Refactor project structure and API
This commit is contained in:
79
Model/API/ApiFactory.swift
Normal file
79
Model/API/ApiFactory.swift
Normal file
@@ -0,0 +1,79 @@
|
||||
//
|
||||
// ApiFactory.swift
|
||||
// iKeyMon
|
||||
//
|
||||
// Created by tracer on 13.11.25.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
enum APIVersion: String, CaseIterable {
|
||||
case v2_12 = "2.12"
|
||||
|
||||
static func from(versionString: String) -> APIVersion? {
|
||||
if let version = APIVersion(rawValue: versionString) {
|
||||
return version
|
||||
}
|
||||
|
||||
let components = versionString.split(separator: ".").compactMap { Int($0) }
|
||||
guard components.count >= 2 else { return nil }
|
||||
|
||||
let major = components[0]
|
||||
let minor = components[1]
|
||||
|
||||
switch (major, minor) {
|
||||
case (2, 12...): return .v2_12
|
||||
default: return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protocol AnyServerAPI {
|
||||
func fetchSystemInfo() async throws -> SystemInfo
|
||||
func fetchLoadData() async throws -> Any
|
||||
func fetchMemoryData() async throws -> Any
|
||||
func fetchUtilizationData() async throws -> Any
|
||||
}
|
||||
|
||||
private struct AnyServerAPIWrapper<T: ServerAPIProtocol>: AnyServerAPI {
|
||||
private let wrapped: T
|
||||
|
||||
init(_ wrapped: T) {
|
||||
self.wrapped = wrapped
|
||||
}
|
||||
|
||||
func fetchSystemInfo() async throws -> SystemInfo {
|
||||
return try await wrapped.fetchSystemInfo()
|
||||
}
|
||||
|
||||
func fetchLoadData() async throws -> Any {
|
||||
return try await wrapped.fetchLoad()
|
||||
}
|
||||
|
||||
func fetchMemoryData() async throws -> Any {
|
||||
return try await wrapped.fetchMemory()
|
||||
}
|
||||
|
||||
func fetchUtilizationData() async throws -> Any {
|
||||
return try await wrapped.fetchUtilization()
|
||||
}
|
||||
}
|
||||
|
||||
class APIFactory {
|
||||
static func createAPI(baseURL: URL, version: APIVersion) -> AnyServerAPI {
|
||||
switch version {
|
||||
case .v2_12:
|
||||
return AnyServerAPIWrapper(APIv2_12(baseURL: baseURL))
|
||||
}
|
||||
}
|
||||
|
||||
static func createAPI(baseURL: URL, versionString: String) -> AnyServerAPI? {
|
||||
guard let version = APIVersion.from(versionString: versionString) else { return nil }
|
||||
return createAPI(baseURL: baseURL, version: version)
|
||||
}
|
||||
|
||||
static func detectAndCreateAPI(baseURL: URL) async throws -> AnyServerAPI {
|
||||
// For now we only support API v2.12, so return that implementation directly.
|
||||
return AnyServerAPIWrapper(APIv2_12(baseURL: baseURL))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user