我想使用2个枚举来控制使用以下客户端时可用的选项。
基本上,如果APIService
是.identity
,则APIEndpoints
应该只返回该服务上的端点。在这种情况下,.accessToken
。
我什至不确定这是否可行,但是,我怎么能做到这一点呢?
import UIKit
struct MyModel: Codable {
let id: String
}
enum Result<T> {
case success(T)
case error(String)
}
protocol ServiceType {}
protocol EndpointType {
var baseURL: String { get }
var path: String { get }
}
// MARK: - APIEndpoints
enum APIEndpoints {
// MARK: - Profile
case userProfile(userId: String)
// MARK: - Identity
case accessToken(company: String, code: String)
}
extension APIEndpoints: EndpointType {
var baseURL: String {
switch self {
case .userProfile:
return "https://profile.foo.bar"
case .accessToken:
return "https://identity.foo.bar"
}
}
var path: String {
switch self {
case .userProfile(let userId):
return "/profile/\(userId)/something"
case .accessToken(let props):
return "/auth/realms/\(props.company)/protocol/openid-connect/token"
}
}
}
// MARK: - APIService
enum APIService {
case profile
case identity
}
extension APIService: ServiceType {}
// MARK: - Client
protocol ClientType {
func request(forService service: APIService, onEndpoint endpoint: APIEndpoints, completion: @escaping (Result<MyModel>) -> Void)
}
class Client: ClientType {
func request(forService service: APIService, onEndpoint endpoint: APIEndpoints, completion: @escaping (Result<MyModel>) -> Void) {
let responseResult = Bool.random()
if responseResult {
guard let data = "{\"id\":\"1234\"}".data(using: .utf8), let value = try? JSONDecoder().decode(MyModel.self, from: data) else { return completion(.error("Decoder Error")) }
completion(.success(value))
} else {
completion(.error("Foo"))
}
}
}
let client = Client()
client.request(forService: .identity, onEndpoint: .accessToken(company: "foobar", code: "123")) { response in
switch response {
case .success(let values):
print("do something with \(values.id)")
case .error(let error):
print("do something with an error of type \(error)")
}
}