| import Foundation |
|
|
| struct GatewayConfig { |
| var mode: String? |
| var bind: String? |
| var port: Int? |
| var remoteUrl: String? |
| var token: String? |
| var password: String? |
| var remoteToken: String? |
| var remotePassword: String? |
| } |
|
|
| struct GatewayEndpoint { |
| let url: URL |
| let token: String? |
| let password: String? |
| let mode: String |
| } |
|
|
| func loadGatewayConfig() -> GatewayConfig { |
| let home = FileManager().homeDirectoryForCurrentUser |
| let candidates = [ |
| home.appendingPathComponent(".openclaw/openclaw.json"), |
| ] |
| let url = candidates.first { FileManager().isReadableFile(atPath: $0.path) } ?? candidates[0] |
| guard let data = try? Data(contentsOf: url) else { return GatewayConfig() } |
| guard let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else { |
| return GatewayConfig() |
| } |
|
|
| var cfg = GatewayConfig() |
| if let gateway = json["gateway"] as? [String: Any] { |
| cfg.mode = gateway["mode"] as? String |
| cfg.bind = gateway["bind"] as? String |
| cfg.port = gateway["port"] as? Int ?? parseInt(gateway["port"]) |
|
|
| if let auth = gateway["auth"] as? [String: Any] { |
| cfg.token = auth["token"] as? String |
| cfg.password = auth["password"] as? String |
| } |
| if let remote = gateway["remote"] as? [String: Any] { |
| cfg.remoteUrl = remote["url"] as? String |
| cfg.remoteToken = remote["token"] as? String |
| cfg.remotePassword = remote["password"] as? String |
| } |
| } |
| return cfg |
| } |
|
|
| func parseInt(_ value: Any?) -> Int? { |
| switch value { |
| case let number as Int: |
| number |
| case let number as Double: |
| Int(number) |
| case let raw as String: |
| Int(raw.trimmingCharacters(in: .whitespacesAndNewlines)) |
| default: |
| nil |
| } |
| } |
|
|