├── .gitignore
├── .swiftpm
└── xcode
│ └── package.xcworkspace
│ └── contents.xcworkspacedata
├── Package.swift
├── README.md
├── Sources
└── Smail
│ ├── GmailWrapper.swift
│ ├── ResourceTypes
│ ├── Draft.swift
│ ├── Labels.swift
│ ├── Message.swift
│ ├── Settings.swift
│ └── Thread.swift
│ ├── Services
│ └── REST-API.swift
│ ├── Smail.swift
│ └── Utils
│ └── Helpers.swift
└── Tests
├── LinuxMain.swift
└── SmailTests
├── SmailTests.swift
└── XCTestManifests.swift
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | /.build
3 | /Packages
4 | /*.xcodeproj
5 | xcuserdata/
6 |
--------------------------------------------------------------------------------
/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:5.3
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "Smail",
8 | platforms: [
9 | .macOS(.v10_15),
10 | .iOS(.v13)
11 | ],
12 | products: [
13 | // Products define the executables and libraries a package produces, and make them visible to other packages.
14 | .library(
15 | name: "Smail",
16 | targets: ["Smail"]),
17 | ],
18 | dependencies: [
19 | // Dependencies declare other packages that this package depends on.
20 | // .package(url: /* package url */, from: "1.0.0"),
21 | ],
22 | targets: [
23 | // Targets are the basic building blocks of a package. A target can define a module or a test suite.
24 | // Targets can depend on other targets in this package, and on products in packages this package depends on.
25 | .target(
26 | name: "Smail",
27 | dependencies: []),
28 | .testTarget(
29 | name: "SmailTests",
30 | dependencies: ["Smail"]),
31 | ]
32 | )
33 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Gmail for Swift
2 |
3 | Google hasn't included Swift in their list of platforms supported, hence, Gmail-for-Swift!
4 |
5 | ## WIP
6 | ### API Modules
7 | - [X] Users
8 | - [X] UsersDrafts
9 | - [X] UsersHistory
10 | - [X] UsersLabels
11 | - [X] UsersMessages
12 | - [ ] UsersMessagesAttachments
13 | - [X] UsersSettings
14 | - [ ] UsersSettingsDelegates
15 | - [ ] UsersSettingsFilters
16 | - [ ] UsersSettingsForwardingAddresses
17 | - [ ] UsersSettingsSendAs
18 | - [ ] UsersSettingsSendAssmimeInfo
19 | - [X] UsersThreads
20 | ---
21 | ### Documentation
22 | - [ ] Users
23 | - [ ] UsersDrafts
24 | - [ ] UsersHistory
25 | - [ ] UsersLabels
26 | - [ ] UsersMessages
27 | - [ ] UsersMessagesAttachments
28 | - [ ] UsersSettings
29 | - [ ] UsersSettingsDelegates
30 | - [ ] UsersSettingsFilters
31 | - [ ] UsersSettingsForwardingAddresses
32 | - [ ] UsersSettingsSendAs
33 | - [ ] UsersSettingsSendAssmimeInfo
34 | - [ ] UsersThreads
35 |
--------------------------------------------------------------------------------
/Sources/Smail/GmailWrapper.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GmailWrapper.swift
3 | // Smail
4 | //
5 | // Created by Praneet S on 12/04/21.
6 | //
7 |
8 | import Foundation
9 | import Combine
10 |
11 | public class Gmail {
12 |
13 | private static var bearerToken: String = ""
14 | private static var defaultHeadersWithAuth = ["Authorization" : "Bearer \(Gmail.bearerToken)"]
15 |
16 | public static func setAuth(bearerToken: String) {
17 | Gmail.bearerToken = bearerToken
18 | }
19 |
20 | public class Users {
21 |
22 | public static func getProfile(userID: String = "me") -> AnyPublisher {
23 | return API.executeRequest(APIRequest: API.user.getProfile(userID: userID).request, headers: defaultHeadersWithAuth, requestBody: nil, decodingType: Data.self)
24 | }
25 |
26 | public static func stop(userID: String = "me") -> AnyPublisher {
27 | return API.executeRequest(APIRequest: API.user.stop(userID: userID).request, headers: defaultHeadersWithAuth, requestBody: nil, decodingType: Data.self)
28 | }
29 |
30 | public static func watch(userID: String = "me", requestBody: [String : Any]) -> AnyPublisher {
31 | return API.executeRequest(APIRequest: API.user.watch(userID: userID).request, headers: defaultHeadersWithAuth, requestBody: requestBody, decodingType: Data.self)
32 | }
33 |
34 | }
35 |
36 | public class UsersDrafts {
37 |
38 | public static func create(userID: String = "me", type: API.resourceContentType, draft: [String : Any]) -> AnyPublisher {
39 | return API.executeRequest(APIRequest: API.usersDrafts.create(userId: userID, type: type).request, headers: defaultHeadersWithAuth, requestBody: draft, decodingType: Data.self)
40 | }
41 |
42 | public static func delete(userID: String = "me", id: String) -> AnyPublisher {
43 | return API.executeRequest(APIRequest: API.usersDrafts.delete(userId: userID, id: id).request, headers: defaultHeadersWithAuth, requestBody: nil, decodingType: Data.self)
44 | }
45 |
46 | public static func get(userID: String = "me", id: String) -> AnyPublisher {
47 | return API.executeRequest(APIRequest: API.usersDrafts.get(userId: userID, id: id).request, headers: defaultHeadersWithAuth, requestBody: nil, decodingType: Data.self)
48 | }
49 |
50 | public static func list(userID: String = "me") -> AnyPublisher {
51 | return API.executeRequest(APIRequest: API.usersDrafts.list(userId: userID).request, headers: defaultHeadersWithAuth, requestBody: nil, decodingType: DraftList.self)
52 | }
53 |
54 | public static func send(userID: String = "me", headers: [String : String], draft: [String : Any], type: API.resourceContentType) -> AnyPublisher {
55 | var headersWithAuth = headers
56 | headersWithAuth["Authorization"] = "Bearer \(Gmail.bearerToken)"
57 | return API.executeRequest(APIRequest: API.usersDrafts.send(userId: userID, type: type).request, headers: headersWithAuth, requestBody: draft, decodingType: Data.self)
58 | }
59 |
60 | public static func update(userID: String = "me", draft: [String : Any], id: String, type: API.resourceContentType) -> AnyPublisher {
61 | return API.executeRequest(APIRequest: API.usersDrafts.update(userId: userID, id: id, type: type).request, headers: defaultHeadersWithAuth, requestBody: draft, decodingType: Data.self)
62 | }
63 |
64 | }
65 |
66 | public class UsersHistory {
67 |
68 | public static func list(userID: String = "me", startHistoryId: String) -> AnyPublisher {
69 | return API.executeRequest(APIRequest: API.usersHistory.list(userID: userID, startHistoryId: startHistoryId).request, headers: defaultHeadersWithAuth, requestBody: nil, decodingType: Data.self)
70 | }
71 |
72 | }
73 |
74 | public class UsersLabels {
75 |
76 | public static func create(userID: String = "me", requestBody: Label) -> AnyPublisher