Custom ResponseSerializer for Alamofire 3
static func CloudFlareResponseSerializer<T: Decodable where T == T.DecodedType>() -> ResponseSerializer<T, CloudFlareError> {
return ResponseSerializer { (request, response, data, error) in
guard error == nil else {
return .Failure(CloudFlareError.NetworkError(error: error!))
}
let JSONResult = Request.JSONResponseSerializer().serializeResponse(request, response, data, nil)
guard case let .Success(responseJSON) = JSONResult else {
return .Failure(CloudFlareError.SerializationError(error: JSONResult.error!))
}
let decodedCloudFlareResponse = CloudFlareResponse.decode(JSON(responseJSON))
guard case let .Success(cloudFlareResponse) = decodedCloudFlareResponse else {
return .Failure(CloudFlareError.DecodingError(decodedString: decodedCloudFlareResponse.error!.description))
}
guard cloudFlareResponse.success else {
return .Failure(CloudFlareError.ResponseError(response: cloudFlareResponse))
}
let decodedResponseObject = T.decode(cloudFlareResponse.result)
guard case let .Success(responseObject) = decodedResponseObject else {
return .Failure(CloudFlareError.DecodingError(decodedString: decodedResponseObject.error!.description))
}
return .Success(responseObject)
}
}