Fleshing out requests for data or status codes
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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?)
|
||||||
|
}
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
// The Swift Programming Language
|
|
||||||
// https://docs.swift.org/swift-book
|
|
||||||
public func hello() {
|
|
||||||
print("Hello, world!")
|
|
||||||
}
|
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user