38 lines
1.1 KiB
Swift
38 lines
1.1 KiB
Swift
import Commander
|
|
import Foundation
|
|
import Speech
|
|
import Swabble
|
|
|
|
@MainActor
|
|
struct DoctorCommand: ParsableCommand {
|
|
static var commandDescription: CommandDescription {
|
|
CommandDescription(commandName: "doctor", abstract: "Check Speech permission and config")
|
|
}
|
|
|
|
@Option(name: .long("config"), help: "Path to config JSON") var configPath: String?
|
|
|
|
init() {}
|
|
init(parsed: ParsedValues) {
|
|
self.init()
|
|
if let cfg = parsed.options["config"]?.last { configPath = cfg }
|
|
}
|
|
|
|
mutating func run() async throws {
|
|
let auth = await SFSpeechRecognizer.authorizationStatus()
|
|
print("Speech auth: \(auth)")
|
|
do {
|
|
_ = try ConfigLoader.load(at: configURL)
|
|
print("Config: OK")
|
|
} catch {
|
|
print("Config missing or invalid; run setup")
|
|
}
|
|
let session = AVCaptureDevice.DiscoverySession(
|
|
deviceTypes: [.microphone, .external],
|
|
mediaType: .audio,
|
|
position: .unspecified)
|
|
print("Mics found: \(session.devices.count)")
|
|
}
|
|
|
|
private var configURL: URL? { configPath.map { URL(fileURLWithPath: $0) } }
|
|
}
|