extension ApiRequest where Response: Decodable {
public var dataParser: DataParser { return DecodableDataParser() }
public func response(from object: Any, urlResponse: HTTPURLResponse) throws -> Response {
guard let data = object as? Data else {
throw ResponseError.unexpectedObject(object)
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .custom { (decoder: Decoder) -> Date in
let container = try decoder.singleValueContainer()
let str = try container.decode(String.self)
if let date = ISO8601DateFormatter().date(from: str) {
return date
}
if let date = DateFormatter.birthday.date(from: str) {
return date
}
throw ApiError(response: urlResponse,
body: ApiErrorBody(identifier: .badResponse,
detail: "Failed to parse \(str) to Date by using ISO8601DateFormatter or DateFormatter.birthday"))
}
return try decoder.decode(Response.self, from: data)
}
}
extension DateFormatter {
/**
Facebook Graph API Birthday Formatter
https://developers.facebook.com/docs/graph-api/reference/user
*/
public static let birthday: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "MM/dd/yyyy"
return formatter
}()
}