mono0926
9/7/2017 - 7:11 AM

APIKit_Codable.swift

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