typealias SubArgParser = ArgParser func windowIdSubArgParser() -> SubArgParser { singleValueSubArgParser(\T.windowId, "", parseUInt32) } func workspaceSubArgParser() -> SubArgParser { singleValueSubArgParser(\T.workspaceName, "", WorkspaceName.parse) } func trueBoolFlag(_ keyPath: SendableWritableKeyPath) -> SubArgParser { ArgParser(keyPath, constSubArgParserFun(true)) } func falseBoolFlag(_ keyPath: SendableWritableKeyPath) -> SubArgParser { ArgParser(keyPath, constSubArgParserFun(false)) } func boolFlag(_ keyPath: SendableWritableKeyPath) -> SubArgParser { ArgParser(keyPath) { input in input.argOrNil == "no" ? .succ(false, advanceBy: 1) : .succ(true, advanceBy: 0) } } func singleValueSubArgParser( _ keyPath: SendableWritableKeyPath, _ placeholder: String, _ mapper: @escaping @Sendable (String) -> ResOrStr, ) -> SubArgParser { ArgParser(keyPath) { input in switch input.nonFlagArgOrNil() { case nil: .fail("'\(input.superArg)' must be followed by '\(placeholder)'", advanceBy: 0) case let arg?: switch mapper(arg) { case .success(let value): .succ(value, advanceBy: 1) case .failure(let error): .fail("Failed to parse '\(arg)' CLI argument: \(error)", advanceBy: 1) } } } } func constSubArgParserFun(_ const: Value) -> ArgParserFun { return { _ in .succ(const, advanceBy: 0) } }