Fleshing out requests for data or status codes

This commit is contained in:
2026-10-13 12:58:14 -07:00
parent e79d4cc6e8
commit 5f3b0937e2
6 changed files with 125 additions and 5 deletions
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
+67
View File
@@ -0,0 +1,67 @@
//
// Client.swift
// JellyKit
//
// Created by Alex Loren on 10/10/26.
//
import Foundation
struct Client {
// MARK: - Properties
private let session: URLSession
private let defaultHeaders: [String:String]
private let server: String
private let decoder: JSONDecoder = .init()
private let encoder: JSONEncoder = .init()
// MARK: - Functions
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 {
do {
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
} catch {
throw RequestError.unknown(message: error.localizedDescription)
}
}
func dataRequest<T>(_ request: any Request) async throws -> T? where T: Codable {
do {
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)
} catch {
throw RequestError.unknown(message: error.localizedDescription)
}
}
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
}
}
+14
View File
@@ -0,0 +1,14 @@
//
// RequestError.swift
// JellyKit
//
// Created by Alex Loren on 10/13/26.
//
import Foundation
enum RequestError: Error {
case badURL
case invalidResponse
case unknown(message: String?)
}
-5
View File
@@ -1,5 +0,0 @@
// The Swift Programming Language
// https://docs.swift.org/swift-book
public func hello() {
print("Hello, world!")
}
+22
View File
@@ -0,0 +1,22 @@
//
// User.swift
// JellyKit
//
// Created by Alex Loren on 10/13/26.
//
struct User: Codable {
var id: String
var serverId: String
var name: String
var hasPassword: Bool
var primaryImageTag: String
enum CodingKeys: String, CodingKey {
case id = "Id"
case serverId = "ServerId"
case name = "Name"
case hasPassword = "HasPassword"
case primaryImageTag = "PrimaryImageTag"
}
}
+15
View File
@@ -0,0 +1,15 @@
//
// Request.swift
// JellyKit
//
// Created by Alex Loren on 10/13/26.
//
import Foundation
protocol Request {
// MARK: - Properties
var endpoint: String { get set }
var method: String { get set }
var headers: [String:String]? { get set }
}