Skip to content

Instantly share code, notes, and snippets.

@eugeniobaglieri
Created July 2, 2018 20:31
Show Gist options
  • Save eugeniobaglieri/0c19a7ec5e1549019113ef20c76bc5eb to your computer and use it in GitHub Desktop.
Save eugeniobaglieri/0c19a7ec5e1549019113ef20c76bc5eb to your computer and use it in GitHub Desktop.
class Response {
typealias Headers = [String : String]
enum ResponseError: Error {
case badInput
case noData
case noResponseReceived
case unacceptableResponse(Int)
}
enum Result<T> {
case success(T)
case error(Error)
}
let response: HTTPURLResponse?
let error: Error?
let data: Data?
init(data: Data?, response: HTTPURLResponse?, error: Error?) {
self.data = data
self.error = error
self.response = response
}
var jsonResult: Result<Any> {
let e = errorOccurred()
guard e == nil else { return .error(e!) }
guard let _data = data else { return .error(ResponseError.noData) }
do {
let json = try JSONSerialization.jsonObject(with: _data, options: [])
return Result<Any>.success(json)
} catch let parsingError {
return .error(parsingError)
}
}
var dataResult: Result<Data> {
if let e = errorOccurred() { return .error(e) }
guard let _data = data else { return .error(ResponseError.noData) }
return Result<Data>.success(_data)
}
var headersResult: Result<Headers> {
if let e = errorOccurred() { return .error(e) }
var headers = Headers()
for (key, value) in response!.allHeaderFields {
headers["\(key)"] = "\(value)"
}
return Result<Headers>.success(headers)
}
private func errorOccurred() -> Error? {
guard error == nil else { return error! }
guard let r = response else { return ResponseError.noResponseReceived }
let statusCode = r.statusCode
guard Array(200...220).contains(statusCode) else { return ResponseError.unacceptableResponse(statusCode) }
return nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment