Last active
January 10, 2019 03:05
-
-
Save SergeyPetrachkov/194b97350b8ac5e106baebcb9dacfa01 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| extension SwaggerClientAPI { | |
| private enum HeadersKeys: String { | |
| case authorization = "Authorization" | |
| } | |
| class func setBearer(_ token: String) { | |
| SwaggerClientAPI.customHeaders = [HeadersKeys.authorization.rawValue: "Bearer \(token)"] | |
| } | |
| class func clearBearer() { | |
| SwaggerClientAPI.customHeaders.removeValue(forKey: HeadersKeys.authorization.rawValue) | |
| } | |
| } | |
| /// A handler for swagger style responses | |
| class SwaggerApiResponseHandler { | |
| class func handleResponse<ResponseType>(_ response: (successResponse: ResponseType?, failure: Error?), | |
| success: ((ResponseType) -> Void), | |
| failure: (Error) -> Void) { | |
| if let error = response.failure { | |
| handleError(error: error) { outputError in | |
| failure(outputError) | |
| } | |
| } else { | |
| if let successResponse = response.successResponse { | |
| success(successResponse) | |
| } else { | |
| let error = NSError(domain: "SwaggerApiResponseHandler::handleResponse", code: -2, userInfo: [NSLocalizedDescriptionKey: "server.error.generic".localized]) | |
| failure(error) | |
| } | |
| } | |
| } | |
| class func unwrapResponse<ResponseType>(_ response: (successResponse: ResponseType?, failure: Error?)) throws -> ResponseType { | |
| if let error = response.failure { | |
| try unwrapError(error: error) | |
| } else { | |
| if let successResponse = response.successResponse { | |
| return successResponse | |
| } | |
| } | |
| let error = NSError(domain: "SwaggerApiResponseHandler::unwrapResponse", code: -2, userInfo: [NSLocalizedDescriptionKey: "server.error.generic".localized]) | |
| throw error | |
| } | |
| class func unwrapError(error: Error) throws { | |
| // Try extract internal error from returned error | |
| switch error { | |
| case let errorResponse as ErrorResponse: | |
| switch errorResponse { | |
| /// code, data, error. in future we can handle different codes. now when internet connection is interrupted error contains info about it, data is empty and code is 500 | |
| case .error(_, let data, let error): | |
| if let data = data, | |
| let serverError = try? JSONDecoder().decode(ErrorBase.self, from: data) { | |
| throw NSError(domain: "SwaggerApiResponseHandler::unwrapError", code: serverError.errorCode, userInfo: [NSLocalizedDescriptionKey: serverError.failReason ?? ""]) | |
| } else { | |
| throw error | |
| } | |
| } | |
| // if web service returned error | |
| default: | |
| throw error | |
| } | |
| } | |
| fileprivate class func handleError(error: Error, failure: (Error) -> Void) { | |
| // Try extract internal error from returned error | |
| switch error { | |
| case let errorResponse as ErrorResponse: | |
| switch errorResponse { | |
| /// code, data, error. in future we can handle different codes. now when internet connection is interrupted error contains info about it, data is empty and code is 500 | |
| case .error(_, let data, let error): | |
| if let data = data, | |
| let serverError = try? JSONDecoder().decode(ErrorBase.self, from: data) { | |
| failure(NSError(domain: "SwaggerApiResponseHandler::handleError", code: serverError.errorCode, userInfo: [NSLocalizedDescriptionKey: serverError.failReason ?? ""])) | |
| } else { | |
| failure(error) | |
| } | |
| break | |
| } | |
| break | |
| // if web service returned error | |
| default: | |
| failure(error) | |
| break | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment