Files
iKeyMon/Sources/Model/API/BaseAPI.swift
2025-11-17 15:42:55 +01:00

68 lines
1.8 KiB
Swift

//
// BaseAPI.swift
// iKeyMon
//
// Created by tracer on 13.11.25.
//
import Foundation
protocol ServerAPIProtocol {
associatedtype LoadType: Codable
associatedtype MemoryType: Codable
associatedtype UtilizationType: Codable
func fetchSystemInfo() async throws -> SystemInfo
func fetchLoad() async throws -> LoadType
func fetchMemory() async throws -> MemoryType
func fetchUtilization() async throws -> UtilizationType
func fetchServerSummary(apiKey: String) async throws -> ServerInfo
}
struct SystemInfo: Codable {
let version: String
let timestamp: Date
let hostname: String
}
class BaseAPIClient {
let baseURL: URL
let session: URLSession
init(baseURL: URL, session: URLSession = .shared) {
self.baseURL = baseURL
self.session = session
}
func performRequest<T: Codable>(_ request: URLRequest, responseType: T.Type) async throws -> T {
let (data, response) = try await session.data(for: request)
guard let httpResponse = response as? HTTPURLResponse else {
throw APIError.invalidResponse
}
guard 200...299 ~= httpResponse.statusCode else {
throw APIError.httpError(httpResponse.statusCode)
}
return try JSONDecoder().decode(T.self, from: data)
}
}
enum APIError: Error, LocalizedError {
case invalidURL
case invalidResponse
case httpError(Int)
case decodingError(Error)
var errorDescription: String? {
switch self {
case .invalidURL: return "Invalid URL"
case .invalidResponse: return "Invalid response"
case .httpError(let code): return "HTTP Error: \(code)"
case .decodingError(let error): return "Decoding error: \(error.localizedDescription)"
}
}
}