Add PromiseKit dependency

- Added PromiseKit dependency
This commit is contained in:
2018-11-15 22:08:00 -04:00
parent 2689d86c18
commit be7b6b5881
541 changed files with 46282 additions and 0 deletions

View File

@@ -0,0 +1,189 @@
@_exported import Alamofire
import Foundation
#if !PMKCocoaPods
import PromiseKit
#endif
/**
To import the `Alamofire` category:
use_frameworks!
pod "PromiseKit/Alamofire"
And then in your sources:
import PromiseKit
*/
extension Alamofire.DataRequest {
/// Adds a handler to be called once the request has finished.
public func response(_: PMKNamespacer, queue: DispatchQueue? = nil) -> Promise<(URLRequest, HTTPURLResponse, Data)> {
return Promise { seal in
response(queue: queue) { rsp in
if let error = rsp.error {
seal.reject(error)
} else if let a = rsp.request, let b = rsp.response, let c = rsp.data {
seal.fulfill((a, b, c))
} else {
seal.reject(PMKError.invalidCallingConvention)
}
}
}
}
/// Adds a handler to be called once the request has finished.
public func responseData(queue: DispatchQueue? = nil) -> Promise<(data: Data, response: PMKAlamofireDataResponse)> {
return Promise { seal in
responseData(queue: queue) { response in
switch response.result {
case .success(let value):
seal.fulfill((value, PMKAlamofireDataResponse(response)))
case .failure(let error):
seal.reject(error)
}
}
}
}
/// Adds a handler to be called once the request has finished.
public func responseString(queue: DispatchQueue? = nil) -> Promise<(string: String, response: PMKAlamofireDataResponse)> {
return Promise { seal in
responseString(queue: queue) { response in
switch response.result {
case .success(let value):
seal.fulfill((value, PMKAlamofireDataResponse(response)))
case .failure(let error):
seal.reject(error)
}
}
}
}
/// Adds a handler to be called once the request has finished.
public func responseJSON(queue: DispatchQueue? = nil, options: JSONSerialization.ReadingOptions = .allowFragments) -> Promise<(json: Any, response: PMKAlamofireDataResponse)> {
return Promise { seal in
responseJSON(queue: queue, options: options) { response in
switch response.result {
case .success(let value):
seal.fulfill((value, PMKAlamofireDataResponse(response)))
case .failure(let error):
seal.reject(error)
}
}
}
}
/// Adds a handler to be called once the request has finished.
public func responsePropertyList(queue: DispatchQueue? = nil, options: PropertyListSerialization.ReadOptions = PropertyListSerialization.ReadOptions()) -> Promise<(plist: Any, response: PMKAlamofireDataResponse)> {
return Promise { seal in
responsePropertyList(queue: queue, options: options) { response in
switch response.result {
case .success(let value):
seal.fulfill((value, PMKAlamofireDataResponse(response)))
case .failure(let error):
seal.reject(error)
}
}
}
}
#if swift(>=3.2)
/**
Returns a Promise for a Decodable
Adds a handler to be called once the request has finished.
- Parameter queue: DispatchQueue, by default nil
- Parameter decoder: JSONDecoder, by default JSONDecoder()
*/
public func responseDecodable<T: Decodable>(queue: DispatchQueue? = nil, decoder: JSONDecoder = JSONDecoder()) -> Promise<T> {
return Promise { seal in
responseData(queue: queue) { response in
switch response.result {
case .success(let value):
do {
seal.fulfill(try decoder.decode(T.self, from: value))
} catch {
seal.reject(error)
}
case .failure(let error):
seal.reject(error)
}
}
}
}
/**
Returns a Promise for a Decodable
Adds a handler to be called once the request has finished.
- Parameter queue: DispatchQueue, by default nil
- Parameter decoder: JSONDecoder, by default JSONDecoder()
*/
public func responseDecodable<T: Decodable>(_ type: T.Type, queue: DispatchQueue? = nil, decoder: JSONDecoder = JSONDecoder()) -> Promise<T> {
return Promise { seal in
responseData(queue: queue) { response in
switch response.result {
case .success(let value):
do {
seal.fulfill(try decoder.decode(type, from: value))
} catch {
seal.reject(error)
}
case .failure(let error):
seal.reject(error)
}
}
}
}
#endif
}
extension Alamofire.DownloadRequest {
public func response(_: PMKNamespacer, queue: DispatchQueue? = nil) -> Promise<DefaultDownloadResponse> {
return Promise { seal in
response(queue: queue) { response in
if let error = response.error {
seal.reject(error)
} else {
seal.fulfill(response)
}
}
}
}
/// Adds a handler to be called once the request has finished.
public func responseData(queue: DispatchQueue? = nil) -> Promise<DownloadResponse<Data>> {
return Promise { seal in
responseData(queue: queue) { response in
switch response.result {
case .success:
seal.fulfill(response)
case .failure(let error):
seal.reject(error)
}
}
}
}
}
/// Alamofire.DataResponse, but without the `result`, since the Promise represents the `Result`
public struct PMKAlamofireDataResponse {
public init<T>(_ rawrsp: Alamofire.DataResponse<T>) {
request = rawrsp.request
response = rawrsp.response
data = rawrsp.data
timeline = rawrsp.timeline
}
/// The URL request sent to the server.
public let request: URLRequest?
/// The server's response to the URL request.
public let response: HTTPURLResponse?
/// The data returned by the server.
public let data: Data?
/// The timeline of the complete lifecycle of the request.
public let timeline: Timeline
}