Files
JellyKit/Sources/JellyKit/Client.swift
T

60 lines
1.7 KiB
Swift

//
// Client.swift
// JellyKit
//
// Created by Alex Loren on 10/10/26.
//
import Foundation
public struct Client {
// MARK: - Properties
private let server: String
private let session: URLSession
private let defaultHeaders: [String:String]
private let decoder: JSONDecoder = .init()
private let encoder: JSONEncoder = .init()
// MARK: - Functions
public init(server: String, session: URLSession = .shared, headers: [String:String] = [:]) {
self.server = server
self.session = session
self.defaultHeaders = headers
}
func statusRequest(_ request: any Request) async throws -> Int {
let urlRequest = try createRequestObject(for: request)
let (_, response) = try await session.data(for: urlRequest)
guard let response = response as? HTTPURLResponse else {
throw RequestError.invalidResponse
}
return response.statusCode
}
func dataRequest<T>(_ request: any Request) async throws -> T? where T: Codable {
let urlRequest = try createRequestObject(for: request)
let (data, response) = try await session.data(for: urlRequest)
guard let response = response as? HTTPURLResponse else {
throw RequestError.invalidResponse
}
return try decoder.decode(T.self, from: data)
}
private func createRequestObject(for request: Request) throws -> URLRequest {
guard let url = URL(string: "\(server)\(request.endpoint)") else {
throw RequestError.badURL
}
let headers = defaultHeaders.merging(request.headers ?? [:]) { (current, new) in
return new
}
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = request.method
urlRequest.allHTTPHeaderFields = headers
return urlRequest
}
}