public struct WorkspaceCmdArgs: CmdArgs { /*conforms*/ public var commonState: CmdArgsCommonState public init(rawArgs: StrArrSlice) { self.commonState = .init(rawArgs) } public static let parser: CmdParser = .init( kind: .workspace, help: workspace_help_generated, flags: [ "--auto-back-and-forth": ArgParser(\._autoBackAndForth, constSubArgParserFun(true)), "--wrap-around": ArgParser(\._wrapAround, constSubArgParserFun(true)), "--fail-if-noop": trueBoolFlag(\.failIfNoop), "--stdin": ArgParser(\.commonState.explicitStdinFlag, constSubArgParserFun(true)), "--no-stdin": ArgParser(\.commonState.explicitStdinFlag, constSubArgParserFun(false)), ], posArgs: [ dashDashArg(mandatory: false), newMandatoryPosArgParser(\.target, parseWorkspaceTarget, placeholder: workspaceTargetPlaceholder), ], conflictingOptions: [ ["--stdin", "--no-stdin"], ], ) public var target: Lateinit = .uninitialized public var _autoBackAndForth: Bool? public var failIfNoop: Bool = false public var _wrapAround: Bool? } func parseWorkspaceCmdArgs(_ args: StrArrSlice) -> ParsedCmd { parseSpecificCmdArgs(WorkspaceCmdArgs(rawArgs: args), args) .filter("--wrapAround requires using \(NextPrev.unionLiteral) argument") { ($0._wrapAround != nil).implies($0.target.val.isRelatve) } .filterNot("--auto-back-and-forth is incompatible with \(NextPrev.unionLiteral)") { $0._autoBackAndForth != nil && $0.target.val.isRelatve } .filterNot("--fail-if-noop is incompatible with \(NextPrev.unionLiteral)") { $0.failIfNoop && $0.target.val.isRelatve } .filterNot("--fail-if-noop is incompatible with --auto-back-and-forth") { $0.autoBackAndForth && $0.failIfNoop } .filter("--stdin and --no-stdin require using \(NextPrev.unionLiteral) argument") { ($0.commonState.explicitStdinFlag != nil).implies($0.target.val.isRelatve) } } extension WorkspaceCmdArgs { public var wrapAround: Bool { _wrapAround ?? false } public var autoBackAndForth: Bool { _autoBackAndForth ?? false } public var useStdin: Bool { commonState.explicitStdinFlag ?? false } } public enum WorkspaceTarget: Equatable, Sendable { case relative(NextPrev) case direct(WorkspaceName) public var isRelatve: Bool { switch self { case .relative: true default: false } } public func workspaceNameOrNil() -> WorkspaceName? { switch self { case .direct(let name): name case .relative: nil } } } let workspaceTargetPlaceholder = "(|next|prev)" func parseWorkspaceTarget(i: PosArgParserInput) -> ParsedCliArgs { switch (i.arg, i.sawDashDash) { case ("next", false): return .succ(.relative(.next), advanceBy: 1) case ("prev", false): return .succ(.relative(.prev), advanceBy: 1) default: return .init(WorkspaceName.parse(i.arg).map(WorkspaceTarget.direct), advanceBy: 1) } }