chourobin
9/22/2015 - 5:39 PM

Custom ResponseSerializer for Alamofire 3

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)
    }
}