// // 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(_ 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)" } } }