mirror of
https://github.com/Dimillian/IceCubesApp.git
synced 2024-06-08 16:29:24 +00:00
35 lines
1,006 B
Swift
35 lines
1,006 B
Swift
import Foundation
|
|
import SwiftUI
|
|
|
|
public class Client: ObservableObject {
|
|
public enum Version: String {
|
|
case v1
|
|
}
|
|
|
|
public let server: String
|
|
public let version: Version
|
|
private let urlSession: URLSession
|
|
private let decoder = JSONDecoder()
|
|
|
|
public init(server: String, version: Version = .v1) {
|
|
self.server = server
|
|
self.version = version
|
|
self.urlSession = URLSession.shared
|
|
self.decoder.keyDecodingStrategy = .convertFromSnakeCase
|
|
}
|
|
|
|
private func makeURL(endpoint: Endpoint) -> URL {
|
|
var components = URLComponents()
|
|
components.scheme = "https"
|
|
components.host = server
|
|
components.path += "/api/\(version.rawValue)/\(endpoint.path())"
|
|
components.queryItems = endpoint.queryItems()
|
|
return components.url!
|
|
}
|
|
|
|
public func fetch<Entity: Codable>(endpoint: Endpoint) async throws -> Entity {
|
|
let (data, _) = try await urlSession.data(from: makeURL(endpoint: endpoint))
|
|
return try decoder.decode(Entity.self, from: data)
|
|
}
|
|
}
|