Switch to gRPC client in Swift app

This commit is contained in:
Conrad Kramer 2024-07-13 18:08:43 -07:00
parent 25a0f7c421
commit 083ec73613
93 changed files with 1666 additions and 1327 deletions

View file

@ -0,0 +1,73 @@
import SwiftUI
struct TunnelButton: View {
@Environment(\.tunnel)
var tunnel: any Tunnel
private var action: Action? { tunnel.action }
var body: some View {
Button {
if let action {
tunnel.perform(action)
}
} label: {
Text(action.description)
}
.disabled(action.isDisabled)
.padding(.horizontal)
.buttonStyle(.floating)
}
}
extension Tunnel {
@MainActor fileprivate var action: TunnelButton.Action? {
switch status {
case .permissionRequired, .invalid:
.enable
case .disabled, .disconnecting, .disconnected:
.start
case .connecting, .connected, .reasserting:
.stop
case .unknown, .configurationReadWriteFailed:
nil
}
}
}
extension TunnelButton {
fileprivate enum Action {
case enable
case start
case stop
}
}
extension TunnelButton.Action? {
var description: LocalizedStringKey {
switch self {
case .enable: "Enable"
case .start: "Start"
case .stop: "Stop"
case .none: "Start"
}
}
var isDisabled: Bool {
if case .none = self {
true
} else {
false
}
}
}
extension Tunnel {
fileprivate func perform(_ action: TunnelButton.Action) {
switch action {
case .enable: enable()
case .start: start()
case .stop: stop()
}
}
}