Skip to content

Instantly share code, notes, and snippets.

@SergeyPetrachkov
Last active January 10, 2019 03:05
Show Gist options
  • Select an option

  • Save SergeyPetrachkov/194b97350b8ac5e106baebcb9dacfa01 to your computer and use it in GitHub Desktop.

Select an option

Save SergeyPetrachkov/194b97350b8ac5e106baebcb9dacfa01 to your computer and use it in GitHub Desktop.
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