60 lines
1.7 KiB
Swift
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
|
|
}
|
|
}
|