Closed puuurm closed 6 years ago
private func request<T>( _ params: [String: String], before object: Storable?, baseURL: BaseURL, type: T.Type, completion: @escaping ((ResponseResult<T>) -> Void)) { guard let url = WeatherAPI.url(baseURL: baseURL, parameters: params) else { return } NetworkSpinner.on() session.dataTask(with: url) { [weak self] (data, response, _) in guard let httpResponse = response as? HTTPURLResponse, let `self` = self else { return } let result = self.processRequest(type, response: httpResponse, data: data) completion(result) self.imageCache.deleteImageForkeys(keys: object?.cacheKeys) NetworkSpinner.off() }.resume() } private func processRequest<T: Decodable>( _ type: T.Type, response: HTTPURLResponse, data: Data? ) -> ResponseResult<T> { let status = response.statusCode if status == Http.Success, let jsonData = data { return WeatherAPI.objectFromJSONData(type, data: jsonData) } else { return .failure(FailureResponse(statusCode: status).error) } }
struct FailureResponse { let statusCode: Int var error: HttpError { switch statusCode { case 404: return HttpError.notFound case 300...307: return HttpError.redirection case 400...417: return HttpError.clientError default: return HttpError.serverError } } enum HttpError: Error, LocalizedError { case redirection // 3xx case clientError // 4xx case notFound // 404 case serverError // 5xx var errorDescription: String? { switch self { case .notFound: return "HTTP Not Found" case .redirection: return "redirection" case .clientError: return "Client Error" case .serverError: return "Server Error" } } } }