added iOS source code
[wl-app.git] / iOS / Pods / AlamofireActivityLogger / alamofire_activity_logger / ActivityLogger / LoggeableRequest.swift
1 //
2 //  LoggeableRequest.swift
3 //  alamofire_activity_logger
4 //
5 //  Created by Manu on 30/5/16.
6 //  Copyright © 2016 manuege. All rights reserved.
7 //
8 import Foundation
9 import Alamofire
10
11 /**
12  A struct that put together the relevant info from a Response
13  */
14 public struct ResponseInfo {
15     public var httpResponse: HTTPURLResponse?
16     public var data: Data?
17     public var error: Error?
18     public var elapsedTime: TimeInterval
19 }
20
21 /**
22  Make a Request conform this protocol to be able to log its request/response
23  */
24 public protocol LoggeableRequest: AnyObject {
25     
26     /// The request sent
27     var request: URLRequest? { get }
28     
29     /**
30      Use this method to fetch the info needed to buld a `ResponseInfo` instance. Once the `ResponseInfo` has been build, you must call the `completion` parameter .
31      - parameter completion: The block that must be called when the asynchronous process has finished.
32      */
33     func fetchResponseInfo(completion: @escaping (ResponseInfo) -> Void)
34 }
35
36 public extension LoggeableRequest {
37     
38     /**
39      Log the request and response with the given level and options
40      */
41     public func log(level: LogLevel = .all, options: [LogOption] = LogOption.defaultOptions, printer: Printer = NativePrinter()) -> Self {
42         
43         guard level != .none else {
44             return self
45         }
46         
47         let debugOption = options.contains(.onlyDebug)
48         if debugOption && !appIsDebugMode {
49             return self
50         }
51         
52         Logger.logRequest(request: request, level: level, options: options, printer: printer)
53         fetchResponseInfo { response in
54             Logger.logResponse(request: self.request, response: response, level: level, options: options, printer: printer)
55         }
56         
57         return self
58     }
59 }
60
61
62 extension DataRequest: LoggeableRequest {
63     public func fetchResponseInfo(completion: @escaping (ResponseInfo) -> Void) {
64         
65         responseData { (response) in
66             
67             var error: Error? = nil
68             if case .failure(let e) = response.result {
69                 error = e
70             }
71             
72             let logResponse = ResponseInfo(httpResponse: response.response,
73                                            data: response.data,
74                                            error: error,
75                                            elapsedTime:  response.timeline.requestDuration)
76             completion(logResponse)
77         }
78         
79     }
80 }
81
82 extension DownloadRequest: LoggeableRequest {
83     public func fetchResponseInfo(completion: @escaping (ResponseInfo) -> Void) {
84         
85         responseData { (response) in
86             
87             var error: Error? = nil
88             var data: Data? = nil
89             
90             switch response.result {
91             case let .success(value):
92                 data = value
93             case let .failure(value):
94                 error = value
95             }
96             
97             let logResponse = ResponseInfo(httpResponse: response.response,
98                                            data: data,
99                                            error: error,
100                                            elapsedTime:  response.timeline.requestDuration)
101             completion(logResponse)
102         }
103     }
104 }