Spaces:
Paused
Paused
| import Commander | |
| import Foundation | |
| @available(macOS 26.0, *) | |
| private func runCLI() async -> Int32 { | |
| do { | |
| let descriptors = CLIRegistry.descriptors | |
| let program = Program(descriptors: descriptors) | |
| let invocation = try program.resolve(argv: CommandLine.arguments) | |
| try await dispatch(invocation: invocation) | |
| return 0 | |
| } catch { | |
| fputs("error: \(error)\n", stderr) | |
| return 1 | |
| } | |
| } | |
| @available(macOS 26.0, *) | |
| private func dispatch(invocation: CommandInvocation) async throws { | |
| let parsed = invocation.parsedValues | |
| let path = invocation.path | |
| guard let first = path.first else { throw CommanderProgramError.missingCommand } | |
| switch first { | |
| case "swabble": | |
| try await dispatchSwabble(parsed: parsed, path: path) | |
| default: | |
| throw CommanderProgramError.unknownCommand(first) | |
| } | |
| } | |
| @available(macOS 26.0, *) | |
| private func dispatchSwabble(parsed: ParsedValues, path: [String]) async throws { | |
| let sub = try subcommand(path, index: 1, command: "swabble") | |
| switch sub { | |
| case "mic": | |
| try await dispatchMic(parsed: parsed, path: path) | |
| case "service": | |
| try await dispatchService(path: path) | |
| default: | |
| let handlers = swabbleHandlers(parsed: parsed) | |
| guard let handler = handlers[sub] else { | |
| throw CommanderProgramError.unknownSubcommand(command: "swabble", name: sub) | |
| } | |
| try await handler() | |
| } | |
| } | |
| @available(macOS 26.0, *) | |
| private func swabbleHandlers(parsed: ParsedValues) -> [String: () async throws -> Void] { | |
| [ | |
| "serve": { | |
| var cmd = ServeCommand(parsed: parsed) | |
| try await cmd.run() | |
| }, | |
| "transcribe": { | |
| var cmd = TranscribeCommand(parsed: parsed) | |
| try await cmd.run() | |
| }, | |
| "test-hook": { | |
| var cmd = TestHookCommand(parsed: parsed) | |
| try await cmd.run() | |
| }, | |
| "doctor": { | |
| var cmd = DoctorCommand(parsed: parsed) | |
| try await cmd.run() | |
| }, | |
| "setup": { | |
| var cmd = SetupCommand(parsed: parsed) | |
| try await cmd.run() | |
| }, | |
| "health": { | |
| var cmd = HealthCommand(parsed: parsed) | |
| try await cmd.run() | |
| }, | |
| "tail-log": { | |
| var cmd = TailLogCommand(parsed: parsed) | |
| try await cmd.run() | |
| }, | |
| "start": { | |
| var cmd = StartCommand() | |
| try await cmd.run() | |
| }, | |
| "stop": { | |
| var cmd = StopCommand() | |
| try await cmd.run() | |
| }, | |
| "restart": { | |
| var cmd = RestartCommand() | |
| try await cmd.run() | |
| }, | |
| "status": { | |
| var cmd = StatusCommand() | |
| try await cmd.run() | |
| } | |
| ] | |
| } | |
| @available(macOS 26.0, *) | |
| private func dispatchMic(parsed: ParsedValues, path: [String]) async throws { | |
| let micSub = try subcommand(path, index: 2, command: "mic") | |
| switch micSub { | |
| case "list": | |
| var cmd = MicList(parsed: parsed) | |
| try await cmd.run() | |
| case "set": | |
| var cmd = MicSet(parsed: parsed) | |
| try await cmd.run() | |
| default: | |
| throw CommanderProgramError.unknownSubcommand(command: "mic", name: micSub) | |
| } | |
| } | |
| @available(macOS 26.0, *) | |
| private func dispatchService(path: [String]) async throws { | |
| let svcSub = try subcommand(path, index: 2, command: "service") | |
| switch svcSub { | |
| case "install": | |
| var cmd = ServiceInstall() | |
| try await cmd.run() | |
| case "uninstall": | |
| var cmd = ServiceUninstall() | |
| try await cmd.run() | |
| case "status": | |
| var cmd = ServiceStatus() | |
| try await cmd.run() | |
| default: | |
| throw CommanderProgramError.unknownSubcommand(command: "service", name: svcSub) | |
| } | |
| } | |
| private func subcommand(_ path: [String], index: Int, command: String) throws -> String { | |
| guard path.count > index else { | |
| throw CommanderProgramError.missingSubcommand(command: command) | |
| } | |
| return path[index] | |
| } | |
| if #available(macOS 26.0, *) { | |
| let exitCode = await runCLI() | |
| exit(exitCode) | |
| } else { | |
| fputs("error: swabble requires macOS 26 or newer\n", stderr) | |
| exit(1) | |
| } | |