Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. struct UserLogin: Codable {
  2. let status: Bool?
  3. let accessToken: String?
  4. let data: [UserLoginData]?
  5. ....
  6. }
  7.  
  8. struct FailedResponse: Codable {
  9. let status: Bool?
  10. let error: ErrorResponse?
  11.  
  12. }
  13.  
  14. struct FailableResponse <T:Codable,E:Codable> : Codable {
  15.  
  16. var success:T?
  17. var failure:E?
  18.  
  19. public init(from decoder:Decoder) throws {
  20.  
  21. let singleValue = try decoder.singleValueContainer()
  22.  
  23. success = try singleValue.decode(T.self)
  24. failure = try singleValue.decode(E.self)
  25.  
  26. }
  27. }
  28.  
  29. APIClient.login(userName: self.loginViewModel.userName, password: self.loginViewModel.password) { (response:FailableResponse<UserLogin,FailedResponse>? , error) in
  30.  
  31. }
  32.  
  33.  
  34. // METHOD OF API CLIENT
  35. // API CALLING
  36. static func login<T:Codable>(userName:String,password:String,completion:@escaping completionResponse<T>) {
  37. self.performRequest(request: APIRouterUserModule.login(email: userName, password: password)) {(model) in
  38.  
  39. self.handleResponseCallCompletion(result: model, completion: completion)
  40. }
  41. }
  42. // Parsing
  43. private static func handleResponseCallCompletion<T:Codable>(result:Result<Any>,completion:@escaping completionResponse<T>) {
  44. let object = CodableHelper<T>().decode(json: result)
  45. completion(object.object,object.error)
  46. }
  47.  
  48. struct UserLoginResponse: Codable {
  49. let status: Bool
  50. let error: ErrorResponse?
  51. let accessToken: String?
  52. let data: [UserLoginData]?
  53. }
  54.  
  55. do {
  56. let responseObject = try decoder.decode(UserLoginResponse.self, from: data)
  57. switch responseObject.status {
  58. case true:
  59. guard let accessToken = responseObject.accessToken, let userLoginData = responseObject.data else {
  60. throw ParsingError.requiredFieldMissing
  61. }
  62.  
  63. // use accessToken and userLoginData here
  64.  
  65. case false:
  66. guard let errorObject = responseObject.error else {
  67. throw ParsingError.requiredFieldMissing
  68. }
  69.  
  70. // use errorObject here
  71. }
  72. } catch {
  73. print(error)
  74. }
  75.  
  76. enum Result<Success, Failure> {
  77. case success(Success)
  78. case failure(Failure)
  79. }
  80.  
  81. struct ApiResponse<T: Codable, E: Codable>: Codable {
  82. let status: Bool
  83. var result: Result<T, E>
  84. var error: E?
  85.  
  86. enum CodingKeys: String, CodingKey {
  87. case status, error
  88. }
  89.  
  90. init(from decoder: Decoder) throws {
  91. let values = try decoder.container(keyedBy: CodingKeys.self)
  92. status = try values.decode(Bool.self, forKey: .status)
  93. if status {
  94. let singleValue = try decoder.singleValueContainer()
  95. result = try .success(singleValue.decode(T.self))
  96. } else {
  97. result = try .failure(values.decode(E.self, forKey: .error))
  98. }
  99. }
  100. }
  101.  
  102. do {
  103. let responseObject = try decoder.decode(ApiResponse<UserLoginResponse, ErrorResponse>.self, from: data)
  104. switch responseObject.result {
  105. case .success(let object):
  106. print(object.accessToken, object.data)
  107.  
  108. case .failure(let error):
  109. print(error)
  110. }
  111. } catch {
  112. print(error)
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement