mirror of
https://github.com/Moya/Moya.git
synced 2026-03-18 19:52:28 +00:00
94 lines
2.8 KiB
Swift
94 lines
2.8 KiB
Swift
// swiftlint:disable force_unwrapping
|
|
|
|
import Foundation
|
|
import Moya
|
|
|
|
// MARK: - Provider setup
|
|
|
|
private func JSONResponseDataFormatter(_ data: Data) -> String {
|
|
do {
|
|
let dataAsJSON = try JSONSerialization.jsonObject(with: data)
|
|
let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted)
|
|
return String(data: prettyData, encoding: .utf8) ?? String(data: data, encoding: .utf8) ?? ""
|
|
} catch {
|
|
return String(data: data, encoding: .utf8) ?? ""
|
|
}
|
|
}
|
|
|
|
let gitHubProvider = MoyaProvider<GitHub>(plugins: [NetworkLoggerPlugin(configuration: .init(formatter: .init(responseData: JSONResponseDataFormatter),
|
|
logOptions: .verbose))])
|
|
|
|
// MARK: - Provider support
|
|
|
|
private extension String {
|
|
var urlEscaped: String {
|
|
self.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
|
|
}
|
|
}
|
|
|
|
public enum GitHub {
|
|
case zen
|
|
case userProfile(String)
|
|
case userRepositories(String)
|
|
}
|
|
|
|
extension GitHub: TargetType {
|
|
public var baseURL: URL { URL(string: "https://api.github.com")! }
|
|
public var path: String {
|
|
switch self {
|
|
case .zen:
|
|
return "/zen"
|
|
case .userProfile(let name):
|
|
return "/users/\(name.urlEscaped)"
|
|
case .userRepositories(let name):
|
|
return "/users/\(name.urlEscaped)/repos"
|
|
}
|
|
}
|
|
public var method: Moya.Method { .get }
|
|
|
|
public var task: Task {
|
|
switch self {
|
|
case .userRepositories:
|
|
return .requestParameters(parameters: ["sort": "pushed"], encoding: URLEncoding.default)
|
|
default:
|
|
return .requestPlain
|
|
}
|
|
}
|
|
public var validationType: ValidationType {
|
|
switch self {
|
|
case .zen:
|
|
return .successCodes
|
|
default:
|
|
return .none
|
|
}
|
|
}
|
|
public var sampleData: Data {
|
|
switch self {
|
|
case .zen:
|
|
return "Half measures are as bad as nothing at all.".data(using: String.Encoding.utf8)!
|
|
case .userProfile(let name):
|
|
return "{\"login\": \"\(name)\", \"id\": 100}".data(using: String.Encoding.utf8)!
|
|
case .userRepositories(let name):
|
|
return "[{\"name\": \"\(name)\"}]".data(using: String.Encoding.utf8)!
|
|
}
|
|
}
|
|
public var headers: [String: String]? { nil }
|
|
|
|
}
|
|
|
|
public func url(_ route: TargetType) -> String {
|
|
route.baseURL.appendingPathComponent(route.path).absoluteString
|
|
}
|
|
|
|
// MARK: - Response Handlers
|
|
|
|
extension Moya.Response {
|
|
func mapNSArray() throws -> NSArray {
|
|
let any = try self.mapJSON()
|
|
guard let array = any as? NSArray else {
|
|
throw MoyaError.jsonMapping(self)
|
|
}
|
|
return array
|
|
}
|
|
}
|