diff --git a/ClashX/AppDelegate.swift b/ClashX/AppDelegate.swift index 8edd003..a86de1e 100644 --- a/ClashX/AppDelegate.swift +++ b/ClashX/AppDelegate.swift @@ -82,8 +82,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { removeUnExistProxyGroups() // start proxy - setupData() updateConfig(showNotification: false) + setupData() updateLoggingLevel() // start watch config file change diff --git a/ClashX/General/ApiRequest.swift b/ClashX/General/ApiRequest.swift index 85e2fc8..27bec63 100644 --- a/ClashX/General/ApiRequest.swift +++ b/ClashX/General/ApiRequest.swift @@ -16,10 +16,6 @@ protocol ApiRequestStreamDelegate: class { func didGetLog(log: String, level: String) } -enum RequestError: Error { - case decodeFail -} - typealias ErrorString = String class ApiRequest { @@ -73,15 +69,12 @@ class ApiRequest { static func requestConfig(completeHandler: @escaping ((ClashConfig) -> Void)) { if !ConfigManager.builtInApiMode { - req("/configs").responseData { - res in - do { - let data = try res.result.get() - guard let config = ClashConfig.fromData(data) else { - throw RequestError.decodeFail - } + req("/configs").responseDecodable(of: ClashConfig.self) { + resp in + switch resp.result { + case let .success(config): completeHandler(config) - } catch let err { + case let .failure(err): Logger.log(err.localizedDescription) NSUserNotificationCenter.default.post(title: "Error", info: err.localizedDescription) } @@ -156,14 +149,20 @@ class ApiRequest { ApiRequest.shared.proxyRespCache = proxies completeHandler?(proxies) } - return } static func requestProxyProviderList(completeHandler: ((ClashProviderResp) -> Void)? = nil) { - req("/providers/proxies").responseData { res in - let provider = ClashProviderResp.create(try? res.result.get()) - completeHandler?(provider) - } + req("/providers/proxies") + .responseDecodable(of: ClashProviderResp.self, decoder: ClashProviderResp.decoder) { resp in + switch resp.result { + case let .success(providerResp): + completeHandler?(providerResp) + case let .failure(err): + print(err) + completeHandler?(ClashProviderResp()) + assertionFailure() + } + } } static func updateAllowLan(allow: Bool, completeHandler: (() -> Void)? = nil) { @@ -236,10 +235,14 @@ class ApiRequest { extension ApiRequest { static func getConnections(completeHandler: @escaping ([ClashConnectionSnapShot.Connection]) -> Void) { - req("/connections").responseData { res in - guard let data = try? res.result.get() else { return } - let resp = ClashConnectionSnapShot.fromData(data) - completeHandler(resp.connections) + req("/connections").responseDecodable(of: ClashConnectionSnapShot.self) { resp in + switch resp.result { + case let .success(snapshot): + completeHandler(snapshot.connections) + case .failure: + assertionFailure() + completeHandler([]) + } } } diff --git a/ClashX/Models/ClashConnection.swift b/ClashX/Models/ClashConnection.swift index d79fbb9..0cc323d 100644 --- a/ClashX/Models/ClashConnection.swift +++ b/ClashX/Models/ClashConnection.swift @@ -10,12 +10,6 @@ import Cocoa struct ClashConnectionSnapShot: Codable { let connections: [Connection] - - static func fromData(_ data: Data) -> ClashConnectionSnapShot { - let decoder = JSONDecoder() - let model = try? decoder.decode(ClashConnectionSnapShot.self, from: data) - return model ?? ClashConnectionSnapShot(connections: []) - } } extension ClashConnectionSnapShot { diff --git a/ClashX/Models/ClashProvider.swift b/ClashX/Models/ClashProvider.swift index d9665a6..34734b1 100644 --- a/ClashX/Models/ClashProvider.swift +++ b/ClashX/Models/ClashProvider.swift @@ -14,15 +14,14 @@ class ClashProviderResp: Codable { return allProviders.filter({ $0.value.vehicleType != .Compatible }) }() - private init() { + init() { allProviders = [:] } - static func create(_ data: Data?) -> ClashProviderResp { - guard let data = data else { return ClashProviderResp() } + static var decoder: JSONDecoder { let decoder = JSONDecoder() decoder.dateDecodingStrategy = .formatted(DateFormatter.js) - return (try? decoder.decode(ClashProviderResp.self, from: data)) ?? ClashProviderResp() + return decoder } private enum CodingKeys: String, CodingKey {