chore(request): use responseDecodable

This commit is contained in:
yicheng 2020-03-04 18:30:53 +08:00
parent 01f3e3da2e
commit ae7cf5e89e
4 changed files with 28 additions and 32 deletions

View File

@ -82,8 +82,8 @@ class AppDelegate: NSObject, NSApplicationDelegate {
removeUnExistProxyGroups()
// start proxy
setupData()
updateConfig(showNotification: false)
setupData()
updateLoggingLevel()
// start watch config file change

View File

@ -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([])
}
}
}

View File

@ -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 {

View File

@ -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 {