[
  {
    "path": ".cargo/config.toml",
    "content": "[resolver]\nincompatible-rust-versions = \"fallback\"\n"
  },
  {
    "path": ".clippy.toml",
    "content": "allow-print-in-tests = true\nallow-expect-in-tests = true\nallow-unwrap-in-tests = true\nallow-dbg-in-tests = true\ndisallowed-methods = [\n    { path = \"std::option::Option::map_or\", reason = \"prefer `map(..).unwrap_or(..)` for legibility\" },\n    { path = \"std::option::Option::map_or_else\", reason = \"prefer `map(..).unwrap_or_else(..)` for legibility\" },\n    { path = \"std::result::Result::map_or\", reason = \"prefer `map(..).unwrap_or(..)` for legibility\" },\n    { path = \"std::result::Result::map_or_else\", reason = \"prefer `map(..).unwrap_or_else(..)` for legibility\" },\n    { path = \"std::iter::Iterator::for_each\", reason = \"prefer `for` for side-effects\" },\n    { path = \"std::iter::Iterator::try_for_each\", reason = \"prefer `for` for side-effects\" },\n]\ndoc-valid-idents = [\"PowerShell\", \"..\"]\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: clap-rs\nopen_collective: clap\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug report\ndescription: An issue with clap, clap_complete, clap_derive, or clap_mangen\nlabels: [\"C-bug\", \"S-triage\"]\nbody:\n  - type: checkboxes\n    attributes:\n      label: Please complete the following tasks\n      options:\n        - label: I have searched the [discussions](https://github.com/clap-rs/clap/discussions)\n          required: true\n        - label: I have searched the [open](https://github.com/clap-rs/clap/issues) and [rejected](https://github.com/clap-rs/clap/issues?q=is%3Aissue+label%3AS-wont-fix+is%3Aclosed) issues\n          required: true\n  - type: input\n    attributes:\n      label: Rust Version\n      description: Output of `rustc -V`\n    validations:\n      required: true\n  - type: input\n    attributes:\n      label: Clap Version\n      description: Can be found in Cargo.lock or Cargo.toml of your project (i.e. `grep -C1 clap Cargo.lock`). PLEASE DO NOT PUT \"latest\" HERE, use precise version. Put `master` (or other branch) if you're using the repo directly.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Minimal reproducible code\n      description: Please write a minimal complete program which has this bug. Do not point to an existing repository.\n      value: |\n        ```rust\n        fn main() {}\n        ```\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Steps to reproduce the bug with the above code\n      description: A command like `cargo run -- options...` or multiple commands.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Actual Behaviour\n      description: When I do like *this*, *that* is happening and I think it shouldn't.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Expected Behaviour\n      description: I think *this* should happen instead.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Additional Context\n      description: Add any other context about the problem here.\n  - type: textarea\n    attributes:\n      label: Debug Output\n      description: |\n        Compile clap with `debug` feature:\n\n        ```toml\n        [dependencies]\n        clap = { version = \"*\", features = [\"debug\"] }\n        ```\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\ncontact_links:\n  - name: Ask a question\n    about: For support or brainstorming\n    url: https://github.com/clap-rs/clap/discussions/new\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: Feature request\ndescription: Suggest an idea for this project\nlabels: [\"C-enhancement\", \"S-triage\"]\nbody:\n  - type: checkboxes\n    attributes:\n      label: Please complete the following tasks\n      options:\n        - label: I have searched the [discussions](https://github.com/clap-rs/clap/discussions)\n          required: true\n        - label: I have searched the [open](https://github.com/clap-rs/clap/issues) and [rejected](https://github.com/clap-rs/clap/issues?q=is%3Aissue+label%3AS-wont-fix+is%3Aclosed) issues\n          required: true\n  - type: input\n    attributes:\n      label: Clap Version\n      description: Can be found in Cargo.lock or Cargo.toml of your project (i.e. `grep clap Cargo.lock`). PLEASE DO NOT PUT \"latest\" HERE, use precise version. Put `master` (or other branch) if you're using the repo directly.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Describe your use case\n      description: Describe the problem you're trying to solve. This is not mandatory and we *do* consider features without a specific use case, but real problems have priority.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Describe the solution you'd like\n      description: Please explain what the wanted solution should look like. You are **strongly encouraged** to attach a snippet of (pseudo)code.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Alternatives, if applicable\n      description: A clear and concise description of any alternative solutions or features you've managed to come up with.\n  - type: textarea\n    attributes:\n      label: Additional Context\n      description: Add any other context about the feature request here.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\nThanks for helping out!\n\nPlease link the appropriate issue from your PR.\n\nIf you don't have an issue, we'd recommend starting with one first so the PR can focus on the\nimplementation (unless its an obvious bug or documentation fix that will have\nlittle conversation).\n-->\n"
  },
  {
    "path": ".github/renovate.json5",
    "content": "{\n  schedule: [\n    'before 5am on the first day of the month',\n  ],\n  semanticCommits: 'enabled',\n  commitMessageLowerCase: 'never',\n  configMigration: true,\n  dependencyDashboard: true,\n  \"pre-commit\": {\n    enabled: true\n  },\n  customManagers: [\n    {\n      customType: 'regex',\n      managerFilePatterns: [\n        '/^rust-toolchain\\\\.toml$/',\n        '/Cargo.toml$/',\n        '/clippy.toml$/',\n        '/^Makefile$/',\n        '/^tests/derive_ui.rs$/',\n        '/\\\\.clippy.toml$/',\n        '/^\\\\.github/workflows/ci.yml$/',\n        '/^\\\\.github/workflows/rust-next.yml$/',\n      ],\n      matchStrings: [\n        'STABLE.*?(?<currentValue>\\\\d+\\\\.\\\\d+(\\\\.\\\\d+)?)',\n        '(?<currentValue>\\\\d+\\\\.\\\\d+(\\\\.\\\\d+)?).*?STABLE',\n      ],\n      depNameTemplate: 'STABLE',\n      packageNameTemplate: 'rust-lang/rust',\n      datasourceTemplate: 'github-releases',\n    },\n    {\n      customType: 'regex',\n      managerFilePatterns: [\n        '/^\\\\.github/workflows/pre-commit.yml$/',\n      ],\n      matchStrings: [\n        'prek-version.*?(?<currentValue>\\\\d+\\\\.\\\\d+(\\\\.\\\\d+)?)',\n      ],\n      depNameTemplate: 'prek',\n      packageNameTemplate: 'j178/prek',\n      datasourceTemplate: 'github-releases',\n    },\n  ],\n  packageRules: [\n    {\n      commitMessageTopic: 'Rust Stable',\n      matchManagers: [\n        'custom.regex',\n      ],\n      matchDepNames: [\n        'STABLE',\n      ],\n      extractVersion: '^(?<version>\\\\d+\\\\.\\\\d+)',  // Drop the patch version\n      schedule: [\n        '* * * * *',\n      ],\n      automerge: true,\n    },\n    {\n      commitMessageTopic: 'Prek',\n      matchManagers: [\n        'custom.regex',\n      ],\n      matchDepNames: [\n        'prek',\n      ],\n      extractVersion: '^(?<version>\\\\d+\\\\.\\\\d+\\\\.\\\\d+)',\n      schedule: [\n        '* * * * *',\n      ],\n      automerge: true,\n    },\n    // Goals:\n    // - Keep version reqs low, ignoring compatible normal/build dependencies\n    // - Take advantage of latest dev-dependencies\n    // - Rollup safe upgrades to reduce CI runner load\n    // - Help keep number of versions down by always using latest breaking change\n    // - Have lockfile and manifest in-sync\n    {\n      matchManagers: [\n        'cargo',\n      ],\n      matchDepTypes: [\n        'build-dependencies',\n        'dependencies',\n      ],\n      matchCurrentVersion: '>=0.1.0',\n      matchUpdateTypes: [\n        'patch',\n      ],\n      enabled: false,\n    },\n    {\n      matchManagers: [\n        'cargo',\n      ],\n      matchDepTypes: [\n        'build-dependencies',\n        'dependencies',\n      ],\n      matchCurrentVersion: '>=1.0.0',\n      matchUpdateTypes: [\n        'minor',\n        'patch',\n      ],\n      enabled: false,\n    },\n    {\n      matchManagers: [\n        'cargo',\n      ],\n      matchDepTypes: [\n        'dev-dependencies',\n      ],\n      matchCurrentVersion: '>=0.1.0',\n      matchUpdateTypes: [\n        'patch',\n      ],\n      automerge: true,\n      groupName: 'compatible (dev)',\n    },\n    {\n      matchManagers: [\n        'cargo',\n      ],\n      matchDepTypes: [\n        'dev-dependencies',\n      ],\n      matchCurrentVersion: '>=1.0.0',\n      matchUpdateTypes: [\n        'minor',\n        'patch',\n      ],\n      automerge: true,\n      groupName: 'compatible (dev)',\n    },\n  ],\n}\n"
  },
  {
    "path": ".github/settings.yml",
    "content": "# These settings are synced to GitHub by https://probot.github.io/apps/settings/\n\nrepository:\n  description: \"A full featured, fast Command Line Argument Parser for Rust\"\n  homepage: \"docs.rs/clap\"\n  topics: \"rust cli command-line argparse clap\"\n  has_issues: true\n  has_projects: false\n  has_wiki: false\n  has_downloads: true\n  default_branch: master\n\n  # Preference: people do clean commits\n  allow_merge_commit: true\n  # Backup in case we need to clean up commits\n  allow_squash_merge: true\n  # Not really needed\n  allow_rebase_merge: false\n\n  allow_auto_merge: true\n  delete_branch_on_merge: true\n\n  squash_merge_commit_title: \"PR_TITLE\"\n  squash_merge_commit_message: \"PR_BODY\"\n  merge_commit_message: \"PR_BODY\"\n\n#labels:\n#  - name: \"A-builder\"\n#    description: \"Area: Builder API\"\n#    color: '#f7e101'\n#  - name: \"A-derive\"\n#    description: \"Area: #[derive]` macro API\"\n#    color: '#f7e101'\n#  - name: \"A-docs\"\n#    description: \"Area: documentation, including docs.rs, readme, examples, etc...\"\n#    color: '#f7e101'\n#  - name: \"A-completion\"\n#    description: \"Area: completion generator\"\n#    color: '#f7e101'\n#  - name: \"A-help\"\n#    description: \"Area: Help or usage messages\"\n#    color: '#f7e101'\n#  - name: \"A-meta\"\n#    description: \"Area: administrative question or tracking issue\"\n#    color: '#f7e101'\n#  - name: \"A-parsing\"\n#    description: \"Area: Parser's logic and needs it changed somehow.\"\n#    color: '#f7e101'\n#  - name: \"A-validators\"\n#    description: \"Area: ArgMatches validation logic\n#    color: '#f7e101'\n#  - name: \"C-bug\"\n#    description: \"Category: Things not working as expected\"\n#    color: '#f5f1fd'\n#  - name: \"C-enhancement\"\n#    description: \"Category: Raise on the bar on expectations\"\n#    color: '#f5f1fd'\n#  - name: \"C-tracking-issue\"\n#    description: \"Category: A tracking issue for an unstable feature\"\n#    color: '#f5f1fd'\n#  - name: \"C-dependencies\"\n#    description: \"Category: Updating dependencies\"\n#    color: '#f5f1fd'\n#  - name: \"E-easy\"\n#    description: \"Call for participation: Experience needed to fix: Easy / not much\"\n#    color: '#02E10C'\n#  - name: \"E-medium\"\n#    description: \"Call for participation: Experience needed to fix: Medium / intermediate\"\n#    color: '#02E10C'\n#  - name: \"E-hard\"\n#    description: \"Call for participation: Experience needed to fix: Hard / a lot\"\n#    color: '#02E10C'\n#  - name: \"E-help-wanted\"\n#    description: \"Call for participation: Help is requested to fix this issue.\"\n#    color: '#02E10C'\n#  - name: \"S-triage\"\n#    description: \"Status: New; needs maintainer attention.\"\n#    color: '#D3DDDD'\n#  - name: \"S-blocked\"\n#    description: \"Status: Blocked on something else such as an RFC or other implementation work.\"\n#    color: '#D3DDDD'\n#  - name: \"S-experimental\"\n#    description: \"Status: Ongoing experiment that does not require reviewing and won't be merged in its current state.\"\n#    color: '#D3DDDD'\n#  - name: \"S-waiting-on-design\"\n#    description: \"Status: Waiting on user-facing design to be resolved before implementing\"\n#    color: '#D3DDDD'\n#  - name: \"S-waiting-on-decision\"\n#    description: \"Status: Waiting on a go/no-go before implementing\"\n#    color: '#D3DDDD'\n#  - name: \"S-waiting-on-mentor\"\n#    description: \"Status: Needs elaboration on the details before doing a 'Call for participation'\"\n#    color: '#D3DDDD'\n#  - name: \"S-waiting-on-author\"\n#    description: \"Status: This is awaiting some action (such as code changes or more information) from the author.\"\n#    color: '#D3DDDD'\n#  - name: \"M-breaking-change\"\n#    description: \"Meta: Implementing or merging this will introduce a breaking change.\"\n#    color: '#E10C02'\n#  - name: \"M-unreviewed\"\n#    description: \"Meta: Request for post-merge review.\"\n#    color: '#E10C02'\n\n# This serves more as documentation.\n# Branch protection API was replaced by rulesets but settings isn't updated.\n# See https://github.com/repository-settings/app/issues/825\n#\n# branches:\n#   - name: master\n#     protection:\n#       required_pull_request_reviews: null\n#       required_conversation_resolution: true\n#       required_status_checks:\n#         # Required. Require branches to be up to date before merging.\n#         strict: false\n#         contexts: [\"CI\", \"Spell Check with Typos\"]\n#       enforce_admins: false\n#       restrictions: null\n"
  },
  {
    "path": ".github/workflows/audit.yml",
    "content": "name: Security audit\n\npermissions:\n  contents: read\n\non:\n  pull_request:\n    paths:\n      - '**/Cargo.toml'\n      - '**/Cargo.lock'\n  push:\n    branches:\n    - master\n\nenv:\n  RUST_BACKTRACE: 1\n  CARGO_TERM_COLOR: always\n  CLICOLOR: 1\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\njobs:\n  security_audit:\n    permissions:\n      issues: write # to create issues (actions-rs/audit-check)\n      checks: write # to create check (actions-rs/audit-check)\n    runs-on: ubuntu-latest\n    # Prevent sudden announcement of a new advisory from failing ci:\n    continue-on-error: true\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - uses: actions-rs/audit-check@v1\n      with:\n        token: ${{ secrets.GITHUB_TOKEN }}\n\n  cargo_deny:\n    permissions:\n      issues: write # to create issues (actions-rs/audit-check)\n      checks: write # to create check (actions-rs/audit-check)\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        checks:\n          - bans licenses sources\n    steps:\n    - uses: actions/checkout@v6\n    - uses: EmbarkStudios/cargo-deny-action@v2\n      with:\n        command: check ${{ matrix.checks }}\n        rust-version: stable\n"
  },
  {
    "path": ".github/workflows/bench-baseline.yml",
    "content": "name: Benchmark Baseline\n\npermissions:\n  contents: read\n\non:\n  push:\n    branches: master\n\njobs:\n  bench:\n    name: Binary Size\n    permissions:\n      checks: write\n    strategy:\n      matrix:\n        build: [linux]\n        include:\n        - build: linux\n          os: ubuntu-latest\n    runs-on: \"${{ matrix.os }}\"\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: stable\n    - uses: Swatinem/rust-cache@v2\n    - name: Install Bencher\n      uses: bencherdev/bencher@main\n    - name: Build\n      run: \"cargo build --package clap --example git-derive -F derive --release\"\n      env:\n        CARGO_PROFILE_RELEASE_STRIP: true\n    - name: Report\n      run: |\n        bencher run \\\n        --project $(echo \"${{ github.repository }}\" | sed 's/\\//-/g') \\\n        --branch \"${{ github.ref_name }}\" \\\n        --testbed \"${{ matrix.os }}\" \\\n        --token '${{ secrets.BENCHER_API_TOKEN }}' \\\n        --github-actions '${{ secrets.GITHUB_TOKEN }}' \\\n        --adapter json \\\n        --file-size target/release/examples/git-derive\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\npermissions:\n  contents: read\n\non:\n  pull_request:\n  push:\n    branches:\n      - \"*master\"\n\nenv:\n  RUST_BACKTRACE: 1\n  CARGO_TERM_COLOR: always\n  CLICOLOR: 1\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\njobs:\n  ci:\n    permissions:\n      contents: none\n    name: CI\n    needs: [test, shell-integration, shell-integration-nu, check, ui, minimal-versions, lockfile, docs, rustfmt, clippy, cffconvert]\n    runs-on: ubuntu-latest\n    if: \"always()\"\n    steps:\n      - name: Failed\n        run: exit 1\n        if: \"contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped')\"\n  test:\n    name: Test\n    strategy:\n      matrix:\n        build: [linux, windows, mac, minimal, default, next]\n        include:\n        - build: linux\n          os: ubuntu-latest\n          rust: \"stable\"\n          features: \"full\"\n        - build: windows\n          os: windows-latest\n          rust: \"stable\"\n          features: \"full\"\n        - build: mac\n          os: macos-latest\n          rust: \"stable\"\n          features: \"full\"\n        - build: minimal\n          os: ubuntu-latest\n          rust: \"stable\"\n          features: \"minimal\"\n        - build: default\n          os: ubuntu-latest\n          rust: \"stable\"\n          features: \"default\"\n        - build: next\n          os: ubuntu-latest\n          rust: \"stable\"\n          features: \"next\"\n    continue-on-error: ${{ matrix.rust != 'stable' }}\n    runs-on: ${{ matrix.os }}\n    env:\n      # Reduce amount of data cached\n      CARGO_PROFILE_DEV_DEBUG: line-tables-only\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: ${{ matrix.rust }}\n    - uses: Swatinem/rust-cache@v2\n    - name: Build\n      run: make build-${{matrix.features}}\n    - name: Test\n      run: make test-${{matrix.features}}\n    - name: Test (benches)\n      run: make test-${{matrix.features}} ARGS='--workspace --benches'\n    - name: Test (ultra-minimal)\n      if: matrix.build == 'minimal'\n      run: make test-minimal ARGS='--manifest-path Cargo.toml'\n    - name: Test dynamic completions\n      run: cargo test -p clap_complete -F unstable-dynamic\n  shell-integration:\n    name: Shell Integration\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: stable\n    - uses: Swatinem/rust-cache@v2\n    - name: Install shells\n      if: runner.os == 'Linux'\n      run: sudo apt-get install -y elvish fish zsh\n    - name: clap_complete\n      run: cargo test -p clap_complete -F unstable-dynamic -F unstable-shell-tests\n  shell-integration-nu:\n    name: Nushell Integration\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: stable\n    - uses: Swatinem/rust-cache@v2\n    - name: clap_complete_nu\n      run: cargo test -p clap_complete_nushell -F unstable-shell-tests\n  check:\n    name: Check\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        build: [msrv, wasm, wasm-wasi, debug, release]\n        include:\n          - build: msrv\n            rust: \"1.85\"  # MSRV\n            target: x86_64-unknown-linux-gnu\n            features: full\n          - build: wasm\n            rust: stable\n            target: wasm32-unknown-unknown\n            features: wasm\n          - build: wasm-wasi\n            rust: stable\n            target: wasm32-wasip2\n            features: wasm\n          - build: debug\n            rust: stable\n            target: x86_64-unknown-linux-gnu\n            features: debug\n          - build: release\n            rust: stable\n            target: x86_64-unknown-linux-gnu\n            features: release\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n      - name: Install rust\n        uses: dtolnay/rust-toolchain@stable\n        with:\n          toolchain: ${{ matrix.rust }}\n          targets: ${{ matrix.target }}\n      - uses: Swatinem/rust-cache@v2\n      - name: Check\n        run: make check-${{ matrix.features }}\n        env:\n          TOOLCHAIN_TARGET: ${{ matrix.target }}\n  ui:\n    name: UI Tests\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        features: [default, next]\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: \"1.94\"  # STABLE\n    - uses: Swatinem/rust-cache@v2\n    - name: UI Tests\n      run: make test-ui-${{ matrix.features }}\n  minimal-versions:\n    name: Minimal versions\n    strategy:\n      matrix:\n        os: [\"ubuntu-latest\"]\n    runs-on: ${{ matrix.os }}\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install stable Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: stable\n    - name: Install nightly Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: nightly\n    - name: Downgrade dependencies to minimal versions\n      run: cargo +nightly generate-lockfile -Z minimal-versions\n    - name: Compile with minimal versions\n      run: cargo +stable check --workspace --all-features --locked --exclude clap_complete_nushell --exclude clap_bench\n  lockfile:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: stable\n    - uses: Swatinem/rust-cache@v2\n    - name: \"Is lockfile updated?\"\n      run: cargo update --workspace --locked\n  docs:\n    name: Docs\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: \"1.94\"  # STABLE\n    - uses: Swatinem/rust-cache@v2\n    - name: Check documentation\n      env:\n        RUSTDOCFLAGS: -D warnings\n      run: make doc\n  rustfmt:\n    name: rustfmt\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: \"1.94\"  # STABLE\n        components: rustfmt\n    - uses: Swatinem/rust-cache@v2\n    - name: Check formatting\n      run: cargo fmt --check\n  clippy:\n    name: clippy\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: \"1.94\"  # STABLE\n        components: clippy\n    - uses: Swatinem/rust-cache@v2\n    - name: Lint (ultra-minimal)\n      run: make clippy-minimal ARGS='--manifest-path Cargo.toml'\n    - name: Lint (minimal)\n      run: make clippy-minimal\n    - name: Lint (all)\n      run: make clippy-full\n    - name: Lint (release)\n      run: make clippy-release\n  cffconvert:\n    name: cffconvert\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n        with:\n          persist-credentials: false\n      - name: CFF validation\n        uses: citation-file-format/cffconvert-github-action@2.0.0\n        with:\n          args: --validate\n"
  },
  {
    "path": ".github/workflows/committed.yml",
    "content": "# Not run as part of pre-commit checks because they don't handle sending the correct commit\n# range to `committed`\nname: Lint Commits\non: [pull_request]\n\npermissions:\n  contents: read\n\nenv:\n  RUST_BACKTRACE: 1\n  CARGO_TERM_COLOR: always\n  CLICOLOR: 1\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\njobs:\n  committed:\n    name: Lint Commits\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout Actions Repository\n      uses: actions/checkout@v6\n      with:\n        fetch-depth: 0\n    - name: Lint Commits\n      uses: crate-ci/committed@master\n"
  },
  {
    "path": ".github/workflows/post-release.yml",
    "content": "name: post-release\non:\n  push:\n    tags:\n    - \"v*\"\npermissions:\n  contents: read\n\njobs:\n  create-release:\n    permissions:\n      contents: write  # for actions/create-release to create a release\n    name: create-release\n    runs-on: ubuntu-latest\n    outputs:\n      upload_url: ${{ steps.release.outputs.upload_url }}\n      release_version: ${{ env.RELEASE_VERSION }}\n    steps:\n    - name: Get the release version from the tag\n      shell: bash\n      if: env.RELEASE_VERSION == ''\n      run: |\n        # See: https://github.community/t5/GitHub-Actions/How-to-get-just-the-tag-name/m-p/32167/highlight/true#M1027\n        echo \"RELEASE_VERSION=${GITHUB_REF#refs/tags/}\" >> $GITHUB_ENV\n        echo \"version is: ${{ env.RELEASE_VERSION }}\"\n    - name: Checkout repository\n      uses: actions/checkout@v6\n      with:\n        fetch-depth: 1\n    - name: Generate Release Notes\n      run: |\n        ./.github/workflows/release-notes.py --tag ${{ env.RELEASE_VERSION }} --output notes-${{ env.RELEASE_VERSION }}.md\n        cat notes-${{ env.RELEASE_VERSION }}.md\n    - name: Create GitHub release\n      id: release\n      uses: actions/create-release@v1\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      with:\n        tag_name: ${{ env.RELEASE_VERSION }}\n        release_name: ${{ env.RELEASE_VERSION }}\n        body_path: notes-${{ env.RELEASE_VERSION }}.md\n"
  },
  {
    "path": ".github/workflows/pre-commit.yml",
    "content": "name: pre-commit\n\npermissions: {} # none\n\non:\n  pull_request:\n  push:\n    branches: [master]\n\nenv:\n  RUST_BACKTRACE: 1\n  CARGO_TERM_COLOR: always\n  CLICOLOR: 1\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\njobs:\n  pre-commit:\n    permissions:\n      contents: read\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v6\n    - uses: j178/prek-action@v1\n      with:\n        prek-version: '0.2.27'\n"
  },
  {
    "path": ".github/workflows/release-notes.py",
    "content": "#!/usr/bin/env python3\n\nimport argparse\nimport re\nimport pathlib\nimport sys\n\n\n_STDIO = pathlib.Path(\"-\")\n\n\ndef main():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"-i\", \"--input\", type=pathlib.Path, default=\"CHANGELOG.md\")\n    parser.add_argument(\"--tag\", required=True)\n    parser.add_argument(\"-o\", \"--output\", type=pathlib.Path, required=True)\n    args = parser.parse_args()\n\n    if args.input == _STDIO:\n        lines = sys.stdin.readlines()\n    else:\n        with args.input.open() as fh:\n            lines = fh.readlines()\n    version = args.tag.lstrip(\"v\")\n\n    note_lines = []\n    for line in lines:\n        if line.startswith(\"## \") and version in line:\n            note_lines.append(line)\n        elif note_lines and line.startswith(\"## \"):\n            break\n        elif note_lines:\n            note_lines.append(line)\n\n    notes = \"\".join(note_lines).strip()\n    if args.output == _STDIO:\n        print(notes)\n    else:\n        args.output.write_text(notes)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": ".github/workflows/rust-next.yml",
    "content": "name: rust-next\n\npermissions:\n  contents: read\n\non:\n  schedule:\n  - cron: '3 3 3 * *'\n\nenv:\n  RUST_BACKTRACE: 1\n  CARGO_TERM_COLOR: always\n  CLICOLOR: 1\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\njobs:\n  test:\n    name: Test\n    strategy:\n      matrix:\n        build: [stable, linux, windows, mac, nightly, minimal, default, next]\n        include:\n        - build: stable\n          os: ubuntu-latest\n          rust: \"stable\"\n          features: \"full\"\n        - build: linux\n          os: ubuntu-latest\n          rust: \"beta\"\n          features: \"full\"\n        - build: windows\n          os: windows-latest\n          rust: \"beta\"\n          features: \"full\"\n        - build: mac\n          os: macos-latest\n          rust: \"beta\"\n          features: \"full\"\n        - build: nightly\n          os: ubuntu-latest\n          rust: \"nightly\"\n          features: \"full\"\n        - build: minimal\n          os: ubuntu-latest\n          rust: \"stable\"\n          features: \"minimal\"\n        - build: default\n          os: ubuntu-latest\n          rust: \"stable\"\n          features: \"default\"\n        - build: next\n          os: ubuntu-latest\n          rust: \"stable\"\n          features: \"next\"\n    continue-on-error: ${{ matrix.rust != 'stable' }}\n    runs-on: ${{ matrix.os }}\n    env:\n      # Reduce amount of data cached\n      CARGO_PROFILE_DEV_DEBUG: line-tables-only\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: ${{ matrix.rust }}\n    - uses: Swatinem/rust-cache@v2\n    - name: Install shells\n      if: runner.os == 'Linux'\n      run: sudo apt-get install -y elvish fish zsh\n    - name: Build\n      run: make build-${{matrix.features}}\n    - name: Test\n      run: make test-${{matrix.features}}\n    - name: Test (benches)\n      run: make test-${{matrix.features}} ARGS='--workspace --benches'\n    - name: Test (ultra-minimal)\n      if: matrix.build == 'minimal'\n      run: make test-minimal ARGS='--manifest-path Cargo.toml'\n    - name: Test dynamic completions\n      run: cargo test -p clap_complete -F unstable-dynamic\n  latest:\n    name: \"Check latest dependencies\"\n    strategy:\n      matrix:\n        build: [stable]\n        include:\n        - build: stable\n          os: ubuntu-latest\n          rust: \"stable\"\n          features: \"full\"\n    runs-on: ${{ matrix.os }}\n    env:\n      CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS: allow\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: stable\n    - uses: Swatinem/rust-cache@v2\n    - uses: taiki-e/install-action@cargo-hack\n    - name: Install shells\n      if: runner.os == 'Linux'\n      run: sudo apt-get install -y elvish fish zsh\n    - name: Update dependencies\n      run: cargo update\n    - name: Build\n      run: make build-${{matrix.features}}\n    - name: Test\n      run: make test-${{matrix.features}}\n    - name: Test (benches)\n      run: make test-${{matrix.features}} ARGS='--workspace --benches'\n    - name: Test (ultra-minimal)\n      if: matrix.build == 'minimal'\n      run: make test-minimal ARGS='--manifest-path Cargo.toml'\n    - name: Test dynamic completions\n      run: cargo test -p clap_complete -F unstable-dynamic\n"
  },
  {
    "path": ".github/workflows/spelling.yml",
    "content": "name: Spelling\n\npermissions:\n  contents: read\n\non: [pull_request]\n\nenv:\n  RUST_BACKTRACE: 1\n  CARGO_TERM_COLOR: always\n  CLICOLOR: 1\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\njobs:\n  spelling:\n    name: Spell Check with Typos\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout Actions Repository\n      uses: actions/checkout@v6\n    - name: Spell Check Repo\n      uses: crate-ci/typos@master\n"
  },
  {
    "path": ".github/workflows/template.yml",
    "content": "name: Template Update\n\npermissions:\n  contents: read\n\non:\n  schedule:\n  - cron: '1 1 1 * *'\n  workflow_dispatch:\n\nenv:\n  RUST_BACKTRACE: 1\n  CARGO_TERM_COLOR: always\n  CLICOLOR: 1\n  TEMPLATE_URL: \"https://github.com/epage/_rust.git\"\n  TEMPLATE_BRANCH: \"main\"\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\njobs:\n  update:\n    permissions:\n      security-events: write # to create PR\n      pull-requests: write\n      contents: write # to push the branch\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n      with:\n        fetch-depth: 0\n    - name: Configure git\n      run: |\n        git config --global user.name '${{ github.actor }}'\n        git config --global user.email '<>'\n    - name: Fetch template\n      run: \"git remote add template ${{ env.TEMPLATE_URL }} && git fetch template ${{ env.TEMPLATE_BRANCH }}\"\n    - name: Merge template\n      run: \"git checkout -b template-update && git merge template/${{ env.TEMPLATE_BRANCH }} -m 'chore: Update from template'\"\n    - name: Clear any existing branch\n      run: \"git push origin --delete template-update\"\n      continue-on-error: true\n      env:\n        GH_TOKEN: ${{ github.token }}\n    - name: Push branch\n      run: \"git push --set-upstream origin template-update\"\n      env:\n        GH_TOKEN: ${{ github.token }}\n    - name: Create PR\n      run: \"gh pr create --head template-update --title 'chore: Update from template' --body ''\"\n      env:\n        GH_TOKEN: ${{ github.token }}\n    - name: Merge PR\n      run: \"gh pr merge --auto --delete-branch\"\n      env:\n        GH_TOKEN: ${{ github.token }}\n"
  },
  {
    "path": ".gitignore",
    "content": "target\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "exclude: |\n  (?x)^(\n    tests/.*|\n    CHANGELOG.md\n  )$\ndefault_install_hook_types: [\"pre-commit\", \"commit-msg\"]\nrepos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v6.0.0\n    hooks:\n    - id: check-yaml\n    - id: check-json\n    - id: check-toml\n    - id: check-merge-conflict\n    - id: check-case-conflict\n    - id: detect-private-key\n  - repo: https://github.com/crate-ci/typos\n    rev: v1.44.0\n    hooks:\n    - id: typos\n  - repo: https://github.com/crate-ci/committed\n    rev: v1.1.11\n    hooks:\n    - id: committed\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/)\nand this project adheres to [Semantic Versioning](https://semver.org/).\n\n## 5.0.0 - TBD\n\n*available through `unstable-v5` feature flag*\n\n### Breaking Changes\n\n- Made `ArgPredicate` `non_exhaustive`\n- *(help)* Change default `Command::term_width` to \"source format\"\n- *(help)* Change default `Command::max_term_width` to 100\n- *(derive)* `Vec<Vec<T>>` types are now assuming to capture occurrences\n- *(derive)* `ValueEnum` variants now use the full doc comment, not summary, for `PossibleValue::help`\n\n### Features\n\n- *(derive)* Group values by their occurrence with `Vec<Vec<T>>`\n\n<!-- next-header -->\n## [Unreleased] - ReleaseDate\n\n## [4.6.0] - 2026-03-12\n\n### Compatibility\n\n- Update MSRV to 1.85\n\n## [4.5.61] - 2026-03-12\n\n### Internal\n\n- Update dependencies\n\n## [4.5.60] - 2026-02-19\n\n### Fixes\n\n- *(help)* Quote empty default values, possible values\n\n## [4.5.59] - 2026-02-16\n\n### Fixes\n\n- `Command::ignore_errors` no longer masks help/version on subcommands\n\n## [4.5.58] - 2026-02-11\n\n## [4.5.57] - 2026-02-03\n\n### Fixes\n\n- Regression from 4.5.55 where having an argument with `.value_terminator(\"--\")` caused problems with an argument with `.last(true)`\n\n## [4.5.56] - 2026-01-29\n\n### Fixes\n\n- On conflict error, don't show conflicting arguments in the usage\n\n## [4.5.55] - 2026-01-27\n\n### Fixes\n\n- Fix inconsistency in precedence between positionals with a `value_terminator(\"--\")` and escapes (`--`) where `./foo -- bar` means the first arg is empty, rather than escaping future args\n\n## [4.5.54] - 2026-01-02\n\n### Fixes\n\n- *(help)* Move `[default]` to its own paragraph when `PossibleValue::help` is present in `--help`\n\n## [4.5.53] - 2025-11-19\n\n### Features\n\n- Add `default_values_if`, `default_values_ifs`\n\n## [4.5.52] - 2025-11-17\n\n### Fixes\n\n- Don't panic when `args_conflicts_with_subcommands` conflicts with an `ArgGroup`\n\n## [4.5.51] - 2025-10-29\n\n### Fixes\n\n- *(help)* Correctly calculate padding for short flags that take a value\n- *(help)* Don't panic on short flags using `ArgAction::Count`\n\n## [4.5.50] - 2025-10-20\n\n### Features\n\n- Accept `Cow` where `String` and `&str` are accepted\n\n## [4.5.49] - 2025-10-13\n\n### Fixes\n\n- *(help)* Correctly wrap when ANSI escape codes are present\n\n## [4.5.48] - 2025-09-19\n\n### Documentation\n\n- Add a new CLI Concepts document as another way of framing clap\n- Expand the `typed_derive` cookbook entry\n\n## [4.5.47] - 2025-09-02\n\n### Features\n\n- Added `impl FromArgMatches for ()`\n- Added `impl Args for ()`\n- Added `impl Subcommand for ()`\n- Added `impl FromArgMatches for Infallible`\n- Added `impl Subcommand for Infallible`\n\n### Fixes\n\n- *(derive)* Update runtime error text to match `clap`\n\n## [4.5.46] - 2025-08-26\n\n### Features\n\n- Expose `StyledStr::push_str`\n\n## [4.5.45] - 2025-08-12\n\n### Fixes\n\n- *(unstable-v5)* `ValueEnum` variants now use the full doc comment, not summary, for `PossibleValue::help`\n\n## [4.5.44] - 2025-08-11\n\n### Features\n\n- Add `Command::mut_subcommands`\n\n## [4.5.43] - 2025-08-06\n\n### Fixes\n\n- *(help)* In long help, list Possible Values before defaults, rather than after, for a more consistent look\n\n## [4.5.42] - 2025-07-30\n\n### Fixes\n\n- Include subcommand visible long aliases in `--help`\n\n## [4.5.41] - 2025-07-09\n\n### Features\n\n- Add `Styles::context` and `Styles::context_value` to customize the styling of `[default: value]` like notes in the `--help`\n\n## [4.5.40] - 2025-06-09\n\n### Features\n\n- Support quoted ids in `arg!()` macro (e.g. `arg!(\"check-config\": ...)`)\n\n## [4.5.39] - 2025-05-27\n\n### Fixes\n\n- *(help)* Show short flag aliases before long\n- *(help)* Merge the short and long flag alias lists\n\n## [4.5.38] - 2025-05-11\n\n### Fixes\n\n- *(help)* When showing aliases, include leading `--` or `-`\n\n## [4.5.37] - 2025-04-18\n\n### Features\n\n- Added `ArgMatches::try_clear_id()`\n\n## [4.5.36] - 2025-04-11\n\n### Fixes\n\n- *(help)* Revert 4.5.35's \"Don't leave space for shorts if there are none\" for now\n\n## [4.5.35] - 2025-04-01\n\n### Fixes\n\n- *(help)* Align positionals and flags when put in the same `help_heading`\n- *(help)* Don't leave space for shorts if there are none\n\n## [4.5.34] - 2025-03-27\n\n### Fixes\n\n- *(help)* Don't add extra blank lines with `flatten_help(true)` and subcommands without arguments\n\n## [4.5.33] - 2025-03-26\n\n### Fixes\n\n- *(error)* When showing the usage of a suggestion for an unknown argument, don't show the group\n\n## [4.5.32] - 2025-03-10\n\n### Features\n\n- Add `Error::remove`\n\n### Documentation\n\n- *(cookbook)* Switch from `humantime` to `jiff`\n- *(tutorial)* Better cover required vs optional\n\n### Internal\n\n- Update `pulldown-cmark`\n\n## [4.5.31] - 2025-02-24\n\n### Features\n\n- Add `ValueParserFactory` for `Saturating<T>`\n\n## [4.5.30] - 2025-02-17\n\n### Fixes\n\n- *(assert)* Allow `num_args(0..=1)` to be used with `SetTrue`\n- *(assert)* Clean up rendering of `takes_values` assertions\n\n## [4.5.29] - 2025-02-11\n\n### Fixes\n\n- Change `ArgMatches::args_present` so not-present flags are considered not-present (matching the documentation)\n\n## [4.5.28] - 2025-02-03\n\n### Features\n\n- *(derive)* Unstable support for full markdown syntax for doc comments, enabled with `unstable-markdown`\n\n## [4.5.27] - 2025-01-20\n\n### Documentation\n\n- Iterate on tutorials and reference based on feedback\n\n## [4.5.26] - 2025-01-09\n\n### Fixes\n\n- *(error)* Reduce binary size with the `suggestions` feature\n\n## [4.5.25] - 2025-01-09\n\n### Fixes\n\n- *(help)* Reduce binary size\n\n## [4.5.24] - 2025-01-07\n\n### Fixes\n\n- *(parser)* Correctly handle defaults with `ignore_errors(true)` and when a suggestion is provided for an unknown argument\n\n## [4.5.23] - 2024-12-05\n\n### Fixes\n\n- *(parser)* When check `allow_negative_numbers`, allow `E` again\n\n## [4.5.22] - 2024-12-03\n\n### Fixes\n\n- *(assert)* Catch bugs with arguments requiring themself\n\n## [4.5.21] - 2024-11-13\n\n### Fixes\n\n- *(parser)* Ensure defaults are filled in on error with `ignore_errors(true)`\n\n## [4.5.20] - 2024-10-08\n\n### Features\n\n- *(unstable)* Add `CommandExt`\n\n## [4.5.19] - 2024-10-01\n\n### Internal\n\n- Update dependencies\n\n## [4.5.18] - 2024-09-20\n\n### Features\n\n- *(builder)* Expose `Arg::get_display_order` and `Command::get_display_order`\n\n## [4.5.17] - 2024-09-04\n\n### Fixes\n\n- *(help)* Style required argument groups\n- *(derive)* Improve error messages when unsupported fields are used\n\n## [4.5.16] - 2024-08-15\n\n### Fixes\n\n- *(derive)* Improve error messages when `derive` feature is missing\n\n## [4.5.15] - 2024-08-10\n\n### Compatiblity\n\n- *(unstable-ext)* `Arg::remove` changed return types\n\n### Fixes\n\n- *(unstable-ext)* Make `Arg::remove` return the removed item\n\n## [4.5.14] - 2024-08-08\n\n### Features\n\n- *(unstable-ext)* Added `Arg::add` for attaching arbitrary state, like completion hints, to `Arg` without `Arg` knowing about it\n\n## [4.5.13] - 2024-07-31\n\n### Fixes\n\n- *(derive)* Improve error message when `#[flatten]`ing an optional `#[group(skip)]`\n- *(help)* Properly wrap long subcommand descriptions in help\n\n## [4.5.12] - 2024-07-31\n\n## [4.5.11] - 2024-07-25\n\n## [4.5.10] - 2024-07-23\n\n## [4.5.9] - 2024-07-09\n\n### Fixes\n\n- *(error)* When defining a custom help flag, be sure to suggest it like we do the built-in one\n\n## [4.5.8] - 2024-06-28\n\n### Fixes\n\n- Reduce extra flushes\n\n## [4.5.7] - 2024-06-10\n\n### Fixes\n\n- Clean up error message when too few arguments for `num_args`\n\n## [4.5.6] - 2024-06-06\n\n## [4.5.5] - 2024-06-06\n\n### Fixes\n\n- Allow `exclusive` to override `required_unless_present`, `required_unless_present_any`, `required_unless_present_all`\n\n## [4.5.4] - 2024-03-25\n\n### Fixes\n\n- *(derive)* Allow non-literal `#[arg(id)]` attributes again\n\n## [4.5.3] - 2024-03-15\n\n### Internal\n\n- *(derive)* Update `heck`\n\n## [4.5.2] - 2024-03-06\n\n### Fixes\n\n- *(macros)* Silence a warning\n\n## [4.5.1] - 2024-02-16\n\n### Fixes\n\n- *(error)* Include suggestion to add `--` even if there is a \"did you mean\" so long as `last` or `trailing_var_arg` is used\n\n## [4.5.0] - 2024-02-08\n\n### Compatibility\n\n- Update MSRV to 1.74\n\n## [4.4.18] - 2024-01-16\n\n### Fixes\n\n- *(error)* When lacking `usage` feature, ensure the list of required arguments is unique\n\n## [4.4.17] - 2024-01-15\n\n### Fixes\n\n- Fix `panic!` when mixing `args_conflicts_with_subcommands` with `ArgGroup` (which is implicit with `derive`) introduced in 4.4.15\n\n## [4.4.16] - 2024-01-12\n\n### Fixes\n\n- Ensure invalid escape sequences in user-defined strings are correctly stripped when terminal doesn't support color\n\n## [4.4.15] - 2024-01-11\n\n### Fixes\n\n- Improve error for `args_conflicts_with_subcommands`\n- Ensure we error for `args_conflicts_with_subcommands` when using subcommand short and long flags\n\n## [4.4.14] - 2024-01-08\n\n### Documentation\n\n- Fix `find` cookbook entry to allow repeats of flags/options\n\n### Features\n\n- Allow `num_args(0)` on options which allows making them emulate being a flag for position-tracking flags\n\n## [4.4.13] - 2024-01-04\n\n### Documentation\n\n- Fix link to structopt migration guide\n\n## [4.4.12] - 2023-12-28\n\n### Performance\n\n- Only ask `TypedValueParser` for possible values if needed\n\n## [4.4.11] - 2023-12-04\n\n### Features\n\n- Add `Command::mut_group`\n\n## [4.4.10] - 2023-11-28\n\n### Documentation\n\n- Link out to changelog\n- Cross link derive's attribute reference to derive tutorial\n\n## [4.4.9] - 2023-11-27\n\n### Fixes\n\n- *(help)* Show correct `Command::about` under flattened headings\n- *(help)* Respect `hide` when flattening subcommands\n\n## [4.4.8] - 2023-11-10\n\n### Features\n\n- Add `Command::flatten_help` to allow `git stash -h` like help for subcommands\n\n## [4.4.7] - 2023-10-24\n\n### Performance\n\n- Reduced code size\n\n## [4.4.6] - 2023-09-28\n\n### Internal\n\n- Upgrade `anstream`\n\n## [4.4.5] - 2023-09-25\n\n### Fixes\n\n- *(parser)* When inferring subcommand `name` or `long_flag`, allow ambiguous-looking matches that unambiguously map back to the same command\n- *(parser)* When inferring subcommand `long_flag`, don't panic\n- *(assert)* Clarify what action is causing a positional that doesn't set values which is especially useful for derive users\n\n## [4.4.4] - 2023-09-18\n\n### Internal\n\n- Update `terminal_size` to 0.3\n\n## [4.4.3] - 2023-09-12\n\n### Documentation\n\n- *(derive)* Clarify use of attributes within the tutorial\n- Split sections in the builder and derive tutorials into separate modules\n\n## [4.4.2] - 2023-08-31\n\n### Performance\n\n- Improve build times by removing `once_cell` dependency\n\n## [4.4.1] - 2023-08-28\n\n### Features\n\n- Stabilize `Command::styles`\n\n## [4.4.0] - 2023-08-24\n\n### compatibility\n\n- update msrv to 1.70.0\n\n## [4.3.24] - 2023-08-23\n\n### Fixes\n\n- Ensure column padding is preserved in `--help` with custom templates\n\n## [4.3.23] - 2023-08-18\n\n### Fixes\n\n- Fixed `UnknownArgumentValueParser` to not error on flag's absence\n\n## [4.3.22] - 2023-08-17\n\n### Features\n\n- Add `UnknownArgumentValueParser` for injecting errors for improving the experience with errors\n\n## [4.3.21] - 2023-08-08\n\n### Features\n\n- Expose `TryMapValueParser` so the type can be named\n\n## [4.3.20] - 2023-08-08\n\n### Features\n\n- `Command::mut_args` for modifying all arguments en masse\n\n## [4.3.19] - 2023-07-21\n\n### Fixes\n\n- *(parse)* Respect `value_terminator` even in the presence of later multiple-value positional arguments\n\n## [4.3.18] - 2023-07-21\n\n### Fixes\n\n- *(parse)* Suggest `--` in fewer places where it won't work\n\n## [4.3.17] - 2023-07-19\n\n### Fixes\n\n- *(help)* Address a regression in wrapping `PossibleValue` descriptions in `--help`\n\n## [4.3.16] - 2023-07-18\n\n### Fixes\n\n- Don't assert when stateful value parsers fail on defaults (e.g. checking if a path exists)\n\n## [4.3.15] - 2023-07-18\n\n### Features\n\n- *(unstable-styles)* Re-export `anstyle`\n\n### Documentation\n\n- *(unstable-styles)* Provide more examples\n\n## [4.3.14] - 2023-07-17\n\n### Features\n\n- `ArgAction::HelpShort` and `ArgAction::HelpLong` for explicitly specifying which style of help to display\n\n### Fixes\n\n- Skip `[OPTIONS]` in usage if a help or version `ArgAction` is used\n\n## [4.3.13] - 2023-07-17\n\n## [4.3.12] - 2023-07-14\n\n### Fixes\n\n- *(derive)* Don't error on enum variant field attributes\n\n## [4.3.11] - 2023-07-05\n\n### Features\n\n- *(derive)* Support fields wrapped in `num::Wrapping`, `Box`, or `Arc`\n- *(derive)* Support `Box<str>`, `Box<OsStr>`, and `Box<Path>`\n\n## [4.3.10] - 2023-06-30\n\n### Performance\n\n- Drop a dependency, reducing binary size by 1.3 KiB\n\n## [4.3.9] - 2023-06-28\n\n### Fixes\n\n- `Command::ignore_errors` no longer masks help/version\n\n## [4.3.8] - 2023-06-23\n\n### Fixes\n\n- Error on ambiguity with `infer_long_arg`, rather than arbitrarily picking one, matching the documentation and subcommand's behavior\n\n## [4.3.7] - 2023-06-23\n\n### Documentation\n\n- Further clarify magic behavior in derive tutorial\n- Further clarify derive API's relationship to builder within the tutorial\n\n## [4.3.6] - 2023-06-23\n\n### Documentation\n\n- Suggest `clio`\n\n## [4.3.5] - 2023-06-20\n\n- `ColorChoice::possible_values` is added to simplify things for builder users\n\n### Fixes\n\n- `ColorChoice::to_possible_value` no longer includes descriptions, encouraging shorter help where possible\n\n## [4.3.4] - 2023-06-14\n\n### Features\n\n- Add `Error::exit_code`\n\n## [4.3.3] - 2023-06-09\n\n### Features\n\n- `Command::defer` for delayed initialization of subcommands to reduce startup times of large applications like deno\n\n## [4.3.2] - 2023-06-05\n\n### Fixes\n\n- *(derive)* Don't produce `unused_equalifications` warnings when someone brings a clap type into scope\n\n## [4.3.1] - 2023-06-02\n\n### Performance\n\n- *(derive)* Reduce the amount of generated code\n\n## [4.3.0] - 2023-05-19\n\n### Fixes\n\n- *(assert)* Allow multiple, value-terminated, positional arguments\n- *(assert)* Clear up language on `last` assertion\n- *(parser)* Correctly assign values to arguments when using multiple, value-termianted, positional arguments\n- *(parser)* Ensure `value_terminator` has higher precedence than `allow_hyphen_values`\n- *(help)* Only use next-line-help on subcommand list when explicitly specified, not just with `--help`\n- *(help)* Correctly align possible values list\n- *(help)* Don't waste code, vertical space in moving possible value descriptions to next line\n\n## [4.2.7] - 2023-05-02\n\n### Fixes\n\n- Correctly track remaining length for iterators provided by `ArgMatches`\n\n## [4.2.6] - 2023-05-02\n\n### Features\n\n- `impl Eq<std::any::TypeId> for clap_builder::util::AnyValueId`\n\n## [4.2.5] - 2023-04-27\n\n### Fixes\n\n- Improve panic when a group requires a non-existent ID\n\n## [4.2.4] - 2023-04-19\n\n### Documentation\n\n- Corrected docs for `Command::style`\n\n## [4.2.3] - 2023-04-18\n\n### Features\n\n- `Command::styles` for theming help/errors (behind `unstable-styles`)\n\n## [4.2.2] - 2023-04-13\n\n### Internal\n\n- Update dependencies\n\n## [4.2.1] - 2023-03-28\n\n### Fixes\n\n- Don't highlight uninteresting parts of the error message\n\n## [4.2.0] - 2023-03-28\n\n### Compatibility\n\n- Removed the languishing `unstable-replace` feature (open to discussion at [#2836](https://github.com/clap-rs/clap/issues/2836))\n- Removed the stablized `unstable-grouped` feature\n\n### Features\n\n- Allow any `StyledStr` to accept text styled with ANSI escape codes\n- Respect `CLICOLOR`, `CLICOLOR_FORCE`\n\n### Fixes\n\n- Lighten the tone for \"unexpected argument\" errors (open to discussion at [#4638](https://github.com/clap-rs/clap/issues/4638))\n\n## [4.1.14] - 2023-03-28\n\n### Features\n\n- *(derive)* `#[group]` raw attribute support\n\n### Performance\n\n- *(derive)* `clap_builder` was pulled out of `clap` so it could build in parallel to `clap_derive`\n- `os_str_bytes` dependency was removed for faster builds and smaller binaries\n\n## [4.1.13] - 2023-03-18\n\n### Performance\n\n- Reduce repeated alloc calls when building a `Command`\n- Reduce duplicate dependencies for faster builds\n\n## [4.1.12] - 2023-03-18\n\n### Internal\n\n- *(derive)* Update to `syn` v2\n\n### Performance\n\n- *(derive)* Faster build times by dropping `proc-macro-error` dependency\n\n## [4.1.11] - 2023-03-17\n\n### Internal\n\n- Update `bitflags`\n\n## [4.1.10] - 2023-03-17\n\n### Fixes\n\n- *(help)* On Windows, avoid underlined text artifacts\n\n## [4.1.9] - 2023-03-16\n\n### Fixes\n\n- *(assert)* Improve the assert when using the wrong action with `get_count` / `get_flag`\n\n## [4.1.8] - 2023-02-27\n\n### Fixes\n\n- *(derive)* Don't `deny` lints on the users behalf\n\n## [4.1.7] - 2023-02-27\n\n### Fixes\n\n- *(derive)* Hide some nightly clippy warnings\n\n## [4.1.6] - 2023-02-15\n\n### Fixes\n\n- *(help)* Don't show long help for `--help` just because hidden possible values include a description\n\n## [4.1.5] - 2023-02-15\n\n### Fixes\n\n- *(help)* Don't show long help for `--help` just because a hidden arg has a possible value with a description\n\n## [4.1.4] - 2023-01-24\n\n### Fixes\n\n- *(help)* Respect `disable_colored_help` when using `arg_required_else_help`\n\n### Performance\n\n- Speed up compiling `arg!` macro\n\n## [4.1.3] - 2023-01-23\n\n### Fixes\n\n- *(error)* Improve suggested flag/value/subcommand when two share a long preifx\n- *(error)* When suggesting one of several subcommands, use the plural `subcommands`, rather than `subcommand`\n\n## [4.1.2] - 2023-01-23\n\n### Fixes\n\n- In documentation, refer to `get_flag`, rather than `get_one::<bool>`\n\n## [4.1.1] - 2023-01-14\n\n### Fixes\n\n- *(error)* Small softening attempt for \"unexpected argument\" error\n\n## [4.1.0] - 2023-01-13\n\n### Compatibility\n\nMSRV changed to 1.64.0\n\nFor apps with custom `--help` and `--version` flags:\n- Descriptions for `--help` and `--version` changed\n\nWhen apps have errors imitating clap's error style:\n- Error message style was changed, including\n  - Moving away from \"did you mean\" to tips\n  - Leading letter is lower case\n  - \"For more\" added some punctuation\n\n### Features\n\n- `ArgMatches::get_occurrences` support for argument values to be grouped by their occurrence\n\n### Fixes\n\n- *(derive)* Allow `upgrade_from` when arguments / subcommands are explicitly marked as required\n- *(help)* Try be more clearer and succinct with `--help` and `--version` (also helps with overflow)\n- *(error)* Try to be more clearer and succinct with error messages\n- *(error)* Officially adopt [an error style guide](https://rustc-dev-guide.rust-lang.org/diagnostics.html#suggestion-style-guide)\n\n## [4.0.32] - 2022-12-22\n\n### Fixes\n\n- *(parser)* When overriding `required(true)`, consider args that conflict with its group\n\n## [4.0.31] - 2022-12-22\n\n### Performance\n\n- Speed up parsing when a lot of different flags are present (100 unique flags)\n\n## [4.0.30] - 2022-12-21\n\n### Fixes\n\n- *(error)* Improve error for `args_conflicts_with_subcommand`\n\n## [4.0.29] - 2022-11-29\n\n## [4.0.28] - 2022-11-29\n\n### Fixes\n\n- Fix wasm support which was broken in 4.0.27\n\n## [4.0.27] - 2022-11-24\n\n### Features\n\n- Have `Arg::value_parser` accept `Vec<impl Into<PossibleValue>>`\n- Implement `Display` and `FromStr` for `ColorChoice`\n\n### Fixes\n\n- Remove soundness issue by switching from `atty` to `is-terminal`\n\n## [4.0.26] - 2022-11-16\n\n### Fixes\n\n- *(error)* Fix typos in `ContextKind::as_str`\n\n## [4.0.25] - 2022-11-15\n\n### Features\n\n- *(error)* Report available subcommands when required subcommand is missing\n\n## [4.0.24] - 2022-11-14\n\n### Fixes\n\n- Avoid panic when printing an argument that isn't built\n\n## [4.0.23] - 2022-11-11\n\n### Fixes\n\n- Don't panic on reporting invalid-long errors when followed by invalid UTF8\n- *(help)* Clarified argument to `help` subcommand\n\n## [4.0.22] - 2022-11-07\n\n### Fixes\n\n- *(help)* Don't overflow into next-line-help early due to stale (pre-v4) padding calculations\n\n## [4.0.21] - 2022-11-07\n\n### Features\n\n- *(derive)* `long_about` and `long_help` attributes, without a value, force using doc comment (before it wouldn't be set if there wasn't anything different than the short help)\n\n## [4.0.20] - 2022-11-07\n\n### Fixes\n\n- *(derive)*  Allow defaulted value parser for '()' fields\n\n## [4.0.19] - 2022-11-04\n\n### Features\n\n- `ColorChoice` now implements `ValueEnum`\n\n## [4.0.18] - 2022-10-20\n\n### Fixes\n\n- *(derive)* Allow `#[command(skip)]` to also work with enum variants with a value\n\n## [4.0.17] - 2022-10-18\n\n### Fixes\n\n- Allow using `Arg::last(true)` with `Arg::value_hint(ValueHint::CommandWithArguments)`\n\n## [4.0.16] - 2022-10-18\n\n### Fixes\n\n- `Arg::exclusive(true)` should not be exclusive with the argument's own `ArgGroup`\n\n## [4.0.15] - 2022-10-13\n\n### Fixes\n\n- *(error)* Don't suggest `--` when it doesn't help\n- *(error)* Be more consistent in quoting, punctuation, and indentation in errors\n\n## [4.0.14] - 2022-10-12\n\n### Fixes\n\n- Only put `ArgGroup` in `ArgMatches` when explicitly specified, fixing derives handling of option-flattened fields (#4375)\n\n## [4.0.13] - 2022-10-11\n\n### Features\n\n- *(derive)* Allow `()` for fields to mean \"don't read\" (#4371)\n\n## [4.0.12] - 2022-10-10\n\n### Features\n\n- Added `TypedValueParser::try_map` for when adapting an existing `TypedValueParser` can fail\n- *(error)* Create errors like clap with `Error::new`, `Error::with_cmd`, and `Error::insert`\n\n## [4.0.11] - 2022-10-09\n\n### Fixes\n\n- *(help)* Fix wrapping calculations with ANSI escape codes\n\n## [4.0.10] - 2022-10-05\n\n### Features\n\n- *(derive)* Support `#[arg(flatten)]` on `Option` types (#4211, #4350)\n\n## [4.0.9] - 2022-10-03\n\n### Fixes\n\n- *(derive)* Process doc comments for `#[command(subcommand)]` like in clap v3\n\n## [4.0.8] - 2022-10-01\n\n### Fixes\n\n- *(derive)* Remove a low-value assert preventing defaulting `Help` and `Version` actions\n\n## [4.0.7] - 2022-09-30\n\n### Features\n\n- *(derive)* Populate implicit ArgGroup (#3165)\n\n### Fixes\n\n- *(derive)* Support `#[group(skip)]` on `Parser` derive\n- *(derive)* Tell users about implicit arg groups when running into group name conflicts\n- *(error)* Don't report unrelated groups in conflict or requires errors\n\n## [4.0.6] - 2022-09-30\n\n### Features\n\n- *(derive)* Support `#[group(skip)]` (#4279, #4301)\n\n## [4.0.5] - 2022-09-30\n\n## [4.0.4] - 2022-09-29\n\n### Fixes\n\n- *(error)* Specialize the self-conflict error to look like clap v3\n\n## [4.0.3] - 2022-09-29\n\n### Fixes\n\n- *(error)* Quote literals consistently\n- *(error)* Stylize escape (`--`) suggestions\n- *(error)* Format help flag as a literal\n\n## [4.0.2] - 2022-09-28\n\n### Fixes\n\n- *(parser)* `SetFalse` should conflict with itself like `SetTrue` and `Set`\n- *(parser)* Allow one-off overrides\n\n## [4.0.1] - 2022-09-28\n\n### Fixes\n\n- *(derive)* Ensure `#[clap(...)]` attribute still works\n\n## [4.0.0] - 2022-09-28\n\n### Highlights\n\n**`Arg::num_args(range)`**\n\nClap has had several ways for controlling how many values will be captured without always being clear on how they interacted, including\n- `Arg::multiple_values(true)`\n- `Arg::number_of_values(4)`\n- `Arg::min_values(2)`\n- `Arg::max_values(20)`\n- `Arg::takes_value(true)`\n\nThese have now all been collapsed into `Arg::num_args` which accepts both\nsingle values and ranges of values.  `num_args` controls how many raw arguments\non the command line will be captured as values per occurrence and independent\nof value delimiters.\n\nSee [Issue 2688](https://github.com/clap-rs/clap/issues/2688) for more background.\n\n**Polishing Help**\n\nClap strives to give a polished CLI experience out of the box with little\nceremony.  With some feedback that has accumulated over time, we took this\nrelease as an opportunity to re-evaluate our `--help` output to make sure it is\nmeeting that goal.\n\nIn doing this evaluation, we wanted to keep in mind:\n- Whether other CLIs had ideas that make sense to apply\n- Providing an experience that fits within the rest of applications and works across all shells\n\nBefore:\n```\ngit\nA fictional versioning CLI\n\nUSAGE:\n    git <SUBCOMMAND>\n\nOPTIONS:\n    -h, --help    Print help information\n\nSUBCOMMANDS:\n    add      adds things\n    clone    Clones repos\n    help     Print this message or the help of the given subcommand(s)\n    push     pushes things\n    stash\n```\n\nAfter:\n```\nA fictional versioning CLI\n\nUsage: git <COMMAND>\n\nCommands:\n  clone  Clones repos\n  push   pushes things\n  add    adds things\n  stash\n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help information\n```\n- name/version header was removed because we couldn't justify the space it occupied when\n  - Usage already includes the name\n  - `--version` is available for showing the same thing (if the program has a version set)\n- Usage was dropped to one line to save space\n- Focus is put on the subcommands\n- Headings are now Title case\n- The more general term \"command\" is used rather than being explicit about being \"subcommands\"\n- The output is more dense with the expectation that it won't affect legibility but will allow more content\n- We've moved to a more neutral palette for highlighting elements (not highlighted above)\n\nIn talking to users, we found some that liked clap's `man`-like experience.\nWhen deviating from this, we are making the assumption that those are more\npower users and that the majority of users wouldn't look as favorably on being\nconsistent with `man`.\n\nSee [Issue 4132](https://github.com/clap-rs/clap/issues/4132) for more background.\n\n**More Dynamicism**\n\nClap's API has focused on `&str` for performance but this can make\ndealing with owned data difficult, like `#[arg(default_value_t)]` generating a\nString from the default value.\n\nAdditionally, to avoid `ArgMatches` from borrowing (and for some features we\ndecided to forgo), clap took the `&str` argument IDs and hashed them.  This\nprevented us from providing a usable API for iterating over existing arguments.\n\nNow clap has switched to a string newtype that gives us the flexibility to\ndecide whether to use `&'static str`, `Cow<'static, str>` for fast dynamic behavior, or\n`Box<str>` for dynamic behavior with small binary size.\n\nAs an extension of that work, you can now call `ArgMatches::ids` to iterate\nover the arguments and groups that were found when parsing.  The newtype `Id`\nwas used to prevent some classes of bugs and to make it easier to understand\nwhen opaque Ids are used vs user-visible strings.\n\n**Clearing Out Deprecations**\n\nInstead of doing all development on clap 4.0.0, we implemented a lot of new features during clap 3's development, deprecating the old API while introducing the new API, including:\n- Replacing the implicit behavior for args when parsing them with `ArgAction`\n- Replacing various one-off forms of value validation with the `ValueParser` API\n  - Allowing derives to automatically do the right thing for `PathBuf` (allowing invalid UTF-8)\n- Replacing `AppSettings` and `ArgSettings` enums with getters/setters\n- Clarifying terms and making them more consistent\n\n### Migrating\n\nSteps:\n\n0. [Upgrade to v3](https://github.com/clap-rs/clap/blob/v3-master/CHANGELOG.md#migrating) if you haven't already\n1. Add CLI tests (including example below), `-h` and `--help` output at a minimum (recommendation: [trycmd](https://docs.rs/trycmd/) for snapshot testing)\n2. *If using Builder API*: Explicitly set the `arg.action(ArgAction::...)` on each argument (`StoreValue` for options and `IncOccurrences` for flags)\n3. Run `cargo check --features clap/deprecated` and resolve all deprecation warnings\n4. Upgrade to v4\n5. Update feature flags\n  - *If `default-features = false`*, run `cargo add clap -F help,usage,error-context`\n  -  Run `cargo add clap -F wrap_help` unless you want to hard code line wraps\n6. Resolve compiler errors\n7. Resolve behavior changes (see \"subtle changes\" under BREAKING CHANGES)\n8. *At your leisure:* resolve new deprecation notices\n\nExample test (derive):\n```rust\n#[derive(clap::Parser)]\nstruct Cli {\n    ...\n}\n\n#[test]\nfn verify_cli() {\n    use clap::CommandFactory;\n    Cli::command().debug_assert()\n}\n```\n\nExample test (builder):\n```rust\nfn cli() -> clap::Command {\n    ...\n}\n\n#[test]\nfn verify_cli() {\n    cli().debug_assert();\n}\n```\n\nNote: the idiomatic / recommended way of specifying different types of args in the Builder API has changed:\n\nBefore\n```rust\n.arg(Arg::new(\"flag\").long(\"flag\"))  # --flag\n.arg(Arg::new(\"option\").long(\"option\").takes_value(true))  # --option <option>\n```\nAfter:\n```rust\n.arg(Arg::new(\"flag\").long(\"flag\").action(ArgAction::SetTrue))  # --flag\n.arg(Arg::new(\"option\").long(\"option\"))  # --option <option>\n```\nIn particular, `num_args` (the replacement for `takes_value`) will default appropriately\nfrom the `ArgAction` and generally only needs to be set explicitly for the\nother `num_args` use cases.\n\n### Breaking Changes\n\nSubtle changes (i.e. compiler won't catch):\n\n- `arg!` now sets one of (#3795):\n  - `ArgAction::SetTrue`, requiring `ArgMatches::get_flag` instead of `ArgMatches::is_present`\n  - `ArgAction::Count`, requiring `ArgMatches::get_count` instead of `ArgMatches::occurrences_of`\n  - `ArgAction::Set`, requiring `ArgMatches::get_one` instead of `ArgMatches::value_of`\n  - `ArgAction::Append`, requiring `ArgMatches::get_many` instead of `ArgMatches::values_of`\n- `ArgAction::Set`, `ArgAction::SetTrue`, and `Arg::Action::SetFalse` now\n  conflict by default to be like `ArgAction::StoreValue` and\n  `ArgAction::IncOccurrences`, requiring `cmd.args_override_self(true)` to override instead (#4261)\n- By default, an `Arg`s default action is `ArgAction::Set`, rather than `ArgAction::IncOccurrence` to reduce confusing magic through consistency (#2687, #4032, see also #3977)\n- `mut_arg` can no longer be used to customize help and version arguments, instead disable them (`Command::disable_help_flag`, `Command::disable_version_flag`) and provide your own (#4056)\n- Removed lifetimes from `Command`, `Arg`, `ArgGroup`, and `PossibleValue`, assuming `'static`.  `string` feature flag will enable support for `String`s (#1041, #2150, #4223)\n- `arg!(--flag <value>)` is now optional, instead of required.  Add `.required(true)` at the end to restore the original behavior (#4206)\n- Added default feature flags, `help`, `usage` and `error-context`, requiring adding them back in if `default-features = false` (#4236)\n- *(parser)* Always fill in `\"\"` argument for external subcommands to make it easier to distinguish them from built-in commands (#3263)\n- *(parser)* Short flags now have higher precedence than hyphen values with `Arg::allow_hyphen_values`, to be consistent with `Command::allow_hyphen_values` (#4187)\n- *(parser)* `Arg::value_terminator` must be its own argument on the CLI rather than being in a delimited list (#4025)\n- *(help)* Line wrapping of help is now behind the existing `wrap_help` feature flag, either enable it or hard code your wraps (#4258)\n- *(help)* Make `DeriveDisplayOrder` the default and removed the setting.  To sort help, set `next_display_order(None)` (#2808)\n- *(help)* Subcommand display order respects `Command::next_display_order` instead of `DeriveDisplayOrder` and using its own initial display order value (#2808)\n- *(help)* Subcommands are now listed before arguments.  To get the old behavior, see `Command::help_template` (#4132)\n- *(help)* Help headings are now title cased, making any user-provided help headings inconsistent.  To get the old behavior, see `Command::help_template`, `Arg::help_heading`, and `Command::subcommand_help_heading` (#4132)\n- *(help)* \"Command\" is used as the section heading for subcommands and `COMMAND` for the value name.  To get the old behavior, see  `Command::subcommand_help_heading` and `Arg::subcommand_value_name` (#4132, #4155)\n- *(help)* Whitespace in help output is now trimmed to ensure consistency regardless of how well a template matches the users needs. (#4132, #4156)\n- *(help)* name/version/author are removed by default from help output.  To get the old behavior, see `Command::help_template`. (#4132, #4160)\n- *(help)* Indentation for second-line usage changed. (#4132, #4188)\n- *(env)* Parse `--help` and `--version` like any `ArgAction::SetTrue` flag (#3776)\n- *(derive)* Leave `Arg::id` as `verbatim` casing, requiring updating of string references to other args like in `conflicts_with` or `requires` (#3282)\n- *(derive)* Doc comments for `ValueEnum` variants will now show up in `--help` (#3312)\n- *(derive)* When deriving `Args`, and `ArgGroup` is created using the type's name, reserving it for future use (#2621, #4209)\n- *(derive)* `next_help_heading` can now leak out of a `#[clap(flatten)]`, like all other command settings (#4222)\n\nEasier to catch changes:\n\n- Looking up a group in `ArgMatches` now returns the arg `Id`s, rather than the values to reduce overhead and offer more flexibility. (#4072)\n- Changed `Arg::number_of_values` (average-across-occurrences) to `Arg::num_args` (per-occurrence) (raw CLI args, not parsed values) (#2688, #4023)\n  - `num_args(0)` no longer implies `takes_value(true).multiple_values(true)` (#4023)\n  - `num_args(1)` no longer implies `multiple_values(true)` (#4023)\n  - Does not check default or env values, only what the user explicitly passes in (#4025)\n  - No longer terminates on delimited values (#4025)\n- Replace `Arg::min_values` (across all occurrences) with `Arg::num_args(N..)` (per occurrence) to reduce confusion over different value count APIs (#4023)\n- Replace `Arg::max_values` (across all occurrences) with `Arg::num_args(1..=M)` (per occurrence) to reduce confusion over different value count APIs  (#4023)\n- Replace `Arg::multiple_values(true)` with `Arg::num_args(1..)` and `Arg::multiple_values(false)` with `Arg::num_args(0)` to reduce confusion over different value count APIs  (#4023)\n- Replace `Arg::takes_value(true)` with `Arg::num_args(1)` and `Arg::takes_value(false)` with `Arg::num_args(0)` to reduce confusion over different value count APIs\n- Remove `Arg::require_value_delimiter`, either users could use `Arg::value_delimiter` or implement a custom parser with `TypedValueParser` as it was mostly to make `multiple_values(true)` act like `multiple_values(false)` and isn't needed anymore (#4026)\n- `Arg::new(\"help\")` and `Arg::new(\"version\")` no longer implicitly disable the\n  built-in flags and be copied to all subcommands, instead disable\n  the built-in flags (`Command::disable_help_flag`,\n  `Command::disable_version_flag`) and mark the custom flags as `global(true)`. (#4056)\n- `Arg::short('h')` no longer implicitly disables the short flag for help,\n  instead disable\n  the built-in flags (`Command::disable_help_flag`,\n  `Command::disable_version_flag`) provide your own `Arg::new(\"help\").long(\"help\").action(ArgAction::Help).global(true)`. (#4056)\n- `ArgAction::SetTrue` and `ArgAction::SetFalse` now prioritize `Arg::default_missing_value` over their standard behavior (#4000)\n- Changed `Arg::requires_ifs` and `Arg::default_value*_ifs*` to taking an `ArgPredicate`, removing ambiguity with `None` when accepting owned and borrowed types (#4084)\n- Removed `PartialEq` and `Eq` from `Command` so we could change external subcommands to use a `ValueParser` (#3990)\n- Various `Arg`, `Command`, and `ArgGroup` calls were switched from accepting `&[]` to `[]` via `IntoIterator` to be more flexible (#4072)\n- `Arg::short_aliases` and other builder functions that took `&[]` need the `&` dropped (#4081)\n- `ErrorKind` and `Result` moved into the `error` module\n- `ErrorKind::EmptyValue` replaced with `ErrorKind::InvalidValue` to remove an unnecessary special case (#3676, #3968)\n- `ErrorKind::UnrecognizedSubcommand` replaced with `ErrorKind::InvalidSubcommand` to remove an unnecessary special case (#3676)\n- Changed the default type of `allow_external_subcommands` from `String` to `OsString` as that is less likely to cause bugs in user applications (#3990)\n- *(help)* `Command::render_usage` now returns a `StyledStr` (#4248)\n- *(derive)* Changed the default for arguments from `parse` to `value_parser`, removing `parse` support (#3827, #3981)\n  - `#[clap(value_parser)]` and `#[clap(action)]` are now redundant\n- *(derive)* `subcommand_required(true).arg_required_else_help(true)` is set instead of `SubcommandRequiredElseHelp` to give more meaningful errors when subcommands are missing and to reduce redundancy (#3280)\n- *(derive)* Remove `arg_enum` attribute in favor of `value_enum` to match the new name (we didn't have support in v3 to mark it deprecated) (#4127)\n- *(parser)* Assert when the CLI looksup an unknown args when external subcommand support is enabled to help catch bugs (#3703)\n- *(assert)* Sometimes `Arg::default_missing_value` didn't require `num_args(0..=N)`, now it does (#4023)\n- *(assert)* Leading dashes in `Arg::long` are no longer allowed (#3691)\n- *(assert)* Disallow more `value_names` than `num_args` (#2695)\n- *(assert)* Always enforce that version is specified when the `ArgAction::Version` is used\n- *(assert)* Add missing `#[track_caller]`s to make it easier to debug asserts\n- *(assert)* Ensure `overrides_with` IDs are valid\n- *(assert)* Ensure no self-`overrides_with` now that Actions replace it\n- *(assert)* Ensure subcommand names are not duplicated\n- *(assert)* Assert on `mut_arg` receiving an invalid arg ID or `mut_subcommand` receiving an invalid command name\n\n### Compatibility\n\nMSRV is now 1.60.0\n\nDeprecated\n- `Arg::use_value_delimiter` in favor of `Arg::value_delimiter` to avoid having multiple ways of doing the same thing\n- `Arg::requires_all` in favor of `Arg::requires_ifs` now that it takes an `ArgPredicate` to avoid having multiple ways of doing the same thing\n- `Arg::number_of_values` in favor of `Arg::num_args` to clarify semantic differences\n- `default_value_os`, `default_values_os`, `default_value_if_os`, and `default_value_ifs_os` as the non `_os` variants now accept either a `str` or an `OsStr` (#4141)\n- `Arg::env_os` in favor of `Arg::env`\n- `Command::dont_collapse_args_in_usage` is now the default (#4151)\n- `Command::trailing_var_arg` in favor of `Arg::trailing_var_arg` to make it clearer which arg it is meant to apply to (#4187)\n- `Command::allow_hyphen_values` in favor of `Arg::allow_hyphen_values` to make it clearer which arg it is meant to apply to (#4187)\n- `Command::allow_negative_numbers` in favor of `Arg::allow_negative_numbers` to make it clearer which arg it is meant to apply to (#4187)\n- *(help)* Deprecated `Command::write_help` and `Command::write_long_help` in favor of `Command::render_help` and `Command::render_long_help` (#4248)\n- *(derive)* `structopt` and `clap` attributes in favor of the more specific `command`, `arg`, and `value` to open the door for [more features](https://github.com/clap-rs/clap/issues/1807) and [clarify relationship to the builder](https://github.com/clap-rs/clap/discussions/4090) (#1807, #4180)\n- *(derive)* `#[clap(value_parser)]` and `#[clap(action)]` defaulted attributes (its the default) (#3976)\n\nBehavior Changes\n- *(help)* With `wrap_help` feature, if the terminal size cannot be determined, `LINES` and `COLUMNS` variables are used (#4186)\n\n### Features\n\n- `Arg::num_args` now accepts ranges, allowing setting both the minimum and maximum number of values per occurrence (#2688, #4023)\n- Allow non-bool `value_parser`s for `ArgAction::SetTrue` / `ArgAction::SetFalse` (#4092)\n- Add `From<&OsStr>`, `From<OsString>`, `From<&str>`, and `From<String>` to `value_parser!` (#4257)\n- Allow resetting most builder methods\n- Can now pass runtime generated data to `Command`, `Arg`, `ArgGroup`, `PossibleValue`, etc without managing lifetimes with the `string` feature flag (#2150, #4223)\n- New default `error-context`, `help` and `usage` feature flags that can be turned off for smaller binaries (#4236)\n- Added `StyledStr::ansi()` to `Display` with ANSI escape codes (#4248)\n- *(error)* `Error::apply` for changing the formatter for dropping binary size (#4111)\n- *(error)* `Error::render`for formatting the error into a `StyledStr`\n- *(help)* Show `PossibleValue::help` in long help (`--help`) (#3312)\n- *(help)* New `{tab}` variable for `Command::help_template` (#4161)\n- *(help)* `Command::render_help` and `Command::render_long_help` for formatting the error into a `StyledStr` (#3873, #4248)\n- *(help)* `Command::render_usage` now returns a `StyledStr` (#4248)\n\n### Fixes\n\n- Verify `required` is not used with conditional required settings (#3660)\n- Replaced `cmd.allow_invalid_for_utf8_external_subcommands` with `cmd.external_subcommand_value_parser` (#3733)\n- `Arg::default_missing_value` now applies per occurrence rather than if a value is missing across all occurrences (#3998)\n- `arg!(--long [value])` to accept `0..=1` per occurrence rather than across all occurrences, making it safe to use with `ArgAction::Append` (#4001)\n- Allow `OsStr`s for `Arg::{required_if_eq,required_if_eq_any,required_if_eq_all}` (#4084)\n- *(help)* With `wrap_help` feature, if the terminal size cannot be determined, `LINES` and `COLUMNS` variables are used (#4186)\n- *(help)* Use `Command::display_name` in the help title rather than `Command::bin_name`\n- *(help)* Show when a flag is `ArgAction::Count` by adding an `...` (#4003)\n- *(help)* Use a more neutral palette for coloring (#4132, #4117)\n- *(help)* Don't rely on ALL CAPS for help headers (#4132, #4123)\n- *(help)* List subcommands first, focusing the emphasis on them (#4132, #4125)\n- *(help)* Do not include global args in `cmd help help` (#4131)\n- *(help)* Use `[positional]` in list when relevant (#4144)\n- *(help)* Show all `[positional]` in usage (#4151)\n- *(help)* Polish up subcommands by referring to them as commands (#4132, #4155)\n- *(help)* Trim extra whitespace to avoid artifacts from different uses of templates (#4132, #4156)\n- *(help)* Hint to the user the difference between `-h` / `--help` when applicable (#4132, #4159)\n- *(help)* Shorten help by eliding name/version/author (#4132, #4160)\n- *(help)* When short help is long enough to activate `next_line_help`, don't add blank lines (#4132, #4190)\n- *(help)* Make help output more dense (reducing horizontal whitespace) (#4132, #4192)\n- *(help)* Separate subcommand flags with \",\" like option flags (#4232, #4235)\n- *(help)* Quote the suggested help flag (#4220)\n- *(version)* Use `Command::display_name` rather than `Command::bin_name` (#3966)\n- *(parser)* Always fill in `\"\"` argument for external subcommands (#3263)\n- *(parser)* Short flags now have higher precedence than hyphen values with `Arg::allow_hyphen_values`, like `Command::allow_hyphen_values` (#4187)\n- *(parser)* Prefer `InvalidSubcommand` over `UnknownArgument` in more cases (#4219)\n- *(derive)* Detect escaped external subcommands that look like built-in subcommands (#3703)\n- *(derive)* Leave `Arg::id` as `verbatim` casing (#3282)\n- *(derive)* Default to `#[clap(value_parser, action)]` instead of `#[clap(parse)]` (#3827)\n\n## [3.2.18] - 2022-08-29\n\n### Fixes\n\n- *(help)* `Command::print_help` now respects `Command::colored_help`\n- *(derive)* Improved error messages\n\n## [3.2.17] - 2022-08-12\n\n### Fixes\n\n- *(derive)* Expose `#[clap(id = ...)]` attribute to match Arg's latest API\n\n## [3.2.16] - 2022-07-30\n\n### Fixes\n\n- Ensure required arguments appear in errors when they are also members of a group (#4004)\n\n## [3.2.15] - 2022-07-25\n\n### Features\n\n- *(derive)* New `default_values_t` and `default_values_os_t` attributes\n\n## [3.2.14] - 2022-07-21\n\n### Fixes\n\n- A `multiple_values` positional followed by another positional now works with multiple flags\n\n## [3.2.13] - 2022-07-19\n\n### Documentation\n\n- Pulled in tutorials, cookbook, and derive reference into rustdoc\n\n## [3.2.12] - 2022-07-14\n\n### Fixes\n\n- Allow an arg to declare a conflict with a group\n\n## [3.2.11] - 2022-07-13\n\n### Features\n\n- Added `Arg::get_all_short_aliaes` and `Arg::get_all_aliases`\n\n## [3.2.10] - 2022-07-12\n\n### Fixes\n\n- Loosen lifetime on `Command::mut_subcommand`\n\n## [3.2.8] - 2022-06-30\n\n### Features\n\n- Added `Command::mut_subcommand` to mirror `Command::mut_arg`\n\n## [3.2.7] - 2022-06-28\n\n### Fixes\n\n- Global arguments should override env-sourced arguments\n\n## [3.2.6] - 2022-06-21\n\n### Fixes\n\n- Don't panic when parsing `--=`\n\n## [3.2.5] - 2022-06-15\n\n### Fixes\n\n- *(derive)* Fix regression with `#[clap(default_value_os_t ...)]` introduced in v3.2.3\n\n## [3.2.4] - 2022-06-14\n\n### Fixes\n\n- *(derive)* Provide more clearer deprecation messages for `#[clap(parse)]` attribute (#3832)\n\n## [3.2.3] - 2022-06-14\n\n### Fixes\n\n- Moved deprecations to be behind the `deprecated` Cargo.toml feature (#3830)\n  - For now, it is disabled by default though we are considering enabling it by\n    default as we release the next major version to help draw attention to the\n    deprecation migration path\n\n## [3.2.2] - 2022-06-14\n\n### Fixes\n\n- *(derive)* Improve the highlighted code for deprecation warnings\n\n**gated behind `unstable-v4`**\n- *(derive)* Default to `#[clap(value_parser, action)]` instead of `#[clap(parse)]` (#3827)\n\n## [3.2.1] - 2022-06-13\n\n## [3.2.0] - 2022-06-13\n\n### Compatibility\n\nMSRV is now 1.56.0 (#3732)\n\nBehavior\n- Defaults no longer satisfy `required` and its variants (#3793)\n- When misusing `ArgMatches::value_of` and friends, debug asserts were turned into panics\n\nMoving (old location deprecated)\n- `clap::{PossibleValue, ValueHint}` to `clap::builder::{PossibleValue, ValueHint}`\n- `clap::{Indices, OsValues, ValueSource, Values}` to `clap::parser::{Indices, OsValues, ValueSource, Values}`\n- `clap::ArgEnum` to `clap::ValueEnum` (#3799)\n\nReplaced\n- `Arg::allow_invalid_utf8` with `Arg::value_parser(value_parser!(PathBuf))` (#3753)\n- `Arg::validator` / `Arg::validator_os` with `Arg::value_parser` (#3753)\n- `Arg::validator_regex` with users providing their own `builder::TypedValueParser` (#3756)\n- `Arg::forbid_empty_values` with `builder::NonEmptyStringValueParser` / `builder::PathBufValueParser` (#3753)\n- `Arg::possible_values` with `Arg::value_parser([...])`, `builder::PossibleValuesParser`, or `builder::EnumValueParser` (#3753)\n- `Arg::max_occurrences` with `arg.action(ArgAction::Count).value_parser(value_parser!(u8).range(..N))` for flags (#3797)\n- `Arg::multiple_occurrences` with `ArgAction::Append` or `ArgAction::Count` though positionals will need `Arg::multiple_values` (#3772, #3797)\n- `Command::args_override_self` with `ArgAction::Set` (#2627, #3797)\n- `AppSettings::NoAutoVersion` with `ArgAction` or `Command::disable_version_flag` (#3800)\n- `AppSettings::NoHelpVersion` with `ArgAction` or `Command::disable_help_flag` / `Command::disable_help_subcommand` (#3800)\n- `ArgMatches::{value_of, value_of_os, value_of_os_lossy, value_of_t}` with `ArgMatches::{get_one,remove_one}` (#3753)\n- `ArgMatches::{values_of, values_of_os, values_of_os_lossy, values_of_t}` with `ArgMatches::{get_many,remove_many}` (#3753)\n- `ArgMatches::is_valid_arg` with `ArgMatches::{try_get_one,try_get_many}` (#3753)\n- `ArgMatches::occurrences_of` with `ArgMatches::value_source` or `ArgAction::Count` (#3797)\n- `ArgMatches::is_present` with `ArgMatches::contains_id` or `ArgAction::SetTrue` (#3797)\n- `ArgAction::StoreValue` with `ArgAction::Set` or `ArgAction::Append` (#3797)\n- `ArgAction::IncOccurrences` with `ArgAction::SetTrue` or `ArgAction::Count` (#3797)\n- *(derive)* `#[clap(parse(...))]` replaced with: (#3589, #3794)\n  - For default parsers (no `parse` attribute), deprecation warnings can be\n    silenced by opting into the new behavior by adding either `#[clap(action)]`\n    or `#[clap(value_parser)]` (ie requesting the default behavior for these\n    attributes).  Alternatively, the `unstable-v4` feature changes the default\n    away from `parse` to `action`/`value_parser`.\n  - For `#[clap(parse(from_flag))]` replaced with `#[clap(action = ArgAction::SetTrue)]` (#3794)\n  - For `#[clap(parse(from_occurrences))]` replaced with `#[clap(action = ArgAction::Count)]` though the field's type must be `u8` (#3794)\n  - For `#[clap(parse(from_os_str)]` for `PathBuf`, replace it with\n    `#[clap(value_parser)]` (as mentioned earlier this will call\n    `value_parser!(PathBuf)` which will auto-select the right `ValueParser`\n    automatically).\n  - For `#[clap(parse(try_from_str = ...)]`, replace it with `#[clap(value_parser = ...)]`\n  - For most other cases, a type implementing `TypedValueParser` will be needed and specify it with `#[clap(value_parser = ...)]`\n\n### Features\n\n- Parsed, typed arguments via `Arg::value_parser` / `ArgMatches::{get_one,get_many}` (#2683, #3732)\n  - Several built-in `TypedValueParser`s available with an API open for expansion\n  - `value_parser!(T)` macro for selecting a parser for a given type (#3732) and open to expansion via the `ValueParserFactory` trait (#3755)\n  - `[&str]` is implicitly a value parser for possible values\n  - All `ArgMatches` getters do not assume required arguments (#2505)\n  - Add `ArgMatches::remove_*` variants to transfer ownership\n  - Add `ArgMatches::try_*` variants to avoid panics for developer errors (#3621)\n  - Add a `get_raw` to access the underlying `OsStr`s\n  - `PathBuf` value parsers imply `ValueHint::AnyPath` for completions (#3732)\n- Explicit control over parsing via `Arg::action` (#3774)\n  - `ArgAction::StoreValue`: existing `takes_value(true)` behavior\n  - `ArgAction::IncOccurrences`: existing `takes_value(false)` behavior\n  - `ArgAction::Help`: existing `--help` behavior\n  - `ArgAction::Version`: existing `--version` behavior\n  - `ArgAction::Set`: Overwrite existing values (like `Arg::multiple_occurrences` mixed with `Command::args_override_self`) (#3777)\n  - `ArgAction::Append`: like `Arg::multiple_occurrences` (#3777)\n  - `ArgAction::SetTrue`: Treat `--flag` as `--flag=true` (#3775)\n    - Implies `Arg::default_value(\"false\")` (#3786)\n    - Parses `Arg::env` via `Arg::value_parser`\n  - `ArgAction::SetFalse`: Treat `--flag` as `--flag=false` (#3775)\n    - Implies `Arg::default_value(\"true\")` (#3786)\n    - Parses `Arg::env` via `Arg::value_parser`\n  - `ArgAction::Count`: Treat `--flag --flag --flag` as `--flag=1 --flag=2 --flag=3` (#3775)\n    - Implies `Arg::default_value(\"0\")` (#3786)\n    - Parses `Arg::env` via `Arg::value_parser`\n- *(derive)* Opt-in to new `Arg::value_parser` / `Arg::action` with either `#[clap(value_parser)]` (#3589, #3742) / `#[clap(action)]` attributes (#3794)\n  - Default `ValueParser` is determined by `value_parser!` (#3199, #3496)\n  - Default `ArgAction` is determine by a hard-coded lookup on the type (#3794)\n- `Command::multicall` is now stable for busybox-like programs and REPLs (#2861, #3684)\n- `ArgMatches::{try_,}contains_id` for checking if there are values for an argument that mirrors the new `get_{one,many}` API\n\n### Fixes\n\n- Don't correct argument id in `default_value_ifs_os`(#3815)\n\n*parser*\n- Set `ArgMatches::value_source` and `ArgMatches::occurrences_of` for external subcommands (#3732)\n- Use value delimiter for `Arg::default_missing_values` (#3761, #3765)\n- Split`Arg::default_value` / `Arg::env` on value delimiters independent of whether `--` was used (#3765)\n- Allow applying defaults to flags (#3294, 3775)\n- Defaults no longer satisfy `required` and its variants (#3793)\n\n## [3.1.18] - 2022-05-10\n\n### Fixes\n\n- Fix deprecated `arg_enum!` for users migrating to clap3 (#3717)\n- Verify all `required_unless_present_all` arguments exist\n- Verify group members exist before processing group members (#3711)\n- *(help)* Use `...` when not enough `value_names` are supplied\n\n**gated behind `unstable-v4`**\n- Verify `required` is not used with conditional required settings (#3660)\n- Disallow more `value_names` than `number_of_values` (#2695)\n- *(parser)* Assert on unknown args when using external subcommands (#3703)\n- *(parser)* Always fill in `\"\"` argument for external subcommands (#3263)\n- *(derive)* Detect escaped external subcommands that look like built-in subcommands (#3703)\n- *(derive)* Leave `Arg::id` as `verbatim` casing (#3282)\n\n## [3.1.17] - 2022-05-06\n\n### Fixes\n\n- Allow value names for `arg!` macro to have dashes when quoted, like longs\n\n## [3.1.16] - 2022-05-06\n\n### Fixes\n\n- *(parser)* `Arg::exclusive` overrides `Arg::required`, like other conflicts\n- *(error)* Don't duplicate arguments in usage\n- *(error)* Don't show hidden arguments in conflict error usage\n- *(help)* New `help_template` variable `{name}` to fix problems with `{bin}`\n- *(help)* Don't wrap URLs\n\n**gated behind `unstable-v4`**\n- Leading dashes in `Arg::long` are no longer allowed\n- *(help)* Use `Command::display_name` in the help title rather than `Command::bin_name`\n\n## [3.1.15] - 2022-05-02\n\n### Fixes\n\n- *(error)* Render actual usage for unrecognized subcommands\n- *(multicall)* Improve bad command error\n- *(multicall)* Always require a multicall command\n- *(multicall)* Disallow arguments on multicall parent command\n- *(multicall)* More consistent with rest of clap errors\n\n\n## [3.1.14] - 2022-05-01\n\n### Fixes\n\n- Panic when calling `Command::build` with a required positional argument nested several layers in subcommands\n\n## [3.1.13] - 2022-04-30\n\n### Fixes\n\n- Help subcommand and `Command::write_help` now report required arguments in usage in more circumstances\n- Unknown subcommand for help subcommand flag now reports an error with more context\n- More details reported when using `debug` feature\n- Allow disabling `color` feature with `debug` feature enabled\n\n## [3.1.12] - 2022-04-22\n\n### Fixes\n\n- Regression in 3.1.11 where the (output) streams were crossed\n\n## [3.1.11] - 2022-04-22\n\n### Fixes\n\n- Implied conflicts override `Arg::required`, making the behavior consistent with how we calculate conflicts for error reporting\n- Members of a mutually exclusive `ArgGroup`  override `Arg::required`, making the behavior consistent with how we calculate conflicts for error reporting\n- `Arg::overrides_with` always override `Arg::required`, not just when the parser processes an override\n\n## [3.1.10] - 2022-04-19\n\n### Features\n\n- Expose `Command::build` for custom help generation or other command introspection needs\n\n## [3.1.9] - 2022-04-15\n\n### Fixes\n\n- Pin the `clap_derive` version so a compatible version is always used with `clap`\n\n## [3.1.8] - 2022-04-01\n\n### Fixes\n\n- Add `Debug` impls to more types\n\n## [3.1.7] - 2022-03-31\n\n### Fixes\n\n- *(derive)* Abort, rather than ignore, when deriving `ArgEnum` with non-unit unskipped variants\n\n## [3.1.6] - 2022-03-07\n\n### Fixes\n\n- Don't panic when validating delimited defaults (#3541)\n- Make it clearer that `cargo` feature is needed\n- Documentation improvements\n\n## [3.1.5] - 2022-03-02\n\n### Fixes\n\n- Dependency upgrade\n\n## [3.1.4] - 2022-03-02\n\n### Features\n\n- *(help)* Show `PossibleValue::help` in long help (`--help`)  **(gated behind `unstable-v4`)** (#3312)\n\n## [3.1.3] - 2022-02-28\n\n### Fixes\n\n- Don't panic when validating delimited defaults (#3514)\n\n## [3.1.2] - 2022-02-23\n\n### Fixes\n\n- *(derive)* Allow other attribute with a subcommand that has subcommands\n\n### Documentation\n\n- *(examples)* List example topics\n- *(derive)* Clarify syntax and relation to builder API\n\n## [3.1.1] - 2022-02-21\n\n### Fixes\n\n- Track caller for `ArgMatches` assertions so the user more easily sees where they need to fix the call\n\n## [3.1.0] - 2022-02-16\n\n### Compatibility\n\nChanges in behavior of note that are not guaranteed to be compatible across releases:\n\n- *(help)* `help` subcommand shows long help like `--help`, rather than short help (`-h`), deprecated `clap::AppSettings::UseLongFormatForHelpSubcommand` (#3440)\n- *(help)* Pacman-style subcommands are now ordered the same as usage errors (#3470)\n- *(help)* Pacman-style subcommands use standard alternate syntax in usage (#3470)\n\n### Deprecations\n\n- `clap::Command` is now preferred over `clap::App` (#3089 in #3472)\n  - `clap::command!` is now preferred over `clap::app_from_crate` (#3089 in #3474)\n  - `clap::CommandFactory::command` is now preferred over `clap::IntoApp::into_app` (#3089 in #3473)\n- *(help)* `help` subcommand shows long help like `--help`, rather than short help (`-h`), deprecated `clap::AppSettings::UseLongFormatForHelpSubcommand` (#3440)\n- *(error)* Deprecate `clap::AppSettings::WaitOnError`, leaving it to the user to implement\n- *(validation)* `clap::Command::subcommand_required(true).arg_required_else_help(true)` is now preferred over `clap::AppSettings::SubcommandRequiredElseHelp` (#3280)\n- *(builder)* `clap::AppSettings` are nearly all deprecated and replaced with builder methods and getters (#2717)\n- *(builder)* `clap::ArgSettings` is deprecated and replaced with builder methods and getters (#2717)\n- *(builder)* `clap::Arg::id` and `clap::ArgGroup::id` are now preferred over `clap::Arg::name` and `clap::ArgGroup::name` (#3335)\n- *(help)* `clap::Command::next_help_heading` is now preferred over `clap::Command::help_heading` (#1807, #1553)\n- *(error)* `clap::error::ErrorKind` is now preferred over `clap::ErrorKind` (#3395)\n- *(error)* `clap::Error::kind()` is now preferred over `clap::Error::kind`\n- *(error)* `clap::Error::context()` is now preferred over `clap::Error::info` (#2628)\n\nNote: All items deprecated in 3.0.0 are now hidden in the documentation. (#3458)\n\n### Features\n\n- *(matches)* Add `clap::ArgMatches::value_source` to determine what insert the value (#1345)\n- *(help)* Override derived display order with `clap::Command::next_display_order` (#1807)\n- *(error)* Show possible values when an argument doesn't have a value (#3320)\n- *(error)* New `clap::Error::context` API to open the door for fully-custom error messages (#2628)\n  - *(error)* `clap::error::ErrorKind` now implements `Display`\n\n### Fixes\n\n- *(builder)* Some functions were renamed for consistency and fixing spelling issues\n- *(builder)* Allow `clap::Command::color` to override previous calls (#3449)\n- *(parse)* Propagate globals with multiple subcommands (#3428)\n- *(validation)* Give `ArgRequiredElseHelp` precedence over `SubcommandRequired` (#3456)\n- *(validation)* Default values no longer count as \"present\" for conflicts, requires, `clap::Command::arg_required_else_help`, etc (#3076, #1264)\n- *(assert)* Report invalid defaults (#3202)\n- *(help)* Clarify how to handle `-h` conflicts (#3403)\n- *(help)* Make it easier to debug the addition of help flags (#3425)\n- *(help)* Pacman-style subcommands are now separated with spaces (#3470)\n- *(help)* Pacman-style subcommands are now ordered the same as usage errors (#3470)\n- *(help)* Pacman-style subcommands use standard alternate syntax in usage (#3470)\n- *(error)* Be consistent in showing of required attributes between errors / usage (#3390)\n- *(error)* Show user's order of possible values, like in `--help` (#1549)\n- *(error)* Allow customizing error type in `clap::error::Result` (#3395)\n\n### Performance\n\n- *(error)* Reduced stack size of `clap::Error` (#3395)\n\n### Documentation\n\n- *(builder)* Correct data take accepted for `clap::Arg::validator`\n- *(derive)* Clarify `parse` attribute\n- *(tutorial)* Demonstrate custom parsing\n- *(example)* Consistently list out required feature flags (#3448)\n\n## [3.0.14] - 2022-02-01\n\n### Features\n\n- Added `ArgMatches::args_present()` to check if any args are present\n- Added `Error::kind()` as we work to deprecate direct member access for `Error`\n- Added `App::get_version`\n- Added `App::get_long_version`\n- Added `App::get_author`\n- Added `App::get_subcommand_help_heading`\n- Added `App::get_subcommand_value_name`\n- Added `App::get_after_help`\n- Added `App::get_after_long_help`\n\n### Performance\n\n- Misc binary size reductions\n\n## [3.0.13] - 2022-01-26\n\n### Fixes\n\n- Show optional flag values wrapped in `[]`\n\n## [3.0.12] - 2022-01-24\n\n### Features\n\n- *(derive)* Support for `default_value_os_t`\n\n## [3.0.11] - 2022-01-24\n\n### Fixes\n\n- Ensure conflicts work when they target a group with a default value\n\n## [3.0.10] - 2022-01-18\n\n### Fixes\n\n- Resolve `panic!` from v3.0.8 when using `global_setting(PropagateVersion)`.\n\n## [3.0.9] - 2022-01-17\n\n### Features\n\n- Added `App::find_subcommand_mut`\n\n## [3.0.8] - 2022-01-17\n\n### Fixes\n\n- Respected `DisableColoredHelp` on `cmd help help`\n- Provide a little more context when completing arguments for `cmd help`\n- Provide more context for some asserts\n- Small documentation improvements\n\n## [3.0.7] - 2022-01-12\n\n### Fixes\n\n- Shift more asserts from parsing to `App` building (ie will now run in `App::debug_assert`)\n\n**derive**\n- Documentation fixes\n\n## [3.0.6] - 2022-01-10\n\n### Fixes\n\n**derive**\n- Don't assume user does `use clap::ArgEnum` (#3277)\n- Documentation fixes\n\n## [3.0.5] - 2022-01-05\n\n### Fixes\n\n- Provide hack to workaround [inability to detect external subcommands aliasing when escaped](https://github.com/clap-rs/clap/issues/3263) (#3264)\n\n**docs:**\n- Cleaned up code blocks in tutorials (#3261)\n- Clean up quotes in `ArgMatches` asserts\n- List correct replacement for deprecated `Parser::from_clap` (#3257)\n\n## [3.0.4] - 2022-01-04\n\n### Features\n\n- For very limited cases, like `cargo`, expose `ArgMatches::is_valid_arg` to avoid panicing on undefined arguments\n\n## [3.0.3] - 2022-01-04\n\n### Fixes\n\n- Specify cause of debug assert failure\n\n## [3.0.2] - 2022-01-04\n\n### Fixes\n\n- Ignore `Last` when checking hyphen values (see #3249 for details)\n- Help catch bugs with `#[must_use]`\n\n## [3.0.1] - 2022-01-03\n\n### Fixes\n\n- Don't panic when getting number of values (#3241)\n- Don't warn when using `default_value_t` derive attribute with a `Subcommand` (#3245)\n\nDocumentation\n- Added `name` attribute to `ArgEnum` variant derive reference\n\n## [3.0.0] - 2021-12-31\n\n**Note:** clap v3 has been in development for several years and has changed\nhands multiple times.  Unfortunately, our changelog might be incomplete,\nwhether in changes or their motivation.\n\n### Highlights\n\nA special thanks to the maintainers, contributors, beta users, and sponsors who\nhave helped along this journey, especially kbknapp.\n\n**[StructOpt](https://docs.rs/structopt/) Integration**\n\n[StructOpt](https://docs.rs/structopt/) provides a serde-like declarative\napproach to defining your parser.  The main benefits we've seen so far from integrating are:\n- Tighter feedback between the design of clap and the derives\n- More universal traits.  Crates exist for common CLI patterns\n  ([example](https://github.com/rust-cli/clap-verbosity-flag))\n  and we've re-designed the `StructOpt` traits so crates built on clap3 can be\n  reused not just with other derives but also people using the builder API.\n  People can even hand implement these so people using the builder API won't\n  have the pay the cost for derives.\n\n**Custom Help Headings**\n\nPreviously, clap automatically grouped arguments in the help as either\n`ARGS`, `FLAGS`, `OPTIONS`, and `SUBCOMMANDS`.\n\nYou can now override the default group with `Arg::help_heading` and\n`App::subcommand_help_heading`.  To apply a heading to a series of arguments,\nyou can set `App::help_heading`.\n\n**Deprecations**\n\nWhile a lot of deprecations have been added to clean up the API (overloaded\nmeaning of `Arg::multiple`) or make things more consistent, some particular\nhighlights are:\n- `clap_app!` has been deprecated in favor of the builder API with `arg!` ([clap-rs/clap#2835](https://github.com/clap-rs/clap/issues/2835))\n- `Arg::from_usage` has been deprecated in favor of `arg!` ([clap-rs/clap#3087](https://github.com/clap-rs/clap/issues/3087))\n  - [Porting example](https://github.com/clap-rs/clap/commit/4c4a2b86a08ef9e2d63010aab4909dd5a013dfb0) \n- The YAML API has been deprecated in favor the builder or derive APIs ([clap-rs/clap#3087](https://github.com/clap-rs/clap/issues/3087))\n\n### Migrating\n\n**From clap v2**\n\n1. Add CLI tests, `-h` and `--help` output at a minimum (recommendation: [trycmd](https://docs.rs/trycmd/) for snapshot testing)\n2. Update your dependency\n    1. *If you use `no-default-features`:* add the `std` feature\n3. Resolve compiler errors\n4. Resolve behavior changes\n    1. Refactor your `App` creation to a function and add a test similar to the one below, resolving any of its assertions\n    2. Look over the \"subtle changes\" under BREAKING CHANGES\n    3. *If using builder:* test your application under various circumstances to see if `ArgMatches` asserts regarding `AllowInvalidUtf8`.\n5. *At your leisure:* resolve deprecation notices\n\nExample test:\n```rust\nfn app() -> clap::App<'static> {\n    ...\n}\n\n#[test]\nfn verify_app() {\n    app().debug_assert();\n}\n```\n\n**From structopt 0.3.25**\n<a name=\"migrate-structopt\"></a>\n\n1. Add CLI tests, `-h` and `--help` output at a minimum (recommendation: [trycmd](https://docs.rs/trycmd/) for snapshot testing)\n2. Replace your dependency from `structopt = \"...\"` to `clap = { version = \"3.0\", features = [\"derive\"] }`\n    1. *If you use `no-default-features`:* add the `std` feature\n3. Resolve compiler errors, including\n    1. Update your `use` statements from `structopt` and `structopt::clap` to `clap`\n4. Resolve behavior changes\n    1. Add a test similar to the one below, resolving any of its assertions\n    2. Look over the \"subtle changes\" under BREAKING CHANGES\n5. *At your leisure:* resolve deprecation notices\n\nExample test:\n```rust\n#[derive(clap::StructOpt)]\nstruct Args {\n    ...\n}\n\n#[test]\nfn verify_app() {\n    use clap::IntoApp;\n    Args::into_app().debug_assert()\n}\n```\n\n**From clap v3.0.0-beta.5**\n\n1. Add CLI tests, `-h` and `--help` output at a minimum (recommendation: [trycmd](https://docs.rs/trycmd/) for snapshot testing)\n2. Update your dependency\n    1. Add in `derive`, `env`, `cargo`, or `unicode` feature flags as needed\n3. Resolve compiler errors\n    1. *If you use `yaml`, `clap_app!`, or usage parser:* revert any changes you made for clap3\n    2. Change `Arg::about` `Arg::long_about` back to `help` and `long_help` and change `PossibleValue::about` to `help` ([clap-rs/clap#3075](https://github.com/clap-rs/clap/issues/3075))\n    3. Change `AppSettings::HelpRequired` to `AppSettings::HelpExpected`\n    4. Change `PossibleValue::hidden` to `PossibleValue::hide`\n    5. Change `App::subcommand_placeholder` to `App::subcommand_value_name` / `App::subcommand_help_heading`\n4. Resolve behavior changes\n    1. Add the above listed test appropriate for your application and resolve any problems it reports\n    2. *If using `derive`:* see the structopt breaking changes section for `Vec` changes\n    3. *If using builder:* test your application under various circumstances to see if `ArgMatches` asserts regarding `AllowInvalidUtf8`.\n5. *At your leisure:* resolve deprecation notices\n\n### BREAKING CHANGES\n\n**From clap 2**\n\nSubtle changes (i.e. compiler won't catch):\n- `AppSettings::UnifiedHelpMessage` is now default behaviour\n  - `{flags}` and `{unified}` will assert if present in `App::help_template`\n  - See [clap-rs/clap#2807](https://github.com/clap-rs/clap/issues/2807)\n- `AppSettings::EnableColoredHelp` is now the default behavior but can be\n  opted-out with `AppSettings::DisableColoredHelp`\n  ([clap-rs/clap#2806](https://github.com/clap-rs/clap/issues/2806))\n- `App::override_usage` no longer implies a leading `\\t`, allowing multi lined usages\n- `Arg::require_equals` no longer implies `ArgSettings::ForbidEmptyValues` ([#2233](https://github.com/clap-rs/clap/issues/2233))\n- `Arg::require_delimiter` no longer implies `ArgSettings::TakesValue` and `ArgSettings::UseValueDelimiter` ([#2233](https://github.com/clap-rs/clap/issues/2233))\n- `Arg::env`, `Arg::env_os`, `Arg::last`, `Arg::require_equals`, `Arg::allow_hyphen_values`,\n  `Arg::hide_possible_values`, `Arg::hide_default_value`, `Arg::hide_env_values`,\n  `Arg::case_insensitive` and `Arg::multiple_values` no longer imply `ArgSettings::TakesValue` ([#2233](https://github.com/clap-rs/clap/issues/2233))\n- `ArgMatches::is_present` no longer checks subcommand names\n- Some env variable values are now considered false for flags, not just \"not-present\" ([clap-rs/clap#2539](https://github.com/clap-rs/clap/issues/2539))\n- Changed `...`s meaning in usage parser.  Before, it always meant `multiple` which is still true for `--option [val]...`.  Now `[name]... --option [val]` results in `ArgSettings::MultipleOccurrences`.\n- Usage exit code changed from `1` to `2` ([clap-rs/clap#1327](https://github.com/clap-rs/clap/issues/1327))\n- Reject `--foo=bar` when `takes_value(false)` ([clap-rs/clap#1543](https://github.com/clap-rs/clap/issues/1543))\n- No longer accept an arbitrary number of `-` for long arguments (`-----long`)\n\nEasier to catch changes:\n- When using `no-default-features`, you now have to specify the `std` feature (reserved for future work)\n- Gated env support behind `env` feature flag\n  - Impacts `Arg::env`, `Arg::env_os`, `Arg::hide_env_values`, `ArgSettings::HideEnvValues`\n  - See [clap-rs/clap#2694](https://github.com/clap-rs/clap/pull/2694)\n- Gated crate information behind `cargo` feature flag\n  - Impacts `crate_name!`, `crate_version!`, `crate_authors!`, `crate_description!`, `app_from_crate!`\n- `AppSettings::StrictUtf8` is now default behaviour and asserts if\n  `AppSettings::AllowInvalidUtf8ForExternalSubcommands` and\n  `ArgSettings::AllowInvalidUtf8` and `ArgMatches::value_of_os` aren't used\n  together\n  - `AppSettings::AllowInvalidUtf8` has been removed\n  - [clap-rs/clap#751](https://github.com/clap-rs/clap/issues/751)\n- `Arg::short` and `Arg::value_delimiter` now take a `char` instead of a `&str`\n- `ArgMatches` panics on unknown arguments\n- Removed `VersionlessSubcommands`, making it the default (see [clap-rs/clap#2812](https://github.com/clap-rs/clap/issues/2812))\n- Completion generation has been split out into [clap_complete](./clap_complete).\n- Removed `ArgSettings::EmptyValues` in favor of `ArgSettings::ForbidEmptyValues`\n- Validator signatures have been loosed:\n  - `Arg::validator` now takes first argument as `Fn(&str) -> Result<O, E: ToString>` instead of\n    `Fn(String) -> Result<(), String>`\n  - `Arg::validator_os` now takes first argument as `Fn(&OsStr) -> Result<O, OsString>` instead of\n    `Fn(&OsStr) -> Result<(), OsString>`\n- `Arg::value_name` now sets, rather than appends (see [clap-rs/clap#2634](https://github.com/clap-rs/clap/issues/2634))\n- Upgrade `yaml-rust` from 0.3 to 0.4\n- Replaced `ArgGroup::from(BTreeMap)` to `ArgGroup::from(yaml)`\n- Replaced `ArgMatches::usage` with `App::generate_usage`\n- Replaced `Arg::settings` with `Arg::setting(Setting1 | Setting2)`\n- `App` and `Arg` now need only one lifetime\n- Removed deprecated `App::with_defaults`, replaced with `app_from_crate`\n- Removed deprecated `AppSettings::PropagateGlobalValuesDown` (now the default)\n- Some `App` functions, like `App::write_help` now take `&mut self` instead of `&self`\n- `Error::message` is now private, use `Error::to_string`\n- `Arg::default_value_if`, `Arg::default_value_if_os`, `Arg::default_value_ifs`,\n  `Arg::default_value_ifs_os` now takes the default value parameter as an option ([clap-rs/clap#1406](https://github.com/clap-rs/clap/issues/1406))\n- Changed `App::print_help` & `App::print_long_help` to now return `std::io::Result`\n- Changed `App::write_help` & `App::write_long_help` to now return `std::io::Result`\n- Changed `Arg::index`, `Arg::number_of_values`, `Arg::min_values`, `Arg::max_values` to taking `usize` instead of u64\n- Changed `Error::info` to type `Vec<String>` instead of `Option<Vec<String>>`\n- Changed `ArgMatches::subcommand` to now return `Option<(&str, &ArgMatches)>`\n- Renamed `ErrorKind::MissingArgumentOrSubcommand` to `ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand`\n- Renamed `ErrorKind::HelpDisplayed` to `ErrorKind::DisplayHelp`\n- Renamed `ErrorKind::VersionDisplayed` to `ErrorKind::DisplayVersion`\n- Added `#[non_exhaustive]` to `clap::{ValueHint, ErrorKind, AppSettings, ArgSettings}` ([clap-rs/clap#3167](https://github.com/clap-rs/clap/pull/3167))\n\n**From structopt 0.3.25**\n\n- By default, the `App` isn't initialized with crate information anymore.  Now opt-in via `#[clap(author)]`, `#[clap(about)]`, `#[clap(version)]` ([clap-rs/clap#3034](https://github.com/clap-rs/clap/issues/3034))\n- `#[clap(default_value)]` is replaced with `#[clap(default_value_t)]` ([clap-rs/clap#1694](https://github.com/clap-rs/clap/issues/1694))\n- Subcommands nested under subcommands now needs a `#[clap(subcommand)]` attribute ([clap-rs/clap#2587](https://github.com/clap-rs/clap/pull/2587))\n- `Vec<_>` and `Option<Vec<_>>` have changed from `multiple` to `multiple_occurrences`\n\nOn top of the clap 2 changes\n\n### Performance\n\n**From clap 2**\n\n- Split out non-default `unicode` feature flag for faster builds and smaller binaries for ASCII-only CLIs.\n- Split out non-default `env` feature flag  for faster builds and smaller binaries.\n\n### Features\n\n**From clap 2**\n\n- Integration of `structopt::StructOpt` via `clap::Parser` (requires `derive` feature flag)\n- Custom help headings\n  - `App::help_heading` (apply to all future args)\n  - `Arg::help_heading` (apply to current arg)\n  - `App::subcommand_help_heading` along with `App::subcommand_value_name` (apply to subcommands)\n  - See [clap-rs/clap#805](https://github.com/clap-rs/clap/issues/805)\n  - `AppSettings::UnifiedHelpMessage` is now default behaviour ([clap-rs/clap#2807](https://github.com/clap-rs/clap/issues/2807))\n- Deriving of `ArgEnum` for generating `Arg::possible_values` (requires `derive` feature flag)\n- Disable built-in help/version behavior with `AppSettings::NoAutoHelp` and `AppSettings::NoAutoVersion`\n- Change an existing arg with new builder method `mut_arg` (particularly helpful for `--help` and `--version`)\n- Provide extra context in long help messages (`--help`) with `before_long_help` and `after_long_help` ([clap-rs/clap#1903](https://github.com/clap-rs/clap/issues/1903))\n- Detect missing help descriptions via debug asserts by enabling `AppSettings::HelpExpected`\n- Aliases for short flags ([clap-rs/clap#1896](https://github.com/clap-rs/clap/issues/1896))\n- Validate UTF-8 values, rather than panicing during `ArgMatches::value_of` thanks to `AppSettings::AllowInvalidUtf8ForExternalSubcommands` and `ArgSettings::AllowInvalidUtf8`\n  - Debug builds will assert when the `ArgMatches` calls do not match the UTF-8 setting.\n  - See [clap-rs/clap#751](https://github.com/clap-rs/clap/issues/751)\n- `clap::PossibleValue` to allow\n  - Hiding ([clap-rs/clap#2756](https://github.com/clap-rs/clap/issues/2756))\n  - Completion help for possible values for args ([clap-rs/clap#2731](https://github.com/clap-rs/clap/issues/2731))\n- Allow arguments to conflict with all others via `Arg::exclusive` ([clap-rs/clap#1583](https://github.com/clap-rs/clap/issues/1583))\n- Validate arguments with a regex (required `regex` feature flag)\n  - See [clap-rs/clap](https://github.com/clap-rs/clap/issues/1968)\n- `Arg::default_missing_value` for cases like `--color[=<WHEN>]` ([clap-rs/clap#1587](https://github.com/clap-rs/clap/pull/1587))\n- `clap::App::color` / `clap::ColorChoice` to specify color setting for the app\n- Custom error reporting with `App::error`\n- `App::debug_assert` test helper\n- Replace `Arg::multiple(bool)` with `Arg::multiple_values` / `Arg::multiple_occurrences`\n  - Positionals can be either\n- Added support for flag subcommands like pacman ([clap-rs/clap#1361](https://github.com/clap-rs/clap/issues/1361))\n- Partial parsing via `AppSettings::IgnoreErrors` ([clap-rs/clap#1880](https://github.com/clap-rs/clap/issues/1880))\n- Enable `cmd help` to print long help (`--help` instead of `-h`) with `AppSettings::UseLongFormatForHelpSubcommand` ([clap-rs/clap#2435](https://github.com/clap-rs/clap/issues/2435))\n- Allow long arg abbreviations like we do with subcommands via `AppSettings::InferLongArgs` ([clap-rs/clap#2435](https://github.com/clap-rs/clap/issues/2435))\n- Detect subcommands among positional arguments with `AppSettings::SubcommandPrecedenceOverArg`\n- Give completion scripts hints with `Arg::value_hint` ([clap-rs/clap#1793](https://github.com/clap-rs/clap/pull/1793))\n- Allow unsetting defaults with\n- `Arg::default_value_if`, `Arg::default_value_if_os`, `Arg::default_value_ifs`,\n  `Arg::default_value_ifs_os` ([clap-rs/clap#1406](https://github.com/clap-rs/clap/issues/1406))\n- Interpret some env variable values as `false` for flags, in addition to \"not-present\" ([clap-rs/clap#2539](https://github.com/clap-rs/clap/issues/2539))\n  - `n`, `no`, `f`, `false`, `off`, `0`\n- Added `arg!` macro for creating an `Arg` from a compile-time usage parser\n\n- *(Experimental)* Busybox-like multi-call support\n  - See `AppSettings::Multicall` behind `unstable-multicall` feature flag\n  - See [clap-rs/clap#1120](https://github.com/clap-rs/clap/issues/1120)\n- *(Experimental)* Alias an argument to anything group of arguments\n  - See `App::replace` behind `unstable-replace` feature flag\n  - See [clap-rs#1603](https://github.com/clap-rs/clap/issues/1603)\n- *(Experimental)* Grouping of multiple values within multiple occurrences\n  - See `ArgMatches::grouped_values_of` behind `unstable-grouped` feature flag\n  - See [clap-rs/clap#1026](https://github.com/clap-rs/clap/issues/1026)\n\n**From structopt 0.3.25**\n\n- Allow defaulting with native types via new `default_value_t [= <expr>]` attribute ([clap-rs/clap#1694](https://github.com/clap-rs/clap/issues/1694))\n- New `update` API\n- New `arg_enum` attribute for integrating with `ArgEnum` trait\n\nOn top of the clap 2 changes\n\n### Fixes\n\n**From clap 2**\n\n- Correctly handle colored output on Windows\n- Only generate version flags when `App::version`, `App::long_version` are set\n  (see [clap-rs/clap#2812](https://github.com/clap-rs/clap/issues/2812))\n- General completion script improvements\n- Limited default help text wrapping to 100 when `wrap_help` feature is not enabled\n- Be more specific than `Arg::multiple` with `Arg::multiple_values` and `Arg::multiple_occurrences`\n- `app_from_crate!` defaults to separating multiple authors with `\", \"`\n- Ensure all examples work\n- `IgnoreCase` is now unicode aware (requires `unicode` feature flag)\n- Always respect `ColorChoice::Never`, even if that means we skip colors in some cases\n- `ArgMatches` panics on unknown arguments\n- Gracefully handle empty `authors` field in `Cargo.toml` with `app_from_crate`\n- Do not show `--help` in `cmd help` with `DisableHelpFlag` ([clap-rs/clap#3169](https://github.com/clap-rs/clap/pull/3169))\n- Do not show `--help` in `cmd help help` that doesn't work ([clap-rs/clap#3169](https://github.com/clap-rs/clap/pull/3169))\n\n**From structopt 0.3.25**\n\n- Support `SubcommandsNegateReqs` by allowing required `Option<_>`s ([clap-rs/clap#2255](https://github.com/clap-rs/clap/issues/2255))\n- Infer `AllowInvalidUtf8` based on parser ([clap-rs/clap#751](https://github.com/clap-rs/clap/issues/2255))\n- Gracefully handle empty `authors` field in `Cargo.toml`\n- Don't panic with `default_value_os` but treat it like `default_value` ([clap-rs/clap#3031](https://github.com/clap-rs/clap/issues/3031))\n- When using `flatten` and `subcommand`, ensure our doc comment always overrides the nested container's doc comment, whether it has only `about` or `about` and `long_about` ([clap-rs/clap#3175](]https://github.com/clap-rs/clap/pull/3175))\n\nOn top of the clap 2 changes\n\n### Minimum Required Rust\n\n- As of this release, `clap` requires `rustc 1.54.0` or greater.\n\n## [2.34.0] - 2021-11-30\n\n- Updates to Rust 2018 edition and bumps the MSRV to Rust 1.46\n\n## [2.33.4] - 2021-11-29\n\n### Bug Fixes\n\n* **prevents `panic`:**  swallows broken pipe errors on error output ([7a729bc4](https://github.com/kbknapp/clap-rs/commit/7a729bc4df2646b05f6bf15f001124cd39d076ce))\n\n## [2.33.3] - 2020-08-13\n\n### Improvements\n\n* Suppress deprecation warnings when using `crate_*` macros.\n\n## [2.33.2] - 2020-08-5\n\n#### Documentation\n\n* Fixed links to `2.x` examples. Now they point to the right place.\n\n## [2.33.1] - 2020-05-11\n\n### Bug Fixes\n\n* Windows: Prevent some panics when parsing invalid Unicode on Windows ([922c645](https://github.com/clap-rs/clap/commit/922c64508389170c9c77f1c8a4e597d14d3ed2f0), closes [#1905](https://github.com/clap-rs/clap/issues/1905))\n\n### Documentation\n\n*   fixes versions referenced in the README ([d307466a](https://github.com/kbknapp/clap-rs/commit/d307466af1013f172b8ec0252f01a473e2192d6b))\n* **README.md:**\n  *  cuts down the number of examples to reduce confusion ([6e508ee0](https://github.com/kbknapp/clap-rs/commit/6e508ee09e7153de4adf4e88b0aa6418a537dadd))\n\n### Improvements\n\n* **Deps:**  doesnt compile ansi_term on Windows since its not used ([b57ee946](https://github.com/kbknapp/clap-rs/commit/b57ee94609da3ddc897286cfba968f26ff961491), closes [#1155](https://github.com/kbknapp/clap-rs/issues/1155))\n\n### Minimum Required Rust\n\n* As of this release, `clap` requires `rustc 1.36.0` or greater.\n\n## [2.33.0] - 2019-04-06\n\n#### New Sponsor\n\n*   Stephen Oats is now a sponsor \\o/ ([823457c0](https://github.com/clap-rs/clap/commit/823457c0ef5e994ed7080cf62addbfe1aa3b1833))\n* **SPONSORS.md:**  fixes Josh Triplett's info in the sponsor document ([24cb5740](https://github.com/clap-rs/clap/commit/24cb574090a11159b48bba105d5ec2dfb0a20e4e))\n\n#### Features\n\n* **Completions:**  adds completion support for Elvish. ([e9d0562a](https://github.com/clap-rs/clap/commit/e9d0562a1dc5dfe731ed7c767e6cee0af08f0cf9))\n* There is a new setting to disable automatic building of `--help` and `-h` flags (`AppSettings::DisableAutoHelp`)\n\n#### Improvements\n\n* **arg_matches.rs:**  add Debug implementations ([47192b7a](https://github.com/clap-rs/clap/commit/47192b7a2d84ec716b81ae4af621e008a8762dc9))\n* **macros:**  Support shorthand syntax for ArgGroups ([df9095e7](https://github.com/clap-rs/clap/commit/df9095e75bb1e7896415251d0d4ffd8a0ebcd559))\n\n#### Documentation\n\n*   Refer to macOS rather than OSX. ([ab0d767f](https://github.com/clap-rs/clap/commit/ab0d767f3a5a57e2bbb97d0183c2ef63c8c77a6c))\n* **README.md:**  use https for all links ([96a7639a](https://github.com/clap-rs/clap/commit/96a7639a36bcb184c3f45348986883115ef1ab3a))\n\n#### Bug Fixes\n\n*   add debug assertion for missing args in subcommand ArgGroup ([2699d9e5](https://github.com/clap-rs/clap/commit/2699d9e51e7eadc258ba64c4e347c5d1fef61343))\n*   Restore compat with Rust 1.21 ([6b263de1](https://github.com/clap-rs/clap/commit/6b263de1d42ede692ec5ee55019ad2fc6386f92e))\n*   Don't mention unused subcommands ([ef92e2b6](https://github.com/clap-rs/clap/commit/ef92e2b639ed305bdade4741f60fa85cb0101c5a))\n* **OsValues:**  Add `ExactSizeIterator` implementation ([356c69e5](https://github.com/clap-rs/clap/commit/356c69e508fd25a9f0ea2d27bf80ae1d9a8d88f4))\n* **arg_enum!:**\n  *  Fix comma position for valid values. ([1f1f9ff3](https://github.com/clap-rs/clap/commit/1f1f9ff3fa38a43231ef8be9cfea89a32e53f518))\n  *  Invalid expansions of some trailing-comma patterns ([7023184f](https://github.com/clap-rs/clap/commit/7023184fca04e852c270341548d6a16207d13862))\n* **completions:**  improve correctness of completions when whitespace is involved ([5a08ff29](https://github.com/clap-rs/clap/commit/5a08ff295b2aa6ce29420df6252a0e3ff4441bdc))\n* **help message:**  Unconditionally uses long description for subcommands ([6acc8b6a](https://github.com/clap-rs/clap/commit/6acc8b6a621a765cbf513450188000d943676a30), closes [#897](https://github.com/clap-rs/clap/issues/897))\n* **macros:**  fixes broken pattern which prevented calling multi-argument Arg methods ([9e7a352e](https://github.com/clap-rs/clap/commit/9e7a352e13aaf8025d80f2bac5c47fb32528672b))\n* **parser:**  Better interaction between AllowExternalSubcommands and SubcommandRequired ([9601c95a](https://github.com/clap-rs/clap/commit/9601c95a03d2b82bf265c328b4769238f1b79002))\n\n#### Minimum Required Rust\n\n* As of this release, `clap` requires `rustc 1.31.0` or greater.\n\n## v2.32.0 (2018-06-26)\n\n#### Minimum Required Rust\n\n* As of this release, `clap` requires `rustc 1.21.0` or greater.\n\n\n#### Features\n\n* **Completions:**  adds completion support for Elvish. ([e9d0562a](https://github.com/clap-rs/clap/commit/e9d0562a1dc5dfe731ed7c767e6cee0af08f0cf9))\n\n#### Improvements\n\n* **macros:**  Support shorthand syntax for ArgGroups ([df9095e7](https://github.com/clap-rs/clap/commit/df9095e75bb1e7896415251d0d4ffd8a0ebcd559))\n\n#### Bug Fixes\n\n* **OsValues:**  Add `ExactSizeIterator` implementation ([356c69e5](https://github.com/clap-rs/clap/commit/356c69e508fd25a9f0ea2d27bf80ae1d9a8d88f4))\n* **arg_enum!:**  Invalid expansions of some trailing-comma patterns ([7023184f](https://github.com/clap-rs/clap/commit/7023184fca04e852c270341548d6a16207d13862))\n* **help message:**  Unconditionally uses long description for subcommands ([6acc8b6a](https://github.com/clap-rs/clap/commit/6acc8b6a621a765cbf513450188000d943676a30), closes [#897](https://github.com/clap-rs/clap/issues/897))\n\n#### Documentation\n\n*   Refer to macOS rather than OSX. ([ab0d767f](https://github.com/clap-rs/clap/commit/ab0d767f3a5a57e2bbb97d0183c2ef63c8c77a6c))\n\n\n\n## v2.31.2 (2018-03-19)\n\n#### Bug Fixes\n\n* **Fish Completions:**  fixes a bug that only allowed a single completion in in Fish Shell ([e8774a8](https://github.com/clap-rs/clap/pull/1214/commits/e8774a84ee4a319c888036e7c595ab46451d8e48), closes [#1212](https://github.com/clap-rs/clap/issues/1212))\n* **AllowExternalSubcommands**: fixes a bug where external subcommands would be blocked by a similarly named subcommand (suggestions were getting in the way). ([a410e85](https://github.com/clap-rs/clap/pull/1215/commits/a410e855bcd82b05f9efa73fa8b9774dc8842c6b))\n\n#### Documentation\n\n* Fixes some typos in the `README.md` ([c8e685d7](https://github.com/clap-rs/clap/commit/c8e685d76adee2a3cc06cac6952ffcf6f9548089))\n\n## v2.31.1 (2018-03-06)\n\n\n#### Improvements\n\n* **AllowMissingPositional:**  improves the ability of AllowMissingPositional to allow 'skipping' to the last positional arg with '--' ([df20e6e2](https://github.com/clap-rs/clap/commit/df20e6e24b4e782be0b423b484b9798e3e2efe2f))\n\n\n## v2.31.0 (2018-03-04)\n\n\n#### Features\n\n* **Arg Indices:**  adds the ability to query argument value indices ([f58d0576](https://github.com/clap-rs/clap/commit/f58d05767ec8133c8eb2de117cb642b9ae29ccbc))\n* **Indices:**  implements an Indices<Item=&usize> iterator ([1e67be44](https://github.com/clap-rs/clap/commit/1e67be44f0ccf161cc84c4e6082382072e89c302))\n* **Raw Args** adds a convenience function to `Arg` that allows implying all of `Arg::last` `Arg::allow_hyphen_values` and `Arg::multiple(true)` ([66a78f29](https://github.com/clap-rs/clap/commit/66a78f2972786f5fe7c07937a1ac23da2542afd2))\n\n#### Documentation\n\n*   Fix some typos and markdown issues. ([935ba0dd](https://github.com/clap-rs/clap/commit/935ba0dd547a69c3f636c5486795012019408794))\n* **Arg Indices:**  adds the documentation for the arg index querying methods ([50bc0047](https://github.com/clap-rs/clap/commit/50bc00477afa64dc6cdc5de161d3de3ba1d105a7))\n* **CONTRIBUTING.md:**  fix url to clippy upstream repo to point to https://github.com/rust-lang-nursery/rust-clippy instead of https://github.com/Manishearth/rust-clippy ([42407d7f](https://github.com/clap-rs/clap/commit/42407d7f21d794103cda61f49d2615aae0a4bcd9))\n* **Values:**  improves the docs example of the Values iterator ([74075d65](https://github.com/clap-rs/clap/commit/74075d65e8db1ddb5e2a4558009a5729d749d1b6))\n* Updates readme to hint that the `wrap_help` feature is a thing ([fc7ab227](https://github.com/clap-rs/clap/commit/66a78f2972786f5fe7c07937a1ac23da2542afd2))\n\n### Improvements\n\n*  Cargo.toml: use codegen-units = 1 in release and bench profiles ([19f425ea](https://github.com/clap-rs/clap/commit/66a78f2972786f5fe7c07937a1ac23da2542afd2))\n*  Adds WASM support (clap now compiles on WASM!) ([689949e5](https://github.com/clap-rs/clap/commit/689949e57d390bb61bc69f3ed91f60a2105738d0))\n*  Uses the short help tool-tip for PowerShell completion scripts ([ecda22ce](https://github.com/clap-rs/clap/commit/ecda22ce7210ce56d7b2d1a5445dd1b8a2959656))\n\n\n## v2.30.0 (2018-02-13)\n\n#### Bug Fixes\n\n* **YAML:** Adds a missing conversion from  `Arg::last` when instantiating from a YAML file ([aab77c81a5](https://github.com/clap-rs/clap/pull/1175/commits/aab77c81a519b045f95946ae0dd3e850f9b93070), closes [#1160](https://github.com/clap-rs/clap/issues/1173))\n\n#### Improvements\n\n* **Bash Completions:**  instead of completing a generic option name, all bash completions fall back to file completions UNLESS `Arg::possible_values` was used ([872f02ae](https://github.com/clap-rs/clap/commit/872f02aea900ffa376850a279eb164645e1234fa))\n* **Deps:**  No longer needlessly compiles `ansi_term` on Windows since its not used ([b57ee946](https://github.com/clap-rs/clap/commit/b57ee94609da3ddc897286cfba968f26ff961491), closes [#1155](https://github.com/clap-rs/clap/issues/1155))\n* **Help Message:** changes the `[values: foo bar baz]` array to `[possible values: foo bar baz]` for consistency with the API ([414707e4e97](https://github.com/clap-rs/clap/pull/1176/commits/414707e4e979d07bfe555247e5d130c546673708), closes [#1160](https://github.com/clap-rs/clap/issues/1160))\n\n\n## v2.29.4 (2018-02-06)\n\n\n#### Bug Fixes\n\n* **Overrides Self:**  fixes a bug where options with multiple values couldn't ever have multiple values ([d95907cf](https://github.com/clap-rs/clap/commit/d95907cff6d011a901fe35fa00b0f4e18547a1fb))\n\n\n\n## v2.29.3 (2018-02-05)\n\n\n#### Improvements\n\n* **Overrides:**  clap now supports arguments which override with themselves ([6c7a0010](https://github.com/clap-rs/clap/commit/6c7a001023ca1eac1cc6ffe6c936b4c4a2aa3c45), closes [#976](https://github.com/clap-rs/clap/issues/976))\n\n#### Bug Fixes\n\n* **Requirements:**  fixes an issue where conflicting args would still show up as required ([e06cefac](https://github.com/clap-rs/clap/commit/e06cefac97083838c0a4e1444dcad02a5c3f911e), closes [#1158](https://github.com/clap-rs/clap/issues/1158))\n* Fixes a bug which disallows proper nesting of `--` ([73993fe](https://github.com/clap-rs/clap/commit/73993fe30d135f682e763ec93dcb0814ed518011), closes [#1161](https://github.com/clap-rs/clap/issues/1161))\n\n#### New Settings\n\n* **AllArgsOverrideSelf:**  adds a new convenience setting to allow all args to override themselves ([4670325d](https://github.com/clap-rs/clap/commit/4670325d1bf0369addec2ae2bcb56f1be054c924))\n\n\n\n## v2.29.2 (2018-01-16)\n\n\n#### Features\n\n* **completions/zsh.rs:**\n  *  Escape possible values for options ([25561dec](https://github.com/clap-rs/clap/commit/25561decf147d329b64634a14d9695673c2fc78f))\n  *  Implement positional argument possible values completion ([f3b0afd2](https://github.com/clap-rs/clap/commit/f3b0afd2bef8b7be97162f8a7802ddf7603dff36))\n  *  Complete positional arguments properly ([e39aeab8](https://github.com/clap-rs/clap/commit/e39aeab8487596046fbdbc6a226e5c8820585245))\n\n#### Bug Fixes\n\n* **completions/zsh.rs:**\n  *  Add missing autoload for is-at-least ([a6522607](https://github.com/clap-rs/clap/commit/a652260795d1519f6ec2a7a09ccc1258499cad7b))\n  *  Don't pass -S to _arguments if Zsh is too old ([16b4f143](https://github.com/clap-rs/clap/commit/16b4f143ff466b7ef18a267bc44ade0f9639109b))\n  *  Maybe fix completions with mixed positionals and subcommands ([1146f0da](https://github.com/clap-rs/clap/commit/1146f0da154d6796fbfcb09db8efa3593cb0d898))\n* **completions/zsh.zsh:**  Remove redundant code from output ([0e185b92](https://github.com/clap-rs/clap/commit/0e185b922ed1e0fd653de00b4cd8d567d72ff68e), closes [#1142](https://github.com/clap-rs/clap/issues/1142))\n\n\n\n### 2.29.1 (2018-01-09)\n\n\n#### Documentation\n\n*   fixes broken links. ([56e734b8](https://github.com/clap-rs/clap/commit/56e734b839303d733d2e5baf7dac39bd7b97b8e4))\n*   updates contributors list ([e1313a5a](https://github.com/clap-rs/clap/commit/e1313a5a0f69d8f4016f73b860a63af8318a6676))\n\n#### Performance\n\n*   further debloating by removing generics from error cases ([eb8d919e](https://github.com/clap-rs/clap/commit/eb8d919e6f3443db279ba0c902f15d76676c02dc))\n*   debloats clap by deduplicating logic and refactors ([03e413d7](https://github.com/clap-rs/clap/commit/03e413d7175d35827cd7d8908d47dbae15a849a3))\n\n#### Bug Fixes\n\n*   fixes the ripgrep benchmark by adding a value to a flag that expects it ([d26ab2b9](https://github.com/clap-rs/clap/commit/d26ab2b97cf9c0ea675b440b7b0eaf6ac3ad01f4))\n* **bash completion:**  Change the bash completion script code generation to support hyphens. ([ba7f1d18](https://github.com/clap-rs/clap/commit/ba7f1d18eba7a07ce7f57e0981986f66c994b639))\n* **completions/zsh.rs:**  Fix completion of long option values ([46365cf8](https://github.com/clap-rs/clap/commit/46365cf8be5331ba04c895eb183e2f230b5aad51))\n\n\n## 2.29.0 (2017-12-02)\n\n\n#### API Additions\n\n* **Arg:**  adds Arg::hide_env_values(bool) which allows one to hide any current env values and display only the key in help messages ([fb41d062](https://github.com/clap-rs/clap/commit/fb41d062eedf37cb4f805c90adca29909bd197d7))\n\n\n\n## 2.28.0 (2017-11-28)\n\nThe minimum required Rust is now 1.20. This was done to start using bitflags 1.0 and having >1.0 deps is a *very good* thing!\n\n#### Documentation\n\n*   changes the demo version to 2.28 to stay in sync ([ce6ca492](https://github.com/clap-rs/clap/commit/ce6ca492c7510ab6474075806360b96081b021a9))\n*   Fix URL path to github hosted files ([ce72aada](https://github.com/clap-rs/clap/commit/ce72aada56a9581d4a6cb4bf9bdb861c3906f8df), closes [#1106](https://github.com/clap-rs/clap/issues/1106))\n*   fix typo ([002b07fc](https://github.com/clap-rs/clap/commit/002b07fc98a1c85acb66296b1eec0b2aba906125))\n* **README.md:**  updates the readme and pulls out some redundant sections ([db6caf86](https://github.com/clap-rs/clap/commit/db6caf8663747e679d2f4ed3bd127f33476754aa))\n\n#### Improvements\n\n*   adds '[SUBCOMMAND]' to usage strings with only AppSettings::AllowExternalSubcommands is used with no other subcommands ([e78bb757](https://github.com/clap-rs/clap/commit/e78bb757a3df16e82d539e450c06767a6bfcf859), closes [#1093](https://github.com/clap-rs/clap/issues/1093))\n\n#### API Additions\n\n*   Adds Arg::case_insensitive(bool) which allows matching Arg::possible_values without worrying about ASCII case ([1fec268e](https://github.com/clap-rs/clap/commit/1fec268e51736602e38e67c76266f439e2e0ef12), closes [#1118](https://github.com/clap-rs/clap/issues/1118))\n*   Adds the traits to be used with the clap-derive crate to be able to use Custom Derive ([6f4c3412](https://github.com/clap-rs/clap/commit/6f4c3412415e882f5ca2cc3fbd6d4dce79440828))\n\n#### Bug Fixes\n\n*   Fixes a regression where --help couldn't be overridden ([a283d69f](https://github.com/clap-rs/clap/commit/a283d69fc08aa016ae1bf9ba010012abecc7ba69), closes [#1112](https://github.com/clap-rs/clap/issues/1112))\n*   fixes a bug that allowed options to pass parsing when no value was provided ([2fb75821](https://github.com/clap-rs/clap/commit/2fb758219c7a60d639da67692e100b855a8165ac), closes [#1105](https://github.com/clap-rs/clap/issues/1105))\n*   ignore PropagateGlobalValuesDown deprecation warning ([f61ce3f5](https://github.com/clap-rs/clap/commit/f61ce3f55fe65e16b3db0bd4facdc4575de22767), closes [#1086](https://github.com/clap-rs/clap/issues/1086))\n\n#### Deps\n\n*  Updates `bitflags` to 1.0\n\n\n\n## v2.27.1 (2017-10-24)\n\n\n#### Bug Fixes\n\n* Adds `term_size` as an optional dependency (with feature `wrap_help`) to fix compile bug\n\n## v2.27.0 (2017-10-24)\n\n** This release raises the minimum required version of Rust to 1.18 **\n\n** This release also contains a very minor breaking change to fix a bug **\n\nThe only CLIs affected will be those using unrestrained multiple values and subcommands where the\nsubcommand name can coincide with one of the multiple values.\n\nSee the commit [0c223f54](https://github.com/clap-rs/clap/commit/0c223f54ed46da406bc8b43a5806e0b227863b31) for full details.\n\n\n#### Bug Fixes\n\n*   Values from global args are now propagated UP and DOWN!\n*   fixes a bug where using AppSettings::AllowHyphenValues would allow invalid arguments even when there is no way for them to be valid ([77ed4684](https://github.com/clap-rs/clap/commit/77ed46841fc0263d7aa32fcc5cc49ef703b37c04), closes [#1066](https://github.com/clap-rs/clap/issues/1066))\n*   when an argument requires a value and that value happens to match a subcommand name, its parsed as a value ([0c223f54](https://github.com/clap-rs/clap/commit/0c223f54ed46da406bc8b43a5806e0b227863b31), closes [#1031](https://github.com/clap-rs/clap/issues/1031), breaks [#](https://github.com/clap-rs/clap/issues/), [#](https://github.com/clap-rs/clap/issues/))\n*   fixes a bug that prevented number_of_values and default_values to be used together ([5eb342a9](https://github.com/clap-rs/clap/commit/5eb342a99dde07b0f011048efde3e283bc1110fc), closes [#1050](https://github.com/clap-rs/clap/issues/1050), [#1056](https://github.com/clap-rs/clap/issues/1056))\n*   fixes a bug that didn't allow args with default values to have conflicts ([58b5b4be](https://github.com/clap-rs/clap/commit/58b5b4be315280888d50d9b15119b91a9028f050), closes [#1071](https://github.com/clap-rs/clap/issues/1071))\n*   fixes a panic when using global args and calling App::get_matches_from_safe_borrow multiple times ([d86ec797](https://github.com/clap-rs/clap/commit/d86ec79742c77eb3f663fb30e225954515cf25bb), closes [#1076](https://github.com/clap-rs/clap/issues/1076))\n*   fixes issues and potential regressions with global args values not being propagated properly or at all ([a43f9dd4](https://github.com/clap-rs/clap/commit/a43f9dd4aaf1864dd14a3c28dec89ccdd70c61e5), closes [#1010](https://github.com/clap-rs/clap/issues/1010), [#1061](https://github.com/clap-rs/clap/issues/1061), [#978](https://github.com/clap-rs/clap/issues/978))\n*   fixes a bug where default values are not applied if the option supports zero values ([9c248cbf](https://github.com/clap-rs/clap/commit/9c248cbf7d8a825119bc387c23e9a1d1989682b0), closes [#1047](https://github.com/clap-rs/clap/issues/1047))\n\n#### Documentation\n\n*   adds additional blurbs about using multiples with subcommands ([03455b77](https://github.com/clap-rs/clap/commit/03455b7751a757e7b2f6ffaf2d16168539c99661))\n*   updates the docs to reflect changes to global args and that global args values can now be propagated back up the stack ([ead076f0](https://github.com/clap-rs/clap/commit/ead076f03ada4c322bf3e34203925561ec496d87))\n*   add html_root_url attribute ([e67a061b](https://github.com/clap-rs/clap/commit/e67a061bcf567c6518d6c2f58852e01f02764b22))\n*   sync README version numbers with crate version ([5536361b](https://github.com/clap-rs/clap/commit/5536361bcda29887ed86bb68e43d0b603cbc423f))\n\n#### Improvements\n\n*   args that have require_delimiter(true) is now reflected in help and usage strings ([dce61699](https://github.com/clap-rs/clap/commit/dce616998ed9bd95e8ed3bec1f09a4883da47b85), closes [#1052](https://github.com/clap-rs/clap/issues/1052))\n*   if all subcommands are hidden, the subcommands section of the help message is no longer displayed ([4ae7b046](https://github.com/clap-rs/clap/commit/4ae7b0464750bc07ec80ece38e43f003fdd1b8ae), closes [#1046](https://github.com/clap-rs/clap/issues/1046))\n\n#### Breaking Changes\n\n*   when an argument requires a value and that value happens to match a subcommand name, its parsed as a value ([0c223f54](https://github.com/clap-rs/clap/commit/0c223f54ed46da406bc8b43a5806e0b227863b31), closes [#1031](https://github.com/clap-rs/clap/issues/1031), breaks [#](https://github.com/clap-rs/clap/issues/), [#](https://github.com/clap-rs/clap/issues/))\n\n#### Deprecations\n\n* **AppSettings::PropagateGlobalValuesDown:**  this setting is no longer required to propagate values down or up ([2bb5ddce](https://github.com/clap-rs/clap/commit/2bb5ddcee61c791ca1aaca494fbeb4bd5e277488))\n\n\n\n## v2.26.2 (2017-09-14)\n\n\n#### Improvements\n\n*   if all subcommands are hidden, the subcommands section of the help message is no longer displayed ([4ae7b046](https://github.com/clap-rs/clap/commit/4ae7b0464750bc07ec80ece38e43f003fdd1b8ae), closes [#1046](https://github.com/clap-rs/clap/issues/1046))\n\n#### Bug Fixes\n\n*   fixes a bug where default values are not applied if the option supports zero values ([9c248cbf](https://github.com/clap-rs/clap/commit/9c248cbf7d8a825119bc387c23e9a1d1989682b0), closes [#1047](https://github.com/clap-rs/clap/issues/1047))\n\n\n\n## v2.26.1 (2017-09-14)\n\n\n#### Bug Fixes\n\n*   fixes using require_equals(true) and min_values(0) together ([10ae208f](https://github.com/clap-rs/clap/commit/10ae208f68518eff6e98166724065745f4083174), closes [#1044](https://github.com/clap-rs/clap/issues/1044))\n*   escape special characters in zsh and fish completions ([87e019fc](https://github.com/clap-rs/clap/commit/87e019fc84ba6193a8c4ddc26c61eb99efffcd25))\n*   avoid panic generating default help msg if term width set to 0 due to bug in textwrap 0.7.0 ([b3eadb0d](https://github.com/clap-rs/clap/commit/b3eadb0de516106db4e08f078ad32e8f6d6e7a57))\n*   Change `who's` -> `whose` ([53c1ffe8](https://github.com/clap-rs/clap/commit/53c1ffe87f38b05d8804a0f7832412a952845349))\n*   adds a debug assertion to ensure all args added to groups actually exist ([7ad123e2](https://github.com/clap-rs/clap/commit/7ad123e2c02577e3ca30f7e205181e896b157d11), closes [#917](https://github.com/clap-rs/clap/issues/917))\n*   fixes a bug where args that allow values to start with a hyphen couldn't contain a double hyphen -- as a value ([ab2f4c9e](https://github.com/clap-rs/clap/commit/ab2f4c9e563e36ec739a4b55d5a5b76fdb9e9fa4), closes [#960](https://github.com/clap-rs/clap/issues/960))\n*   fixes a bug where positional argument help text is misaligned ([54c16836](https://github.com/clap-rs/clap/commit/54c16836dea4651806a2cfad53146a83fa3abf21))\n* **Help Message:**  fixes long_about not being usable ([a8257ea0](https://github.com/clap-rs/clap/commit/a8257ea0ffb812e552aca256c4a3d2aebfd8065b), closes [#1043](https://github.com/clap-rs/clap/issues/1043))\n* **Suggestions:**  output for flag after subcommand ([434ea5ba](https://github.com/clap-rs/clap/commit/434ea5ba71395d8c1afcf88e69f0b0d8339b01a1))\n\n\n\n## v2.26.0 (2017-07-29)\n\nMinimum version of Rust is now v1.13.0 (Stable)\n\n\n#### Improvements\n\n*   bumps unicode-segmentation to v1.2 ([cd7b40a2](https://github.com/clap-rs/clap/commit/cd7b40a21c77bae17ba453c5512cb82b7d1ce474))\n\n\n#### Performance\n\n*   update textwrap to version 0.7.0 ([c2d4e637](https://github.com/clap-rs/clap/commit/c2d4e63756a6f070e38c16dff846e9b0a53d6f93))\n\n\n\n\n## v2.25.1 (2017-07-21)\n\n#### Improvements\n\n* impl Default for Values + OsValues for any lifetime. ([fb7d6231f1](https://github.com/clap-rs/clap/commit/fb7d6231f13a2f79f411e62dca210b7dc9994c18))\n\n#### Documentation\n\n* Various documentation typos and grammar fixes\n\n## v2.25.0 (2017-06-20)\n\n\n#### Features\n\n*   use textwrap crate for wrapping help texts ([b93870c1](https://github.com/clap-rs/clap/commit/b93870c10ae3bd90d233c586a33e086803117285))\n\n#### Improvements\n\n* **Suggestions:**  suggests to use flag after subcommand when applicable ([2671ca72](https://github.com/clap-rs/clap/commit/2671ca7260119d4311d21c4075466aafdd9da734))\n* Bumps bitflags crate to v0.9\n\n#### Documentation\n\n*   Change `who's` -> `whose` ([53c1ffe8](https://github.com/clap-rs/clap/commit/53c1ffe87f38b05d8804a0f7832412a952845349))\n\n#### Documentation\n\n* **App::template:**  adds details about the necessity to use AppSettings::UnifiedHelpMessage when using {unified} tags in the help template ([cbea3d5a](https://github.com/clap-rs/clap/commit/cbea3d5acf3271a7a734498c4d99c709941c331e), closes [#949](https://github.com/clap-rs/clap/issues/949))\n* **Arg::allow_hyphen_values:**  updates the docs to include warnings for allow_hyphen_values and multiple(true) used together ([f9b0d657](https://github.com/clap-rs/clap/commit/f9b0d657835d3f517f313d70962177dc30acf4a7))\n* **README.md:**\n  *  added a warning about using ~ deps ([821929b5](https://github.com/clap-rs/clap/commit/821929b51bd60213955705900a436c9a64fcb79f), closes [#964](https://github.com/clap-rs/clap/issues/964))\n* **clap_app!:**  adds using the @group specifier to the macro docs ([826048cb](https://github.com/clap-rs/clap/commit/826048cb3cbc0280169303f1498ff0a2b7395883), closes [#932](https://github.com/clap-rs/clap/issues/932))\n\n\n\n## v2.24.2 (2017-05-15)\n\n\n#### Bug Fixes\n\n*   adds a debug assertion to ensure all args added to groups actually exist ([14f6b8f3](https://github.com/clap-rs/clap/commit/14f6b8f3a2f6df73aeeec9c54a54909b1acfc158), closes [#917](https://github.com/clap-rs/clap/issues/917))\n*   fixes a bug where args that allow values to start with a hyphen couldn't contain a double hyphen -- as a value ([ebf73a09](https://github.com/clap-rs/clap/commit/ebf73a09db6f3c03c19cdd76b1ba6113930e1643), closes [#960](https://github.com/clap-rs/clap/issues/960))\n*   fixes a bug where positional argument help text is misaligned ([54c16836](https://github.com/clap-rs/clap/commit/54c16836dea4651806a2cfad53146a83fa3abf21))\n\n#### Documentation\n\n* **App::template:**  adds details about the necessity to use AppSettings::UnifiedHelpMessage when using {unified} tags in the help template ([cf569438](https://github.com/clap-rs/clap/commit/cf569438f309c199800bb8e46c9f140187de69d7), closes [#949](https://github.com/clap-rs/clap/issues/949))\n* **Arg::allow_hyphen_values:**  updates the docs to include warnings for allow_hyphen_values and multiple(true) used together ([ded5a2f1](https://github.com/clap-rs/clap/commit/ded5a2f15474d4a5bd46a67b130ccb8b6781bd01))\n* **clap_app!:**  adds using the @group specifier to the macro docs ([fe85fcb1](https://github.com/clap-rs/clap/commit/fe85fcb1772b61f13b20b7ea5290e2437a76190c), closes [#932](https://github.com/clap-rs/clap/issues/932))\n\n\n\n## v2.24.0 (2017-05-07)\n\n\n#### Bug Fixes\n\n*   fixes a bug where args with last(true) and required(true) set were not being printed in the usage string ([3ac533fe](https://github.com/clap-rs/clap/commit/3ac533fedabf713943eedf006f830a5a486bbe80), closes [#944](https://github.com/clap-rs/clap/issues/944))\n*   fixes a bug that was printing the arg name, instead of value name when Arg::last(true) was used ([e1fe8ac3](https://github.com/clap-rs/clap/commit/e1fe8ac3bc1f9cf4e36df0d881f8419755f1787b), closes [#940](https://github.com/clap-rs/clap/issues/940))\n*   fixes a bug where flags were parsed as flags AND positional values when specific combinations of settings were used ([20f83292](https://github.com/clap-rs/clap/commit/20f83292d070038b8cee2a6b47e91f6b0a2f7871), closes [#946](https://github.com/clap-rs/clap/issues/946))\n\n\n\n## v2.24.0 (2017-05-05)\n\n\n#### Documentation\n\n* **README.md:**  fix some typos ([fa34deac](https://github.com/clap-rs/clap/commit/fa34deac079f334c3af97bb7fb151880ba8887f8))\n\n#### API Additions\n\n* **Arg:**  add `default_value_os` ([d5ef8955](https://github.com/clap-rs/clap/commit/d5ef8955414b1587060f7218385256105b639c88))\n* **arg_matches.rs:**  Added a Default implementation for Values and OsValues iterators. ([0a4384e3](https://github.com/clap-rs/clap/commit/0a4384e350eed74c2a4dc8964c203f21ac64897f))\n\n\n## v2.23.2 (2017-04-19)\n\n\n#### Bug Fixes\n\n* **PowerShell Completions:**  fixes a bug where powershells completions cant be used if no subcommands are defined ([a8bce558](https://github.com/clap-rs/clap/commit/a8bce55837dc4e0fb187dc93180884a40ae09c6f), closes [#931](https://github.com/clap-rs/clap/issues/931))\n\n#### Improvements\n\n*   bumps term_size to take advantage of better terminal dimension handling ([e05100b7](https://github.com/clap-rs/clap/commit/e05100b73d74066a90876bf38f952adf5e8ee422))\n* **PowerShell Completions:**  massively dedups subcommand names in the generate script to make smaller scripts that are still functionally equiv ([85b0e1cc](https://github.com/clap-rs/clap/commit/85b0e1cc4b9755dda75a93d898d79bc38631552b))\n\n#### Documentation\n\n*   Fix a typo the minimum rust version required ([71dabba3](https://github.com/clap-rs/clap/commit/71dabba3ea0a17c88b0e2199c9d99f0acbf3bc17))\n\n## v2.23.1 (2017-04-05)\n\n\n#### Bug Fixes\n\n*   fixes a missing newline character in the autogenerated help and version messages in some instances ([5ae9007d](https://github.com/clap-rs/clap/commit/5ae9007d984ae94ae2752df51bcbaeb0ec89bc15))\n\n\n## v2.23.0 (2017-04-05)\n\n\n#### API Additions\n\n* `App::long_about`\n* `App::long_version`\n* `App::print_long_help`\n* `App::write_long_help`\n* `App::print_long_version`\n* `App::write_long_version`\n* `Arg::long_help`\n\n#### Features\n\n*   allows distinguishing between short and long version messages (-V/short or --version/long) ([59272b06](https://github.com/clap-rs/clap/commit/59272b06cc213289dc604dbc694cb95d383a5d68))\n*   allows distinguishing between short and long help with subcommands in the same manner as args ([6b371891](https://github.com/clap-rs/clap/commit/6b371891a1702173a849d1e95f9fecb168bf6fc4))\n*   allows specifying a short help vs a long help (i.e. varying levels of detail depending on if -h or --help was used) ([ef1b24c3](https://github.com/clap-rs/clap/commit/ef1b24c3a0dff2f58c5e2e90880fbc2b69df20ee))\n* **clap_app!:**  adds support for arg names with hyphens similar to longs with hyphens ([f7a88779](https://github.com/clap-rs/clap/commit/f7a8877978c8f90e6543d4f0d9600c086cf92cd7), closes [#869](https://github.com/clap-rs/clap/issues/869))\n\n#### Bug Fixes\n\n*   fixes a bug that wasn't allowing help and version to be properly overridden ([8b2ceb83](https://github.com/clap-rs/clap/commit/8b2ceb8368bcb70689fadf1c7f4b9549184926c1), closes [#922](https://github.com/clap-rs/clap/issues/922))\n\n#### Documentation\n\n* **clap_app!:**  documents the `--(\"some-arg\")` method for using args with hyphens inside them ([bc08ef3e](https://github.com/clap-rs/clap/commit/bc08ef3e185393073d969d301989b6319c616c1f), closes [#919](https://github.com/clap-rs/clap/issues/919))\n\n\n\n## v2.22.2 (2017-03-30)\n\n\n#### Bug Fixes\n\n* **Custom Usage Strings:**  fixes the usage string regression when using help templates ([0e4fd96d](https://github.com/clap-rs/clap/commit/0e4fd96d74280d306d09e60ac44f938a82321769))\n\n\n\n## v2.22.1 (2017-03-24)\n\n\n#### Bug Fixes\n\n* **usage:**  fixes a big regression with custom usage strings ([2c41caba](https://github.com/clap-rs/clap/commit/2c41caba3c7d723a2894e315d04da796b0e97759))\n\n## v2.22.0 (2017-03-23)\n\n#### API Additions\n\n* **App::name:**  adds the ability to change the name of the App instance after creation ([d49e8292](https://github.com/clap-rs/clap/commit/d49e8292b026b06e2b70447cd9f08299f4fcba76), closes [#908](https://github.com/clap-rs/clap/issues/908))\n* **Arg::hide_default_value:**  adds ability to hide the default value of an argument from the help string ([89e6ea86](https://github.com/clap-rs/clap/commit/89e6ea861e16a1ad56757ca12f6b32d02253e44a), closes [#902](https://github.com/clap-rs/clap/issues/902))\n\n\n## v2.21.3 (2017-03-23)\n\n#### Bug Fixes\n\n* **yaml:**  adds support for loading author info from yaml ([e04c390c](https://github.com/clap-rs/clap/commit/e04c390c597a55fa27e724050342f16c42f1c5c9))\n\n\n## v2.21.2 (2017-03-17)\n\n\n#### Improvements\n\n*   add fish subcommand help support ([f8f68cf8](https://github.com/clap-rs/clap/commit/f8f68cf8251669aef4539a25a7c1166f0ac81ea6))\n*   options that use `require_equals(true)` now display the equals sign in help messages, usage strings, and errors\" ([c8eb0384](https://github.com/clap-rs/clap/commit/c8eb0384d394d2900ccdc1593099c97808a3fa05), closes [#903](https://github.com/clap-rs/clap/issues/903))\n\n\n#### Bug Fixes\n\n*  setting the max term width now correctly propagates down through child subcommands\n\n\n\n## v2.21.1 (2017-03-12)\n\n\n#### Bug Fixes\n\n* **ArgRequiredElseHelp:**  fixes the precedence of this error to prioritize over other error messages ([74b751ff](https://github.com/clap-rs/clap/commit/74b751ff2e3631e337b7946347c1119829a41c53), closes [#895](https://github.com/clap-rs/clap/issues/895))\n* **Positionals:**  fixes some regression bugs resulting from old asserts in debug mode. ([9a3bc98e](https://github.com/clap-rs/clap/commit/9a3bc98e9b55e7514b74b73374c5ac8b6e5e0508), closes [#896](https://github.com/clap-rs/clap/issues/896))\n\n\n\n## v2.21.0 (2017-03-09)\n\n#### Performance\n\n*   doesn't run `arg_post_processing` on multiple values anymore ([ec516182](https://github.com/clap-rs/clap/commit/ec5161828729f6a53f0fccec8648f71697f01f78))\n*   changes internal use of `VecMap` to `Vec` for matched values of `Arg`s ([22bf137a](https://github.com/clap-rs/clap/commit/22bf137ac581684c6ed460d2c3c640c503d62621))\n*   vastly reduces the amount of cloning when adding non-global args minus when they're added from `App::args` which is forced to clone ([8da0303b](https://github.com/clap-rs/clap/commit/8da0303bc02db5fe047cfc0631a9da41d9dc60f7))\n*   refactor to remove unneeded vectors and allocations and checks for significant performance increases ([0efa4119](https://github.com/clap-rs/clap/commit/0efa4119632f134fc5b8b9695b007dd94b76735d))\n\n#### Documentation\n\n*   Fix examples link in CONTRIBUTING.md ([60cf875d](https://github.com/clap-rs/clap/commit/60cf875d67a252e19bb85054be57696fac2c57a1))\n\n#### Improvements\n\n*   when `AppSettings::SubcommandsNegateReqs` and `ArgsNegateSubcommands` are used, a new more accurate double line usage string is shown ([50f02300](https://github.com/clap-rs/clap/commit/50f02300d81788817acefef0697e157e01b6ca32), closes [#871](https://github.com/clap-rs/clap/issues/871))\n\n#### API Additions\n\n* **Arg::last:**  adds the ability to mark a positional argument as 'last' which means it should be used with `--` syntax and can be accessed early ([6a7aea90](https://github.com/clap-rs/clap/commit/6a7aea9043b83badd9ab038b4ecc4c787716147e), closes [#888](https://github.com/clap-rs/clap/issues/888))\n*   provides `default_value_os` and `default_value_if[s]_os` ([0f2a3782](https://github.com/clap-rs/clap/commit/0f2a378219a6930748d178ba350fe5925be5dad5), closes [#849](https://github.com/clap-rs/clap/issues/849))\n*   provides `App::help_message` and `App::version_message` which allows one to override the auto-generated help/version flag associated help ([389c413](https://github.com/clap-rs/clap/commit/389c413b7023dccab8c76aa00577ea1d048e7a99), closes [#889](https://github.com/clap-rs/clap/issues/889))\n\n#### New Settings\n\n* **InferSubcommands:**  adds a setting to allow one to infer shortened subcommands or aliases (i.e. for subcommmand \"test\", \"t\", \"te\", or \"tes\" would be allowed assuming no other ambiguities) ([11602032](https://github.com/clap-rs/clap/commit/11602032f6ff05881e3adf130356e37d5e66e8f9), closes [#863](https://github.com/clap-rs/clap/issues/863))\n\n#### Bug Fixes\n\n*   doesn't print the argument sections in the help message if all args in that section are hidden ([ce5ee5f5](https://github.com/clap-rs/clap/commit/ce5ee5f5a76f838104aeddd01c8ec956dd347f50))\n*   doesn't include the various [ARGS] [FLAGS] or [OPTIONS] if the only ones available are hidden ([7b4000af](https://github.com/clap-rs/clap/commit/7b4000af97637703645c5fb2ac8bb65bd546b95b), closes [#882](https://github.com/clap-rs/clap/issues/882))\n*   now correctly shows subcommand as required in the usage string when AppSettings::SubcommandRequiredElseHelp is used ([8f0884c1](https://github.com/clap-rs/clap/commit/8f0884c1764983a49b45de52a1eddf8d721564d8))\n*   fixes some memory leaks when an error is detected and clap exits ([8c2dd287](https://github.com/clap-rs/clap/commit/8c2dd28718262ace4ae0db98563809548e02a86b))\n*   fixes a trait that's marked private accidentally, but should be crate internal public ([1ae21108](https://github.com/clap-rs/clap/commit/1ae21108015cea87e5360402e1747025116c7878))\n* **Completions:**   fixes a bug that tried to propagate global args multiple times when generating multiple completion scripts ([5e9b9cf4](https://github.com/clap-rs/clap/commit/5e9b9cf4dd80fa66a624374fd04e6545635c1f94), closes [#846](https://github.com/clap-rs/clap/issues/846))\n\n#### Features\n\n* **Options:**  adds the ability to require the equals syntax with options --opt=val ([f002693d](https://github.com/clap-rs/clap/commit/f002693dec6a6959c4e9590cb7b7bfffd6d6e5bc), closes [#833](https://github.com/clap-rs/clap/issues/833))\n\n\n\n## v2.20.5 (2017-02-18)\n\n\n#### Bug Fixes\n\n* **clap_app!:**   fixes a critical bug of a missing fragment specifier when using `!property` style tags. ([5635c1f94](https://github.com/clap-rs/clap/commit/5e9b9cf4dd80fa66a624374fd04e6545635c1f94))\n\n\n## v2.20.4 (2017-02-15)\n\n\n#### Bug Fixes\n\n* **Completions:**   fixes a bug that tried to propagate global args multiple times when generating multiple completion scripts ([5e9b9cf4](https://github.com/clap-rs/clap/commit/5e9b9cf4dd80fa66a624374fd04e6545635c1f94), closes [#846](https://github.com/clap-rs/clap/issues/846))\n\n#### Documentation\n\n*   Fix examples link in CONTRIBUTING.md ([60cf875d](https://github.com/clap-rs/clap/commit/60cf875d67a252e19bb85054be57696fac2c57a1))\n\n\n## v2.20.3 (2017-02-03)\n\n\n#### Documentation\n\n* **Macros:**  adds a warning about changing values in Cargo.toml not triggering a rebuild automatically ([112aea3e](https://github.com/clap-rs/clap/commit/112aea3e42ae9e0c0a2d33ebad89496dbdd95e5d), closes [#838](https://github.com/clap-rs/clap/issues/838))\n\n#### Bug Fixes\n\n*   fixes a println->debugln typo ([279aa62e](https://github.com/clap-rs/clap/commit/279aa62eaf08f56ce090ba16b937bc763cbb45be))\n*   fixes bash completions for commands that have an underscore in the name ([7f5cfa72](https://github.com/clap-rs/clap/commit/7f5cfa724f0ac4e098f5fe466c903febddb2d994), closes [#581](https://github.com/clap-rs/clap/issues/581))\n*   fixes a bug where ZSH completions would panic if the binary name had an underscore in it ([891a2a00](https://github.com/clap-rs/clap/commit/891a2a006f775e92c556dda48bb32fac9807c4fb), closes [#581](https://github.com/clap-rs/clap/issues/581))\n*   allow final word to be wrapped in wrap_help ([564c5f0f](https://github.com/clap-rs/clap/commit/564c5f0f1730f4a2c1cdd128664f1a981c31dcd4), closes [#828](https://github.com/clap-rs/clap/issues/828))\n* fixes a bug where global args weren't included in the generated completion scripts ([9a1e006e](https://github.com/clap-rs/clap/commit/9a1e006eb75ad5a6057ebd119aa90f7e06c0ace8), closes [#841](https://github.com/clap-rs/clap/issues/841))\n\n\n\n## v2.20.2 (2017-02-03)\n\n#### Bug Fixes\n\n*   fixes a critical bug where subcommand settings were being propagated too far ([74648c94](https://github.com/clap-rs/clap/commit/74648c94b893df542bfa5bb595e68c7bb8167e36), closes [#832](https://github.com/clap-rs/clap/issues/832))\n\n\n#### Improvements\n\n*   adds ArgGroup::multiple to the supported YAML fields for building ArgGroups from YAML ([d8590037](https://github.com/clap-rs/clap/commit/d8590037ce07dafd8cd5b26928aa4a9fd3018288), closes [#840](https://github.com/clap-rs/clap/issues/840))\n\n## v2.20.1 (2017-01-31)\n\n#### Bug Fixes\n\n*   allow final word to be wrapped in wrap_help ([564c5f0f](https://github.com/clap-rs/clap/commit/564c5f0f1730f4a2c1cdd128664f1a981c31dcd4), closes [#828](https://github.com/clap-rs/clap/issues/828))\n*   actually show character in debug output ([84d8c547](https://github.com/clap-rs/clap/commit/84d8c5476de95b7f37d61888bc4f13688b712434))\n*   include final character in line length ([aff4ba18](https://github.com/clap-rs/clap/commit/aff4ba18da8147e1259b04b0bfbc1fcb5c78a3c0))\n\n#### Improvements\n\n*   updates libc and term_size deps for the libc version conflict ([6802ac4a](https://github.com/clap-rs/clap/commit/6802ac4a59c142cda9ec55ca0c45ae5cb9a6ab55))\n\n#### Documentation\n\n*   fix link from app_from_crate! to crate_authors! (#822) ([5b29be9b](https://github.com/clap-rs/clap/commit/5b29be9b073330ab1f7227cdd19fe4aab39d5dcb))\n*   fix spelling of \"guaranteed\" ([4f30a65b](https://github.com/clap-rs/clap/commit/4f30a65b9c03eb09607eb91a929a6396637dc105))\n\n\n#### New Settings\n\n* **ArgsNegateSubcommands:**  disables args being allowed between subcommands ([5e2af8c9](https://github.com/clap-rs/clap/commit/5e2af8c96adb5ab75fa2d1536237ebcb41869494), closes [#793](https://github.com/clap-rs/clap/issues/793))\n* **DontCollapseArgsInUsage:** disables the collapsing of positional args into `[ARGS]` in the usage string  ([c2978afc](https://github.com/clap-rs/clap/commit/c2978afc61fb46d5263ab3b2d87ecde1c9ce1553), closes [#769](https://github.com/clap-rs/clap/issues/769))\n* **DisableHelpSubcommand:**  disables building the `help` subcommand  ([a10fc859](https://github.com/clap-rs/clap/commit/a10fc859ee20159fbd9ff4337be59b76467a64f2))\n* **AllowMissingPositional:**  allows one to implement `$ prog [optional] <required>` style CLIs where the second positional argument is required, but the first is optional ([1110fdc7](https://github.com/clap-rs/clap/commit/1110fdc7a345c108820dc45783a9bf893fa4c214), closes [#636](https://github.com/clap-rs/clap/issues/636))\n* **PropagateGlobalValuesDown:**  automatically propagats global arg's values down through *used* subcommands ([985536c8](https://github.com/clap-rs/clap/commit/985536c8ebcc09af98aac835f42a8072ad58c262), closes [#694](https://github.com/clap-rs/clap/issues/694))\n\n#### API Additions\n\n##### Arg\n\n* **Arg::value_terminator:**  adds the ability to terminate multiple values with a given string or char ([be64ce0c](https://github.com/clap-rs/clap/commit/be64ce0c373efc106384baca3f487ea99fe7b8cf), closes [#782](https://github.com/clap-rs/clap/issues/782))\n* **Arg::default_value_if[s]:**  adds new methods for *conditional* default values (such as a particular value from another argument was used) ([eb4010e7](https://github.com/clap-rs/clap/commit/eb4010e7b21724447ef837db11ac441915728f22))\n* **Arg::requires_if[s]:**  adds the ability to *conditionally* require additional args (such as if a particular value was used) ([198449d6](https://github.com/clap-rs/clap/commit/198449d64393c265f0bc327aaeac23ec4bb97226))\n* **Arg::required_if[s]:**  adds the ability for an arg to be *conditionally* required (i.e. \"arg X is only required if arg Y was used with value Z\") ([ee9cfddf](https://github.com/clap-rs/clap/commit/ee9cfddf345a6b5ae2af42ba72aa5c89e2ca7f59))\n* **Arg::validator_os:**  adds ability to validate values which may contain invalid UTF-8 ([47232498](https://github.com/clap-rs/clap/commit/47232498a813db4f3366ccd3e9faf0bff56433a4))\n\n##### Macros\n\n* **crate_description!:** Uses the `Cargo.toml` description field to fill in the `App::about` method at compile time ([4d9a82db](https://github.com/clap-rs/clap/commit/4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d), closes [#778](https://github.com/clap-rs/clap/issues/778))\n* **crate_name!:** Uses the `Cargo.toml` name field to fill in the `App::new` method at compile time ([4d9a82db](https://github.com/clap-rs/clap/commit/4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d), closes [#778](https://github.com/clap-rs/clap/issues/778))\n* **app_from_crate!:** Combines `crate_version!`, `crate_name!`, `crate_description!`, and `crate_authors!` into a single macro call to build a default `App` instance from the `Cargo.toml` fields ([4d9a82db](https://github.com/clap-rs/clap/commit/4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d), closes [#778](https://github.com/clap-rs/clap/issues/778))\n\n\n#### Features\n\n* **no_cargo:**  adds a `no_cargo` feature to disable Cargo-env-var-dependent macros for those *not* using `cargo` to build their crates (#786) ([6fdd2f9d](https://github.com/clap-rs/clap/commit/6fdd2f9d693aaf1118fc61bd362273950703f43d))\n\n#### Bug Fixes\n\n* **Options:**  fixes a critical bug where options weren't forced to have a value ([5a5f2b1e](https://github.com/clap-rs/clap/commit/5a5f2b1e9f598a0d0280ef3e98abbbba2bc41132), closes [#665](https://github.com/clap-rs/clap/issues/665))\n*   fixes a bug where calling the help of a subcommand wasn't ignoring required args of parent commands ([d3d34a2b](https://github.com/clap-rs/clap/commit/d3d34a2b51ef31004055b0ab574f766d801c3adf), closes [#789](https://github.com/clap-rs/clap/issues/789))\n* **Help Subcommand:**  fixes a bug where the help subcommand couldn't be overridden ([d34ec3e0](https://github.com/clap-rs/clap/commit/d34ec3e032d03e402d8e87af9b2942fe2819b2da), closes [#787](https://github.com/clap-rs/clap/issues/787))\n* **Low Index Multiples:**  fixes a bug which caused combinations of LowIndexMultiples and `Arg::allow_hyphen_values` to fail parsing ([26c670ca](https://github.com/clap-rs/clap/commit/26c670ca16d2c80dc26d5c1ce83380ace6357318))\n\n#### Improvements\n\n* **Default Values:**  improves the error message when default values are involved ([1f33de54](https://github.com/clap-rs/clap/commit/1f33de545036e7fd2f80faba251fca009bd519b8), closes [#774](https://github.com/clap-rs/clap/issues/774))\n* **YAML:**  adds conditional requirements and conditional default values to YAML ([9a4df327](https://github.com/clap-rs/clap/commit/9a4df327893486adb5558ffefba790c634ccdc6e), closes [#764](https://github.com/clap-rs/clap/issues/764))\n*  Support `--(\"some-arg-name\")` syntax for defining long arg names when using `clap_app!` macro ([f41ec962](https://github.com/clap-rs/clap/commit/f41ec962c243a5ffff8b1be1ae2ad63970d3d1d4))\n*  Support `(\"some app name\")` syntax for defining app names when using `clap_app!` macro ([9895b671](https://github.com/clap-rs/clap/commit/9895b671cff784f35cf56abcd8270f7c2ba09699), closes [#759](https://github.com/clap-rs/clap/issues/759))\n* **Help Wrapping:**  long app names (with spaces), authors, and descriptions are now wrapped appropriately ([ad4691b7](https://github.com/clap-rs/clap/commit/ad4691b71a63e951ace346318238d8834e04ad8a), closes [#777](https://github.com/clap-rs/clap/issues/777))\n\n\n#### Documentation\n\n* **Conditional Default Values:**  fixes the failing doc tests of Arg::default_value_ifs ([4ef09101](https://github.com/clap-rs/clap/commit/4ef091019c083b4db1a0c13f1c1e95ac363259f2))\n* **Conditional Requirements:**  adds docs for Arg::requires_ifs ([7f296e29](https://github.com/clap-rs/clap/commit/7f296e29db7d9036e76e5dbcc9c8b20dfe7b25bd))\n* **README.md:**  fix some typos ([f22c21b4](https://github.com/clap-rs/clap/commit/f22c21b422d5b287d1a1ac183a379ee02eebf54f))\n* **src/app/mod.rs:**  fix some typos ([5c9b0d47](https://github.com/clap-rs/clap/commit/5c9b0d47ca78dea285c5b9dec79063d24c3e451a))\n\n## v2.19.3 (2016-12-28)\n\n\n#### Bug Fixes\n\n*   fixes a bug where calling the help of a subcommand wasn't ignoring required args of parent commands ([a0ee4993](https://github.com/clap-rs/clap/commit/a0ee4993015ea97b06b5bc9f378d8bcb18f1c51c), closes [#789](https://github.com/clap-rs/clap/issues/789))\n\n\n\n## v2.19.2 (2016-12-08)\n\n#### Bug Fixes\n\n* **ZSH Completions:**  escapes square brackets in ZSH completions ([7e17d5a3](https://github.com/clap-rs/clap/commit/7e17d5a36b2cc2cc77e7b15796b14d639ed3cbf7), closes [#771](https://github.com/clap-rs/clap/issues/771))\n\n#### Documentation\n\n* **Examples:**  adds subcommand examples ([0e0f3354](https://github.com/clap-rs/clap/commit/0e0f33547a6901425afc1d9fbe19f7ae3832d9a4), closes [#766](https://github.com/clap-rs/clap/issues/766))\n* **README.md:**  adds guidance on when to use ~ in version pinning, and clarifies breaking change policy ([591eaefc](https://github.com/clap-rs/clap/commit/591eaefc7319142ba921130e502bb0729feed907), closes [#765](https://github.com/clap-rs/clap/issues/765))\n\n\n\n## v2.19.1 (2016-12-01)\n\n\n#### Bug Fixes\n\n* **Help Messages:**  fixes help message alignment when specific settings are used on options ([cd94b318](https://github.com/clap-rs/clap/commit/cd94b3188d63b63295a319e90e826bca46befcd2), closes [#760](https://github.com/clap-rs/clap/issues/760))\n\n#### Improvements\n\n* **Bash Completion:**  allows bash completion to fall back to traditional bash completion upon no matching completing function ([b1b16d56](https://github.com/clap-rs/clap/commit/b1b16d56d8fddf819bdbe24b3724bb6a9f3fa613)))\n\n\n## v2.19.0 (2016-11-21)\n\n#### Features\n\n*   allows specifying AllowLeadingHyphen style values, but only for specific args vice command wide ([c0d70feb](https://github.com/clap-rs/clap/commit/c0d70febad9996a77a54107054daf1914c50d4ef), closes [#742](https://github.com/clap-rs/clap/issues/742))\n\n#### Bug Fixes\n\n* **Required Unless:**  fixes a bug where having required_unless set doesn't work when conflicts are also set ([d20331b6](https://github.com/clap-rs/clap/commit/d20331b6f7940ac3a4e919999f8bb4780875125d), closes [#753](https://github.com/clap-rs/clap/issues/753))\n* **ZSH Completions:**  fixes an issue where zsh completions caused panics if there were no subcommands ([49e7cdab](https://github.com/clap-rs/clap/commit/49e7cdab76dd1ccc07221e360f07808ec62648aa), closes [#754](https://github.com/clap-rs/clap/issues/754))\n\n#### Improvements\n\n* **Validators:**  improves the error messages for validators ([65eb3385](https://github.com/clap-rs/clap/commit/65eb33859d3ff53e7d3277f02a9d3fd9038a9dfb), closes [#744](https://github.com/clap-rs/clap/issues/744))\n\n#### Documentation\n\n*   updates the docs landing page ([01e1e33f](https://github.com/clap-rs/clap/commit/01e1e33f377934099a4a725fab5cd6c5ff50eaa2))\n*   adds the macro version back to the readme ([45eb9bf1](https://github.com/clap-rs/clap/commit/45eb9bf130329c3f3853aba0342c2fe3c64ff80f))\n*   fix broken docs links ([808e7cee](https://github.com/clap-rs/clap/commit/808e7ceeb86d4a319bdc270f51c23a64621dbfb3))\n* **Compatibility Policy:**  adds an official compatibility policy to ([760d66dc](https://github.com/clap-rs/clap/commit/760d66dc17310b357f257776624151da933cd25d), closes [#740](https://github.com/clap-rs/clap/issues/740))\n* **Contributing:**  updates the readme to improve the readability and contributing sections ([eb51316c](https://github.com/clap-rs/clap/commit/eb51316cdfdc7258d287ba13b67ef2f42bd2b8f6))\n\n## v2.18.0 (2016-11-05)\n\n\n#### Features\n\n* **Completions:**  adds completion support for PowerShell. ([cff82c88](https://github.com/clap-rs/clap/commit/cff82c880e21064fca63351507b80350df6caadf), closes [#729](https://github.com/clap-rs/clap/issues/729))\n\n\n\n## v2.17.1 (2016-11-02)\n\n\n#### Bug Fixes\n\n* **Low Index Multiples:**  fixes a bug where using low index multiples was propagated to subcommands ([33924e88](https://github.com/clap-rs/clap/commit/33924e884461983c4e6b5ea1330fecc769a4ade7), closes [#725](https://github.com/clap-rs/clap/issues/725))\n\n\n\n## v2.17.0 (2016-11-01)\n\n\n#### Features\n\n* **Positional Args:**  allows specifying the second to last positional argument as multiple(true) ([1ced2a74](https://github.com/clap-rs/clap/commit/1ced2a7433ea8937a1b260ea65d708f32ca7c95e), closes [#725](https://github.com/clap-rs/clap/issues/725))\n\n\n\n## v2.16.4 (2016-10-31)\n\n\n#### Improvements\n\n* **Error Output:**  conflicting errors are now symmetrical, meaning more consistent and less confusing ([3d37001d](https://github.com/clap-rs/clap/commit/3d37001d1dc647d73cc597ff172f1072d4beb80d), closes [#718](https://github.com/clap-rs/clap/issues/718))\n\n#### Documentation\n\n*   Fix typo in example `13a_enum_values_automatic` ([c22fbc07](https://github.com/clap-rs/clap/commit/c22fbc07356e556ffb5d1a79ec04597d149b915e))\n* **README.md:**  fixes failing yaml example (#715) ([21fba9e6](https://github.com/clap-rs/clap/commit/21fba9e6cd8c163012999cd0ce271ec8780c5695))\n\n#### Bug Fixes\n\n* **ZSH Completions:**  fixes bug that caused panic on subcommands with aliases ([5c70e1a0](https://github.com/clap-rs/clap/commit/5c70e1a01bc977e44c10015d18bb8e215c32dfc8), closes [#714](https://github.com/clap-rs/clap/issues/714))\n* **debug:**  fixes the debug feature (#716) ([6c11ccf4](https://github.com/clap-rs/clap/commit/6c11ccf443d46258d51f7cda33fbcc81e7fe8e90))\n\n\n\n## v2.16.3 (2016-10-28)\n\n\n#### Bug Fixes\n\n*   Derive display order after propagation ([9cb6facf](https://github.com/clap-rs/clap/commit/9cb6facf507aff7cddd124b8c29714d2b0e7bd13), closes [#706](https://github.com/clap-rs/clap/issues/706))\n* **yaml-example:**  inconsistent args ([847f7199](https://github.com/clap-rs/clap/commit/847f7199219ead5065561d91d64780d99ae4b587))\n\n\n\n## v2.16.2 (2016-10-25)\n\n\n#### Bug Fixes\n\n* **Fish Completions:**  fixes a bug where single quotes are not escaped ([780b4a18](https://github.com/clap-rs/clap/commit/780b4a18281b6f7f7071e1b9db2290fae653c406), closes [#704](https://github.com/clap-rs/clap/issues/704))\n\n\n## v2.16.1 (2016-10-24)\n\n\n#### Bug Fixes\n\n* **Help Message:**  fixes a regression bug where args with multiple(true) threw off alignment ([ebddac79](https://github.com/clap-rs/clap/commit/ebddac791f3ceac193d5ad833b4b734b9643a7af), closes [#702](https://github.com/clap-rs/clap/issues/702))\n\n\n\n## v2.16.0 (2016-10-23)\n\n\n#### Features\n\n* **Completions:**  adds ZSH completion support ([3e36b0ba](https://github.com/clap-rs/clap/commit/3e36b0bac491d3f6194aee14604caf7be26b3d56), closes [#699](https://github.com/clap-rs/clap/issues/699))\n\n\n\n## v2.15.0 (2016-10-21)\n\n\n#### Features\n\n* **AppSettings:**  adds new setting `AppSettings::AllowNegativeNumbers` ([ab064546](https://github.com/clap-rs/clap/commit/ab06454677fb6aa9b9f804644fcca2168b1eaee3), closes [#696](https://github.com/clap-rs/clap/issues/696))\n\n#### Documentation\n\n* **app/settings.rs:**  moves variants to roughly alphabetical order ([9ed4d4d7](https://github.com/clap-rs/clap/commit/9ed4d4d7957a23357aef60081e45639ab9e3905f))\n\n\n## v2.14.1 (2016-10-20)\n\n\n#### Documentation\n\n*   Improve documentation around features ([4ee85b95](https://github.com/clap-rs/clap/commit/4ee85b95d2d16708a016a3ba4e6e2c93b89b7fad))\n*   reword docs for ErrorKind and app::Settings ([3ccde7a4](https://github.com/clap-rs/clap/commit/3ccde7a4b8f7a2ea8b916a5415c04a8ff4b5cb7a))\n*   fix tests that fail when the \"suggestions\" feature is disabled ([996fc381](https://github.com/clap-rs/clap/commit/996fc381763a48d125c7ea8a58fed057fd0b4ac6))\n*   fix the OsString-using doc-tests ([af9e1a39](https://github.com/clap-rs/clap/commit/af9e1a393ce6cdda46a03c8a4f48df222b015a24))\n*   tag non-rust code blocks as such instead of ignoring them ([0ba9f4b1](https://github.com/clap-rs/clap/commit/0ba9f4b123f281952581b6dec948f7e51dd22890))\n* **ErrorKind:**  improve some errors about subcommands ([9f6217a4](https://github.com/clap-rs/clap/commit/9f6217a424da823343d7b801b9c350dee3cd1906))\n* **yaml:**  make sure the doc-tests don't fail before \"missing file\" ([8c0f5551](https://github.com/clap-rs/clap/commit/8c0f55516f4910c78c9f8a2bdbd822729574f95b))\n\n#### Improvements\n\n*   Stabilize clap_app! ([cd516006](https://github.com/clap-rs/clap/commit/cd516006e35c37b005f329338560a0a53d1f3e00))\n* **with_defaults:**  Deprecate App::with_defaults() ([26085409](https://github.com/clap-rs/clap/commit/2608540940c8bb66e517b65706bc7dea55510682), closes [#638](https://github.com/clap-rs/clap/issues/638))\n\n#### Bug Fixes\n\n*   fixes a bug that made determining when to auto-wrap long help messages inconsistent ([468baadb](https://github.com/clap-rs/clap/commit/468baadb8398fc1d37897b0c49374aef4cf97dca), closes [#688](https://github.com/clap-rs/clap/issues/688))\n* **Completions:**  fish completions for nested subcommands ([a61eaf8a](https://github.com/clap-rs/clap/commit/a61eaf8aade76cfe90ccc0f7125751ebf60e3254))\n* **features:**  Make lints not enable other nightly-requiring features ([835f75e3](https://github.com/clap-rs/clap/commit/835f75e3ba20999117363ed9f916464d777f36ef))\n\n\n\n## v2.14.0 (2016-10-05)\n\n\n#### Features\n\n* **arg_aliases:**  Ability to alias arguments ([33b5f6ef](https://github.com/clap-rs/clap/commit/33b5f6ef2c9612ecabb31f96b824793e46bfd3dd), closes [#669](https://github.com/clap-rs/clap/issues/669))\n* **flag_aliases:**  Ability to alias flags ([40d6dac9](https://github.com/clap-rs/clap/commit/40d6dac973927dded6ab423481634ef47ee7bfd7))\n\n#### Bug Fixes\n\n* **UsageParser:**  Handle non-ascii names / options. ([1d6a7c6e](https://github.com/clap-rs/clap/commit/1d6a7c6e7e6aadc527346aa822f19d8587f714f3), closes [#664](https://github.com/clap-rs/clap/issues/664))\n\n#### Documentation\n\n*   typo ([bac417fa](https://github.com/clap-rs/clap/commit/bac417fa1cea3d32308334c7cccfcf54546cd9d8))\n\n\n## v2.13.0 (2016-09-18)\n\n\n#### Documentation\n\n*   updates README.md with new website information and updated video tutorials info ([0c19c580](https://github.com/clap-rs/clap/commit/0c19c580cf50f1b82ff32f70b36708ae2bcac132))\n*   updates the docs about removing implicit value_delimiter(true) ([c81bc722](https://github.com/clap-rs/clap/commit/c81bc722ebb8a86d22be89b5aec98df9fe222a08))\n* **Default Values:**  adds better examples on using default values ([57a8d9ab](https://github.com/clap-rs/clap/commit/57a8d9abb2f973c235a8a14f8fc031673d7a7460), closes [#418](https://github.com/clap-rs/clap/issues/418))\n\n#### Bug Fixes\n\n* **Value Delimiters:**  fixes the confusion around implicitly setting value delimiters. (default is now `false`) ([09d4d0a9](https://github.com/clap-rs/clap/commit/09d4d0a9038d7ce2df55c2aec95e16f36189fcee), closes [#666](https://github.com/clap-rs/clap/issues/666))\n\n\n\n## v2.12.1 (2016-09-13)\n\n\n#### Bug Fixes\n\n* **Help Wrapping:**  fixes a regression-bug where the old {n} newline char stopped working ([92ac353b](https://github.com/clap-rs/clap/commit/92ac353b48b7caa2511ad2a046d94da93c236cf6), closes [#661](https://github.com/clap-rs/clap/issues/661))\n\n\n\n## v2.12.0 (2016-09-13)\n\n\n#### Features\n\n* **Help:**  adds ability to hide the possible values on a per argument basis ([9151ef73](https://github.com/clap-rs/clap/commit/9151ef739871f2e74910c342299c0de196b95dec), closes [#640](https://github.com/clap-rs/clap/issues/640))\n* **help:**  allow for limiting detected terminal width ([a43e28af](https://github.com/clap-rs/clap/commit/a43e28af85c9a9deaedd5ef735f4f13008daab29), closes [#653](https://github.com/clap-rs/clap/issues/653))\n\n#### Documentation\n\n* **Help Wrapping:**  removes the verbage about using `'{n}'` to insert newlines in help text ([c5a2b352](https://github.com/clap-rs/clap/commit/c5a2b352ca600f5b802290ad945731066cd53611))\n* **Value Delimiters:**  updates the docs for the Arg::multiple method WRT value delimiters and default settings ([f9d17a06](https://github.com/clap-rs/clap/commit/f9d17a060aa53f10d0a6e1a7eed5d989d1a59533))\n* **appsettings:**  Document AppSetting::DisableVersion ([94501965](https://github.com/clap-rs/clap/commit/945019654d2ca67eb2b1d6014fdf80b84d528d30), closes [#589](https://github.com/clap-rs/clap/issues/589))\n\n#### Bug Fixes\n\n* **AllowLeadingHyphen:**  fixes a bug where valid args aren't recognized with this setting ([a9699e4d](https://github.com/clap-rs/clap/commit/a9699e4d7cdc9a06e73b845933ff1fe6d76f016a), closes [#588](https://github.com/clap-rs/clap/issues/588))\n\n#### Improvements\n\n* **Help Wrapping:**\n  *  clap now ignores hard newlines in help messages and properly re-aligns text, but still wraps if the term width is too small ([c7678523](https://github.com/clap-rs/clap/commit/c76785239fd42adc8ca04f9202b6fec615aa9f14), closes [#617](https://github.com/clap-rs/clap/issues/617))\n  *  makes some minor changes to when next line help is automatically used ([01cae799](https://github.com/clap-rs/clap/commit/01cae7990a33167ac35103fb36c811b4fe6eb98f))\n* **Value Delimiters:**  changes the default value delimiter rules ([f9e69254](https://github.com/clap-rs/clap/commit/f9e692548e8c94de15f909432de301407d6bb834), closes [#655](https://github.com/clap-rs/clap/issues/655))\n* **YAML:**  supports setting Arg::require_delimiter from YAML ([b9b55a39](https://github.com/clap-rs/clap/commit/b9b55a39dfebcdbdc05dca2692927e503db50816))\n\n#### Performance\n\n* **help:**  fix redundant contains() checks ([a8afed74](https://github.com/clap-rs/clap/commit/a8afed7428bf0733f8e93bb11ad6c00d9e970fcc))\n\n\n\n## v2.11.3 (2016-09-07)\n\n\n#### Documentation\n\n* **Help Wrapping:**  removes the verbage about using `'{n}'` to insert newlines in help text ([c5a2b352](https://github.com/clap-rs/clap/commit/c5a2b352ca600f5b802290ad945731066cd53611))\n\n#### Improvements\n\n* **Help Wrapping:**\n  *  clap now ignores hard newlines in help messages and properly re-aligns text, but still wraps if the term width is too small ([c7678523](https://github.com/clap-rs/clap/commit/c76785239fd42adc8ca04f9202b6fec615aa9f14), closes [#617](https://github.com/clap-rs/clap/issues/617))\n  *  makes some minor changes to when next line help is automatically used ([01cae799](https://github.com/clap-rs/clap/commit/01cae7990a33167ac35103fb36c811b4fe6eb98f))\n* **YAML:**  supports setting Arg::require_delimiter from YAML ([b9b55a39](https://github.com/clap-rs/clap/commit/b9b55a39dfebcdbdc05dca2692927e503db50816))\n\n\n\n\n## v2.11.2 (2016-09-06)\n\n#### Improvements\n\n* **Help Wrapping:**  makes some minor changes to when next line help is automatically used ([5658b117](https://github.com/clap-rs/clap/commit/5658b117aec3e03adff9c8c52a4c4bc1fcb4e1ff))\n\n\n## v2.11.1 (2016-09-05)\n\n\n#### Bug Fixes\n\n* **Settings:**  fixes an issue where settings weren't propagated down through grandchild subcommands ([b3efc107](https://github.com/clap-rs/clap/commit/b3efc107515d78517b20798ff3890b8a2b04498e), closes [#638](https://github.com/clap-rs/clap/issues/638))\n\n#### Features\n\n* **Errors:**  Errors with custom description ([58512f2f](https://github.com/clap-rs/clap/commit/58512f2fcb430745f1ee6ee8f1c67f62dc216c73))\n\n#### Improvements\n\n* **help:**  use term_size instead of home-grown solution ([fc7327e9](https://github.com/clap-rs/clap/commit/fc7327e9dcf4258ef2baebf0a8714d9c0622855b))\n\n\n\n## v2.11.0 (2016-08-28)\n\n\n#### Bug Fixes\n\n* **Groups:**  fixes some usage strings that contain both args in groups and ones that conflict with each other ([3d782def](https://github.com/clap-rs/clap/commit/3d782def57725e2de26ca5a5bc5cc2e40ddebefb), closes [#616](https://github.com/clap-rs/clap/issues/616))\n\n#### Documentation\n\n*   moves docs to docs.rs ([03209d5e](https://github.com/clap-rs/clap/commit/03209d5e1300906f00bafec1869c2047a92e5071), closes [#634](https://github.com/clap-rs/clap/issues/634))\n\n#### Improvements\n\n* **Completions:**  uses standard conventions for bash completion files, namely '{bin}.bash-completion' ([27f5bbfb](https://github.com/clap-rs/clap/commit/27f5bbfbcc9474c2f57c2b92b1feb898ae46ee70), closes [#567](https://github.com/clap-rs/clap/issues/567))\n* **Help:**  automatically moves help text to the next line and wraps when term width is determined to be too small, or help text is too long ([150964c4](https://github.com/clap-rs/clap/commit/150964c4e7124d54476c9d9b4b3f2406f0fd00e5), closes [#597](https://github.com/clap-rs/clap/issues/597))\n* **YAML Errors:**  vastly improves error messages when using YAML ([f43b7c65](https://github.com/clap-rs/clap/commit/f43b7c65941c53adc0616b8646a21dc255862eb2), closes [#574](https://github.com/clap-rs/clap/issues/574))\n\n#### Features\n\n*   adds App::with_defaults to automatically use crate_authors! and crate_version! macros ([5520bb01](https://github.com/clap-rs/clap/commit/5520bb012c127dfd299fd55699443c744d8dcd5b), closes [#600](https://github.com/clap-rs/clap/issues/600))\n\n\n\n## v2.10.4 (2016-08-25)\n\n\n#### Bug Fixes\n\n* **Help Wrapping:**  fixes a bug where help is wrapped incorrectly and causing a panic with some non-English characters ([d0b442c7](https://github.com/clap-rs/clap/commit/d0b442c7beeecac9764406bc3bd171ced0b8825e), closes [#626](https://github.com/clap-rs/clap/issues/626))\n\n\n\n## v2.10.3 (2016-08-25)\n\n#### Features\n\n* **Help:**  adds new short hand way to use source formatting and ignore term width in help messages ([7dfdaf20](https://github.com/clap-rs/clap/commit/7dfdaf200ebb5c431351a045b48f5e0f0d3f31db), closes [#625](https://github.com/clap-rs/clap/issues/625))\n\n#### Documentation\n\n* **Term Width:**  adds details about set_term_width(0) ([00b8205d](https://github.com/clap-rs/clap/commit/00b8205d22639d1b54b9c453c55c785aace52cb2))\n\n#### Bug Fixes\n\n* **Unicode:**  fixes two bugs where non-English characters were stripped or caused a panic with help wrapping ([763a5c92](https://github.com/clap-rs/clap/commit/763a5c920e23efc74d190af0cb8b5dd714b2d67a), closes [#626](https://github.com/clap-rs/clap/issues/626))\n\n\n\n## v2.10.2 (2016-08-22)\n\n\n#### Bug Fixes\n\n*   fixes a bug where the help is printed twice ([a643fb28](https://github.com/clap-rs/clap/commit/a643fb283acd9905dc727c4579c5c9fa2ceaa7e7), closes [#623](https://github.com/clap-rs/clap/issues/623))\n\n\n\n## v2.10.1 (2016-08-21)\n\n\n#### Bug Fixes\n\n* **Help Subcommand:**  fixes misleading usage string when using multi-level subcommmands ([e203515e](https://github.com/clap-rs/clap/commit/e203515e3ac495b405dbba4f78fb6af148fd282e), closes [#618](https://github.com/clap-rs/clap/issues/618))\n\n#### Features\n\n* **YAML:**  allows using lists or single values with arg declarations ([9ade2cd4](https://github.com/clap-rs/clap/commit/9ade2cd4b268d6d7fe828319ce6a523c641b9c38), closes [#614](https://github.com/clap-rs/clap/issues/614), [#613](https://github.com/clap-rs/clap/issues/613))\n\n\n\n## v2.10.0 (2016-07-29)\n\n\n#### Features\n\n* **Completions:**  one can generate a basic fish completions script at compile time ([1979d2f2](https://github.com/clap-rs/clap/commit/1979d2f2f3216e57d02a97e624a8a8f6cf867ed9))\n\n#### Bug Fixes\n\n* **parser:**  preserve external subcommand name ([875df243](https://github.com/clap-rs/clap/commit/875df24316c266920a073c13bbefbf546bc1f635))\n\n#### Breaking Changes\n\n* **parser:**  preserve external subcommand name ([875df243](https://github.com/clap-rs/clap/commit/875df24316c266920a073c13bbefbf546bc1f635))\n\n#### Documentation\n\n* **YAML:**  fixes example 17's incorrect reference to arg_groups instead of groups ([b6c99e13](https://github.com/clap-rs/clap/commit/b6c99e1377f918e78c16c8faced70a71607da931), closes [#601](https://github.com/clap-rs/clap/issues/601))\n\n\n\n### 2.9.3 (2016-07-24)\n\n\n#### Bug Fixes\n\n*   fixes bug where only first arg in list of required_unless_one is recognized ([1fc3b55b](https://github.com/clap-rs/clap/commit/1fc3b55bd6c8653b02e7c4253749c6b77737d2ac), closes [#575](https://github.com/clap-rs/clap/issues/575))\n* **Settings:**  fixes typo subcommandsrequired->subcommandrequired ([fc72cdf5](https://github.com/clap-rs/clap/commit/fc72cdf591d30f5d9375d0b5cc2a2ff3e812f9f6), closes [#593](https://github.com/clap-rs/clap/issues/593))\n\n#### Features\n\n* **Completions:**  adds the ability to generate completions to io::Write object ([9f62cf73](https://github.com/clap-rs/clap/commit/9f62cf7378ba5acb5ce8c5bac89b4aa60c30755f))\n* **Settings:**  Add unset_setting and unset_settings fns to App (#598) ([0ceba231](https://github.com/clap-rs/clap/commit/0ceba231c6767cd6d88fdb1feeeea41deadf77ff), closes [#590](https://github.com/clap-rs/clap/issues/590))\n\n\n### 2.9.2 (2016-07-03)\n\n\n#### Documentation\n\n* **Completions:**  fixes the formatting of the Cargo.toml excerpt in the completions example ([722f2607](https://github.com/clap-rs/clap/commit/722f2607beaef56b6a0e433db5fd09492d9f028c))\n\n#### Bug Fixes\n\n* **Completions:**  fixes bug where --help and --version short weren't added to the completion list ([e9f2438e](https://github.com/clap-rs/clap/commit/e9f2438e2ce99af0ae570a2eaf541fc7f55b771b), closes [#536](https://github.com/clap-rs/clap/issues/536))\n\n\n\n### 2.9.1 (2016-07-02)\n\n\n#### Improvements\n\n* **Completions:**  allows multiple completions to be built by namespacing with bin name ([57484b2d](https://github.com/clap-rs/clap/commit/57484b2daeaac01c1026e8c84efc8bf099e0eb31))\n\n\n## v2.9.0 (2016-07-01)\n\n\n#### Documentation\n\n* **Completions:**\n  *  fixes some errors in the completion docs ([9b359bf0](https://github.com/clap-rs/clap/commit/9b359bf06255d3dad8f489308044b60a9d1e6a87))\n  *  adds documentation for completion scripts ([c6c519e4](https://github.com/clap-rs/clap/commit/c6c519e40efd6c4533a9ef5efe8e74fd150391b7))\n\n#### Features\n\n* **Completions:**\n  *  one can now generate a bash completions script at compile time! ([e75b6c7b](https://github.com/clap-rs/clap/commit/e75b6c7b75f729afb9eb1d2a2faf61dca7674634), closes [#376](https://github.com/clap-rs/clap/issues/376))\n  *  completions now include aliases to subcommands, including all subcommand options ([0ab9f840](https://github.com/clap-rs/clap/commit/0ab9f84052a8cf65b5551657f46c0c270841e634), closes [#556](https://github.com/clap-rs/clap/issues/556))\n  *  completions now continue completing even after first completion ([18fc2e5b](https://github.com/clap-rs/clap/commit/18fc2e5b5af63bf54a94b72cec5e1223d49f4806))\n  *  allows matching on possible values in options ([89cc2026](https://github.com/clap-rs/clap/commit/89cc2026ba9ac69cf44c5254360bbf99236d4f89), closes [#557](https://github.com/clap-rs/clap/issues/557))\n\n#### Bug Fixes\n\n* **AllowLeadingHyphen:**  fixes an issue where  isn't ignored like it should be with this setting ([96c24c9a](https://github.com/clap-rs/clap/commit/96c24c9a8fa1f85e06138d3cdd133e51659e19d2), closes [#558](https://github.com/clap-rs/clap/issues/558))\n\n## v2.8.0 (2016-06-30)\n\n\n#### Features\n\n* **Arg:**  adds new setting `Arg::require_delimiter` which requires val delimiter to parse multiple values ([920b5595](https://github.com/clap-rs/clap/commit/920b5595ed72abfb501ce054ab536067d8df2a66))\n\n#### Bug Fixes\n\n*   Declare term::Winsize as repr(C) ([5d663d90](https://github.com/clap-rs/clap/commit/5d663d905c9829ce6e7a164f1f0896cdd70236dd))\n\n#### Documentation\n\n* **Arg:**  adds docs for ([49af4e38](https://github.com/clap-rs/clap/commit/49af4e38a5dae2ab0a7fc3b4147e2c053d532484))\n\n\n\n## v2.7.1 (2016-06-29)\n\n\n#### Bug Fixes\n\n* **Options:**\n  *  options with multiple values and using delimiters no longer parse additional values after a trailing space ([cdc500bd](https://github.com/clap-rs/clap/commit/cdc500bdde6abe238c36ade406ddafc2bafff583))\n  *  using options with multiple values and with an = no longer parse args after the trailing space as values ([290f61d0](https://github.com/clap-rs/clap/commit/290f61d07177413cf082ada55526d83405f6d011))\n\n\n\n## v2.7.0 (2016-06-28)\n\n\n#### Documentation\n\n*   fix typos ([43b3d40b](https://github.com/clap-rs/clap/commit/43b3d40b8c38b1571da75af86b5088be96cccec2))\n* **ArgGroup:**  vastly improves ArgGroup docs by adding better examples ([9e5f4f5d](https://github.com/clap-rs/clap/commit/9e5f4f5d734d630bca5535c3a0aa4fd4f9db3e39), closes [#534](https://github.com/clap-rs/clap/issues/534))\n\n#### Features\n\n* **ArgGroup:**  one can now specify groups which require AT LEAST one of the args ([33689acc](https://github.com/clap-rs/clap/commit/33689acc689b217a8c0ee439f1b1225590c38355), closes [#533](https://github.com/clap-rs/clap/issues/533))\n\n#### Bug Fixes\n\n* **App:**  using `App::print_help` now prints the same as would have been printed by `--help` or the like ([e84cc018](https://github.com/clap-rs/clap/commit/e84cc01836bbe0527e97de6db9889bd9e0fd6ba1), closes [#536](https://github.com/clap-rs/clap/issues/536))\n* **Help:**\n  *  prevents invoking <cmd> help help and displaying incorrect help message ([e3d2893f](https://github.com/clap-rs/clap/commit/e3d2893f377942a2d4cf3c6ff04524d0346e6fdb), closes [#538](https://github.com/clap-rs/clap/issues/538))\n  *  subcommand help messages requested via <cmd> help <sub> now correctly match <cmd> <sub> --help ([08ad1cff](https://github.com/clap-rs/clap/commit/08ad1cff4fec57224ea957a2891a057b323c01bc), closes [#539](https://github.com/clap-rs/clap/issues/539))\n\n#### Improvements\n\n* **ArgGroup:**  Add multiple ArgGroups per Arg ([902e182f](https://github.com/clap-rs/clap/commit/902e182f7a58aff11ff01e0a452abcdbdb2262aa), closes [#426](https://github.com/clap-rs/clap/issues/426))\n* **Usage Strings:**  `[FLAGS]` and `[ARGS]` are no longer blindly added to usage strings ([9b2e45b1](https://github.com/clap-rs/clap/commit/9b2e45b170aff567b038d8b3368880b6046c10c6), closes [#537](https://github.com/clap-rs/clap/issues/537))\n* **arg_enum!:**  allows using meta items like repr(C) with arg_enum!s ([edf9b233](https://github.com/clap-rs/clap/commit/edf9b2331c17a2cbcc13f961add4c55c2778e773), closes [#543](https://github.com/clap-rs/clap/issues/543))\n\n\n\n## v2.6.0 (2016-06-14)\n\n\n#### Improvements\n\n*   removes extra newline from help output ([86e61d19](https://github.com/clap-rs/clap/commit/86e61d19a748fb9870fcf1175308984e51ca1115))\n*   allows printing version to any io::Write object ([921f5f79](https://github.com/clap-rs/clap/commit/921f5f7916597f1d028cd4a65bfe76a01c801724))\n*   removes extra newline when printing version ([7e2e2cbb](https://github.com/clap-rs/clap/commit/7e2e2cbb4a8a0f050bb8072a376f742fc54b8589))\n* **Aliases:**  improves readability of asliases in help messages ([ca511de7](https://github.com/clap-rs/clap/commit/ca511de71f5b8c2ac419f1b188658e8c63b67846), closes [#526](https://github.com/clap-rs/clap/issues/526), [#529](https://github.com/clap-rs/clap/issues/529))\n* **Usage Strings:**  improves the default usage string when only a single positional arg is present ([ec86f2da](https://github.com/clap-rs/clap/commit/ec86f2dada1545a63fc72355e22fcdc4c466c215), closes [#518](https://github.com/clap-rs/clap/issues/518))\n\n#### Features\n\n* **Help:**  allows wrapping at specified term width (Even on Windows!) ([1761dc0d](https://github.com/clap-rs/clap/commit/1761dc0d27d0d621229d792be40c36fbf65c3014), closes [#451](https://github.com/clap-rs/clap/issues/451))\n* **Settings:**\n  *  adds new setting to stop delimiting values with -- or TrailingVarArg ([fc3e0f5a](https://github.com/clap-rs/clap/commit/fc3e0f5afda6d24cdb3c4676614beebe13e1e870), closes [#511](https://github.com/clap-rs/clap/issues/511))\n  *  one can now set an AppSetting which is propagated down through child subcommands ([e2341835](https://github.com/clap-rs/clap/commit/e23418351a3b98bf08dfd7744bc14377c70d59ee), closes [#519](https://github.com/clap-rs/clap/issues/519))\n* **Subcommands:**  adds support for visible aliases ([7b10e7f8](https://github.com/clap-rs/clap/commit/7b10e7f8937a07fdb8d16a6d8df79ce78d080cd3), closes [#522](https://github.com/clap-rs/clap/issues/522))\n\n#### Bug Fixes\n\n*   fixes bug where args are printed out of order with templates ([05abb534](https://github.com/clap-rs/clap/commit/05abb534864764102031a0d402e64ac65867aa87))\n*   fixes bug where one can't override version or help flags ([90d7d6a2](https://github.com/clap-rs/clap/commit/90d7d6a2ea8240122dd9bf8d82d3c4f5ebb5c703), closes [#514](https://github.com/clap-rs/clap/issues/514))\n*   fixes issue where before_help wasn't printed ([b3faff60](https://github.com/clap-rs/clap/commit/b3faff6030f76a23f26afcfa6a90169002ed7106))\n* **Help:**  `App::before_help` and `App::after_help` now correctly wrap ([1f4da767](https://github.com/clap-rs/clap/commit/1f4da7676e6e71aa8dda799f3eeefad105a47819), closes [#516](https://github.com/clap-rs/clap/issues/516))\n* **Settings:**  fixes bug where new color settings couldn't be converted from strs ([706a7c11](https://github.com/clap-rs/clap/commit/706a7c11b0900be594de6d5a3121938eff197602))\n* **Subcommands:**  subcommands with aliases now display help of the aliased subcommand ([5354d14b](https://github.com/clap-rs/clap/commit/5354d14b51f189885ba110e01e6b76cca3752992), closes [#521](https://github.com/clap-rs/clap/issues/521))\n* **Windows:**  fixes a failing windows build ([01e7dfd6](https://github.com/clap-rs/clap/commit/01e7dfd6c07228c0be6695b3c7bf9370d82860d4))\n* **YAML:**  adds missing YAML methods for App and Arg ([e468faf3](https://github.com/clap-rs/clap/commit/e468faf3f05950fd9f72d84b69aa2061e91c6c64), closes [#528](https://github.com/clap-rs/clap/issues/528))\n\n\n\n## v2.5.2 (2016-05-31)\n\n\n#### Improvements\n\n*   removes extra newline from help output ([86e61d19](https://github.com/clap-rs/clap/commit/86e61d19a748fb9870fcf1175308984e51ca1115))\n*   allows printing version to any io::Write object ([921f5f79](https://github.com/clap-rs/clap/commit/921f5f7916597f1d028cd4a65bfe76a01c801724))\n*   removes extra newline when printing version ([7e2e2cbb](https://github.com/clap-rs/clap/commit/7e2e2cbb4a8a0f050bb8072a376f742fc54b8589))\n\n#### Bug Fixes\n\n*   fixes bug where args are printed out of order with templates ([3935431d](https://github.com/clap-rs/clap/commit/3935431d5633f577c0826ae2142794b301f4b8ca))\n*   fixes bug where one can't override version or help flags ([90d7d6a2](https://github.com/clap-rs/clap/commit/90d7d6a2ea8240122dd9bf8d82d3c4f5ebb5c703), closes [#514](https://github.com/clap-rs/clap/issues/514))\n*   fixes issue where before_help wasn't printed ([b3faff60](https://github.com/clap-rs/clap/commit/b3faff6030f76a23f26afcfa6a90169002ed7106))\n\n#### Documentation\n\n*   inter-links all types and pages ([3312893d](https://github.com/clap-rs/clap/commit/3312893ddaef3f44d68d8d26ed3d08010be50d97), closes [#505](https://github.com/clap-rs/clap/issues/505))\n*   makes all publicly available types viewable in docs ([52ca6505](https://github.com/clap-rs/clap/commit/52ca6505b4fec7b5c2d53d160c072d395eb21da6))\n\n## v2.5.1 (2016-05-11)\n\n\n#### Bug Fixes\n\n* **Subcommand Aliases**: fixes lifetime issue when setting multiple aliases at once ([ac42f6cf0](https://github.com/clap-rs/clap/commit/ac42f6cf0de6c4920f703807d63061803930b18d))\n\n## v2.5.0 (2016-05-10)\n\n\n#### Improvements\n\n* **SubCommand Aliases:**  adds feature to yaml configs too ([69592195](https://github.com/clap-rs/clap/commit/695921954dde46dfd483399dcdef482c9dd7f34a))\n\n#### Features\n\n* **SubCommands:**  adds support for subcommand aliases ([66b4dea6](https://github.com/clap-rs/clap/commit/66b4dea65c44d8f77ff522238a9237aed1bcab6d), closes [#469](https://github.com/clap-rs/clap/issues/469))\n\n\n## v2.4.3 (2016-05-10)\n\n\n#### Bug Fixes\n\n* **Usage Strings:**\n  *  now properly dedups args that are also in groups ([3ca0947c](https://github.com/clap-rs/clap/commit/3ca0947c166b4f8525752255e3a4fa6565eb9689), closes [#498](https://github.com/clap-rs/clap/issues/498))\n  *  removes duplicate groups from usage strings ([f574fb8a](https://github.com/clap-rs/clap/commit/f574fb8a7cde4d4a2fa4c4481d59be2d0f135427))\n\n#### Improvements\n\n* **Groups:**  formats positional args in groups in a better way ([fef11154](https://github.com/clap-rs/clap/commit/fef11154fb7430d1cbf04a672aabb366e456a368))\n* **Help:**\n  *  moves positionals to standard <> formatting ([03dfe5ce](https://github.com/clap-rs/clap/commit/03dfe5ceff1d63f172788ff688567ddad9fe119b))\n  *  default help subcommand string has been shortened ([5b7fe8e4](https://github.com/clap-rs/clap/commit/5b7fe8e4161e43ab19e2e5fcf55fbe46791134e9), closes [#494](https://github.com/clap-rs/clap/issues/494))\n\n## v2.4.3 (2016-05-10)\n\n* Ghost Release\n\n## v2.4.3 (2016-05-10)\n\n* Ghost Release\n\n## v2.4.0 (2016-05-02)\n\n\n#### Features\n\n* **Help:**  adds support for displaying info before help message ([29fbfa3b](https://github.com/clap-rs/clap/commit/29fbfa3b963f2f3ca7704bf5d3e1201531baa373))\n* **Required:**  adds allowing args that are required unless certain args are present ([af1f7916](https://github.com/clap-rs/clap/commit/af1f79168390ea7da4074d0d9777de458ea64971))\n\n#### Documentation\n\n*   hides formatting from docs ([cb708093](https://github.com/clap-rs/clap/commit/cb708093a7cd057f08c98b7bd1ed54c2db86ae7e))\n* **required_unless:**  adds docs and examples for required_unless ([ca727b52](https://github.com/clap-rs/clap/commit/ca727b52423b9883acd88b2f227b2711bc144573))\n\n#### Bug Fixes\n\n* **Required Args:**  fixes issue where missing required args are sometimes duplicated in error messages ([3beebd81](https://github.com/clap-rs/clap/commit/3beebd81e7bc2faa4115ac109cf570e512c5477f), closes [#492](https://github.com/clap-rs/clap/issues/492))\n\n\n## v2.3.0 (2016-04-18)\n\n\n#### Improvements\n\n* **macros.rs:**  Added write_nspaces macro (a new version of write_spaces) ([9d757e86](https://github.com/clap-rs/clap/commit/9d757e8678e334e5a740ac750c76a9ed4e785cba))\n* **parser.rs:**\n  *  Provide a way to create a usage string without the USAGE: title ([a91d378b](https://github.com/clap-rs/clap/commit/a91d378ba0c91b5796457f8c6e881b13226ab735))\n  *  Make Parser's create_usage public allowing to have function outside the parser to generate the help ([d51945f8](https://github.com/clap-rs/clap/commit/d51945f8b82ebb0963f4f40b384a9e8335783091))\n  *  Expose Parser's flags, opts and positionals argument as iterators ([9b23e7ee](https://github.com/clap-rs/clap/commit/9b23e7ee40e51f7a823644c4496be955dc6c9d3a))\n* **src/args:**  Exposes argument display order by introducing a new Trait ([1321630e](https://github.com/clap-rs/clap/commit/1321630ef56955f152c73376d4d85cceb0bb4a12))\n* **srs/args:**  Added longest_filter to AnyArg trait ([65b3f667](https://github.com/clap-rs/clap/commit/65b3f667532685f854c699ddd264d326599cf7e5))\n\n#### Features\n\n* **Authors Macro:**  adds a crate_authors macro ([38fb59ab](https://github.com/clap-rs/clap/commit/38fb59abf480eb2b6feca269097412f8b00b5b54), closes [#447](https://github.com/clap-rs/clap/issues/447))\n* **HELP:**\n  *  implements optional colored help messages ([abc8f669](https://github.com/clap-rs/clap/commit/abc8f669c3c8193ffc3a3b0ac6c3ac2198794d4f), closes [#483](https://github.com/clap-rs/clap/issues/483))\n  *  Add a Templated Help system. ([81e121ed](https://github.com/clap-rs/clap/commit/81e121edd616f7285593f11120c63bcccae0d23e))\n\n#### Bug Fixes\n\n* **HELP:**  Adjust Help to semantic changes introduced in 6933b84 ([8d23806b](https://github.com/clap-rs/clap/commit/8d23806bd67530ad412c34a1dcdcb1435555573d))\n\n## v2.2.6 (2016-04-11)\n\n#### Bug Fixes\n\n* **Arg Groups**: fixes bug where arg name isn't printed properly ([3019a685](https://github.com/clap-rs/clap/commit/3019a685eee747ccbe6be09ad5dddce0b1d1d4db), closes [#476](https://github.com/clap-rs/clap/issues/476))\n\n\n## v2.2.5 (2016-04-03)\n\n\n#### Bug Fixes\n\n* **Empty Values:**  fixes bug where empty values weren't stored ([885d166f](https://github.com/clap-rs/clap/commit/885d166f04eb3fb581898ae5818c6c8032e5a686), closes [#470](https://github.com/clap-rs/clap/issues/470))\n* **Help Message:**  fixes bug where arg name is printed twice ([71acf1d5](https://github.com/clap-rs/clap/commit/71acf1d576946658b8bbdb5ae79e6716c43a030f), closes [#472](https://github.com/clap-rs/clap/issues/472))\n\n\n## v2.2.4 (2016-03-30)\n\n\n#### Bug Fixes\n\n*   fixes compiling with debug cargo feature ([d4b55450](https://github.com/clap-rs/clap/commit/d4b554509928031ac0808076178075bb21f8c1da))\n* **Empty Values:**  fixes bug where empty values weren't stored ([885d166f](https://github.com/clap-rs/clap/commit/885d166f04eb3fb581898ae5818c6c8032e5a686), closes [#470](https://github.com/clap-rs/clap/issues/470))\n\n\n\n## v2.2.3 (2016-03-28)\n\n\n#### Bug Fixes\n\n* **Help Subcommand:**  fixes issue where help and version flags weren't properly displayed ([205b07bf](https://github.com/clap-rs/clap/commit/205b07bf2e6547851f1290f8cd6b169145e144f1), closes [#466](https://github.com/clap-rs/clap/issues/466))\n\n## v2.2.2 (2016-03-27)\n\n\n#### Bug Fixes\n\n* **Help Message:**  fixes bug with wrapping in the middle of a unicode sequence ([05365ddc](https://github.com/clap-rs/clap/commit/05365ddcc252e4b49e7a75e199d6001a430bd84d), closes [#456](https://github.com/clap-rs/clap/issues/456))\n* **Usage Strings:**  fixes small bug where -- would appear needlessly in usage strings ([6933b849](https://github.com/clap-rs/clap/commit/6933b8491c2a7e28cdb61b47dcf10caf33c2f78a), closes [#461](https://github.com/clap-rs/clap/issues/461))\n\n\n### 2.2.1 (2016-03-16)\n\n\n#### Features\n\n* **Help Message:**  wraps and aligns the help message of subcommands ([813d75d0](https://github.com/clap-rs/clap/commit/813d75d06fbf077c65762608c0fa5e941cfc393c), closes [#452](https://github.com/clap-rs/clap/issues/452))\n\n#### Bug Fixes\n\n* **Help Message:**  fixes a bug where small terminal sizes causing a loop ([1d73b035](https://github.com/clap-rs/clap/commit/1d73b0355236923aeaf6799abc759762ded7e1d0), closes [#453](https://github.com/clap-rs/clap/issues/453))\n\n\n## v2.2.0 (2016-03-15)\n\n\n#### Features\n\n* **Help Message:**  can auto wrap and aligning help text to term width ([e36af026](https://github.com/clap-rs/clap/commit/e36af0266635f23e85e951b9088d561e9a5d1bf6), closes [#428](https://github.com/clap-rs/clap/issues/428))\n* **Help Subcommand:**  adds support passing additional subcommands to help subcommand ([2c12757b](https://github.com/clap-rs/clap/commit/2c12757bbdf34ce481f3446c074e24c09c2e60fd), closes [#416](https://github.com/clap-rs/clap/issues/416))\n* **Opts and Flags:**  adds support for custom ordering in help messages ([9803b51e](https://github.com/clap-rs/clap/commit/9803b51e799904c0befaac457418ee766ccc1ab9))\n* **Settings:**  adds support for automatically deriving custom display order of args ([ad86e433](https://github.com/clap-rs/clap/commit/ad86e43334c4f70e86909689a088fb87e26ff95a), closes [#444](https://github.com/clap-rs/clap/issues/444))\n* **Subcommands:**  adds support for custom ordering in help messages ([7d2a2ed4](https://github.com/clap-rs/clap/commit/7d2a2ed413f5517d45988eef0765cdcd663b6372), closes [#442](https://github.com/clap-rs/clap/issues/442))\n\n#### Bug Fixes\n\n* **From Usage:**  fixes a bug where adding empty lines weren't ignored ([c5c58c86](https://github.com/clap-rs/clap/commit/c5c58c86b9c503d8de19da356a5a5cffb59fbe84))\n\n#### Documentation\n\n* **Groups:**  explains required ArgGroups better ([4ff0205b](https://github.com/clap-rs/clap/commit/4ff0205b85a45151b59bbaf090a89df13438380f), closes [#439](https://github.com/clap-rs/clap/issues/439))\n\n## v2.1.2 (2016-02-24)\n\n#### Bug Fixes\n\n* **Nightly:**  fixes failing nightly build ([d752c170](https://github.com/clap-rs/clap/commit/d752c17029598b19037710f204b7943f0830ae75), closes [#434](https://github.com/clap-rs/clap/issues/434))\n\n\n## v2.1.1 (2016-02-19)\n\n\n#### Documentation\n\n* **AppSettings:**  clarifies that AppSettings do not propagate ([3c8db0e9](https://github.com/clap-rs/clap/commit/3c8db0e9be1d24edaad364359513cbb02abb4186), closes [#429](https://github.com/clap-rs/clap/issues/429))\n* **Arg Examples:**  adds better examples ([1e79cccc](https://github.com/clap-rs/clap/commit/1e79cccc12937bc0e7cd2aad8e404410798e9fff))\n\n#### Improvements\n\n* **Help:**  adds setting for next line help by arg ([066df748](https://github.com/clap-rs/clap/commit/066df7486e684cf50a8479a356a12ba972c34ce1), closes [#427](https://github.com/clap-rs/clap/issues/427))\n\n\n## v2.1.0 (2016-02-10)\n\n\n#### Features\n\n* **Default Values:**  adds support for default values in args ([73211952](https://github.com/clap-rs/clap/commit/73211952964a79d97b434dd567e6d7d34be7feb5), closes [#418](https://github.com/clap-rs/clap/issues/418))\n\n#### Documentation\n\n* **Default Values:**  adds better examples and notes for default values ([9facd74f](https://github.com/clap-rs/clap/commit/9facd74f843ef3807c5d35259558a344e6c25905))\n\n\n## v2.0.6 (2016-02-09)\n\n\n#### Improvements\n\n* **Positional Arguments:**  now displays value name if appropriate ([f0a99916](https://github.com/clap-rs/clap/commit/f0a99916c59ce675515c6dcdfe9a40b130510908), closes [#420](https://github.com/clap-rs/clap/issues/420))\n\n\n## v2.0.5 (2016-02-05)\n\n\n#### Bug Fixes\n\n* **Multiple Values:**  fixes bug where number_of_values wasn't respected ([72c387da](https://github.com/clap-rs/clap/commit/72c387da0bb8a6f526f863770f08bb8ca0d3de03))\n\n\n## v2.0.4 (2016-02-04)\n\n\n#### Bug Fixes\n\n*   adds support for building ArgGroups from standalone YAML ([fcbc7e12](https://github.com/clap-rs/clap/commit/fcbc7e12f5d7b023b8f30cba8cad28a01cf6cd26))\n*   Stop lonely hyphens from causing panic ([85b11468](https://github.com/clap-rs/clap/commit/85b11468b0189d5cc15f1cfac5db40d17a0077dc), closes [#410](https://github.com/clap-rs/clap/issues/410))\n* **AppSettings:**  fixes bug where subcmds didn't receive parent ver ([a62e4527](https://github.com/clap-rs/clap/commit/a62e452754b3b0e3ac9a15aa8b5330636229ead1))\n\n## v2.0.3 (2016-02-02)\n\n\n#### Improvements\n\n* **values:**  adds support for up to u64::max values per arg ([c7abf7d7](https://github.com/clap-rs/clap/commit/c7abf7d7611e317b0d31d97632e3d2e13570947c))\n* **occurrences:**  Allow for more than 256 occurrences of an argument. ([3731ddb3](https://github.com/clap-rs/clap/commit/3731ddb361163f3d6b86844362871e48c80fa530))\n\n#### Features\n\n* **AppSettings:**  adds HidePossibleValuesInHelp to skip writing those values ([cdee7a0e](https://github.com/clap-rs/clap/commit/cdee7a0eb2beeec723cb98acfacf03bf629c1da3))\n\n#### Bug Fixes\n\n* **value_t_or_exit:**  fixes typo which causes value_t_or_exit to return a Result ([ee96baff](https://github.com/clap-rs/clap/commit/ee96baffd306cb8d20ddc5575cf739bb1a6354e8))\n\n\n## v2.0.2 (2016-01-31)\n\n\n#### Improvements\n\n* **arg_enum:**  enum declared with arg_enum returns [&'static str; #] instead of Vec ([9c4b8a1a](https://github.com/clap-rs/clap/commit/9c4b8a1a6b12949222f17d1074578ad7676b9c0d))\n\n#### Bug Fixes\n\n*   clap_app! should be gated by unstable, not nightly feature ([0c8b84af](https://github.com/clap-rs/clap/commit/0c8b84af6161d5baf683688eafc00874846f83fa))\n* **SubCommands:**  fixed where subcmds weren't recognized after mult args ([c19c17a8](https://github.com/clap-rs/clap/commit/c19c17a8850602990e24347aeb4427cf43316223), closes [#405](https://github.com/clap-rs/clap/issues/405))\n* **Usage Parser:**  fixes a bug where literal single quotes weren't allowed in help strings ([0bcc7120](https://github.com/clap-rs/clap/commit/0bcc71206478074769e311479b34a9f74fe80f5c), closes [#406](https://github.com/clap-rs/clap/issues/406))\n\n\n## v2.0.1 (2016-01-30)\n\n\n#### Bug Fixes\n\n*   fixes cargo features to NOT require nightly with unstable features ([dcbcc60c](https://github.com/clap-rs/clap/commit/dcbcc60c9ba17894be636472ea4b07a82d86a9db), closes [#402](https://github.com/clap-rs/clap/issues/402))\n\n\n## v2.0.0 (2016-01-28)\n\n\n#### Improvements\n\n* **From Usage:**  vastly improves the usage parser ([fa3a2f86](https://github.com/clap-rs/clap/commit/fa3a2f86bd674c5eb07128c95098fab7d1437247), closes [#350](https://github.com/clap-rs/clap/issues/350))\n\n#### Features\n\n*   adds support for external subcommands ([177fe5cc](https://github.com/clap-rs/clap/commit/177fe5cce745c2164a8e38c23be4c4460d2d7211), closes [#372](https://github.com/clap-rs/clap/issues/372))\n*   adds support values with a leading hyphen ([e4d429b9](https://github.com/clap-rs/clap/commit/e4d429b9d52e95197bd0b572d59efacecf305a59), closes [#385](https://github.com/clap-rs/clap/issues/385))\n*   adds support for turning off the value delimiter ([508db850](https://github.com/clap-rs/clap/commit/508db850a87c2e251cf6b6ddead9ad56b29f9e57), closes [#352](https://github.com/clap-rs/clap/issues/352))\n*   adds support changing the value delimiter ([dafeae8a](https://github.com/clap-rs/clap/commit/dafeae8a526162640f6a68da434370c64d190889), closes [#353](https://github.com/clap-rs/clap/issues/353))\n*   adds support for comma separated values ([e69da6af](https://github.com/clap-rs/clap/commit/e69da6afcd2fe48a3c458ca031db40997f860eda), closes [#348](https://github.com/clap-rs/clap/issues/348))\n*   adds support with options with optional values ([4555736c](https://github.com/clap-rs/clap/commit/4555736cad01441dcde4ea84a285227e0844c16e), closes [#367](https://github.com/clap-rs/clap/issues/367))\n* **UTF-8:**  adds support for invalid utf8 in values ([c5c59dec](https://github.com/clap-rs/clap/commit/c5c59dec0bc33b86b2e99d30741336f17ec84282), closes [#269](https://github.com/clap-rs/clap/issues/269))\n* **v2:**  implementing the base of 2.x ([a3536054](https://github.com/clap-rs/clap/commit/a3536054512ba833533dc56615ce3663d884381c))\n\n#### Bug Fixes\n\n*   fixes nightly build with new lints ([17599195](https://github.com/clap-rs/clap/commit/175991956c37dc83ba9c49396e927a1cb65c5b11))\n*   fixes Windows build for 2x release ([674c9b48](https://github.com/clap-rs/clap/commit/674c9b48c7c92079cb180cc650a9e39f34781c32), closes [#392](https://github.com/clap-rs/clap/issues/392))\n*   fixes yaml build for 2x base ([adceae64](https://github.com/clap-rs/clap/commit/adceae64c8556d00ab715677377b216f9f468ad7))\n\n#### Documentation\n\n*   updates examples for 2x release ([1303b360](https://github.com/clap-rs/clap/commit/1303b3607468f362ab1b452d5614c1a064dc69b4), closes [#394](https://github.com/clap-rs/clap/issues/394))\n*   updates examples for 2x release ([0a011f31](https://github.com/clap-rs/clap/commit/0a011f3142aec338d388a6c8bfe22fa7036021bb), closes [#394](https://github.com/clap-rs/clap/issues/394))\n*   updates documentation for v2 release ([8d51724e](https://github.com/clap-rs/clap/commit/8d51724ef73dfde5bb94fb9466bc5463a1cc1502))\n*   updating docs for 2x release ([576d0e0e](https://github.com/clap-rs/clap/commit/576d0e0e2c7b8f386589179bbf7419b93abacf1c))\n* **README.md:**\n  *  updates readme for v2 release ([acaba01a](https://github.com/clap-rs/clap/commit/acaba01a353c12144b9cd9a3ce447400691849b0), closes [#393](https://github.com/clap-rs/clap/issues/393))\n  *  fix typo and make documentation conspicuous ([07b9f614](https://github.com/clap-rs/clap/commit/07b9f61495d927f69f7abe6c0d85253f0f4e6107))\n\n#### BREAKING CHANGES\n\n* **Fewer lifetimes! Yay!**\n * `App<'a, 'b, 'c, 'd, 'e, 'f>` => `App<'a, 'b>`\n * `Arg<'a, 'b, 'c, 'd, 'e, 'f>` => `Arg<'a, 'b>`\n * `ArgMatches<'a, 'b>` => `ArgMatches<'a>`\n* **Simply Renamed**\n * `App::arg_group` => `App::group`\n * `App::arg_groups` => `App::groups`\n * `ArgGroup::add` => `ArgGroup::arg`\n * `ArgGroup::add_all` => `ArgGroup::args`\n * `ClapError` => `Error`\n  * struct field `ClapError::error_type` => `Error::kind`\n * `ClapResult` => `Result`\n * `ClapErrorType` => `ErrorKind`\n* **Removed Deprecated Functions and Methods**\n * `App::subcommands_negate_reqs`\n * `App::subcommand_required`\n * `App::arg_required_else_help`\n * `App::global_version(bool)`\n * `App::versionless_subcommands`\n * `App::unified_help_messages`\n * `App::wait_on_error`\n * `App::subcommand_required_else_help`\n * `SubCommand::new`\n * `App::error_on_no_subcommand`\n * `Arg::new`\n * `Arg::mutually_excludes`\n * `Arg::mutually_excludes_all`\n * `Arg::mutually_overrides_with`\n * `simple_enum!`\n* **Renamed Error Variants**\n * `InvalidUnicode` => `InvalidUtf8`\n * `InvalidArgument` => `UnknownArgument`\n* **Usage Parser**\n * Value names can now be specified inline, i.e. `-o, --option <FILE> <FILE2> 'some option which takes two files'`\n * **There is now a priority of order to determine the name** - This is perhaps the biggest breaking change. See the documentation for full details. Prior to this change, the value name took precedence. **Ensure your args are using the proper names (i.e. typically the long or short and NOT the value name) throughout the code**\n* `ArgMatches::values_of` returns an `Values` now which implements `Iterator` (should not break any code)\n* `crate_version!` returns `&'static str` instead of `String`\n* Using the `clap_app!` macro requires compiling with the `unstable` feature because the syntax could change slightly in the future\n\n\n## v1.5.5 (2016-01-04)\n\n\n#### Bug Fixes\n\n*   fixes an issue where invalid short args didn't cause an error ([c9bf7e44](https://github.com/clap-rs/clap/commit/c9bf7e4440bd2f9b524ea955311d433c40a7d1e0))\n*   prints the name in version and help instead of binary name ([8f3817f6](https://github.com/clap-rs/clap/commit/8f3817f665c0cab6726bc16c56a53b6a61e44448), closes [#368](https://github.com/clap-rs/clap/issues/368))\n*   fixes an intentional panic issue discovered via clippy ([ea83a3d4](https://github.com/clap-rs/clap/commit/ea83a3d421ea8856d4cac763942834d108b71406))\n\n\n## v1.5.4 (2015-12-18)\n\n\n#### Examples\n\n* **17_yaml:**  conditinonally compile 17_yaml example ([575de089](https://github.com/clap-rs/clap/commit/575de089a3e240c398cb10e6cf5a5c6b68662c01))\n\n#### Improvements\n\n*   clippy improvements ([99cdebc2](https://github.com/clap-rs/clap/commit/99cdebc23da3a45a165f14b27bebeb2ed828a2ce))\n\n#### Bug Fixes\n\n\n* **errors:**  return correct error type in WrongNumValues error builder ([5ba8ba9d](https://github.com/clap-rs/clap/commit/5ba8ba9dcccdfa74dd1c44260e64b359bbb36be6))\n*   ArgRequiredElseHelp setting now takes precedence over missing required args ([faad83fb](https://github.com/clap-rs/clap/commit/faad83fbef6752f3093b6e98fca09a9449b830f4), closes [#362](https://github.com/clap-rs/clap/issues/362))\n\n\n## v1.5.3 (2015-11-20)\n\n\n#### Bug Fixes\n\n* **Errors:**  fixes some instances when errors are missing a final newline ([c4d2b171](https://github.com/clap-rs/clap/commit/c4d2b1711994479ad64ee52b6b49d2ceccbf2118))\n\n\n\n\n## v1.5.2 (2015-11-14)\n\n\n#### Bug Fixes\n\n* **Errors:**  fixes a compiling bug when built on Windows or without the color feature ([a35f7634](https://github.com/clap-rs/clap/commit/a35f76346fe6ecc88dda6a1eb13627186e7ce185))\n\n\n\n## v1.5.1 (2015-11-13)\n\n\n#### Bug Fixes\n\n* **Required Args:**  fixes a bug where required args are not correctly accounted for ([f03b88a9](https://github.com/clap-rs/clap/commit/f03b88a9766b331a63879bcd747687f2e5a2661b), closes [#343](https://github.com/clap-rs/clap/issues/343))\n\n\n\n## v1.5.0 (2015-11-13)\n\n\n#### Bug Fixes\n\n*   fixes a bug with required positional args in usage strings ([c6858f78](https://github.com/clap-rs/clap/commit/c6858f78755f8e860204323c828c8355a066dc83))\n\n#### Documentation\n\n* **FAQ:**  updates readme with slight changes to FAQ ([a4ef0fab](https://github.com/clap-rs/clap/commit/a4ef0fab73c8dc68f1b138965d1340459c113398))\n\n#### Improvements\n\n*   massive errors overhaul ([cdc29175](https://github.com/clap-rs/clap/commit/cdc29175bc9c53e5b4aec86cbc04c1743154dae6))\n* **ArgMatcher:**  huge refactor and deduplication of code ([8988853f](https://github.com/clap-rs/clap/commit/8988853fb8825e8f841fde349834cc12cdbad081))\n* **Errors:**  errors have been vastly improved ([e59bc0c1](https://github.com/clap-rs/clap/commit/e59bc0c16046db156a88ba71a037db05028e995c))\n* **Traits:**  refactoring some configuration into traits ([5800cdec](https://github.com/clap-rs/clap/commit/5800cdec6dce3def4242b9f7bd136308afb19685))\n\n#### Performance\n\n* **App:**\n  *  more BTreeMap->Vec, Opts and SubCmds ([bc4495b3](https://github.com/clap-rs/clap/commit/bc4495b32ec752b6c4b29719e831c043ef2a26ce))\n  *  changes flags BTreeMap->Vec ([d357640f](https://github.com/clap-rs/clap/commit/d357640fab55e5964fe83efc3c771e53aa3222fd))\n  *  removed unneeded BTreeMap ([78971fd6](https://github.com/clap-rs/clap/commit/78971fd68d7dc5c8e6811b4520cdc54e4188f733))\n  *  changes BTreeMap to VecMap in some instances ([64b921d0](https://github.com/clap-rs/clap/commit/64b921d087fdd03775c95ba0bcf65d3f5d36f812))\n  *  removed excess clones ([ec0089d4](https://github.com/clap-rs/clap/commit/ec0089d42ed715d293fb668d3a90b0db0aa3ec39))\n\n\n\n## v1.4.7 (2015-11-03)\n\n\n#### Documentation\n\n*   Clarify behavior of Arg::multiple with options. ([434f497a](https://github.com/clap-rs/clap/commit/434f497ab6d831f8145cf09278c97ca6ee6c6fe7))\n*   Fix typos and improve grammar. ([c1f66b5d](https://github.com/clap-rs/clap/commit/c1f66b5de7b5269fbf8760a005ef8c645edd3229))\n\n#### Bug Fixes\n\n* **Error Status:**  fixes bug where --help and --version return non-zero exit code ([89b51fdf](https://github.com/clap-rs/clap/commit/89b51fdf8b1ab67607567344e2317ff1a757cb12))\n\n\n\n## v1.4.6 (2015-10-29)\n\n\n#### Features\n\n*   allows parsing without a binary name for daemons and interactive CLIs ([aff89d57](https://github.com/clap-rs/clap/commit/aff89d579b5b85c3dc81b64f16d5865299ec39a2), closes [#318](https://github.com/clap-rs/clap/issues/318))\n\n#### Bug Fixes\n\n* **Errors:**  tones down quoting in some error messages ([34ce59ed](https://github.com/clap-rs/clap/commit/34ce59ede53bfa2eef722c74881cdba7419fd9c7), closes [#309](https://github.com/clap-rs/clap/issues/309))\n* **Help and Version:**  only builds help and version once ([e3be87cf](https://github.com/clap-rs/clap/commit/e3be87cfc095fc41c9811adcdc6d2b079f237d5e))\n* **Option Args:**  fixes bug with args and multiple values ([c9a9548a](https://github.com/clap-rs/clap/commit/c9a9548a8f96cef8a3dd9a980948325fbbc1b91b), closes [#323](https://github.com/clap-rs/clap/issues/323))\n* **POSIX Overrides:**  fixes bug where required args are overridden ([40ed2b50](https://github.com/clap-rs/clap/commit/40ed2b50c3a9fe88bfdbaa43cef9fd6493ecaa8e))\n* **Safe Matches:**  using 'safe' forms of the get_matches family no longer exit the process ([c47025dc](https://github.com/clap-rs/clap/commit/c47025dca2b3305dea0a0acfdd741b09af0c0d05), closes [#256](https://github.com/clap-rs/clap/issues/256))\n* **Versionless SubCommands:**  fixes a bug where the -V flag was needlessly built ([27df8b9d](https://github.com/clap-rs/clap/commit/27df8b9d98d13709dad3929a009f40ebff089a1a), closes [#329](https://github.com/clap-rs/clap/issues/329))\n\n#### Documentation\n\n*   adds comparison in readme ([1a8bf31e](https://github.com/clap-rs/clap/commit/1a8bf31e7a6b87ce48a66af2cde1645b2dd5bc95), closes [#325](https://github.com/clap-rs/clap/issues/325))\n\n\n\n## v1.4.5 (2015-10-06)\n\n\n#### Bug Fixes\n\n*   fixes crash on invalid arg error ([c78ce128](https://github.com/clap-rs/clap/commit/c78ce128ebbe7b8f730815f8176c29d76f4ade8c))\n\n\n\n## v1.4.4 (2015-10-06)\n\n\n#### Documentation\n\n*   clean up some formatting ([b7df92d7](https://github.com/clap-rs/clap/commit/b7df92d7ea25835701dd22ddff984b9749f48a00))\n*   move the crate-level docs to top of the lib.rs file ([d7233bf1](https://github.com/clap-rs/clap/commit/d7233bf122dbf80ba8fc79e5641be2df8af10e7a))\n*   changes doc comments to rustdoc comments ([34b601be](https://github.com/clap-rs/clap/commit/34b601be5fdde76c1a0859385b359b96d66b8732))\n*   fixes panic in 14_groups example ([945b00a0](https://github.com/clap-rs/clap/commit/945b00a0c27714b63bdca48d003fe205fcfdc578), closes [#295](https://github.com/clap-rs/clap/issues/295))\n*   avoid suggesting star dependencies. ([d33228f4](https://github.com/clap-rs/clap/commit/d33228f40b5fefb84cf3dd51546bfb340dcd9f5a))\n* **Rustdoc:**  adds portions of the readme to main rustdoc page ([6f9ee181](https://github.com/clap-rs/clap/commit/6f9ee181e69d90bd4206290e59d6f3f1e8f0cbb2), closes [#293](https://github.com/clap-rs/clap/issues/293))\n\n#### Bug Fixes\n\n*   grammar error in some conflicting option errors ([e73b07e1](https://github.com/clap-rs/clap/commit/e73b07e19474323ad2260da66abbf6a6d4ecbd4f))\n* **Unified Help:**  sorts both flags and options as a unified category ([2a223dad](https://github.com/clap-rs/clap/commit/2a223dad82901fa2e74baad3bfc4c7b94509300f))\n* **Usage:**  fixes a bug where required args aren't filtered properly ([72b453dc](https://github.com/clap-rs/clap/commit/72b453dc170af3050bb123d35364f6da77fc06d7), closes [#277](https://github.com/clap-rs/clap/issues/277))\n* **Usage Strings:**  fixes a bug ordering of elements in usage strings ([aaf0d6fe](https://github.com/clap-rs/clap/commit/aaf0d6fe7aa2403e76096c16204d254a9ee61ee2), closes [#298](https://github.com/clap-rs/clap/issues/298))\n\n#### Features\n\n*   supports -aValue style options ([0e3733e4](https://github.com/clap-rs/clap/commit/0e3733e4fec2015c2d566a51432dcd92cb69cad3))\n* **Trailing VarArg:**  adds opt-in setting for final arg being vararg ([27018b18](https://github.com/clap-rs/clap/commit/27018b1821a4bcd5235cfe92abe71b3c99efc24d), closes [#278](https://github.com/clap-rs/clap/issues/278))\n\n\n\n## v1.4.3 (2015-09-30)\n\n\n#### Features\n\n*   allows accessing arg values by group name ([c92a4b9e](https://github.com/clap-rs/clap/commit/c92a4b9eff2d679957f61c0c41ff404b40d38a91))\n\n#### Documentation\n\n*   use links to examples instead of plain text ([bb4fe237](https://github.com/clap-rs/clap/commit/bb4fe237858535627271465147add537e4556b43))\n\n#### Bug Fixes\n\n* **Help Message:**  required args no longer double list in usage ([1412e639](https://github.com/clap-rs/clap/commit/1412e639e0a79df84936d1101a837f90077d1c83), closes [#277](https://github.com/clap-rs/clap/issues/277))\n* **Possible Values:**  possible value validation is restored ([f121ae74](https://github.com/clap-rs/clap/commit/f121ae749f8f4bfe754ef2e8a6dfc286504b5b75), closes [#287](https://github.com/clap-rs/clap/issues/287))\n\n\n\n## v1.4.2 (2015-09-23)\n\n\n#### Bug Fixes\n\n* **Conflicts:**  fixes bug with conflicts not removing required args ([e17fcec5](https://github.com/clap-rs/clap/commit/e17fcec53b3216ad047a13dddc6f740473fad1a1), closes [#271](https://github.com/clap-rs/clap/issues/271))\n\n\n\n## v1.4.1 (2015-09-22)\n\n\n#### Examples\n\n*   add clap_app quick example ([4ba6249c](https://github.com/clap-rs/clap/commit/4ba6249c3cf4d2e083370d1fe4dcc7025282c28a))\n\n#### Features\n\n* **Unicode:**  allows non-panicking on invalid unicode characters ([c5bf7ddc](https://github.com/clap-rs/clap/commit/c5bf7ddc8cfb876ec928a5aaf5591232bbb32e5d))\n\n#### Documentation\n\n*   properly names Examples section for rustdoc ([87ba5445](https://github.com/clap-rs/clap/commit/87ba54451d7ec7b1c9b9ef134f90bbe39e6fac69))\n*   fixes various typos and spelling ([f85640f9](https://github.com/clap-rs/clap/commit/f85640f9f6d8fd3821a40e9b8b7a34fabb789d02))\n* **Arg:**  unhides fields of the Arg struct ([931aea88](https://github.com/clap-rs/clap/commit/931aea88427edf43a3da90d5a500c1ff2b2c3614))\n\n#### Bug Fixes\n\n*   flush the buffer in App::print_version() ([cbc42a37](https://github.com/clap-rs/clap/commit/cbc42a37d212d84d22b1777d08e584ff191934e7))\n*   Macro benchmarks ([13712da1](https://github.com/clap-rs/clap/commit/13712da1d36dc7614eec3a10ad488257ba615751))\n\n\n\n## v1.4.0 (2015-09-09)\n\n\n#### Features\n\n*   allows printing help message by library consumers ([56b95f32](https://github.com/clap-rs/clap/commit/56b95f320875c62dda82cb91b29059671e120ed1))\n*   allows defining hidden args and subcmds ([2cab4d03](https://github.com/clap-rs/clap/commit/2cab4d0334ea3c2439a1d4bfca5bf9905c7ea9ac), closes [#231](https://github.com/clap-rs/clap/issues/231))\n*   Builder macro to assist with App/Arg/Group/SubCommand building ([443841b0](https://github.com/clap-rs/clap/commit/443841b012a8d795cd5c2bd69ae6e23ef9b16477))\n* **Errors:**  allows consumers to write to stderr and exit on error ([1e6403b6](https://github.com/clap-rs/clap/commit/1e6403b6a863574fa3cb6946b1fb58f034e8664c))\n\n\n\n## v1.3.2 (2015-09-08)\n\n\n#### Documentation\n\n*   fixed ErrorKind docs ([dd057843](https://github.com/clap-rs/clap/commit/dd05784327fa070eb6ce5ce89a8507e011d8db94))\n* **ErrorKind:**  changed examples content ([b9ca2616](https://github.com/clap-rs/clap/commit/b9ca261634b89613bbf3d98fd74d55cefbb31a8c))\n\n#### Bug Fixes\n\n*   fixes a bug where the help subcommand wasn't overridable ([94003db4](https://github.com/clap-rs/clap/commit/94003db4b5eebe552ca337521c1c001295822745))\n\n#### Features\n\n*   adds ability not consume self when parsing matches and/or exit on help ([94003db4](https://github.com/clap-rs/clap/commit/94003db4b5eebe552ca337521c1c001295822745))\n* **App:**  Added ability for users to handle errors themselves ([934e6fbb](https://github.com/clap-rs/clap/commit/934e6fbb643b2385efc23444fe6fce31494dc288))\n\n\n\n## v1.3.1 (2015-09-04)\n\n\n#### Examples\n\n* **17_yaml:**  fixed example ([9b848622](https://github.com/clap-rs/clap/commit/9b848622296c8c5c7b9a39b93ddd41f51df790b5))\n\n#### Performance\n\n*   changes ArgGroup HashSets to Vec ([3cb4a48e](https://github.com/clap-rs/clap/commit/3cb4a48ebd15c20692f4f3a2a924284dc7fd5e10))\n*   changes BTreeSet for Vec in some instances ([baab2e3f](https://github.com/clap-rs/clap/commit/baab2e3f4060e811abee14b1654cbcd5cf3b5fea))\n\n\n\n## v1.3.0 (2015-09-01)\n\n\n#### Features\n\n* **YAML:**  allows building a CLI from YAML files ([86cf4c45](https://github.com/clap-rs/clap/commit/86cf4c45626a36b8115446952f9069f73c1debc3))\n* **ArgGroups:**  adds support for building ArgGroups from yaml ([ecf88665](https://github.com/clap-rs/clap/commit/ecf88665cbff367018b29161a1b75d44a212707d))\n* **Subcommands:**  adds support for subcommands from yaml ([e415cf78](https://github.com/clap-rs/clap/commit/e415cf78ba916052d118a8648deba2b9c16b1530))\n\n#### Documentation\n\n* **YAML:**  adds examples for using YAML to build a CLI ([ab41d7f3](https://github.com/clap-rs/clap/commit/ab41d7f38219544750e6e1426076dc498073191b))\n* **Args from YAML:**  fixes doc examples ([19b348a1](https://github.com/clap-rs/clap/commit/19b348a10050404cd93888dbbbe4f396681b67d0))\n* **Examples:**  adds better usage examples instead of having unused variables ([8cbacd88](https://github.com/clap-rs/clap/commit/8cbacd8883004fe71a8ea036ec4391c7dd8efe94))\n\n#### Examples\n\n*   Add AppSettings example ([12705079](https://github.com/clap-rs/clap/commit/12705079ca96a709b4dd94f7ddd20a833b26838c))\n\n#### Bug Fixes\n\n* **Unified Help Messages:**  fixes a crash from this setting and no opts ([169ffec1](https://github.com/clap-rs/clap/commit/169ffec1003d58d105d7ef2585b3425e57980000), closes [#210](https://github.com/clap-rs/clap/issues/210))\n\n\n\n## v1.2.5 (2015-08-27)\n\n\n#### Examples\n\n*   add custom validator example ([b9997d1f](https://github.com/clap-rs/clap/commit/b9997d1fca74d4d8f93971f2a01bdf9798f913d5))\n*   fix indentation ([d4f1b740](https://github.com/clap-rs/clap/commit/d4f1b740ede410fd2528b9ecd89592c2fd8b1e20))\n\n#### Features\n\n* **Args:**  allows opts and args to define a name for help and usage msgs ([ad962ec4](https://github.com/clap-rs/clap/commit/ad962ec478da999c7dba0afdb84c266f4d09b1bd))\n\n\n\n## v1.2.4 (2015-08-26)\n\n\n#### Bug Fixes\n\n* **Possible Values:**  fixes a bug where suggestions aren't made when using --long=value format ([3d5e9a6c](https://github.com/clap-rs/clap/commit/3d5e9a6cedb26668839b481c9978e2fbbab8be6f), closes [#192](https://github.com/clap-rs/clap/issues/192))\n\n\n\n## v1.2.3 (2015-08-24)\n\n\n#### Bug Fixes\n\n* **App, Args:**  fixed subcommand reqs negation ([b41afa8c](https://github.com/clap-rs/clap/commit/b41afa8c3ded3d1be12f7a2f8ea06cc44afc9458), closes [#188](https://github.com/clap-rs/clap/issues/188))\n\n\n\n## v1.2.2 (2015-08-23)\n\n\n#### Bug Fixes\n\n*   fixed confusing error message, also added test for it ([fc7a31a7](https://github.com/clap-rs/clap/commit/fc7a31a745efbf1768ee2c62cd3bb72bfe30c708))\n* **App:**  fixed requirmets overriding ([9c135eb7](https://github.com/clap-rs/clap/commit/9c135eb790fa16183e5bdb2009ddc3cf9e25f99f))\n\n\n\n## v1.2.1 (2015-08-20)\n\n\n#### Documentation\n\n* **README.md:**  updates for new features ([16cf9245](https://github.com/clap-rs/clap/commit/16cf9245fb5fc4cf6face898e358368bf9961cbb))\n\n#### Features\n\n*   implements posix compatible conflicts for long args ([8c2d48ac](https://github.com/clap-rs/clap/commit/8c2d48acf5473feebd721a9049a9c9b7051e70f9))\n*   added overrides to support conflicts in POSIX compatible manner ([0b916a00](https://github.com/clap-rs/clap/commit/0b916a00de26f6941538f6bc5f3365fa302083c1))\n* **Args:**  allows defining POSIX compatible argument conflicts ([d715646e](https://github.com/clap-rs/clap/commit/d715646e69759ccd95e01f49b04f489827ecf502))\n\n#### Bug Fixes\n\n*   fixed links in cargo and license buttons ([6d9837ad](https://github.com/clap-rs/clap/commit/6d9837ad9a9e006117cd7372fdc60f9a3889c7e2))\n\n#### Performance\n\n* **Args and Apps:**  changes HashSet->Vec in some instances for increased performance ([d0c3b379](https://github.com/clap-rs/clap/commit/d0c3b379700757e0a9b0c40af709f8af1f5b4949))\n\n\n\n## v1.2.0 (2015-08-15)\n\n\n#### Bug Fixes\n\n*   fixed misspell and enum name ([7df170d7](https://github.com/clap-rs/clap/commit/7df170d7f4ecff06608317655d1e0c4298f62076))\n*   fixed use for clap crate ([dc3ada73](https://github.com/clap-rs/clap/commit/dc3ada738667d4b689678f79d14251ee82004ece))\n\n#### Documentation\n\n*   updates docs for new features ([03496547](https://github.com/clap-rs/clap/commit/034965471782d872ca495045b58d34b31807c5b1))\n*   fixed docs for previous changes ([ade36778](https://github.com/clap-rs/clap/commit/ade367780c366425de462506d256e0f554ed3b9c))\n\n#### Improvements\n\n* **AppSettings:**  adds ability to add multiple settings at once ([4a00e251](https://github.com/clap-rs/clap/commit/4a00e2510d0ca8d095d5257d51691ba3b61c1374))\n\n#### Features\n\n*   Replace application level settings with enum variants ([618dc4e2](https://github.com/clap-rs/clap/commit/618dc4e2c205bf26bc43146164e65eb1f6b920ed))\n* **Args:**  allows for custom argument value validations to be defined ([84ae2ddb](https://github.com/clap-rs/clap/commit/84ae2ddbceda34b5cbda98a6959edaa52fde2e1a), closes [#170](https://github.com/clap-rs/clap/issues/170))\n\n\n\n## v1.1.6 (2015-08-01)\n\n\n#### Bug Fixes\n\n*   fixes two bugs in App when printing newlines in help and subcommands required error ([d63c0136](https://github.com/clap-rs/clap/commit/d63c0136310db9dd2b1c7b4745938311601d8938))\n\n\n\n## v1.1.5 (2015-07-29)\n\n#### Performance\n\n*   removes some unneeded allocations ([93e915df](https://github.com/clap-rs/clap/commit/93e915dfe300f7b7d6209ca93323c6a46f89a8c1))\n\n## v1.1.4 (2015-07-20)\n\n\n#### Improvements\n\n* **Usage Strings**  displays a [--] when it may be helpful ([86c3be85](https://github.com/clap-rs/clap/commit/86c3be85fb6f77f83b5a6d2df40ae60937486984))\n\n#### Bug Fixes\n\n* **Macros**  fixes a typo in a macro generated error message ([c9195c5f](https://github.com/clap-rs/clap/commit/c9195c5f92abb8cd6a37b4f4fbb2f1fee2a8e368))\n* **Type Errors**  fixes formatting of error output when failed type parsing ([fe5d95c6](https://github.com/clap-rs/clap/commit/fe5d95c64f3296e6eddcbec0cb8b86659800145f))\n\n\n\n## v1.1.3 (2015-07-18)\n\n\n#### Documentation\n\n*   updates README.md to include lack of color support on Windows ([52f81e17](https://github.com/clap-rs/clap/commit/52f81e17377b18d2bd0f34693b642b7f358998ee))\n\n#### Bug Fixes\n\n*   fixes formatting bug which prevented compiling on windows ([9cb5dceb](https://github.com/clap-rs/clap/commit/9cb5dceb3e5fe5e0e7b24619ff77e5040672b723), closes [#163](https://github.com/clap-rs/clap/issues/163))\n\n\n\n## v1.1.2 (2015-07-17)\n\n\n#### Bug Fixes\n\n*   fixes a bug when parsing multiple {n} newlines inside help strings ([6d214b54](https://github.com/clap-rs/clap/commit/6d214b549a9b7e189a94e5fa2b7c92cc333ca637))\n\n\n\n## v1.1.1 (2015-07-17)\n\n\n#### Bug Fixes\n\n*   fixes a logic bug and allows setting Arg::number_of_values() < 2 ([42b6d1fc](https://github.com/clap-rs/clap/commit/42b6d1fc3c519c92dfb3af15276e7d3b635e6cfe), closes [#161](https://github.com/clap-rs/clap/issues/161))\n\n\n\n## v1.1.0 (2015-07-16)\n\n\n#### Features\n\n*   allows creating unified help messages, a la docopt or getopts ([52bcd892](https://github.com/clap-rs/clap/commit/52bcd892ea51564ce463bc5865acd64f8fe91cb1), closes [#158](https://github.com/clap-rs/clap/issues/158))\n*   allows stating all subcommands should *not* have --version flags ([336c476f](https://github.com/clap-rs/clap/commit/336c476f631d512b54ac56fdca6f29ebdc2c00c5), closes [#156](https://github.com/clap-rs/clap/issues/156))\n*   allows setting version number to auto-propagate through subcommands ([bc66d3c6](https://github.com/clap-rs/clap/commit/bc66d3c6deedeca62463fff95369ab1cfcdd366b), closes [#157](https://github.com/clap-rs/clap/issues/157))\n\n#### Improvements\n\n* **Help Strings**  properly aligns and handles newlines in long help strings ([f9800a29](https://github.com/clap-rs/clap/commit/f9800a29696dd2cc0b0284bf693b3011831e556f), closes [#145](https://github.com/clap-rs/clap/issues/145))\n\n\n#### Performance\n\n* **Help Messages**  big performance improvements when printing help messages ([52bcd892](https://github.com/clap-rs/clap/commit/52bcd892ea51564ce463bc5865acd64f8fe91cb1))\n\n#### Documentation\n\n*   updates readme with new features ([8232f7bb](https://github.com/clap-rs/clap/commit/8232f7bb52e88862bc13c3d4f99ee4f56cfe4bc0))\n*   fix incorrect code example for `App::subcommand_required` ([8889689d](https://github.com/clap-rs/clap/commit/8889689dc6336ccc45b2c9f2cf8e2e483a639e93))\n\n\n## v1.0.3 (2015-07-11)\n\n\n#### Improvements\n\n* **Errors**  writes errors to stderr ([cc76ab8c](https://github.com/clap-rs/clap/commit/cc76ab8c2b77c67b42f4717ded530df7806142cf), closes [#154](https://github.com/clap-rs/clap/issues/154))\n\n#### Documentation\n\n* **README.md**  updates example help message to new format ([0aca29bd](https://github.com/clap-rs/clap/commit/0aca29bd5d6d1a4e9971bdc88d946ffa58606efa))\n\n\n\n## v1.0.2 (2015-07-09)\n\n\n#### Improvements\n\n* **Usage**  re-orders optional arguments and required to natural standard ([dc7e1fce](https://github.com/clap-rs/clap/commit/dc7e1fcea5c85d317018fb201d2a9262249131b4), closes [#147](https://github.com/clap-rs/clap/issues/147))\n\n\n\n## v1.0.1 (2015-07-08)\n\n\n#### Bug Fixes\n\n*   allows empty values when using --long='' syntax ([083f82d3](https://github.com/clap-rs/clap/commit/083f82d333b69720a6ef30074875310921d964d1), closes [#151](https://github.com/clap-rs/clap/issues/151))\n\n\n\n## v1.0.0 (2015-07-08)\n\n\n#### Documentation\n\n* **README.md**  adds new features to what's new list ([938f7f01](https://github.com/clap-rs/clap/commit/938f7f01340f521969376cf4e2e3d9436bca21f7))\n* **README.md**  use with_name for subcommands ([28b7e316](https://github.com/clap-rs/clap/commit/28b7e3161fb772e5309042648fe8c3a420645bac))\n\n#### Features\n\n*   args can now be parsed from arbitrary locations, not just std::env::args() ([75312528](https://github.com/clap-rs/clap/commit/753125282b1b9bfff875f1557ce27610edcc59e1))\n\n\n\n## v1.0.0-beta (2015-06-30)\n\n\n#### Features\n\n*   allows waiting for user input on error ([d0da3bdd](https://github.com/clap-rs/clap/commit/d0da3bdd9d1871541907ea9c645322a74d260e07), closes [#140](https://github.com/clap-rs/clap/issues/140))\n* **Help**  allows one to fully override the auto-generated help message ([26d5ae3e](https://github.com/clap-rs/clap/commit/26d5ae3e330d1e150811d5b60b2b01a8f8df854e), closes [#141](https://github.com/clap-rs/clap/issues/141))\n\n#### Documentation\n\n*   adds \"whats new\" section to readme ([ff149a29](https://github.com/clap-rs/clap/commit/ff149a29dd9e179865e6d577cd7dc87c54f8f95c))\n\n#### Improvements\n\n*   removes deprecated functions in prep for 1.0 ([274484df](https://github.com/clap-rs/clap/commit/274484dfd08fff4859cefd7e9bef3b73d3a9cb5f))\n\n\n\n## v0.11.0 (2015-06-17) - BREAKING CHANGE\n\n\n#### Documentation\n\n*   updates docs to new version flag defaults ([ebf442eb](https://github.com/clap-rs/clap/commit/ebf442ebebbcd2ec6bfe2c06566c9d362bccb112))\n\n#### Features\n\n* **Help and Version**  default short for version is now `-V` but can be overridden (only breaks manual documentation) (**BREAKING CHANGE** [eb1d9320](https://github.com/clap-rs/clap/commit/eb1d9320c509c1e4e57d7c7959da82bcfe06ada0))\n\n\n\n## v0.10.5 (2015-06-06)\n\n\n#### Bug Fixes\n\n* **Global Args**  global arguments propagate fully now ([1f377960](https://github.com/clap-rs/clap/commit/1f377960a48c82f54ca5f39eb56bcb393140b046), closes [#137](https://github.com/clap-rs/clap/issues/137))\n\n\n\n## v0.10.4 (2015-06-06)\n\n\n#### Bug Fixes\n\n* **Global Args**  global arguments propagate fully now ([8f2c0160](https://github.com/clap-rs/clap/commit/8f2c0160c8d844daef375a33dbaec7d89de00a00), closes [#137](https://github.com/clap-rs/clap/issues/137))\n\n\n\n## v0.10.3 (2015-05-31)\n\n\n#### Bug Fixes\n\n* **Global Args**  fixes a bug where globals only transfer to one subcommand ([a37842ee](https://github.com/clap-rs/clap/commit/a37842eec1ee3162b86fdbda23420b221cdb1e3b), closes [#135](https://github.com/clap-rs/clap/issues/135))\n\n\n\n## v0.10.2 (2015-05-30)\n\n\n#### Improvements\n\n* **Binary Names**  allows users to override the system determined bin name ([2191fe94](https://github.com/clap-rs/clap/commit/2191fe94bda35771383b52872fb7f5421b178be1), closes [#134](https://github.com/clap-rs/clap/issues/134))\n\n#### Documentation\n\n*   adds contributing guidelines ([6f76bd0a](https://github.com/clap-rs/clap/commit/6f76bd0a07e8b7419b391243ab2d6687cd8a9c5f))\n\n\n\n## v0.10.1 (2015-05-26)\n\n\n#### Features\n\n*   can now specify that an app or subcommand should display help on no args or subcommands ([29ca7b2f](https://github.com/clap-rs/clap/commit/29ca7b2f74376ca0cdb9d8ee3bfa99f7640cc404), closes [#133](https://github.com/clap-rs/clap/issues/133))\n\n\n\n## v0.10.0 (2015-05-23)\n\n\n#### Features\n\n* **Global Args**  allows args that propagate down to child commands ([2bcc6137](https://github.com/clap-rs/clap/commit/2bcc6137a83cb07757771a0afea953e68e692f0b), closes [#131](https://github.com/clap-rs/clap/issues/131))\n\n#### Improvements\n\n* **Colors**  implements more structured colored output ([d6c3ed54](https://github.com/clap-rs/clap/commit/d6c3ed54d21cf7b40d9f130d4280ff5448522fc5), closes [#129](https://github.com/clap-rs/clap/issues/129))\n\n#### Deprecations\n\n* **SubCommand/App**  several methods and functions for stable release ([28b73855](https://github.com/clap-rs/clap/commit/28b73855523ad170544afdb20665db98702fbe70))\n\n#### Documentation\n\n*   updates for deprecations and new features ([743eefe8](https://github.com/clap-rs/clap/commit/743eefe8dd40c1260065ce086d572e9e9358bc4c))\n\n\n\n## v0.9.2 (2015-05-20)\n\n\n#### Bug Fixes\n\n* **help**  allows parent requirements to be ignored with help and version ([52218cc1](https://github.com/clap-rs/clap/commit/52218cc1fdb06a42456c964d98cc2c7ac3432412), closes [#124](https://github.com/clap-rs/clap/issues/124))\n\n\n\n## v0.9.1 (2015-05-18)\n\n\n#### Bug Fixes\n\n* **help**  fixes a bug where requirements are included as program name in help and version ([08ba3f25](https://github.com/clap-rs/clap/commit/08ba3f25cf38b149229ba8b9cb37a5804fe6b789))\n\n\n\n## v0.9.0 (2015-05-17)\n\n\n#### Improvements\n\n* **usage**  usage strings now include parent command requirements ([dd8f21c7](https://github.com/clap-rs/clap/commit/dd8f21c7c15cde348fdcf44fa7c205f0e98d2e4a), closes [#125](https://github.com/clap-rs/clap/issues/125))\n* **args**  allows consumer of clap to decide if empty values are allowed or not ([ab4ec609](https://github.com/clap-rs/clap/commit/ab4ec609ccf692b9b72cccef5c9f74f5577e360d), closes [#122](https://github.com/clap-rs/clap/issues/122))\n\n#### Features\n\n* **subcommands**\n  *  allows optionally specifying that no subcommand is an error ([7554f238](https://github.com/clap-rs/clap/commit/7554f238fd3afdd60b7e4dcf00ff4a9eccf842c1), closes [#126](https://github.com/clap-rs/clap/issues/126))\n  *  subcommands can optionally negate parent requirements ([4a4229f5](https://github.com/clap-rs/clap/commit/4a4229f500e21c350e1ef78dd09ef27559653288), closes [#123](https://github.com/clap-rs/clap/issues/123))\n\n\n\n## v0.8.6 (2015-05-17)\n\n\n#### Bug Fixes\n\n* **args**  `-` can now be parsed as a value for an argument ([bc12e78e](https://github.com/clap-rs/clap/commit/bc12e78eadd7eaf9d008a8469fdd2dfd7990cb5d), closes [#121](https://github.com/clap-rs/clap/issues/121))\n\n\n\n## v0.8.5 (2015-05-15)\n\n\n#### Bug Fixes\n\n* **macros**  makes macro errors consistent with others ([0c264a8c](https://github.com/clap-rs/clap/commit/0c264a8ca57ec1cfdcb74dae79145d766cdc9b97), closes [#118](https://github.com/clap-rs/clap/issues/118))\n\n#### Features\n\n* **macros**\n  *  arg_enum! and simple_enum! provide a Vec<&str> of variant names ([30fa87ba](https://github.com/clap-rs/clap/commit/30fa87ba4e0f3189351d8f4f78b72e616a30d0bd), closes [#119](https://github.com/clap-rs/clap/issues/119))\n  *  arg_enum! and simple_enum! auto-implement Display ([d1219f0d](https://github.com/clap-rs/clap/commit/d1219f0d1371d872061bd0718057eca4ef47b739), closes [#120](https://github.com/clap-rs/clap/issues/120))\n\n\n\n## v0.8.4 (2015-05-12)\n\n\n#### Bug Fixes\n\n* **suggestions**  --help and --version now get suggestions ([d2b3b1fa](https://github.com/clap-rs/clap/commit/d2b3b1faa0bdc1c5d2350cc4635aba81e02e9d96), closes [#116](https://github.com/clap-rs/clap/issues/116))\n\n\n\n## v0.8.3 (2015-05-10)\n\n\n#### Bug Fixes\n\n* **usage**  groups unfold their members in usage strings ([55d15582](https://github.com/clap-rs/clap/commit/55d155827ea4a6b077a83669701e797ce1ad68f4), closes [#114](https://github.com/clap-rs/clap/issues/114))\n\n#### Performance\n\n* **usage**  removes unneeded allocations ([fd53cd18](https://github.com/clap-rs/clap/commit/fd53cd188555f5c3dc8bc341c5d7eb04b761a70f))\n\n\n\n## v0.8.2 (2015-05-08)\n\n\n#### Bug Fixes\n\n* **usage strings**  positional arguments are presented in index order ([eb0e374e](https://github.com/clap-rs/clap/commit/eb0e374ecf952f1eefbc73113f21e0705936e40b), closes [#112](https://github.com/clap-rs/clap/issues/112))\n\n\n\n## v0.8.1 (2015-05-06)\n\n\n#### Bug Fixes\n\n* **subcommands**  stops parsing multiple values when subcommands are found ([fc79017e](https://github.com/clap-rs/clap/commit/fc79017eced04fd41cc1801331e5054df41fac17), closes [#109](https://github.com/clap-rs/clap/issues/109))\n\n#### Improvements\n\n* **color**  reduces color in error messages ([aab44cca](https://github.com/clap-rs/clap/commit/aab44cca6352f47e280c296e50c535f5d752dd46), closes [#110](https://github.com/clap-rs/clap/issues/110))\n* **suggestions**  adds suggested arguments to usage strings ([99447414](https://github.com/clap-rs/clap/commit/994474146e9fb8b701af773a52da71553d74d4b7))\n\n\n\n## v0.8.0 (2015-05-06)\n\n\n#### Bug Fixes\n\n* **did-you-mean**  for review ([0535cfb0](https://github.com/clap-rs/clap/commit/0535cfb0c711331568b4de8080eeef80bd254b68))\n* **Positional**  positionals were ignored if they matched a subcmd, even after '--' ([90e7b081](https://github.com/clap-rs/clap/commit/90e7b0818741668b47cbe3becd029bab588e3553))\n* **help**  fixes bug where space between arg and help is too long ([632fb115](https://github.com/clap-rs/clap/commit/632fb11514c504999ea86bdce47cdd34f8ebf646))\n\n#### Features\n\n* **from_usage**  adds ability to add value names or num of vals in usage string ([3d581976](https://github.com/clap-rs/clap/commit/3d58197674ed7886ca315efb76e411608a327501), closes [#98](https://github.com/clap-rs/clap/issues/98))\n* **did-you-mean**\n  *  gate it behind 'suggestions' ([c0e38351](https://github.com/clap-rs/clap/commit/c0e383515d01bdd5ca459af9c2f7e2cf49e2488b))\n  *  for possible values ([1cc2deb2](https://github.com/clap-rs/clap/commit/1cc2deb29158e0e4e8b434e4ce26b3d819301a7d))\n  *  for long flags (i.e. --long) ([52a0b850](https://github.com/clap-rs/clap/commit/52a0b8505c99354bdf5fd1cd256cf41197ac2d81))\n  *  for subcommands ([06e869b5](https://github.com/clap-rs/clap/commit/06e869b5180258047ed3c60ba099de818dd25fff))\n* **Flags**  adds suggestions functionality ([8745071c](https://github.com/clap-rs/clap/commit/8745071c3257dd327c497013516f12a823df9530))\n* **errors**  colorizes output red on error ([f8b26b13](https://github.com/clap-rs/clap/commit/f8b26b13da82ba3ba9a932d3d1ab4ea45d1ab036))\n\n#### Improvements\n\n* **arg_enum**  allows ascii case insensitivity for enum variants ([b249f965](https://github.com/clap-rs/clap/commit/b249f9657c6921c004764bd80d13ebca81585eec), closes [#104](https://github.com/clap-rs/clap/issues/104))\n* **clap-test**  simplified `make test` invocation ([d17dcb29](https://github.com/clap-rs/clap/commit/d17dcb2920637a1f58c61c596b7bd362fd53047c))\n\n#### Documentation\n\n* **README**  adds details about optional and new features ([960389de](https://github.com/clap-rs/clap/commit/960389de02c9872aaee9adabe86987f71f986e39))\n* **clap**  fix typos caught by codespell ([8891d929](https://github.com/clap-rs/clap/commit/8891d92917aa1a069cca67272be41b99e548356e))\n* **from_usage**  explains new usage strings with multiple values ([05476fc6](https://github.com/clap-rs/clap/commit/05476fc61cd1e5f4a4e750d258c878732a3a9c64))\n\n\n\n## v0.7.6 (2015-05-05)\n\n\n#### Improvements\n\n* **Options**  adds number of values to options in help/usage ([c1c993c4](https://github.com/clap-rs/clap/commit/c1c993c419d18e35c443785053d8de9a2ef88073))\n\n#### Features\n\n* **from_usage**  adds ability to add value names or num of vals in usage string ([ad55748c](https://github.com/clap-rs/clap/commit/ad55748c265cf27935c7b210307d2040b6a09125), closes [#98](https://github.com/clap-rs/clap/issues/98))\n\n#### Bug Fixes\n\n* **MultipleValues**  properly distinguishes between multiple values and multiple occurrences ([dd2a7564](https://github.com/clap-rs/clap/commit/dd2a75640ca68a91b973faad15f04df891356cef), closes [#99](https://github.com/clap-rs/clap/issues/99))\n* **help**  fixes tab alignment with multiple values ([847001ff](https://github.com/clap-rs/clap/commit/847001ff6d8f4d9518e810fefb8edf746dd0f31e))\n\n#### Documentation\n\n* **from_usage**  explains new usage strings with multiple values ([5a3a42df](https://github.com/clap-rs/clap/commit/5a3a42dfa3a783537f88dedc0fd5f0edcb8ea372))\n\n\n\n## v0.7.5 (2015-05-04)\n\n\n#### Bug Fixes\n\n* **Options**  fixes bug where options with no value don't error out ([a1fb94be](https://github.com/clap-rs/clap/commit/a1fb94be53141572ffd97aad037295d4ffec82d0))\n\n\n\n## v0.7.4 (2015-05-03)\n\n\n#### Bug Fixes\n\n* **Options**  fixes a bug where option arguments in succession get their values skipped ([f66334d0](https://github.com/clap-rs/clap/commit/f66334d0ce984e2b56e5c19abb1dd536fae9342a))\n\n\n\n## v0.7.3 (2015-05-03)\n\n\n#### Bug Fixes\n\n* **RequiredValues**  fixes a bug where missing values are parsed as missing arguments ([93c4a723](https://github.com/clap-rs/clap/commit/93c4a7231ba1a08152648598f7aa4503ea82e4de))\n\n#### Improvements\n\n* **ErrorMessages**  improves error messages and corrections ([a29c3983](https://github.com/clap-rs/clap/commit/a29c3983c4229906655a29146ec15a0e46dd942d))\n* **ArgGroups**  improves requirement and confliction support for groups ([c236dc5f](https://github.com/clap-rs/clap/commit/c236dc5ff475110d2a1b80e62903f80296163ad3))\n\n\n\n## v0.7.2 (2015-05-03)\n\n\n#### Bug Fixes\n\n* **RequiredArgs**  fixes bug where required-by-default arguments are not listed in usage ([12aea961](https://github.com/clap-rs/clap/commit/12aea9612d290845ba86515c240aeeb0a21198db), closes [#96](https://github.com/clap-rs/clap/issues/96))\n\n\n\n## v0.7.1 (2015-05-01)\n\n\n#### Bug Fixes\n\n* **MultipleValues**  stops evaluating values if the max or exact number of values was reached ([86d92c9f](https://github.com/clap-rs/clap/commit/86d92c9fdbf9f422442e9562977bbaf268dbbae1))\n\n\n\n## v0.7.0 (2015-04-30) - BREAKING CHANGE\n\n\n#### Bug Fixes\n\n* **from_usage**  removes bug where usage strings have no help text ([ad4e5451](https://github.com/clap-rs/clap/commit/ad4e54510739aeabf75f0da3278fb0952db531b3), closes [#83](https://github.com/clap-rs/clap/issues/83))\n\n#### Features\n\n* **MultipleValues**\n  *  add support for minimum and maximum number of values ([53f6b8c9](https://github.com/clap-rs/clap/commit/53f6b8c9d8dc408b4fa9f833fc3a63683873c42f))\n  *  adds support limited number and named values ([ae09f05e](https://github.com/clap-rs/clap/commit/ae09f05e92251c1b39a83d372736fcc7b504e432))\n  *  implement shorthand for options with multiple values ([6669f0a9](https://github.com/clap-rs/clap/commit/6669f0a9687d4f668523145d7bd5c007d1eb59a8))\n* **arg**  allow other types besides Vec for multiple value settings (**BREAKING CHANGE** [0cc2f698](https://github.com/clap-rs/clap/commit/0cc2f69839b9b1db5d06330771b494783049a88e), closes [#87](https://github.com/clap-rs/clap/issues/87))\n* **usage**  implement smart usage strings on errors ([d77048ef](https://github.com/clap-rs/clap/commit/d77048efb1e595ffe831f1a2bea2f2700db53b9f), closes [#88](https://github.com/clap-rs/clap/issues/88))\n\n\n\n## v0.6.9 (2015-04-29)\n\n\n#### Bug Fixes\n\n* **from_usage**  removes bug where usage strings have no help text ([ad4e5451](https://github.com/clap-rs/clap/commit/ad4e54510739aeabf75f0da3278fb0952db531b3), closes [#83](https://github.com/clap-rs/clap/issues/83))\n\n\n\n## 0.6.8 (2015-04-27)\n\n\n#### Bug Fixes\n\n* **help**  change long help --long=long -> --long <long> ([1e25abfc](https://github.com/clap-rs/clap/commit/1e25abfc36679ab89eae71bf98ced4de81992d00))\n* **RequiredArgs**  required by default args should no longer be required when their exclusions are present ([4bb4c3cc](https://github.com/clap-rs/clap/commit/4bb4c3cc076b49e86720e882bf8c489877199f2d))\n\n#### Features\n\n* **ArgGroups**  add ability to create arg groups ([09eb4d98](https://github.com/clap-rs/clap/commit/09eb4d9893af40c347e50e2b717e1adef552357d))\n\n\n\n## v0.6.7 (2015-04-22)\n\n\n#### Bug Fixes\n\n* **from_usage**  fix bug causing args to not be required ([b76129e9](https://github.com/clap-rs/clap/commit/b76129e9b71a63365d5c77a7f57b58dbd1e94d49))\n\n#### Features\n\n* **apps**  add ability to display additional help info after auto-gen'ed help msg ([65cc259e](https://github.com/clap-rs/clap/commit/65cc259e4559cbe3653c865ec0c4b1e42a389b07))\n\n\n\n## v0.6.6 (2015-04-19)\n\n\n#### Bug Fixes\n\n* **from_usage**  tabs and spaces should be treated equally ([4fd44181](https://github.com/clap-rs/clap/commit/4fd44181d55d8eb88caab1e625231cfa3129e347))\n\n#### Features\n\n* **macros.rs**  add macro to get version from Cargo.toml ([c630969a](https://github.com/clap-rs/clap/commit/c630969aa3bbd386379219cae27ba1305b117f3e))\n\n\n\n## v0.6.5 (2015-04-19)\n\n\n#### Bug Fixes\n\n* **macros.rs**  fix use statements for trait impls ([86e4075e](https://github.com/clap-rs/clap/commit/86e4075eb111937c8a7bdb344e866e350429f042))\n\n\n\n## v0.6.4 (2015-04-17)\n\n\n#### Features\n\n* **macros**  add ability to create enums pub or priv with derives ([2c499f80](https://github.com/clap-rs/clap/commit/2c499f8015a199827cdf1fa3ec4f6f171722f8c7))\n\n\n\n## v0.6.3 (2015-04-16)\n\n\n#### Features\n\n* **macros**  add macro to create custom enums to use as types ([fb672aff](https://github.com/clap-rs/clap/commit/fb672aff561c29db2e343d6c607138f141aca8b6))\n\n\n\n## v0.6.2 (2015-04-14)\n\n\n#### Features\n\n* **macros**\n  *  add ability to get multiple typed values or exit ([0b87251f](https://github.com/clap-rs/clap/commit/0b87251fc088234bee51c323c2b652d7254f7a59))\n  *  add ability to get a typed multiple values ([e243fe38](https://github.com/clap-rs/clap/commit/e243fe38ddbbf845a46c0b9baebaac3778c80927))\n  *  add convenience macro to get a typed value or exit ([4b7cd3ea](https://github.com/clap-rs/clap/commit/4b7cd3ea4947780d9daa39f3e1ddab53ad4c7fef))\n  *  add convenience macro to get a typed value ([8752700f](https://github.com/clap-rs/clap/commit/8752700fbb30e89ee68adbce24489ae9a24d33a9))\n\n\n\n## v0.6.1 (2015-04-13)\n\n\n#### Bug Fixes\n\n* **from_usage**  trim all whitespace before parsing ([91d29045](https://github.com/clap-rs/clap/commit/91d2904599bd602deef2e515dfc65dc2863bdea0))\n\n\n\n## v0.6.0 (2015-04-13)\n\n\n#### Bug Fixes\n\n* **tests**  fix failing doc tests ([3710cd69](https://github.com/clap-rs/clap/commit/3710cd69162f87221a62464f63437c1ce843ad3c))\n\n#### Features\n\n* **app**  add support for building args from usage strings ([d5d48bcf](https://github.com/clap-rs/clap/commit/d5d48bcf463a4e494ef758836bd69a4c220bbbb5))\n* **args**  add ability to create basic arguments from a usage string ([ab409a8f](https://github.com/clap-rs/clap/commit/ab409a8f1db9e37cc70200f6f4a84a162692e618))\n\n\n\n## v0.5.14 (2015-04-10)\n\n\n#### Bug Fixes\n\n* **usage**\n  *  remove unneeded space ([51372789](https://github.com/clap-rs/clap/commit/5137278942121bc2593ce6e5dc224ec2682549e6))\n  *  remove warning about unused variables ([ba817b9d](https://github.com/clap-rs/clap/commit/ba817b9d815e37320650973f1bea0e7af3030fd7))\n\n#### Features\n\n* **usage**  add ability to get usage string for subcommands too ([3636afc4](https://github.com/clap-rs/clap/commit/3636afc401c2caa966efb5b1869ef4f1ed3384aa))\n\n\n\n## v0.5.13 (2015-04-09)\n\n\n#### Features\n\n* **SubCommands**  add method to get name and subcommand matches together ([64e53928](https://github.com/clap-rs/clap/commit/64e539280e23e567cf5de393b346eb0ca20e7eb5))\n* **ArgMatches**  add method to get default usage string ([02462150](https://github.com/clap-rs/clap/commit/02462150ca750bdc7012627d7e8d96379d494d7f))\n\n\n\n## v0.5.12 (2015-04-08)\n\n\n#### Features\n\n* **help**  sort arguments by name so as to not display a random order ([f4b2bf57](https://github.com/clap-rs/clap/commit/f4b2bf5767386013069fb74862e6e938dacf44d2))\n\n\n\n## v0.5.11 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **flags**  fix bug not allowing users to specify -v or -h ([90e72cff](https://github.com/clap-rs/clap/commit/90e72cffdee321b79eea7a2207119533540062b4))\n\n\n\n## v0.5.10 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **help**  fix spacing when option argument has not long version ([ca17fa49](https://github.com/clap-rs/clap/commit/ca17fa494b68e92da83ee364bf64b0687006824b))\n\n\n\n## v0.5.9 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **positional args**  all previous positional args become required when a latter one is required ([c14c3f31](https://github.com/clap-rs/clap/commit/c14c3f31fd557c165570b60911d8ee483d89d6eb), closes [#50](https://github.com/clap-rs/clap/issues/50))\n* **clap**  remove unstable features for Rust 1.0 ([9abdb438](https://github.com/clap-rs/clap/commit/9abdb438e36e364d41550e7f5d44ebcaa8ee6b10))\n* **args**  improve error messages for arguments with mutual exclusions ([18dbcf37](https://github.com/clap-rs/clap/commit/18dbcf37024daf2b76ca099a6f118b53827aa339), closes [#51](https://github.com/clap-rs/clap/issues/51))\n\n\n\n## v0.5.8 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **option args**  fix bug in getting the wrong number of occurrences for options ([82ad6ad7](https://github.com/clap-rs/clap/commit/82ad6ad77539cf9f9a03b78db466f575ebd972cc))\n* **help**  fix formatting for option arguments with no long ([e8691004](https://github.com/clap-rs/clap/commit/e869100423d93fa3acff03c4620cbcc0d0e790a1))\n* **flags**  add assertion to catch flags with specific value sets ([a0a2a40f](https://github.com/clap-rs/clap/commit/a0a2a40fed57f7c5ad9d68970d090e9856306c7d), closes [#52](https://github.com/clap-rs/clap/issues/52))\n* **args**  improve error messages for arguments with mutual exclusions ([bff945fc](https://github.com/clap-rs/clap/commit/bff945fc5d03bba4266533340adcffb002508d1b), closes [#51](https://github.com/clap-rs/clap/issues/51))\n* **tests**  add missing .takes_value(true) to option2 ([bdb0e88f](https://github.com/clap-rs/clap/commit/bdb0e88f696c8595c3def3bfb0e52d538c7be085))\n* **positional args**  all previous positional args become required when a latter one is required ([343d47dc](https://github.com/clap-rs/clap/commit/343d47dcbf83786a45c0d0f01b27fd9dd76725de), closes [#50](https://github.com/clap-rs/clap/issues/50))\n\n\n\n## v0.5.7 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **args**  fix bug in arguments who are required and mutually exclusive ([6ceb88a5](https://github.com/clap-rs/clap/commit/6ceb88a594caae825605abc1cdad95204996bf29))\n\n\n\n## v0.5.6 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **help**  fix formatting of help and usage ([28691b52](https://github.com/clap-rs/clap/commit/28691b52f67e65c599e10e4ea2a0f6f9765a06b8))\n\n\n\n## v0.5.5 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **help**  fix formatting of help for flags and options ([6ec10115](https://github.com/clap-rs/clap/commit/6ec1011563a746f0578a93b76d45e63878e0f9a8))\n\n\n\n## v0.5.4 (2015-04-08)\n\n\n#### Features\n\n* **help**  add '...' to indicate multiple values supported ([297ddba7](https://github.com/clap-rs/clap/commit/297ddba77000e2228762ab0eca50b480f7467386))\n\n\n\n## v0.5.3 (2015-04-08)\n\n\n#### Features\n\n* **positionals**\n  *  add assertions for positional args with multiple vals ([b7fa72d4](https://github.com/clap-rs/clap/commit/b7fa72d40f18806ec2042dd67a518401c2cf5681))\n  *  add support for multiple values ([80784009](https://github.com/clap-rs/clap/commit/807840094109fbf90b348039ae22669ef27889ba))\n\n\n\n## v0.5.2 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **apps**  allow use of hyphens in application and subcommand names ([da549dcb](https://github.com/clap-rs/clap/commit/da549dcb6c7e0d773044ab17829744483a8b0f7f))\n\n\n\n## v0.5.1 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **args**  determine if the only arguments allowed are also required ([0a09eb36](https://github.com/clap-rs/clap/commit/0a09eb365ced9a03faf8ed24f083ef730acc90e8))\n\n\n\n## v0.5.0 (2015-04-08)\n\n\n#### Features\n\n* **args**  add support for a specific set of allowed values on options or positional arguments ([270eb889](https://github.com/clap-rs/clap/commit/270eb88925b6dc2881bff1f31ee344f085d31809))\n\n\n\n## v0.4.18 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **usage**  display required args in usage, even if only required by others ([1b7316d4](https://github.com/clap-rs/clap/commit/1b7316d4a8df70b0aa584ccbfd33f68966ad2a54))\n\n#### Features\n\n* **subcommands**  properly list subcommands in help and usage ([4ee02344](https://github.com/clap-rs/clap/commit/4ee023442abc3dba54b68138006a52b714adf331))\n\n\n\n## v0.4.17 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **tests**  remove cargo test from claptests makefile ([1cf73817](https://github.com/clap-rs/clap/commit/1cf73817d6fb1dccb5b6a23b46c2efa8b567ad62))\n\n\n\n## v0.4.16 (2015-04-08)\n\n\n#### Bug Fixes\n\n* **option**  fix bug with option occurrence values ([9af52e93](https://github.com/clap-rs/clap/commit/9af52e93cef9e17ac9974963f132013d0b97b946))\n* **tests**  fix testing script bug and formatting ([d8f03a55](https://github.com/clap-rs/clap/commit/d8f03a55c4f74d126710ee06aad5a667246a8001))\n\n#### Features\n\n* **arg**  allow lifetimes other than 'static in arguments ([9e8c1fb9](https://github.com/clap-rs/clap/commit/9e8c1fb9406f8448873ca58bab07fe905f1551e5))\n\n<!-- next-url -->\n[Unreleased]: https://github.com/clap-rs/clap/compare/v4.6.0...HEAD\n[4.6.0]: https://github.com/clap-rs/clap/compare/v4.5.61...v4.6.0\n[4.5.61]: https://github.com/clap-rs/clap/compare/v4.5.60...v4.5.61\n[4.5.60]: https://github.com/clap-rs/clap/compare/v4.5.59...v4.5.60\n[4.5.59]: https://github.com/clap-rs/clap/compare/v4.5.58...v4.5.59\n[4.5.58]: https://github.com/clap-rs/clap/compare/v4.5.57...v4.5.58\n[4.5.57]: https://github.com/clap-rs/clap/compare/v4.5.56...v4.5.57\n[4.5.56]: https://github.com/clap-rs/clap/compare/v4.5.55...v4.5.56\n[4.5.55]: https://github.com/clap-rs/clap/compare/v4.5.54...v4.5.55\n[4.5.54]: https://github.com/clap-rs/clap/compare/v4.5.53...v4.5.54\n[4.5.53]: https://github.com/clap-rs/clap/compare/v4.5.52...v4.5.53\n[4.5.52]: https://github.com/clap-rs/clap/compare/v4.5.51...v4.5.52\n[4.5.51]: https://github.com/clap-rs/clap/compare/v4.5.50...v4.5.51\n[4.5.50]: https://github.com/clap-rs/clap/compare/v4.5.49...v4.5.50\n[4.5.49]: https://github.com/clap-rs/clap/compare/v4.5.48...v4.5.49\n[4.5.48]: https://github.com/clap-rs/clap/compare/v4.5.47...v4.5.48\n[4.5.47]: https://github.com/clap-rs/clap/compare/v4.5.46...v4.5.47\n[4.5.46]: https://github.com/clap-rs/clap/compare/v4.5.45...v4.5.46\n[4.5.45]: https://github.com/clap-rs/clap/compare/v4.5.44...v4.5.45\n[4.5.44]: https://github.com/clap-rs/clap/compare/v4.5.43...v4.5.44\n[4.5.43]: https://github.com/clap-rs/clap/compare/v4.5.42...v4.5.43\n[4.5.42]: https://github.com/clap-rs/clap/compare/v4.5.41...v4.5.42\n[4.5.41]: https://github.com/clap-rs/clap/compare/v4.5.40...v4.5.41\n[4.5.40]: https://github.com/clap-rs/clap/compare/v4.5.39...v4.5.40\n[4.5.39]: https://github.com/clap-rs/clap/compare/v4.5.38...v4.5.39\n[4.5.38]: https://github.com/clap-rs/clap/compare/v4.5.37...v4.5.38\n[4.5.37]: https://github.com/clap-rs/clap/compare/v4.5.36...v4.5.37\n[4.5.36]: https://github.com/clap-rs/clap/compare/v4.5.35...v4.5.36\n[4.5.35]: https://github.com/clap-rs/clap/compare/v4.5.34...v4.5.35\n[4.5.34]: https://github.com/clap-rs/clap/compare/v4.5.33...v4.5.34\n[4.5.33]: https://github.com/clap-rs/clap/compare/v4.5.32...v4.5.33\n[4.5.32]: https://github.com/clap-rs/clap/compare/v4.5.31...v4.5.32\n[4.5.31]: https://github.com/clap-rs/clap/compare/v4.5.30...v4.5.31\n[4.5.30]: https://github.com/clap-rs/clap/compare/v4.5.29...v4.5.30\n[4.5.29]: https://github.com/clap-rs/clap/compare/v4.5.28...v4.5.29\n[4.5.28]: https://github.com/clap-rs/clap/compare/v4.5.27...v4.5.28\n[4.5.27]: https://github.com/clap-rs/clap/compare/v4.5.26...v4.5.27\n[4.5.26]: https://github.com/clap-rs/clap/compare/v4.5.25...v4.5.26\n[4.5.25]: https://github.com/clap-rs/clap/compare/v4.5.24...v4.5.25\n[4.5.24]: https://github.com/clap-rs/clap/compare/v4.5.23...v4.5.24\n[4.5.23]: https://github.com/clap-rs/clap/compare/v4.5.22...v4.5.23\n[4.5.22]: https://github.com/clap-rs/clap/compare/v4.5.21...v4.5.22\n[4.5.21]: https://github.com/clap-rs/clap/compare/v4.5.20...v4.5.21\n[4.5.20]: https://github.com/clap-rs/clap/compare/v4.5.19...v4.5.20\n[4.5.19]: https://github.com/clap-rs/clap/compare/v4.5.18...v4.5.19\n[4.5.18]: https://github.com/clap-rs/clap/compare/v4.5.17...v4.5.18\n[4.5.17]: https://github.com/clap-rs/clap/compare/v4.5.16...v4.5.17\n[4.5.16]: https://github.com/clap-rs/clap/compare/v4.5.15...v4.5.16\n[4.5.15]: https://github.com/clap-rs/clap/compare/v4.5.14...v4.5.15\n[4.5.14]: https://github.com/clap-rs/clap/compare/v4.5.13...v4.5.14\n[4.5.13]: https://github.com/clap-rs/clap/compare/v4.5.12...v4.5.13\n[4.5.12]: https://github.com/clap-rs/clap/compare/v4.5.11...v4.5.12\n[4.5.11]: https://github.com/clap-rs/clap/compare/v4.5.10...v4.5.11\n[4.5.10]: https://github.com/clap-rs/clap/compare/v4.5.9...v4.5.10\n[4.5.9]: https://github.com/clap-rs/clap/compare/v4.5.8...v4.5.9\n[4.5.8]: https://github.com/clap-rs/clap/compare/v4.5.7...v4.5.8\n[4.5.7]: https://github.com/clap-rs/clap/compare/v4.5.6...v4.5.7\n[4.5.6]: https://github.com/clap-rs/clap/compare/v4.5.5...v4.5.6\n[4.5.5]: https://github.com/clap-rs/clap/compare/v4.5.4...v4.5.5\n[4.5.4]: https://github.com/clap-rs/clap/compare/v4.5.3...v4.5.4\n[4.5.3]: https://github.com/clap-rs/clap/compare/v4.5.2...v4.5.3\n[4.5.2]: https://github.com/clap-rs/clap/compare/v4.5.1...v4.5.2\n[4.5.1]: https://github.com/clap-rs/clap/compare/v4.5.0...v4.5.1\n[4.5.0]: https://github.com/clap-rs/clap/compare/v4.4.18...v4.5.0\n[4.4.18]: https://github.com/clap-rs/clap/compare/v4.4.17...v4.4.18\n[4.4.17]: https://github.com/clap-rs/clap/compare/v4.4.16...v4.4.17\n[4.4.16]: https://github.com/clap-rs/clap/compare/v4.4.15...v4.4.16\n[4.4.15]: https://github.com/clap-rs/clap/compare/v4.4.14...v4.4.15\n[4.4.14]: https://github.com/clap-rs/clap/compare/v4.4.13...v4.4.14\n[4.4.13]: https://github.com/clap-rs/clap/compare/v4.4.12...v4.4.13\n[4.4.12]: https://github.com/clap-rs/clap/compare/v4.4.11...v4.4.12\n[4.4.11]: https://github.com/clap-rs/clap/compare/v4.4.10...v4.4.11\n[4.4.10]: https://github.com/clap-rs/clap/compare/v4.4.9...v4.4.10\n[4.4.9]: https://github.com/clap-rs/clap/compare/v4.4.8...v4.4.9\n[4.4.8]: https://github.com/clap-rs/clap/compare/v4.4.7...v4.4.8\n[4.4.7]: https://github.com/clap-rs/clap/compare/v4.4.6...v4.4.7\n[4.4.6]: https://github.com/clap-rs/clap/compare/v4.4.5...v4.4.6\n[4.4.5]: https://github.com/clap-rs/clap/compare/v4.4.4...v4.4.5\n[4.4.4]: https://github.com/clap-rs/clap/compare/v4.4.3...v4.4.4\n[4.4.3]: https://github.com/clap-rs/clap/compare/v4.4.2...v4.4.3\n[4.4.2]: https://github.com/clap-rs/clap/compare/v4.4.1...v4.4.2\n[4.4.1]: https://github.com/clap-rs/clap/compare/v4.4.0...v4.4.1\n[4.4.0]: https://github.com/clap-rs/clap/compare/v4.3.24...v4.4.0\n[4.3.24]: https://github.com/clap-rs/clap/compare/v4.3.23...v4.3.24\n[4.3.23]: https://github.com/clap-rs/clap/compare/v4.3.22...v4.3.23\n[4.3.22]: https://github.com/clap-rs/clap/compare/v4.3.21...v4.3.22\n[4.3.21]: https://github.com/clap-rs/clap/compare/v4.3.20...v4.3.21\n[4.3.20]: https://github.com/clap-rs/clap/compare/v4.3.19...v4.3.20\n[4.3.19]: https://github.com/clap-rs/clap/compare/v4.3.18...v4.3.19\n[4.3.18]: https://github.com/clap-rs/clap/compare/v4.3.17...v4.3.18\n[4.3.17]: https://github.com/clap-rs/clap/compare/v4.3.16...v4.3.17\n[4.3.16]: https://github.com/clap-rs/clap/compare/v4.3.15...v4.3.16\n[4.3.15]: https://github.com/clap-rs/clap/compare/v4.3.14...v4.3.15\n[4.3.14]: https://github.com/clap-rs/clap/compare/v4.3.13...v4.3.14\n[4.3.13]: https://github.com/clap-rs/clap/compare/v4.3.12...v4.3.13\n[4.3.12]: https://github.com/clap-rs/clap/compare/v4.3.11...v4.3.12\n[4.3.11]: https://github.com/clap-rs/clap/compare/v4.3.10...v4.3.11\n[4.3.10]: https://github.com/clap-rs/clap/compare/v4.3.9...v4.3.10\n[4.3.9]: https://github.com/clap-rs/clap/compare/v4.3.8...v4.3.9\n[4.3.8]: https://github.com/clap-rs/clap/compare/v4.3.7...v4.3.8\n[4.3.7]: https://github.com/clap-rs/clap/compare/v4.3.6...v4.3.7\n[4.3.6]: https://github.com/clap-rs/clap/compare/v4.3.5...v4.3.6\n[4.3.5]: https://github.com/clap-rs/clap/compare/v4.3.4...v4.3.5\n[4.3.4]: https://github.com/clap-rs/clap/compare/v4.3.3...v4.3.4\n[4.3.3]: https://github.com/clap-rs/clap/compare/v4.3.2...v4.3.3\n[4.3.2]: https://github.com/clap-rs/clap/compare/v4.3.1...v4.3.2\n[4.3.1]: https://github.com/clap-rs/clap/compare/v4.3.0...v4.3.1\n[4.3.0]: https://github.com/clap-rs/clap/compare/v4.2.7...v4.3.0\n[4.2.7]: https://github.com/clap-rs/clap/compare/v4.2.6...v4.2.7\n[4.2.6]: https://github.com/clap-rs/clap/compare/v4.2.5...v4.2.6\n[4.2.5]: https://github.com/clap-rs/clap/compare/v4.2.4...v4.2.5\n[4.2.4]: https://github.com/clap-rs/clap/compare/v4.2.3...v4.2.4\n[4.2.3]: https://github.com/clap-rs/clap/compare/v4.2.2...v4.2.3\n[4.2.2]: https://github.com/clap-rs/clap/compare/v4.2.1...v4.2.2\n[4.2.1]: https://github.com/clap-rs/clap/compare/v4.2.0...v4.2.1\n[4.2.0]: https://github.com/clap-rs/clap/compare/v4.1.14...v4.2.0\n[4.1.14]: https://github.com/clap-rs/clap/compare/v4.1.13...v4.1.14\n[4.1.13]: https://github.com/clap-rs/clap/compare/v4.1.12...v4.1.13\n[4.1.12]: https://github.com/clap-rs/clap/compare/v4.1.11...v4.1.12\n[4.1.11]: https://github.com/clap-rs/clap/compare/v4.1.10...v4.1.11\n[4.1.10]: https://github.com/clap-rs/clap/compare/v4.1.9...v4.1.10\n[4.1.9]: https://github.com/clap-rs/clap/compare/v4.1.8...v4.1.9\n[4.1.8]: https://github.com/clap-rs/clap/compare/v4.1.7...v4.1.8\n[4.1.7]: https://github.com/clap-rs/clap/compare/v4.1.6...v4.1.7\n[4.1.6]: https://github.com/clap-rs/clap/compare/v4.1.5...v4.1.6\n[4.1.5]: https://github.com/clap-rs/clap/compare/v4.1.4...v4.1.5\n[4.1.4]: https://github.com/clap-rs/clap/compare/v4.1.3...v4.1.4\n[4.1.3]: https://github.com/clap-rs/clap/compare/v4.1.2...v4.1.3\n[4.1.2]: https://github.com/clap-rs/clap/compare/v4.1.1...v4.1.2\n[4.1.1]: https://github.com/clap-rs/clap/compare/v4.1.0...v4.1.1\n[4.1.0]: https://github.com/clap-rs/clap/compare/v4.0.32...v4.1.0\n[4.0.32]: https://github.com/clap-rs/clap/compare/v4.0.31...v4.0.32\n[4.0.31]: https://github.com/clap-rs/clap/compare/v4.0.30...v4.0.31\n[4.0.30]: https://github.com/clap-rs/clap/compare/v4.0.29...v4.0.30\n[4.0.29]: https://github.com/clap-rs/clap/compare/v4.0.28...v4.0.29\n[4.0.28]: https://github.com/clap-rs/clap/compare/v4.0.27...v4.0.28\n[4.0.27]: https://github.com/clap-rs/clap/compare/v4.0.26...v4.0.27\n[4.0.26]: https://github.com/clap-rs/clap/compare/v4.0.25...v4.0.26\n[4.0.25]: https://github.com/clap-rs/clap/compare/v4.0.24...v4.0.25\n[4.0.24]: https://github.com/clap-rs/clap/compare/v4.0.23...v4.0.24\n[4.0.23]: https://github.com/clap-rs/clap/compare/v4.0.22...v4.0.23\n[4.0.22]: https://github.com/clap-rs/clap/compare/v4.0.21...v4.0.22\n[4.0.21]: https://github.com/clap-rs/clap/compare/v4.0.20...v4.0.21\n[4.0.20]: https://github.com/clap-rs/clap/compare/v4.0.19...v4.0.20\n[4.0.19]: https://github.com/clap-rs/clap/compare/v4.0.18...v4.0.19\n[4.0.18]: https://github.com/clap-rs/clap/compare/v4.0.17...v4.0.18\n[4.0.17]: https://github.com/clap-rs/clap/compare/v4.0.16...v4.0.17\n[4.0.16]: https://github.com/clap-rs/clap/compare/v4.0.15...v4.0.16\n[4.0.15]: https://github.com/clap-rs/clap/compare/v4.0.14...v4.0.15\n[4.0.14]: https://github.com/clap-rs/clap/compare/v4.0.13...v4.0.14\n[4.0.13]: https://github.com/clap-rs/clap/compare/v4.0.12...v4.0.13\n[4.0.12]: https://github.com/clap-rs/clap/compare/v4.0.11...v4.0.12\n[4.0.11]: https://github.com/clap-rs/clap/compare/v4.0.10...v4.0.11\n[4.0.10]: https://github.com/clap-rs/clap/compare/v4.0.9...v4.0.10\n[4.0.9]: https://github.com/clap-rs/clap/compare/v4.0.8...v4.0.9\n[4.0.8]: https://github.com/clap-rs/clap/compare/v4.0.7...v4.0.8\n[4.0.7]: https://github.com/clap-rs/clap/compare/v4.0.6...v4.0.7\n[4.0.6]: https://github.com/clap-rs/clap/compare/v4.0.5...v4.0.6\n[4.0.5]: https://github.com/clap-rs/clap/compare/v4.0.4...v4.0.5\n[4.0.4]: https://github.com/clap-rs/clap/compare/v4.0.3...v4.0.4\n[4.0.3]: https://github.com/clap-rs/clap/compare/v4.0.2...v4.0.3\n[4.0.2]: https://github.com/clap-rs/clap/compare/v4.0.1...v4.0.2\n[4.0.1]: https://github.com/clap-rs/clap/compare/v4.0.0...v4.0.1\n[4.0.0]: https://github.com/clap-rs/clap/compare/v3.2.18...v4.0.0\n[3.2.18]: https://github.com/clap-rs/clap/compare/v3.2.17...v3.2.18\n[3.2.17]: https://github.com/clap-rs/clap/compare/v3.2.16...v3.2.17\n[3.2.16]: https://github.com/clap-rs/clap/compare/v3.2.15...v3.2.16\n[3.2.15]: https://github.com/clap-rs/clap/compare/v3.2.14...v3.2.15\n[3.2.14]: https://github.com/clap-rs/clap/compare/v3.2.13...v3.2.14\n[3.2.13]: https://github.com/clap-rs/clap/compare/v3.2.12...v3.2.13\n[3.2.12]: https://github.com/clap-rs/clap/compare/v3.2.11...v3.2.12\n[3.2.11]: https://github.com/clap-rs/clap/compare/v3.2.10...v3.2.11\n[3.2.10]: https://github.com/clap-rs/clap/compare/v3.2.8...v3.2.10\n[3.2.8]: https://github.com/clap-rs/clap/compare/v3.2.7...v3.2.8\n[3.2.7]: https://github.com/clap-rs/clap/compare/v3.2.6...v3.2.7\n[3.2.6]: https://github.com/clap-rs/clap/compare/v3.2.5...v3.2.6\n[3.2.5]: https://github.com/clap-rs/clap/compare/v3.2.4...v3.2.5\n[3.2.4]: https://github.com/clap-rs/clap/compare/v3.2.3...v3.2.4\n[3.2.3]: https://github.com/clap-rs/clap/compare/v3.2.2...v3.2.3\n[3.2.2]: https://github.com/clap-rs/clap/compare/v3.2.1...v3.2.2\n[3.2.1]: https://github.com/clap-rs/clap/compare/v3.2.0...v3.2.1\n[3.2.0]: https://github.com/clap-rs/clap/compare/v3.1.18...v3.2.0\n[3.1.18]: https://github.com/clap-rs/clap/compare/v3.1.17...v3.1.18\n[3.1.17]: https://github.com/clap-rs/clap/compare/v3.1.16...v3.1.17\n[3.1.16]: https://github.com/clap-rs/clap/compare/v3.1.15...v3.1.16\n[3.1.15]: https://github.com/clap-rs/clap/compare/v3.1.14...v3.1.15\n[3.1.14]: https://github.com/clap-rs/clap/compare/v3.1.13...v3.1.14\n[3.1.13]: https://github.com/clap-rs/clap/compare/v3.1.12...v3.1.13\n[3.1.12]: https://github.com/clap-rs/clap/compare/v3.1.11...v3.1.12\n[3.1.11]: https://github.com/clap-rs/clap/compare/v3.1.10...v3.1.11\n[3.1.10]: https://github.com/clap-rs/clap/compare/v3.1.9...v3.1.10\n[3.1.9]: https://github.com/clap-rs/clap/compare/v3.1.8...v3.1.9\n[3.1.8]: https://github.com/clap-rs/clap/compare/v3.1.7...v3.1.8\n[3.1.7]: https://github.com/clap-rs/clap/compare/v3.1.6...v3.1.7\n[3.1.6]: https://github.com/clap-rs/clap/compare/v3.1.5...v3.1.6\n[3.1.5]: https://github.com/clap-rs/clap/compare/v3.1.4...v3.1.5\n[3.1.4]: https://github.com/clap-rs/clap/compare/v3.1.3...v3.1.4\n[3.1.3]: https://github.com/clap-rs/clap/compare/v3.1.2...v3.1.3\n[3.1.2]: https://github.com/clap-rs/clap/compare/v3.1.1...v3.1.2\n[3.1.1]: https://github.com/clap-rs/clap/compare/v3.1.0...v3.1.1\n[3.1.0]: https://github.com/clap-rs/clap/compare/v3.0.14...v3.1.0\n[3.0.14]: https://github.com/clap-rs/clap/compare/v3.0.13...v3.0.14\n[3.0.13]: https://github.com/clap-rs/clap/compare/v3.0.12...v3.0.13\n[3.0.12]: https://github.com/clap-rs/clap/compare/v3.0.11...v3.0.12\n[3.0.11]: https://github.com/clap-rs/clap/compare/v3.0.10...v3.0.11\n[3.0.10]: https://github.com/clap-rs/clap/compare/v3.0.9...v3.0.10\n[3.0.9]: https://github.com/clap-rs/clap/compare/v3.0.8...v3.0.9\n[3.0.8]: https://github.com/clap-rs/clap/compare/v3.0.7...v3.0.8\n[3.0.7]: https://github.com/clap-rs/clap/compare/v3.0.6...v3.0.7\n[3.0.6]: https://github.com/clap-rs/clap/compare/v3.0.5...v3.0.6\n[3.0.5]: https://github.com/clap-rs/clap/compare/v3.0.4...v3.0.5\n[3.0.4]: https://github.com/clap-rs/clap/compare/v3.0.3...v3.0.4\n[3.0.3]: https://github.com/clap-rs/clap/compare/v3.0.2...v3.0.3\n[3.0.2]: https://github.com/clap-rs/clap/compare/v3.0.1...v3.0.2\n[3.0.1]: https://github.com/clap-rs/clap/compare/v3.0.0...v3.0.1\n[3.0.0]: https://github.com/clap-rs/clap/compare/v2.34.0...v3.0.0\n[2.34.0]: https://github.com/clap-rs/clap/compare/v2.33.4...v2.34.0\n[2.33.4]: https://github.com/clap-rs/clap/compare/v2.33.3...v2.33.4\n[2.33.3]: https://github.com/clap-rs/clap/compare/v2.33.2...v2.33.3\n[2.33.2]: https://github.com/clap-rs/clap/compare/v2.33.1...v2.33.2\n[2.33.1]: https://github.com/clap-rs/clap/compare/v2.33.0...v2.33.1\n[2.33.0]: https://github.com/clap-rs/clap/compare/v2.32.0...v2.33.0\n"
  },
  {
    "path": "CITATION.cff",
    "content": "# Parser settings.\ncff-version: 1.2.0\nmessage: Please cite this crate using these information.\n\n# Version information.\ndate-released: 2026-03-12\nversion: 4.6.0\n\n# Project information.\nabstract: A full featured, fast Command Line Argument Parser for Rust\nauthors:\n  - alias: kbknapp\n    family-names: Knapp\n    given-names: Kevin B.\n  - name: The Clap Community\nlicense:\n  - Apache-2.0\n  - MIT\nrepository-artifact: https://crates.io/crates/clap\nrepository-code: https://github.com/clap-rs/clap\ntitle: clap\nurl: https://docs.rs/clap\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to Contribute\n\nContributions are always welcome! And there is a multitude of ways in which you can help depending on what you like to do, or are good at. Anything from documentation, code cleanup, issue completion, new features, you name it, even filing issues is contributing and greatly appreciated!\n\n## Goals\n\nThere are a few goals of `clap` that I'd like to maintain throughout contributions. If your proposed changes break, or go against any of these goals we'll discuss the changes further before merging (but will *not* be ignored, all contributes are welcome!). These are by no means hard-and-fast rules, as I'm no expert and break them myself from time to time (even if by mistake or ignorance :P).\n\n* Remain backwards compatible when possible\n  - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before removing legacy code\n  - This does not apply for security concerns\n* Parse arguments quickly\n  - Parsing of arguments shouldn't slow down usage of the main program\n  - This is also true of generating help and usage information (although *slightly* less stringent, as the program is about to exit)\n* Try to be cognizant of memory usage\n  - Once parsing is complete, the memory footprint of `clap` should be low since the main program is the star of the show\n* `panic!` on *developer* error\n  (e.g. [apps](https://github.com/clap-rs/clap/blob/62eff1f8d3394cef819b4aa7b23a1032fc584f03/src/build/app/debug_asserts.rs) and [args](https://github.com/clap-rs/clap/blob/62eff1f8d3394cef819b4aa7b23a1032fc584f03/src/build/arg/debug_asserts.rs)),\n  exit gracefully on *end-user* error\n\n## General Overview\n\n### Where to Start\n\n- [Discussions](https://github.com/clap-rs/clap/discussions) can be useful for getting help and brainstorming\n- [Issues](https://github.com/clap-rs/clap/issues) work well discussing a need and how to solve it\n  - Focus: requirements gathering and design discussions\n  - Sometimes a branch or Draft PR might be used to demonstrate an idea\n- [PRs](https://github.com/clap-rs/clap/pulls) work well for when the solution has already been discussed as an Issue or there is little to no discussion (obvious bug or documentation fixes)\n  - Focus: implementation discussions\n\n### Compatibility Expectations\n\nOur releases fall into one of:\n- Major releases which are reserved for breaking changes\n  - Aspire to at least 6-9 months between releases\n  - Remove all deprecated functionality\n  - Changes in help/error output that could cause glaring inconsistencies in end-user applications\n  - Try to minimize new breaking changes to ease user transition and reduce time \"we go dark\" (unreleased feature-branch)\n  - Upon release, a minor release will be made for the previous major that enables `deprecated` feature by default\n- Minor releases which are for minor compatibility changes\n  - Aspire to at least 2 months between releases\n  - Changes to MSRV\n  - Wide-spread help/error output changes that would cause minor inconsistencies in end-user applications\n  - Deprecating existing functionality (behind the `deprecated` feature flag)\n  - Making the `deprecated` feature flag enabled-by-default (only on last planned minor release)\n  - `#[doc(hidden)]` all deprecated items in the prior minor release\n- Patch releases\n  - One for every user-facing, user-contributed PR (i.e. release early, release often)\n  - Changes in help/error output that are one-off or improving consistency so as to not increase inconsistency with end-user applications\n\nIf your change does not fit within a \"patch\" release, please coordinate with the clap maintainers for how to handle the situation.\n\nSome practices to avoid breaking changes\n- Duplicate functionality, with old functionality marked as \"deprecated\"\n  - Common documentation pattern: `/// Deprecated in [Issue #XXX](https://github.com/clap-rs/clap/issues/XXX), replaced with [intra-doc-link]`\n  - Common deprecation pattern: `#[cfg_attr(feature = \"deprecated\", deprecated(since = \"X.Y.Z\", note = \"Replaced with `ITEM` in Issue #XXX\"))]`\n    - `deprecated` feature flag is to allow people to process them on their\n      time table and allow us to process feedback from early adopters before\n      requiring everyone to process them on the next major version.\n  - Please keep API addition and deprecation in separate commits in a PR to make it easier to review\n- Develop the feature behind an `unstable-<name>` feature flag with a stabilization tracking issue (e.g. [Multicall Tracking issue](https://github.com/clap-rs/clap/issues/2861))\n\n### Version Support Policy\n\nAs we work towards [a more flexible architecture](https://github.com/clap-rs/clap/discussions/3476), we hope to support multiple major versions to help ease users through the upgrade churn.\n\n| Version                                              | Status        | Support | End-of-Life |\n|------------------------------------------------------|---------------|---------|-------------|\n| [v4](https://github.com/clap-rs/clap/tree/master)    | active        | Features and bug fixes target `master` by default | TBD |\n| [v3](https://github.com/clap-rs/clap/tree/v3-master) | maintenance   | Accepting trivial cherry-picks from `master` (i.e. minimal conflict resolution) by contributors and fixes for ecosystem-wide showstoppers | TBD |\n| [v2](https://github.com/clap-rs/clap/tree/v2-master) | deprecated    | Only accepting fixes for ecosystem-wide showstoppers | TBD |\n| v1                                                   | unsupported   | \\- | \\- |\n\nNote: We have not yet determined the End-of-Life schedule for previous major versions.  We will give at least a 2 month warning before changing the support status.\n\n### Verifying Changes\n\nA common (sub)set of commands for verifying your change:\n```console\n$ make test-full\n$ make clippy-full\n$ make doc\n```\n*(If `make` is not available on your system, you can look up what these expand to in the [Makefile](./Makefile))*\n\nCheck out the [Makefile](./Makefile) for more commands run by CI.\n\n### Debugging Clap\n\nA helpful technique is to see the `clap` debug output while developing features. In order to see the debug output while running the full test suite or individual tests, run:\n\n```console\n$ cargo test --features debug\n\n# Or for individual tests\n$ cargo test --test <test_name> --features debug\n```\n\n### Preparing the PR\n\nAs a heads up, we'll be running your PR through the following gauntlet:\n- warnings turned to compile errors\n- `cargo test`\n- `rustfmt`\n- `clippy`\n- `rustdoc`\n- [`committed`](https://github.com/crate-ci/committed) as we use [Conventional](https://www.conventionalcommits.org) commit style\n- [`typos`](https://github.com/crate-ci/typos) to check spelling\n\nNot everything can be checked automatically though.\n\nWe request that the commit history gets cleaned up.\n\nWe ask that commits are atomic, meaning they are complete and have a single responsibility.\nA complete commit should build, pass tests, update documentation and tests, and not have dead code.\n\nPRs should tell a cohesive story, with refactor and test commits that keep the\nfix or feature commits simple and clear.\n\nSpecifically, we would encourage\n- File renames be isolated into their own commit\n- Add tests in a commit before their feature or fix, showing the current behavior (i.e. they should pass).\n  The diff for the feature/fix commit will then show how the behavior changed,\n  making the commit's intent clearer to reviewers and the community, and showing people that the\n  test is verifying the expected state.\n  - e.g. [clap#5520](https://github.com/clap-rs/clap/pull/5520)\n\nNote that we are talking about ideals.\nWe understand having a clean history requires more advanced git skills;\nfeel free to ask us for help!\nWe might even suggest where it would work to be lax.\nWe also understand that editing some early commits may cause a lot of churn\nwith merge conflicts which can make it not worth editing all of the history.\n\nFor code organization, we recommend\n- Grouping `impl` blocks next to their type (or trait)\n- Grouping private items after the `pub` item that uses them.\n  - The intent is to help people quickly find the \"relevant\" details, allowing them to \"dig deeper\" as needed.  Or put another way, the `pub` items serve as a table-of-contents.\n  - The exact order is fuzzy; do what makes sense\n\n## Conditions for fulfilling a bounty:\n\n1. You should make a pull request which fixes the issue the bounty was promised for\n2. The pull request should be merged by one of the maintainers\n\n### Below are the steps to redeem a bounty:\n\n1. Go to https://opencollective.com/clap/expenses/new.\n2. Select **Invoice**.\n3. Enter **Expense Title** as \"Issue Bounty\".\n4. In **Description**, link the issue you are redeeming _(Ex: `https://github.com/clap-rs/clap/issues/1464`)_\n5. In **Amount**, write the amount that the issue promised _(Ex: 10)_\n6. Fill payment information and submit\n7. Wait for us to approve it\n\n### Can I forgo the bounty?\n\nYes, you can. In that case, you don't have to do anything except writing a\ncomment on the issue saying that I do. The bounty will be reassigned to another\nissue.\n\n## Specific Tasks\n\n### Section-specific CONTRIBUTING\n\n- [Example CONTRIBUTING](./examples/README.md#contributing)\n- [Tutorial (builder) CONTRIBUTING](./examples/tutorial_builder/README.md#contributing)\n- [Tutorial (derive) CONTRIBUTING](./examples/tutorial_derive/README.md#contributing)\n- [clap_derive CONTRIBUTING](./clap_derive/CONTRIBUTING.md)\n\n### Updating MSRV\n\nSearch for `MSRV`, for example\n```bash\n$ rg --hidden MSRV\n```\nAnd update all of the references\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[workspace]\nresolver = \"2\"\nmembers = [\n  \"clap_bench\",\n  \"clap_builder\",\n  \"clap_derive\",\n  \"clap_lex\",\n  \"clap_complete\",\n  \"clap_complete_nushell\",\n  \"clap_mangen\",\n]\n\n[workspace.package]\nrepository = \"https://github.com/clap-rs/clap\"\nlicense = \"MIT OR Apache-2.0\"\nedition = \"2024\"\nrust-version = \"1.85\"  # MSRV\ninclude = [\n  \"build.rs\",\n  \"src/**/*\",\n  \"Cargo.toml\",\n  \"LICENSE*\",\n  \"README.md\",\n  \"examples/**/*\"\n]\n\n[workspace.lints.rust]\nrust_2018_idioms = { level = \"warn\", priority = -1 }\nunnameable_types = \"allow\"\nunreachable_pub = \"warn\"\nunsafe_op_in_unsafe_fn = \"warn\"\nunused_lifetimes = \"warn\"\nunused_macro_rules = \"warn\"\nunused_qualifications = \"warn\"\n\n[workspace.lints.clippy]\nbool_assert_comparison = \"allow\"\nbranches_sharing_code = \"allow\"\nchecked_conversions = \"warn\"\ncollapsible_else_if = \"allow\"\ncreate_dir = \"warn\"\ndbg_macro = \"warn\"\ndebug_assert_with_mut_call = \"warn\"\ndoc_markdown = \"warn\"\nempty_enums = \"warn\"\nenum_glob_use = \"warn\"\nexpl_impl_clone_on_copy = \"warn\"\nexplicit_deref_methods = \"warn\"\nexplicit_into_iter_loop = \"warn\"\nfallible_impl_from = \"warn\"\nfilter_map_next = \"warn\"\nflat_map_option = \"warn\"\nfloat_cmp_const = \"warn\"\nfn_params_excessive_bools = \"warn\"\nfrom_iter_instead_of_collect = \"warn\"\nif_same_then_else = \"allow\"\nimplicit_clone = \"warn\"\nimprecise_flops = \"warn\"\ninconsistent_struct_constructor = \"warn\"\ninefficient_to_string = \"warn\"\ninfinite_loop = \"warn\"\ninvalid_upcast_comparisons = \"warn\"\nlarge_digit_groups = \"warn\"\nlarge_stack_arrays = \"warn\"\nlarge_types_passed_by_value = \"warn\"\nlet_and_return = \"allow\"  # sometimes good to name what you are returning\nlinkedlist = \"warn\"\nlossy_float_literal = \"warn\"\nmacro_use_imports = \"warn\"\nmem_forget = \"warn\"\nmutex_integer = \"warn\"\nneedless_continue = \"allow\"\nneedless_for_each = \"warn\"\nnegative_feature_names = \"warn\"\npath_buf_push_overwrite = \"warn\"\nptr_as_ptr = \"warn\"\nrc_mutex = \"warn\"\nredundant_feature_names = \"warn\"\nref_option_ref = \"warn\"\nrest_pat_in_fully_bound_structs = \"warn\"\nresult_large_err = \"allow\"\nsame_functions_in_if_condition = \"warn\"\nself_named_module_files = \"warn\"\nsemicolon_if_nothing_returned = \"warn\"\n# str_to_string = \"warn\"\n# string_add = \"warn\"\nstring_add_assign = \"warn\"\nstring_lit_as_bytes = \"warn\"\ntodo = \"warn\"\ntrait_duplication_in_bounds = \"warn\"\nuninlined_format_args = \"warn\"\nverbose_file_reads = \"warn\"\n# wildcard_imports = \"warn\"\nzero_sized_map_values = \"warn\"\n# Fix later:\nmultiple_bound_locations = \"allow\"\nassigning_clones = \"allow\"\nblocks_in_conditions = \"allow\"\n\n[profile.dev]\npanic = \"abort\"\n\n[profile.release]\npanic = \"abort\"\ncodegen-units = 1\nlto = true\n# debug = \"line-tables-only\"  # requires Cargo 1.71\n\n[package]\nname = \"clap\"\nversion = \"4.6.0\"\ndescription = \"A simple to use, efficient, and full-featured Command Line Argument Parser\"\ncategories = [\"command-line-interface\"]\nkeywords = [\n  \"argument\",\n  \"cli\",\n  \"arg\",\n  \"parser\",\n  \"parse\"\n]\nrepository.workspace = true\nlicense.workspace = true\nedition.workspace = true\nrust-version.workspace = true\ninclude.workspace = true\n\n[package.metadata.docs.rs]\nfeatures = [\"unstable-doc\"]\nrustdoc-args = [\"--generate-link-to-definition\"]\n\n[package.metadata.playground]\nfeatures = [\"unstable-doc\"]\n\n[package.metadata.release]\nshared-version = true\ntag-name = \"v{{version}}\"\npre-release-replacements = [\n  {file=\"CHANGELOG.md\", search=\"Unreleased\", replace=\"{{version}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"\\\\.\\\\.\\\\.HEAD\", replace=\"...{{tag_name}}\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"ReleaseDate\", replace=\"{{date}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-header -->\", replace=\"<!-- next-header -->\\n## [Unreleased] - ReleaseDate\\n\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-url -->\", replace=\"<!-- next-url -->\\n[Unreleased]: https://github.com/clap-rs/clap/compare/{{tag_name}}...HEAD\", exactly=1},\n  {file=\"CITATION.cff\", search=\"^date-released: ....-..-..\", replace=\"date-released: {{date}}\"},\n  {file=\"CITATION.cff\", search=\"^version: .+\\\\..+\\\\..+\", replace=\"version: {{version}}\"},\n  {file=\"src/lib.rs\", search=\"blob/v.+\\\\..+\\\\..+/CHANGELOG.md\", replace=\"blob/v{{version}}/CHANGELOG.md\", exactly=1},\n]\n\n[features]\ndefault = [\n  \"std\",\n  \"color\",\n  \"help\",\n  \"usage\",\n  \"error-context\",\n  \"suggestions\",\n]\ndebug = [\"clap_builder/debug\", \"clap_derive?/debug\"] # Enables debug messages\nunstable-doc = [\"clap_builder/unstable-doc\", \"derive\"] # for docs.rs\n\n# Used in default\nstd = [\"clap_builder/std\"] # support for no_std in a backwards-compatible way\ncolor = [\"clap_builder/color\"]\nhelp = [\"clap_builder/help\"]\nusage = [\"clap_builder/usage\"]\nerror-context = [\"clap_builder/error-context\"]\nsuggestions = [\"clap_builder/suggestions\"]\n\n# Optional\ndeprecated = [\"clap_builder/deprecated\", \"clap_derive?/deprecated\"] # Guided experience to prepare for next breaking release (at different stages of development, this may become default)\nderive = [\"dep:clap_derive\"]\ncargo = [\"clap_builder/cargo\"] # Disable if you're not using Cargo, enables Cargo-env-var-dependent macros\nwrap_help = [\"clap_builder/wrap_help\"]\nenv = [\"clap_builder/env\"] # Use environment variables during arg parsing\nunicode = [\"clap_builder/unicode\"]  # Support for unicode characters in arguments and help messages\nstring = [\"clap_builder/string\"]  # Allow runtime generated strings\n\n# In-work features\nunstable-v5 = [\"clap_builder/unstable-v5\", \"clap_derive?/unstable-v5\", \"deprecated\"]\nunstable-ext = [\"clap_builder/unstable-ext\"]\nunstable-styles = [\"clap_builder/unstable-styles\"]  # deprecated\nunstable-derive-ui-tests = []\nunstable-markdown = [\"clap_derive/unstable-markdown\"]\n\n[lib]\nbench = false\n\n[dependencies]\nclap_builder = { path = \"./clap_builder\", version = \"=4.6.0\", default-features = false }\nclap_derive = { path = \"./clap_derive\", version = \"=4.6.0\", optional = true }\n\n[dev-dependencies]\ntrybuild = \"1.0.116\"\nrustversion = \"1.0.22\"\n# Cutting out `filesystem` feature\ntrycmd = { version = \"1.1.1\", default-features = false, features = [\"color-auto\", \"diff\", \"examples\"] }\njiff = \"0.2.23\"\nsnapbox = { version = \"1.1.0\", features = [\"term-svg\"] }\nshlex = \"1.3.0\"\nautomod = \"1.0.16\"\nclap-cargo = { version = \"0.15.2\", default-features = false }\nsemver = \"1.0.27\"\n\n[[example]]\nname = \"demo\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"cargo-example\"\nrequired-features = [\"cargo\", \"color\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"cargo-example-derive\"\nrequired-features = [\"derive\", \"color\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"escaped-positional\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"escaped-positional-derive\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"find\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"git-derive\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"typed-derive\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"busybox\"\npath = \"examples/multicall-busybox.rs\"\ndoc-scrape-examples = true\n\n[[example]]\nname = \"hostname\"\npath = \"examples/multicall-hostname.rs\"\ndoc-scrape-examples = true\n\n[[example]]\nname = \"repl\"\npath = \"examples/repl.rs\"\nrequired-features = [\"help\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"repl-derive\"\npath = \"examples/repl-derive.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"01_quick\"\npath = \"examples/tutorial_builder/01_quick.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"02_apps\"\npath = \"examples/tutorial_builder/02_apps.rs\"\ndoc-scrape-examples = true\n\n[[example]]\nname = \"02_crate\"\npath = \"examples/tutorial_builder/02_crate.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"02_app_settings\"\npath = \"examples/tutorial_builder/02_app_settings.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_01_flag_bool\"\npath = \"examples/tutorial_builder/03_01_flag_bool.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_01_flag_count\"\npath = \"examples/tutorial_builder/03_01_flag_count.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_02_option\"\npath = \"examples/tutorial_builder/03_02_option.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_02_option_mult\"\npath = \"examples/tutorial_builder/03_02_option_mult.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_03_positional\"\npath = \"examples/tutorial_builder/03_03_positional.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_03_positional_mult\"\npath = \"examples/tutorial_builder/03_03_positional_mult.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_04_subcommands\"\npath = \"examples/tutorial_builder/03_04_subcommands.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_05_default_values\"\npath = \"examples/tutorial_builder/03_05_default_values.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_06_required\"\npath = \"examples/tutorial_builder/03_06_required.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_01_possible\"\npath = \"examples/tutorial_builder/04_01_possible.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_01_enum\"\npath = \"examples/tutorial_builder/04_01_enum.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_02_parse\"\npath = \"examples/tutorial_builder/04_02_parse.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_02_validate\"\npath = \"examples/tutorial_builder/04_02_validate.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_03_relations\"\npath = \"examples/tutorial_builder/04_03_relations.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_04_custom\"\npath = \"examples/tutorial_builder/04_04_custom.rs\"\nrequired-features = [\"cargo\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"05_01_assert\"\npath = \"examples/tutorial_builder/05_01_assert.rs\"\nrequired-features = [\"cargo\"]\ntest = true\ndoc-scrape-examples = true\n\n[[example]]\nname = \"01_quick_derive\"\npath = \"examples/tutorial_derive/01_quick.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"02_apps_derive\"\npath = \"examples/tutorial_derive/02_apps.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"02_crate_derive\"\npath = \"examples/tutorial_derive/02_crate.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"02_app_settings_derive\"\npath = \"examples/tutorial_derive/02_app_settings.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_01_flag_bool_derive\"\npath = \"examples/tutorial_derive/03_01_flag_bool.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_01_flag_count_derive\"\npath = \"examples/tutorial_derive/03_01_flag_count.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_02_option_derive\"\npath = \"examples/tutorial_derive/03_02_option.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_02_option_mult_derive\"\npath = \"examples/tutorial_derive/03_02_option_mult.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_03_positional_derive\"\npath = \"examples/tutorial_derive/03_03_positional.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_03_positional_mult_derive\"\npath = \"examples/tutorial_derive/03_03_positional_mult.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_04_subcommands_derive\"\npath = \"examples/tutorial_derive/03_04_subcommands.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_04_subcommands_alt_derive\"\npath = \"examples/tutorial_derive/03_04_subcommands_alt.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_05_default_values_derive\"\npath = \"examples/tutorial_derive/03_05_default_values.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"03_06_optional_derive\"\npath = \"examples/tutorial_derive/03_06_optional.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_01_enum_derive\"\npath = \"examples/tutorial_derive/04_01_enum.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_02_parse_derive\"\npath = \"examples/tutorial_derive/04_02_parse.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_02_validate_derive\"\npath = \"examples/tutorial_derive/04_02_validate.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_03_relations_derive\"\npath = \"examples/tutorial_derive/04_03_relations.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"04_04_custom_derive\"\npath = \"examples/tutorial_derive/04_04_custom.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"05_01_assert_derive\"\npath = \"examples/tutorial_derive/05_01_assert.rs\"\nrequired-features = [\"derive\"]\ntest = true\ndoc-scrape-examples = true\n\n[[example]]\nname = \"interop_augment_args\"\npath = \"examples/derive_ref/augment_args.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"interop_augment_subcommands\"\npath = \"examples/derive_ref/augment_subcommands.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"interop_hand_subcommand\"\npath = \"examples/derive_ref/hand_subcommand.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"interop_flatten_hand_args\"\npath = \"examples/derive_ref/flatten_hand_args.rs\"\nrequired-features = [\"derive\"]\ndoc-scrape-examples = true\n\n[profile.test]\nopt-level = 1\n\n[profile.bench]\nlto = true\ncodegen-units = 1\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "LICENSE-APACHE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n"
  },
  {
    "path": "LICENSE-MIT",
    "content": "Copyright (c) Individual contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "# CI Steps\n#\n# Considerations\n# - Easy to debug: show the command being run\n# - Leverage CI features: Only run individual steps so we can use features like reporting elapsed time per step\n\nARGS?=--workspace\nTOOLCHAIN_TARGET ?=\nifneq (${TOOLCHAIN_TARGET},)\n  ARGS+=--target ${TOOLCHAIN_TARGET}\nendif\n\nSTABLE?=1.94\n\n_FEATURES = minimal default wasm full debug release\n_FEATURES_minimal = --no-default-features --features \"std\"\n_FEATURES_default =\n_FEATURES_wasm = --no-default-features --features \"std help usage error-context suggestions\" --features \"deprecated derive cargo env unicode string\"\n_FEATURES_full = --features \"deprecated derive cargo env unicode string wrap_help unstable-ext\"\n_FEATURES_next = ${_FEATURES_full} --features \"unstable-v5 unstable-markdown\"\n_FEATURES_debug = ${_FEATURES_full} --features debug --features clap_complete/debug\n_FEATURES_release = ${_FEATURES_full} --release\n\ncheck-wasm:\n\tcargo check ${_FEATURES_${@:check-%=%}} ${ARGS}\n\ncheck-%:\n\tcargo check ${_FEATURES_${@:check-%=%}} --all-targets ${ARGS}\n\nbuild-%:\n\tcargo test ${_FEATURES_${@:build-%=%}} --all-targets --no-run ${ARGS}\n\ntest-%:\n\tcargo test ${_FEATURES_${@:test-%=%}} ${ARGS}\n\nclippy-%:\n\tcargo clippy ${_FEATURES_${@:clippy-%=%}} ${ARGS} --all-targets -- -D warnings -A deprecated\n\ntest-ui-%:\n\tcargo +${STABLE} test --test derive_ui --features derive,unstable-derive-ui-tests ${_FEATURES_${@:test-ui-%=%}}\n\ndoc:\n\tcargo doc --workspace --all-features --no-deps --document-private-items\n"
  },
  {
    "path": "README.md",
    "content": "# clap\n\n> **Command Line Argument Parser for Rust**\n\n[![Crates.io](https://img.shields.io/crates/v/clap?style=flat-square)](https://crates.io/crates/clap)\n[![Crates.io](https://img.shields.io/crates/d/clap?style=flat-square)](https://crates.io/crates/clap)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square)](LICENSE-APACHE)\n[![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE-MIT)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/clap-rs/clap/ci.yml?branch=master&style=flat-square)](https://github.com/clap-rs/clap/actions/workflows/ci.yml?query=branch%3Amaster)\n[![Coverage Status](https://img.shields.io/coveralls/github/clap-rs/clap/master?style=flat-square)](https://coveralls.io/github/clap-rs/clap?branch=master)\n[![Contributors](https://img.shields.io/github/contributors/clap-rs/clap?style=flat-square)](https://github.com/clap-rs/clap/graphs/contributors)\n\nDual-licensed under [Apache 2.0](LICENSE-APACHE) or [MIT](LICENSE-MIT).\n\n## Get Started\n\n```console\n$ cargo add clap\n```\n\n## About\n\nCreate your command-line parser, with all of the bells and whistles, declaratively or procedurally.\n\nFor more details, see:\n- [docs.rs](https://docs.rs/clap/latest/clap/)\n- [examples](examples/)\n\n## Sponsors\n\n<!-- omit in TOC -->\n### Gold\n\n[![](https://opencollective.com/clap/tiers/gold.svg?width=890)](https://opencollective.com/clap)\n\n<!-- omit in TOC -->\n### Silver\n\n[![](https://opencollective.com/clap/tiers/silver.svg?width=890)](https://opencollective.com/clap)\n\n<!-- omit in TOC -->\n### Bronze\n\n[![](https://opencollective.com/clap/tiers/bronze.svg?width=890)](https://opencollective.com/clap)\n\n<!-- omit in TOC -->\n### Backer\n\n[![](https://opencollective.com/clap/tiers/backer.svg?width=890)](https://opencollective.com/clap)\n"
  },
  {
    "path": "clap_bench/Cargo.toml",
    "content": "[package]\nname = \"clap_bench\"\nversion = \"0.0.0\"\ndescription = \"Benchmarks for clap\"\npublish = false\nrepository.workspace = true\nlicense.workspace = true\nedition.workspace = true\nrust-version.workspace = true\ninclude.workspace = true\n\n[package.metadata.release]\nrelease = false\n\n[dev-dependencies]\nclap = { path = \"../\", version = \"4.0.0\", default-features = false, features = [\"std\", \"help\"] }\ndivan = \"0.1.21\"\nlazy_static = \"1.5.0\"\n\n[[bench]]\nharness = false\nname = \"empty\"\n\n[[bench]]\nharness = false\nname = \"simple\"\n\n[[bench]]\nharness = false\nname = \"complex\"\n\n[[bench]]\nharness = false\nname = \"rustup\"\n\n[[bench]]\nharness = false\nname = \"ripgrep\"\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "clap_bench/benches/complex.rs",
    "content": "#![allow(elided_lifetimes_in_paths)] // needed for divan\n\nuse clap::{ArgMatches, Command, arg};\n\nmacro_rules! create_app {\n    () => {{\n        Command::new(\"claptests\")\n            .version(\"0.1\")\n            .about(\"tests clap library\")\n            .author(\"Kevin K. <kbknapp@gmail.com>\")\n            .arg(arg!(-o --option <opt> ... \"tests options\"))\n            .arg(arg!([positional] \"tests positionals\"))\n            .arg(arg!(-f --flag ... \"tests flags\").global(true))\n            .args([\n                arg!(flag2: -F \"tests flags with exclusions\")\n                    .conflicts_with(\"flag\")\n                    .requires(\"option2\"),\n                arg!(option2: --\"long-option-2\" <option2> \"tests long options with exclusions\")\n                    .conflicts_with(\"option\")\n                    .requires(\"positional2\"),\n                arg!([positional2] \"tests positionals with exclusions\"),\n                arg!(-O --Option <option3> \"tests options with specific value sets\")\n                    .value_parser([\"fast\", \"slow\"]),\n                arg!([positional3] ... \"tests positionals with specific values\")\n                    .value_parser([\"vi\", \"emacs\"]),\n                arg!(--multvals <s> \"Tests multiple values not mult occs\").value_names([\"one\", \"two\"]),\n                arg!(\n                    --multvalsmo <s> \"Tests multiple values, not mult occs\"\n                ).required(false).value_names([\"one\", \"two\"]),\n                arg!(--minvals2 <minvals> ... \"Tests 2 min vals\").num_args(2..),\n                arg!(--maxvals3 <maxvals> ... \"Tests 3 max vals\").num_args(1..=3),\n            ])\n            .subcommand(\n                Command::new(\"subcmd\")\n                    .about(\"tests subcommands\")\n                    .version(\"0.1\")\n                    .author(\"Kevin K. <kbknapp@gmail.com>\")\n                    .arg(arg!(-o --option <scoption> ... \"tests options\"))\n                    .arg(arg!([scpositional] \"tests positionals\"))\n            )\n    }};\n}\n\n#[divan::bench]\nfn build() -> Command {\n    create_app!()\n}\n\n#[divan::bench(args=COMPLEX_ARGS)]\nfn startup(args: &Args) -> ArgMatches {\n    create_app!().get_matches_from(args.args())\n}\n\n#[divan::bench]\nfn render_help(bencher: divan::Bencher) {\n    let mut cmd = create_app!();\n    bencher.bench_local(|| build_help(&mut cmd));\n}\n\nfn build_help(cmd: &mut Command) -> String {\n    let help = cmd.render_help();\n    help.to_string()\n}\n\nconst COMPLEX_ARGS: &[Args] = &[\n    Args(\"empty\", &[\"\"]),\n    Args(\"flag\", &[\"myprog\", \"-f\"]),\n    Args(\"opt\", &[\"myprog\", \"-o\", \"option1\"]),\n    Args(\"pos\", &[\"myprog\", \"arg1\"]),\n    Args(\"sc\", &[\"myprog\", \"subcmd\"]),\n    Args(\"sc_flag\", &[\"myprog\", \"subcmd\", \"-f\"]),\n    Args(\"sc_opt\", &[\"myprog\", \"subcmd\", \"-o\", \"option1\"]),\n    Args(\"sc_pos\", &[\"myprog\", \"subcmd\", \"arg1\"]),\n    Args(\n        \"sc_nested\",\n        &[\"myprog\", \"subcmd\", \"-f\", \"-o\", \"option1\", \"arg1\"],\n    ),\n    Args(\n        \"mixed1\",\n        &[\n            \"myprog\",\n            \"-ff\",\n            \"-o\",\n            \"option1\",\n            \"arg1\",\n            \"-O\",\n            \"fast\",\n            \"arg2\",\n            \"--multvals\",\n            \"one\",\n            \"two\",\n            \"emacs\",\n        ],\n    ),\n    Args(\n        \"mixed2\",\n        &[\n            \"myprog\",\n            \"arg1\",\n            \"-f\",\n            \"arg2\",\n            \"--long-option-2\",\n            \"some\",\n            \"-O\",\n            \"slow\",\n            \"--multvalsmo\",\n            \"one\",\n            \"two\",\n            \"--minvals2\",\n            \"3\",\n            \"2\",\n            \"1\",\n        ],\n    ),\n];\n\n#[derive(Debug)]\npub struct Args(&'static str, &'static [&'static str]);\n\nimpl Args {\n    pub const fn name(&self) -> &'static str {\n        self.0\n    }\n\n    pub const fn args(&self) -> &[&str] {\n        self.1\n    }\n}\n\nimpl std::fmt::Display for Args {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.name().fmt(f)\n    }\n}\n\nfn main() {\n    divan::main();\n}\n"
  },
  {
    "path": "clap_bench/benches/empty.rs",
    "content": "#![allow(elided_lifetimes_in_paths)] // needed for divan\n\nuse clap::ArgMatches;\nuse clap::Command;\n\nmacro_rules! create_app {\n    () => {{ Command::new(\"claptests\") }};\n}\n\n#[divan::bench]\nfn build() -> Command {\n    create_app!()\n}\n\n#[divan::bench]\nfn startup() -> ArgMatches {\n    create_app!().get_matches_from(vec![\"\"])\n}\n\n#[divan::bench]\nfn render_help(bencher: divan::Bencher) {\n    let mut cmd = create_app!();\n    bencher.bench_local(|| build_help(&mut cmd));\n}\n\nfn build_help(cmd: &mut Command) -> String {\n    let help = cmd.render_help();\n    help.to_string()\n}\n\nfn main() {\n    divan::main();\n}\n"
  },
  {
    "path": "clap_bench/benches/ripgrep.rs",
    "content": "//! Used to simulate a fairly large number of options/flags and parsing with thousands of positional\n//! args\n//!\n//! CLI used is adapted from ripgrep 48a8a3a691220f9e5b2b08f4051abe8655ea7e8a\n\n#![allow(elided_lifetimes_in_paths)] // needed for divan\n\nuse std::collections::HashMap;\n\nuse clap::{Arg, ArgAction, ArgMatches, Command, value_parser};\nuse lazy_static::lazy_static;\n\nmod build {\n    use super::{Command, app_long, app_short};\n\n    #[divan::bench]\n    fn short_help() -> Command {\n        app_short()\n    }\n\n    #[divan::bench]\n    fn long_help() -> Command {\n        app_long()\n    }\n}\n\nmod render_help {\n    use super::{app_long, app_short, build_help};\n\n    #[divan::bench]\n    fn short_help(bencher: divan::Bencher) {\n        let mut cmd = app_short();\n        bencher.bench_local(|| build_help(&mut cmd));\n    }\n\n    #[divan::bench]\n    fn long_help(bencher: divan::Bencher) {\n        let mut cmd = app_long();\n        bencher.bench_local(|| build_help(&mut cmd));\n    }\n}\n\nmod startup {\n    use super::{ArgMatches, app_short};\n\n    #[divan::bench]\n    fn simple() -> ArgMatches {\n        app_short().get_matches_from(vec![\"rg\", \"pat\"])\n    }\n\n    #[divan::bench]\n    fn complex() -> ArgMatches {\n        app_short().get_matches_from(vec![\n            \"rg\",\n            \"pat\",\n            \"-cFlN\",\n            \"-pqr=some\",\n            \"--null\",\n            \"--no-filename\",\n            \"--no-messages\",\n            \"-SH\",\n            \"-C5\",\n            \"--follow\",\n            \"-e some\",\n        ])\n    }\n\n    #[divan::bench]\n    fn xargs() -> ArgMatches {\n        app_short().get_matches_from(vec![\n            \"rg\", \"pat\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n        ])\n    }\n}\n\nconst ABOUT: &str = \"\nripgrep (rg) recursively searches your current directory for a regex pattern.\n\nripgrep's regex engine uses finite automata and guarantees linear time\nsearching. Because of this, features like backreferences and arbitrary\nlookaround are not supported.\n\nProject home page: https://github.com/BurntSushi/ripgrep\n\nUse -h for short descriptions and --help for more details.\";\n\nconst USAGE: &str = \"\n    rg [OPTIONS] <pattern> [<path> ...]\n    rg [OPTIONS] [-e PATTERN | -f FILE ]... [<path> ...]\n    rg [OPTIONS] --files [<path> ...]\n    rg [OPTIONS] --type-list\";\n\nconst TEMPLATE: &str = \"\\\n{name} {version}\n{author}\n{about}\n\nUSAGE:{usage}\n\nARGS:\n{positionals}\n\nOPTIONS:\n{options}\";\n\n/// Build a clap application with short help strings.\nfn app_short() -> Command {\n    cmd(false, |k| USAGES[k].short)\n}\n\n/// Build a clap application with long help strings.\nfn app_long() -> Command {\n    cmd(true, |k| USAGES[k].long)\n}\n\n/// Build the help text of an application.\nfn build_help(cmd: &mut Command) -> String {\n    let help = cmd.render_help();\n    help.to_string()\n}\n\n/// Build a clap application parameterized by usage strings.\n///\n/// The function given should take a clap argument name and return a help\n/// string. `cmd` will panic if a usage string is not defined.\n///\n/// This is an intentionally stand-alone module so that it can be used easily\n/// in a `build.rs` script to build shell completion files.\nfn cmd<F>(_next_line_help: bool, doc: F) -> Command\nwhere\n    F: Fn(&'static str) -> &'static str,\n{\n    let arg = |name| Arg::new(name).help(doc(name));\n    let flag = |name| arg(name).long(name).action(ArgAction::SetTrue);\n\n    Command::new(\"ripgrep\")\n        .author(\"BurntSushi\") // simulating since it's only a bench\n        .version(\"0.4.0\") // Simulating\n        .about(ABOUT)\n        .max_term_width(100)\n        .override_usage(USAGE)\n        .help_template(TEMPLATE)\n        // Handle help/version manually to make their output formatting\n        // consistent with short/long views.\n        .disable_help_flag(true)\n        .disable_version_flag(true)\n        .arg(arg(\"help-short\").short('h'))\n        .arg(flag(\"help\"))\n        .arg(flag(\"version\").short('V'))\n        // First, set up primary positional/flag arguments.\n        .arg(arg(\"pattern\").required_unless_present_any([\n            \"file\",\n            \"files\",\n            \"help-short\",\n            \"help\",\n            \"regexp\",\n            \"type-list\",\n            \"version\",\n        ]))\n        .arg(arg(\"path\").num_args(1..))\n        .arg(\n            flag(\"regexp\")\n                .short('e')\n                .allow_hyphen_values(true)\n                .action(ArgAction::Append)\n                .value_name(\"pattern\"),\n        )\n        .arg(\n            flag(\"files\")\n                // This should also conflict with `pattern`, but the first file\n                // path will actually be in `pattern`.\n                .conflicts_with_all([\"file\", \"regexp\", \"type-list\"]),\n        )\n        .arg(flag(\"type-list\").conflicts_with_all([\"file\", \"files\", \"pattern\", \"regexp\"]))\n        // Second, set up common flags.\n        .arg(flag(\"text\").short('a'))\n        .arg(flag(\"count\").short('c'))\n        .arg(\n            flag(\"color\")\n                .value_name(\"WHEN\")\n                .action(ArgAction::Set)\n                .hide_possible_values(true)\n                .value_parser([\"never\", \"auto\", \"always\", \"ansi\"]),\n        )\n        .arg(flag(\"colors\").value_name(\"SPEC\").action(ArgAction::Append))\n        .arg(flag(\"fixed-strings\").short('F'))\n        .arg(\n            flag(\"glob\")\n                .short('g')\n                .action(ArgAction::Append)\n                .value_name(\"GLOB\"),\n        )\n        .arg(flag(\"ignore-case\").short('i'))\n        .arg(flag(\"line-number\").short('n'))\n        .arg(flag(\"no-line-number\").short('N'))\n        .arg(flag(\"quiet\").short('q'))\n        .arg(\n            flag(\"type\")\n                .short('t')\n                .action(ArgAction::Append)\n                .value_name(\"TYPE\"),\n        )\n        .arg(\n            flag(\"type-not\")\n                .short('T')\n                .action(ArgAction::Append)\n                .value_name(\"TYPE\"),\n        )\n        .arg(flag(\"unrestricted\").short('u').action(ArgAction::Append))\n        .arg(flag(\"invert-match\").short('v'))\n        .arg(flag(\"word-regexp\").short('w'))\n        // Third, set up less common flags.\n        .arg(\n            flag(\"after-context\")\n                .short('A')\n                .action(ArgAction::Set)\n                .value_name(\"NUM\")\n                .value_parser(value_parser!(usize)),\n        )\n        .arg(\n            flag(\"before-context\")\n                .short('B')\n                .action(ArgAction::Set)\n                .value_name(\"NUM\")\n                .value_parser(value_parser!(usize)),\n        )\n        .arg(\n            flag(\"context\")\n                .short('C')\n                .action(ArgAction::Set)\n                .value_name(\"NUM\")\n                .value_parser(value_parser!(usize)),\n        )\n        .arg(flag(\"column\"))\n        .arg(flag(\"context-separator\").value_name(\"SEPARATOR\"))\n        .arg(flag(\"debug\"))\n        .arg(\n            flag(\"file\")\n                .short('f')\n                .value_name(\"FILE\")\n                .action(ArgAction::Append),\n        )\n        .arg(flag(\"files-with-matches\").short('l'))\n        .arg(flag(\"files-without-match\"))\n        .arg(flag(\"with-filename\").short('H'))\n        .arg(flag(\"no-filename\"))\n        .arg(flag(\"heading\").overrides_with(\"no-heading\"))\n        .arg(flag(\"no-heading\").overrides_with(\"heading\"))\n        .arg(flag(\"hidden\"))\n        .arg(\n            flag(\"ignore-file\")\n                .value_name(\"FILE\")\n                .action(ArgAction::Append),\n        )\n        .arg(flag(\"follow\").short('L'))\n        .arg(\n            flag(\"max-count\")\n                .short('m')\n                .action(ArgAction::Set)\n                .value_name(\"NUM\")\n                .value_parser(value_parser!(usize)),\n        )\n        .arg(\n            flag(\"maxdepth\")\n                .action(ArgAction::Set)\n                .value_name(\"NUM\")\n                .value_parser(value_parser!(usize)),\n        )\n        .arg(flag(\"mmap\"))\n        .arg(flag(\"no-messages\"))\n        .arg(flag(\"no-mmap\"))\n        .arg(flag(\"no-ignore\"))\n        .arg(flag(\"no-ignore-parent\"))\n        .arg(flag(\"no-ignore-vcs\"))\n        .arg(flag(\"null\"))\n        .arg(flag(\"path-separator\").value_name(\"SEPARATOR\"))\n        .arg(flag(\"pretty\").short('p'))\n        .arg(\n            flag(\"replace\")\n                .short('r')\n                .action(ArgAction::Set)\n                .value_name(\"ARG\"),\n        )\n        .arg(flag(\"case-sensitive\").short('s'))\n        .arg(flag(\"smart-case\").short('S'))\n        .arg(flag(\"sort-files\"))\n        .arg(\n            flag(\"threads\")\n                .short('j')\n                .action(ArgAction::Set)\n                .value_name(\"ARG\")\n                .value_parser(value_parser!(usize)),\n        )\n        .arg(flag(\"vimgrep\"))\n        .arg(\n            flag(\"type-add\")\n                .value_name(\"TYPE\")\n                .action(ArgAction::Append),\n        )\n        .arg(\n            flag(\"type-clear\")\n                .value_name(\"TYPE\")\n                .action(ArgAction::Append),\n        )\n}\n\nstruct Usage {\n    short: &'static str,\n    long: &'static str,\n}\n\nmacro_rules! doc {\n    ($map:expr, $name:expr, $short:expr) => {\n        doc!($map, $name, $short, $short)\n    };\n    ($map:expr, $name:expr, $short:expr, $long:expr) => {\n        $map.insert(\n            $name,\n            Usage {\n                short: $short,\n                long: concat!($long, \"\\n \"),\n            },\n        );\n    };\n}\n\nlazy_static! {\n    static ref USAGES: HashMap<&'static str, Usage> = {\n        let mut h = HashMap::new();\n        doc!(\n            h,\n            \"help-short\",\n            \"Show short help output.\",\n            \"Show short help output. Use --help to show more details.\"\n        );\n        doc!(\n            h,\n            \"help\",\n            \"Show verbose help output.\",\n            \"When given, more details about flags are provided.\"\n        );\n        doc!(h, \"version\", \"Print version information.\");\n\n        doc!(\n            h,\n            \"pattern\",\n            \"A regular expression used for searching.\",\n            \"A regular expression used for searching. Multiple patterns \\\n             may be given. To match a pattern beginning with a -, use [-].\"\n        );\n        doc!(\n            h,\n            \"regexp\",\n            \"A regular expression used for searching.\",\n            \"A regular expression used for searching. Multiple patterns \\\n             may be given. To match a pattern beginning with a -, use [-].\"\n        );\n        doc!(\n            h,\n            \"path\",\n            \"A file or directory to search.\",\n            \"A file or directory to search. Directories are searched \\\n             recursively.\"\n        );\n        doc!(\n            h,\n            \"files\",\n            \"Print each file that would be searched.\",\n            \"Print each file that would be searched without actually \\\n             performing the search. This is useful to determine whether a \\\n             particular file is being searched or not.\"\n        );\n        doc!(\n            h,\n            \"type-list\",\n            \"Show all supported file types.\",\n            \"Show all supported file types and their corresponding globs.\"\n        );\n\n        doc!(h, \"text\", \"Search binary files as if they were text.\");\n        doc!(h, \"count\", \"Only show count of matches for each file.\");\n        doc!(\n            h,\n            \"color\",\n            \"When to use color. [default: auto]\",\n            \"When to use color in the output. The possible values are \\\n             never, auto, always or ansi. The default is auto. When always \\\n             is used, coloring is attempted based on your environment. When \\\n             ansi used, coloring is forcefully done using ANSI escape color \\\n             codes.\"\n        );\n        doc!(\n            h,\n            \"colors\",\n            \"Configure color settings and styles.\",\n            \"This flag specifies color settings for use in the output. \\\n             This flag may be provided multiple times. Settings are applied \\\n             iteratively. Colors are limited to one of eight choices: \\\n             red, blue, green, cyan, magenta, yellow, white and black. \\\n             Styles are limited to nobold, bold, nointense or intense.\\n\\n\\\n             The format of the flag is {type}:{attribute}:{value}. {type} \\\n             should be one of path, line or match. {attribute} can be fg, bg \\\n             or style. {value} is either a color (for fg and bg) or a text \\\n             style. A special format, {type}:none, will clear all color \\\n             settings for {type}.\\n\\nFor example, the following command will \\\n             change the match color to magenta and the background color for \\\n             line numbers to yellow:\\n\\n\\\n             rg --colors 'match:fg:magenta' --colors 'line:bg:yellow' foo.\"\n        );\n        doc!(\n            h,\n            \"fixed-strings\",\n            \"Treat the pattern as a literal string.\",\n            \"Treat the pattern as a literal string instead of a regular \\\n             expression. When this flag is used, special regular expression \\\n             meta characters such as (){}*+. do not need to be escaped.\"\n        );\n        doc!(\n            h,\n            \"glob\",\n            \"Include or exclude files/directories.\",\n            \"Include or exclude files/directories for searching that \\\n             match the given glob. This always overrides any other \\\n             ignore logic. Multiple glob flags may be used. Globbing \\\n             rules match .gitignore globs. Precede a glob with a ! \\\n             to exclude it.\"\n        );\n        doc!(\n            h,\n            \"ignore-case\",\n            \"Case insensitive search.\",\n            \"Case insensitive search. This is overridden by \\\n             --case-sensitive.\"\n        );\n        doc!(\n            h,\n            \"line-number\",\n            \"Show line numbers.\",\n            \"Show line numbers (1-based). This is enabled by default when \\\n             searching in a tty.\"\n        );\n        doc!(\n            h,\n            \"no-line-number\",\n            \"Suppress line numbers.\",\n            \"Suppress line numbers. This is enabled by default when NOT \\\n             searching in a tty.\"\n        );\n        doc!(\n            h,\n            \"quiet\",\n            \"Do not print anything to stdout.\",\n            \"Do not print anything to stdout. If a match is found in a file, \\\n             stop searching. This is useful when ripgrep is used only for \\\n             its exit code.\"\n        );\n        doc!(\n            h,\n            \"type\",\n            \"Only search files matching TYPE.\",\n            \"Only search files matching TYPE. Multiple type flags may be \\\n             provided. Use the --type-list flag to list all available \\\n             types.\"\n        );\n        doc!(\n            h,\n            \"type-not\",\n            \"Do not search files matching TYPE.\",\n            \"Do not search files matching TYPE. Multiple type-not flags may \\\n             be provided. Use the --type-list flag to list all available \\\n             types.\"\n        );\n        doc!(\n            h,\n            \"unrestricted\",\n            \"Reduce the level of \\\"smart\\\" searching.\",\n            \"Reduce the level of \\\"smart\\\" searching. A single -u \\\n             won't respect .gitignore (etc.) files. Two -u flags will \\\n             additionally search hidden files and directories. Three \\\n             -u flags will additionally search binary files. -uu is \\\n             roughly equivalent to grep -r and -uuu is roughly \\\n             equivalent to grep -a -r.\"\n        );\n        doc!(\n            h,\n            \"invert-match\",\n            \"Invert matching.\",\n            \"Invert matching. Show lines that don't match given patterns.\"\n        );\n        doc!(\n            h,\n            \"word-regexp\",\n            \"Only show matches surrounded by word boundaries.\",\n            \"Only show matches surrounded by word boundaries. This is \\\n             equivalent to putting \\\\b before and after all of the search \\\n             patterns.\"\n        );\n\n        doc!(h, \"after-context\", \"Show NUM lines after each match.\");\n        doc!(h, \"before-context\", \"Show NUM lines before each match.\");\n        doc!(h, \"context\", \"Show NUM lines before and after each match.\");\n        doc!(\n            h,\n            \"column\",\n            \"Show column numbers\",\n            \"Show column numbers (1-based). This only shows the column \\\n             numbers for the first match on each line. This does not try \\\n             to account for Unicode. One byte is equal to one column. This \\\n             implies --line-number.\"\n        );\n        doc!(\n            h,\n            \"context-separator\",\n            \"Set the context separator string. [default: --]\",\n            \"The string used to separate non-contiguous context lines in the \\\n             output. Escape sequences like \\\\x7F or \\\\t may be used. The \\\n             default value is --.\"\n        );\n        doc!(\n            h,\n            \"debug\",\n            \"Show debug messages.\",\n            \"Show debug messages. Please use this when filing a bug report.\"\n        );\n        doc!(\n            h,\n            \"file\",\n            \"Search for patterns from the given file.\",\n            \"Search for patterns from the given file, with one pattern per \\\n             line. When this flag is used or multiple times or in \\\n             combination with the -e/--regexp flag, then all patterns \\\n             provided are searched. Empty pattern lines will match all input \\\n             lines, and the newline is not counted as part of the pattern.\"\n        );\n        doc!(\n            h,\n            \"files-with-matches\",\n            \"Only show the path of each file with at least one match.\"\n        );\n        doc!(\n            h,\n            \"files-without-match\",\n            \"Only show the path of each file that contains zero matches.\"\n        );\n        doc!(\n            h,\n            \"with-filename\",\n            \"Show file name for each match.\",\n            \"Prefix each match with the file name that contains it. This is \\\n             the default when more than one file is searched.\"\n        );\n        doc!(\n            h,\n            \"no-filename\",\n            \"Never show the file name for a match.\",\n            \"Never show the file name for a match. This is the default when \\\n             one file is searched.\"\n        );\n        doc!(\n            h,\n            \"heading\",\n            \"Show matches grouped by each file.\",\n            \"This shows the file name above clusters of matches from each \\\n             file instead of showing the file name for every match. This is \\\n             the default mode at a tty.\"\n        );\n        doc!(\n            h,\n            \"no-heading\",\n            \"Don't group matches by each file.\",\n            \"Don't group matches by each file. If -H/--with-filename is \\\n             enabled, then file names will be shown for every line matched. \\\n             This is the default mode when not at a tty.\"\n        );\n        doc!(\n            h,\n            \"hidden\",\n            \"Search hidden files and directories.\",\n            \"Search hidden files and directories. By default, hidden files \\\n             and directories are skipped.\"\n        );\n        doc!(\n            h,\n            \"ignore-file\",\n            \"Specify additional ignore files.\",\n            \"Specify additional ignore files for filtering file paths. \\\n             Ignore files should be in the gitignore format and are matched \\\n             relative to the current working directory. These ignore files \\\n             have lower precedence than all other ignore files. When \\\n             specifying multiple ignore files, earlier files have lower \\\n             precedence than later files.\"\n        );\n        doc!(h, \"follow\", \"Follow symbolic links.\");\n        doc!(\n            h,\n            \"max-count\",\n            \"Limit the number of matches.\",\n            \"Limit the number of matching lines per file searched to NUM.\"\n        );\n        doc!(\n            h,\n            \"maxdepth\",\n            \"Descend at most NUM directories.\",\n            \"Limit the depth of directory traversal to NUM levels beyond \\\n             the paths given. A value of zero only searches the \\\n             starting-points themselves.\\n\\nFor example, \\\n             'rg --maxdepth 0 dir/' is a no-op because dir/ will not be \\\n             descended into. 'rg --maxdepth 1 dir/' will search only the \\\n             direct children of dir/.\"\n        );\n        doc!(\n            h,\n            \"mmap\",\n            \"Searching using memory maps when possible.\",\n            \"Search using memory maps when possible. This is enabled by \\\n             default when ripgrep thinks it will be faster. Note that memory \\\n             map searching doesn't currently support all options, so if an \\\n             incompatible option (e.g., --context) is given with --mmap, \\\n             then memory maps will not be used.\"\n        );\n        doc!(\n            h,\n            \"no-messages\",\n            \"Suppress all error messages.\",\n            \"Suppress all error messages. This is equivalent to redirecting \\\n             stderr to /dev/null.\"\n        );\n        doc!(\n            h,\n            \"no-mmap\",\n            \"Never use memory maps.\",\n            \"Never use memory maps, even when they might be faster.\"\n        );\n        doc!(\n            h,\n            \"no-ignore\",\n            \"Don't respect ignore files.\",\n            \"Don't respect ignore files (.gitignore, .ignore, etc.). This \\\n             implies --no-ignore-parent and --no-ignore-vcs.\"\n        );\n        doc!(\n            h,\n            \"no-ignore-parent\",\n            \"Don't respect ignore files in parent directories.\",\n            \"Don't respect ignore files (.gitignore, .ignore, etc.) in \\\n             parent directories.\"\n        );\n        doc!(\n            h,\n            \"no-ignore-vcs\",\n            \"Don't respect VCS ignore files\",\n            \"Don't respect version control ignore files (.gitignore, etc.). \\\n             This implies --no-ignore-parent. Note that .ignore files will \\\n             continue to be respected.\"\n        );\n        doc!(\n            h,\n            \"null\",\n            \"Print NUL byte after file names\",\n            \"Whenever a file name is printed, follow it with a NUL byte. \\\n             This includes printing file names before matches, and when \\\n             printing a list of matching files such as with --count, \\\n             --files-with-matches and --files. This option is useful for use \\\n             with xargs.\"\n        );\n        doc!(\n            h,\n            \"path-separator\",\n            \"Path separator to use when printing file paths.\",\n            \"The path separator to use when printing file paths. This \\\n             defaults to your platform's path separator, which is / on Unix \\\n             and \\\\ on Windows. This flag is intended for overriding the \\\n             default when the environment demands it (e.g., cygwin). A path \\\n             separator is limited to a single byte.\"\n        );\n        doc!(h, \"pretty\", \"Alias for --color always --heading -n.\");\n        doc!(\n            h,\n            \"replace\",\n            \"Replace matches with string given.\",\n            \"Replace every match with the string given when printing \\\n             results. Neither this flag nor any other flag will modify your \\\n             files.\\n\\nCapture group indices (e.g., $5) and names \\\n             (e.g., $foo) are supported in the replacement string.\\n\\n\\\n             Note that the replacement by default replaces each match, and \\\n             NOT the entire line. To replace the entire line, you should \\\n             match the entire line.\"\n        );\n        doc!(\n            h,\n            \"case-sensitive\",\n            \"Search case sensitively.\",\n            \"Search case sensitively. This overrides -i/--ignore-case and \\\n             -S/--smart-case.\"\n        );\n        doc!(\n            h,\n            \"smart-case\",\n            \"Smart case search.\",\n            \"Searches case insensitively if the pattern is all lowercase. \\\n             Search case sensitively otherwise. This is overridden by \\\n             either -s/--case-sensitive or -i/--ignore-case.\"\n        );\n        doc!(\n            h,\n            \"sort-files\",\n            \"Sort results by file path. Implies --threads=1.\",\n            \"Sort results by file path. Note that this currently \\\n             disables all parallelism and runs search in a single thread.\"\n        );\n        doc!(\n            h,\n            \"threads\",\n            \"The approximate number of threads to use.\",\n            \"The approximate number of threads to use. A value of 0 (which \\\n             is the default) causes ripgrep to choose the thread count \\\n             using heuristics.\"\n        );\n        doc!(\n            h,\n            \"vimgrep\",\n            \"Show results in vim compatible format.\",\n            \"Show results with every match on its own line, including \\\n             line numbers and column numbers. With this option, a line with \\\n             more than one match will be printed more than once.\"\n        );\n\n        doc!(\n            h,\n            \"type-add\",\n            \"Add a new glob for a file type.\",\n            \"Add a new glob for a particular file type. Only one glob can be \\\n             added at a time. Multiple --type-add flags can be provided. \\\n             Unless --type-clear is used, globs are added to any existing \\\n             globs defined inside of ripgrep.\\n\\nNote that this MUST be \\\n             passed to every invocation of ripgrep. Type settings are NOT \\\n             persisted.\\n\\nExample: \\\n             rg --type-add 'foo:*.foo' -tfoo PATTERN.\\n\\n\\\n             --type-add can also be used to include rules from other types \\\n             with the special include directive. The include directive \\\n             permits specifying one or more other type names (separated by a \\\n             comma) that have been defined and its rules will automatically \\\n             be imported into the type specified. For example, to create a \\\n             type called src that matches C++, Python and Markdown files, one \\\n             can use:\\n\\n\\\n             --type-add 'src:include:cpp,py,md'\\n\\n\\\n             Additional glob rules can still be added to the src type by \\\n             using the --type-add flag again:\\n\\n\\\n             --type-add 'src:include:cpp,py,md' --type-add 'src:*.foo'\\n\\n\\\n             Note that type names must consist only of Unicode letters or \\\n             numbers. Punctuation characters are not allowed.\"\n        );\n        doc!(\n            h,\n            \"type-clear\",\n            \"Clear globs for given file type.\",\n            \"Clear the file type globs previously defined for TYPE. This \\\n             only clears the default type definitions that are found inside \\\n             of ripgrep.\\n\\nNote that this MUST be passed to every \\\n             invocation of ripgrep. Type settings are NOT persisted.\"\n        );\n\n        h\n    };\n}\n\nfn main() {\n    divan::main();\n}\n"
  },
  {
    "path": "clap_bench/benches/rustup.rs",
    "content": "//! Used to simulate a fairly large number of subcommands\n//!\n//! CLI used is from rustup 408ed84f0e50511ed44a405dd91365e5da588790\n\n#![allow(elided_lifetimes_in_paths)] // needed for divan\n\nuse clap::{Arg, ArgAction, ArgGroup, ArgMatches, Command};\n\n#[divan::bench]\nfn build() -> Command {\n    build_cli()\n}\n\nmod startup {\n    use super::{ArgMatches, build_cli};\n\n    #[divan::bench]\n    fn empty() -> ArgMatches {\n        build_cli().get_matches_from([\"\"])\n    }\n\n    #[divan::bench]\n    fn sc() -> ArgMatches {\n        build_cli().get_matches_from([\"rustup override add stable\"])\n    }\n}\n\nfn build_cli() -> Command {\n    Command::new(\"rustup\")\n        .version(\"0.9.0\") // Simulating\n        .about(\"The Rust toolchain installer\")\n        .after_help(RUSTUP_HELP)\n        .arg(\n            Arg::new(\"verbose\")\n                .help(\"Enable verbose output\")\n                .short('v')\n                .long(\"verbose\")\n                .action(ArgAction::SetTrue),\n        )\n        .subcommand(\n            Command::new(\"show\")\n                .about(\"Show the active and installed toolchains\")\n                .after_help(SHOW_HELP),\n        )\n        .subcommand(\n            Command::new(\"install\")\n                .about(\"Update Rust toolchains\")\n                .after_help(TOOLCHAIN_INSTALL_HELP)\n                .hide(true) // synonym for 'toolchain install'\n                .arg(Arg::new(\"toolchain\").required(true)),\n        )\n        .subcommand(\n            Command::new(\"update\")\n                .about(\"Update Rust toolchains\")\n                .after_help(UPDATE_HELP)\n                .arg(Arg::new(\"toolchain\").required(true))\n                .arg(\n                    Arg::new(\"no-self-update\")\n                        .help(\"Don't perform self update when running the `rustup` command\")\n                        .long(\"no-self-update\")\n                        .action(ArgAction::SetTrue)\n                        .hide(true),\n                ),\n        )\n        .subcommand(\n            Command::new(\"default\")\n                .about(\"Set the default toolchain\")\n                .after_help(DEFAULT_HELP)\n                .arg(Arg::new(\"toolchain\").required(true)),\n        )\n        .subcommand(\n            Command::new(\"toolchain\")\n                .about(\"Modify or query the installed toolchains\")\n                .after_help(TOOLCHAIN_HELP)\n                .subcommand(Command::new(\"list\").about(\"List installed toolchains\"))\n                .subcommand(\n                    Command::new(\"install\")\n                        .about(\"Install or update a given toolchain\")\n                        .arg(Arg::new(\"toolchain\").required(true)),\n                )\n                .subcommand(\n                    Command::new(\"uninstall\")\n                        .about(\"Uninstall a toolchain\")\n                        .arg(Arg::new(\"toolchain\").required(true)),\n                )\n                .subcommand(\n                    Command::new(\"link\")\n                        .about(\"Create a custom toolchain by symlinking to a directory\")\n                        .arg(Arg::new(\"toolchain\").required(true))\n                        .arg(Arg::new(\"path\").required(true)),\n                )\n                .subcommand(\n                    Command::new(\"update\")\n                        .hide(true) // synonym for 'install'\n                        .arg(Arg::new(\"toolchain\").required(true)),\n                )\n                .subcommand(\n                    Command::new(\"add\")\n                        .hide(true) // synonym for 'install'\n                        .arg(Arg::new(\"toolchain\").required(true)),\n                )\n                .subcommand(\n                    Command::new(\"remove\")\n                        .hide(true) // synonym for 'uninstall'\n                        .arg(Arg::new(\"toolchain\").required(true)),\n                ),\n        )\n        .subcommand(\n            Command::new(\"target\")\n                .about(\"Modify a toolchain's supported targets\")\n                .subcommand(\n                    Command::new(\"list\")\n                        .about(\"List installed and available targets\")\n                        .arg(\n                            Arg::new(\"toolchain\")\n                                .long(\"toolchain\")\n                                .action(ArgAction::Set),\n                        ),\n                )\n                .subcommand(\n                    Command::new(\"add\")\n                        .about(\"Add a target to a Rust toolchain\")\n                        .arg(Arg::new(\"target\").required(true))\n                        .arg(\n                            Arg::new(\"toolchain\")\n                                .long(\"toolchain\")\n                                .action(ArgAction::Set),\n                        ),\n                )\n                .subcommand(\n                    Command::new(\"remove\")\n                        .about(\"Remove a target  from a Rust toolchain\")\n                        .arg(Arg::new(\"target\").required(true))\n                        .arg(\n                            Arg::new(\"toolchain\")\n                                .long(\"toolchain\")\n                                .action(ArgAction::Set),\n                        ),\n                )\n                .subcommand(\n                    Command::new(\"install\")\n                        .hide(true) // synonym for 'add'\n                        .arg(Arg::new(\"target\").required(true))\n                        .arg(\n                            Arg::new(\"toolchain\")\n                                .long(\"toolchain\")\n                                .action(ArgAction::Set),\n                        ),\n                )\n                .subcommand(\n                    Command::new(\"uninstall\")\n                        .hide(true) // synonym for 'remove'\n                        .arg(Arg::new(\"target\").required(true))\n                        .arg(\n                            Arg::new(\"toolchain\")\n                                .long(\"toolchain\")\n                                .action(ArgAction::Set),\n                        ),\n                ),\n        )\n        .subcommand(\n            Command::new(\"component\")\n                .about(\"Modify a toolchain's installed components\")\n                .subcommand(\n                    Command::new(\"list\")\n                        .about(\"List installed and available components\")\n                        .arg(\n                            Arg::new(\"toolchain\")\n                                .long(\"toolchain\")\n                                .action(ArgAction::Set),\n                        ),\n                )\n                .subcommand(\n                    Command::new(\"add\")\n                        .about(\"Add a component to a Rust toolchain\")\n                        .arg(Arg::new(\"component\").required(true))\n                        .arg(\n                            Arg::new(\"toolchain\")\n                                .long(\"toolchain\")\n                                .action(ArgAction::Set),\n                        )\n                        .arg(Arg::new(\"target\").long(\"target\").action(ArgAction::Set)),\n                )\n                .subcommand(\n                    Command::new(\"remove\")\n                        .about(\"Remove a component from a Rust toolchain\")\n                        .arg(Arg::new(\"component\").required(true))\n                        .arg(\n                            Arg::new(\"toolchain\")\n                                .long(\"toolchain\")\n                                .action(ArgAction::Set),\n                        )\n                        .arg(Arg::new(\"target\").long(\"target\").action(ArgAction::Set)),\n                ),\n        )\n        .subcommand(\n            Command::new(\"override\")\n                .about(\"Modify directory toolchain overrides\")\n                .after_help(OVERRIDE_HELP)\n                .subcommand(Command::new(\"list\").about(\"List directory toolchain overrides\"))\n                .subcommand(\n                    Command::new(\"set\")\n                        .about(\"Set the override toolchain for a directory\")\n                        .arg(Arg::new(\"toolchain\").required(true)),\n                )\n                .subcommand(\n                    Command::new(\"unset\")\n                        .about(\"Remove the override toolchain for a directory\")\n                        .after_help(OVERRIDE_UNSET_HELP)\n                        .arg(\n                            Arg::new(\"path\")\n                                .long(\"path\")\n                                .action(ArgAction::Set)\n                                .help(\"Path to the directory\"),\n                        )\n                        .arg(\n                            Arg::new(\"nonexistent\")\n                                .long(\"nonexistent\")\n                                .action(ArgAction::SetTrue)\n                                .help(\"Remove override toolchain for all nonexistent directories\"),\n                        ),\n                )\n                .subcommand(\n                    Command::new(\"add\")\n                        .hide(true) // synonym for 'set'\n                        .arg(Arg::new(\"toolchain\").required(true)),\n                )\n                .subcommand(\n                    Command::new(\"remove\")\n                        .hide(true) // synonym for 'unset'\n                        .about(\"Remove the override toolchain for a directory\")\n                        .arg(Arg::new(\"path\").long(\"path\").action(ArgAction::Set))\n                        .arg(\n                            Arg::new(\"nonexistent\")\n                                .long(\"nonexistent\")\n                                .action(ArgAction::SetTrue)\n                                .help(\"Remove override toolchain for all nonexistent directories\"),\n                        ),\n                ),\n        )\n        .subcommand(\n            Command::new(\"run\")\n                .about(\"Run a command with an environment configured for a given toolchain\")\n                .after_help(RUN_HELP)\n                .arg(Arg::new(\"toolchain\").required(true))\n                .arg(\n                    Arg::new(\"command\")\n                        .required(true)\n                        .num_args(1..)\n                        .trailing_var_arg(true),\n                ),\n        )\n        .subcommand(\n            Command::new(\"which\")\n                .about(\"Display which binary will be run for a given command\")\n                .arg(Arg::new(\"command\").required(true)),\n        )\n        .subcommand(\n            Command::new(\"doc\")\n                .about(\"Open the documentation for the current toolchain\")\n                .after_help(DOC_HELP)\n                .arg(\n                    Arg::new(\"book\")\n                        .long(\"book\")\n                        .action(ArgAction::SetTrue)\n                        .help(\"The Rust Programming Language book\"),\n                )\n                .arg(\n                    Arg::new(\"std\")\n                        .long(\"std\")\n                        .action(ArgAction::SetTrue)\n                        .help(\"Standard library API documentation\"),\n                )\n                .group(ArgGroup::new(\"page\").args([\"book\", \"std\"])),\n        )\n        .subcommand(\n            Command::new(\"man\")\n                .about(\"View the man page for a given command\")\n                .arg(Arg::new(\"command\").required(true))\n                .arg(\n                    Arg::new(\"toolchain\")\n                        .long(\"toolchain\")\n                        .action(ArgAction::Set),\n                ),\n        )\n        .subcommand(\n            Command::new(\"self\")\n                .about(\"Modify the rustup installation\")\n                .subcommand(Command::new(\"update\").about(\"Download and install updates to rustup\"))\n                .subcommand(\n                    Command::new(\"uninstall\")\n                        .about(\"Uninstall rustup.\")\n                        .arg(Arg::new(\"no-prompt\").short('y').action(ArgAction::SetTrue)),\n                )\n                .subcommand(\n                    Command::new(\"upgrade-data\").about(\"Upgrade the internal data format.\"),\n                ),\n        )\n        .subcommand(\n            Command::new(\"telemetry\")\n                .about(\"rustup telemetry commands\")\n                .hide(true)\n                .subcommand(Command::new(\"enable\").about(\"Enable rustup telemetry\"))\n                .subcommand(Command::new(\"disable\").about(\"Disable rustup telemetry\"))\n                .subcommand(Command::new(\"analyze\").about(\"Analyze stored telemetry\")),\n        )\n        .subcommand(\n            Command::new(\"set\")\n                .about(\"Alter rustup settings\")\n                .subcommand(\n                    Command::new(\"default-host\")\n                        .about(\"The triple used to identify toolchains when not specified\")\n                        .arg(Arg::new(\"host_triple\").required(true)),\n                ),\n        )\n}\n\nstatic RUSTUP_HELP: &str = r\"\nrustup installs The Rust Programming Language from the official\nrelease channels, enabling you to easily switch between stable, beta,\nand nightly compilers and keep them updated. It makes cross-compiling\nsimpler with binary builds of the standard library for common platforms.\n\nIf you are new to Rust consider running `rustup doc --book`\nto learn Rust.\";\n\nstatic SHOW_HELP: &str = r\"\nShows the name of the active toolchain and the version of `rustc`.\n\nIf the active toolchain has installed support for additional\ncompilation targets, then they are listed as well.\n\nIf there are multiple toolchains installed then all installed\ntoolchains are listed as well.\";\n\nstatic UPDATE_HELP: &str = r\"\nWith no toolchain specified, the `update` command updates each of the\ninstalled toolchains from the official release channels, then updates\nrustup itself.\n\nIf given a toolchain argument then `update` updates that toolchain,\nthe same as `rustup toolchain install`.\n\n'toolchain' specifies a toolchain name, such as 'stable', 'nightly',\nor '1.8.0'. For more information see `rustup help toolchain`.\";\n\nstatic TOOLCHAIN_INSTALL_HELP: &str = r\"\nInstalls a specific rust toolchain.\n\nThe 'install' command is an alias for 'rustup update <toolchain>'.\n\n'toolchain' specifies a toolchain name, such as 'stable', 'nightly',\nor '1.8.0'. For more information see `rustup help toolchain`.\";\n\nstatic DEFAULT_HELP: &str = r\"\nSets the default toolchain to the one specified. If the toolchain is\nnot already installed then it is installed first.\";\n\nstatic TOOLCHAIN_HELP: &str = r\"\nMany `rustup` commands deal with *toolchains*, a single installation\nof the Rust compiler. `rustup` supports multiple types of\ntoolchains. The most basic track the official release channels:\n'stable', 'beta' and 'nightly'; but `rustup` can also install\ntoolchains from the official archives, for alternate host platforms,\nand from local builds.\n\nStandard release channel toolchain names have the following form:\n\n    <channel>[-<date>][-<host>]\n\n    <channel>       = stable|beta|nightly|<version>\n    <date>          = YYYY-MM-DD\n    <host>          = <target-triple>\n\n'channel' is either a named release channel or an explicit version\nnumber, such as '1.8.0'. Channel names can be optionally appended with\nan archive date, as in 'nightly-2014-12-18', in which case the\ntoolchain is downloaded from the archive for that date.\n\nFinally, the host may be specified as a target triple. This is most\nuseful for installing a 32-bit compiler on a 64-bit platform, or for\ninstalling the [MSVC-based toolchain] on Windows. For example:\n\n    rustup toolchain install stable-x86_64-pc-windows-msvc\n\nFor convenience, elements of the target triple that are omitted will be\ninferred, so the above could be written:\n\n    $ rustup default stable-msvc\n\nToolchain names that don't name a channel instead can be used to name\ncustom toolchains with the `rustup toolchain link` command.\";\n\nstatic OVERRIDE_HELP: &str = r\"\nOverrides configure rustup to use a specific toolchain when\nrunning in a specific directory.\n\nDirectories can be assigned their own Rust toolchain with\n`rustup override`. When a directory has an override then\nany time `rustc` or `cargo` is run inside that directory,\nor one of its child directories, the override toolchain\nwill be invoked.\n\nTo pin to a specific nightly:\n\n    rustup override set nightly-2014-12-18\n\nOr a specific stable release:\n\n    rustup override set 1.0.0\n\nTo see the active toolchain use `rustup show`. To remove the override\nand use the default toolchain again, `rustup override unset`.\";\n\nstatic OVERRIDE_UNSET_HELP: &str = r\"\nIf `--path` argument is present, removes the override toolchain for\nthe specified directory. If `--nonexistent` argument is present, removes\nthe override toolchain for all nonexistent directories. Otherwise,\nremoves the override toolchain for the current directory.\";\n\nstatic RUN_HELP: &str = r\"\nConfigures an environment to use the given toolchain and then runs\nthe specified program. The command may be any program, not just\nrustc or cargo. This can be used for testing arbitrary toolchains\nwithout setting an override.\n\nCommands explicitly proxied by `rustup` (such as `rustc` and `cargo`)\nalso have a shorthand for this available. The toolchain can be set by\nusing `+toolchain` as the first argument. These are equivalent:\n\n    cargo +nightly build\n\n    rustup run nightly cargo build\";\n\nstatic DOC_HELP: &str = r\"\nOpens the documentation for the currently active toolchain with the\ndefault browser.\n\nBy default, it opens the documentation index. Use the various flags to\nopen specific pieces of documentation.\";\n\nfn main() {\n    divan::main();\n}\n"
  },
  {
    "path": "clap_bench/benches/simple.rs",
    "content": "#![allow(elided_lifetimes_in_paths)] // needed for divan\n\nuse clap::{ArgMatches, Command, arg};\n\nmacro_rules! create_app {\n    () => {{\n        Command::new(\"claptests\")\n            .version(\"0.1\")\n            .about(\"tests clap library\")\n            .author(\"Kevin K. <kbknapp@gmail.com>\")\n            .arg(arg!(-f --flag         \"tests flags\"))\n            .arg(arg!(-o --option <opt> \"tests options\"))\n            .arg(arg!([positional]      \"tests positional\"))\n    }};\n}\n\n#[divan::bench]\nfn build() -> Command {\n    create_app!()\n}\n\nmod startup {\n    use super::{ArgMatches, Command, arg};\n\n    #[divan::bench]\n    fn flag() -> ArgMatches {\n        create_app!().get_matches_from(vec![\"myprog\", \"-f\"])\n    }\n\n    #[divan::bench]\n    fn opt() -> ArgMatches {\n        create_app!().get_matches_from(vec![\"myprog\", \"-o\", \"option1\"])\n    }\n\n    #[divan::bench]\n    fn pos() -> ArgMatches {\n        create_app!().get_matches_from(vec![\"myprog\", \"arg1\"])\n    }\n}\n\n#[divan::bench]\nfn render_help(bencher: divan::Bencher) {\n    let mut cmd = create_app!();\n    bencher.bench_local(|| build_help(&mut cmd));\n}\n\nfn build_help(cmd: &mut Command) -> String {\n    let help = cmd.render_help();\n    help.to_string()\n}\n\nfn main() {\n    divan::main();\n}\n"
  },
  {
    "path": "clap_bench/src/lib.rs",
    "content": "#![cfg_attr(docsrs, feature(doc_cfg))]\n#![forbid(unsafe_code)]\n#![warn(clippy::print_stderr)]\n#![warn(clippy::print_stdout)]\n"
  },
  {
    "path": "clap_builder/CONTRIBUTING.md",
    "content": "# How to Contribute\n\nSee the [clap-wide CONTRIBUTING.md](../CONTRIBUTING.md).  This will contain `clap_builder` specific notes.\n"
  },
  {
    "path": "clap_builder/Cargo.toml",
    "content": "[package]\nname = \"clap_builder\"\nversion = \"4.6.0\"\ndescription = \"A simple to use, efficient, and full-featured Command Line Argument Parser\"\ncategories = [\"command-line-interface\"]\nkeywords = [\n  \"argument\",\n  \"cli\",\n  \"arg\",\n  \"parser\",\n  \"parse\"\n]\nrepository.workspace = true\nlicense.workspace = true\nedition.workspace = true\nrust-version.workspace = true\ninclude.workspace = true\n\n[package.metadata.docs.rs]\nfeatures = [\"unstable-doc\"]\nrustdoc-args = [\"--generate-link-to-definition\"]\n\n[package.metadata.playground]\nfeatures = [\"unstable-doc\"]\n\n[package.metadata.release]\nshared-version = true\ndependent-version = \"upgrade\"\ntag-name = \"v{{version}}\"\n\n[features]\ndefault = [\"std\", \"color\", \"help\", \"usage\", \"error-context\", \"suggestions\"]\ndebug = [\"dep:backtrace\"] # Enables debug messages\nunstable-doc = [\"cargo\", \"wrap_help\", \"env\", \"unicode\", \"string\", \"unstable-ext\"] # for docs.rs\n\n# Used in default\nstd = [\"anstyle/std\"] # support for no_std in a backwards-compatible way\ncolor = [\"dep:anstream\"]\nhelp = []\nusage = []\nerror-context = []\nsuggestions = [\"dep:strsim\", \"error-context\"]\n\n# Optional\ndeprecated = [] # Guided experience to prepare for next breaking release (at different stages of development, this may become default)\ncargo = [] # Disable if you're not using Cargo, enables Cargo-env-var-dependent macros\nwrap_help = [\"help\", \"dep:terminal_size\"]\nenv = [] # Use environment variables during arg parsing\nunicode = [\"dep:unicode-width\", \"dep:unicase\"]  # Support for unicode characters in arguments and help messages\nstring = []  # Allow runtime generated strings\n\n# In-work features\nunstable-v5 = [\"deprecated\"]\nunstable-ext = []\nunstable-styles = [\"color\"]  # deprecated\n\n[lib]\nbench = false\n\n[dependencies]\nclap_lex = { path = \"../clap_lex\", version = \"1.0.0\" }\nunicase = { version = \"2.9.0\", optional = true }\nstrsim = { version = \"0.11.1\",  optional = true }\nanstream = { version = \"1.0.0\", optional = true }\nanstyle = \"1.0.13\"\nterminal_size = { version = \"0.4.3\", optional = true }\nbacktrace = { version = \"0.3.76\", optional = true }\nunicode-width = { version = \"0.2.2\", optional = true }\n\n[dev-dependencies]\nstatic_assertions = \"1.1.0\"\nunic-emoji-char = \"0.9.0\"\ncolor-print = \"0.3.7\"\nsnapbox = { version = \"1.1.0\" }\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "clap_builder/README.md",
    "content": "# `clap_builder`\n\nBuilder implementation for clap.\n\n[docs.rs](https://docs.rs/clap)\n- [Derive Tutorial](https://docs.rs/clap/latest/clap/_derive/_tutorial/index.html)\n- [Derive Reference](https://docs.rs/clap/latest/clap/_derive/index.html)\n\n## License\n\nLicensed under either of\n\n* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or <https://www.apache.org/licenses/LICENSE-2.0>)\n* MIT license ([LICENSE-MIT](LICENSE-MIT) or <https://opensource.org/license/mit>)\n\nat your option.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally\nsubmitted for inclusion in the work by you, as defined in the Apache-2.0\nlicense, shall be dual-licensed as above, without any additional terms or\nconditions.\n\nSee [CONTRIBUTING](CONTRIBUTING.md) for more details.\n"
  },
  {
    "path": "clap_builder/src/builder/action.rs",
    "content": "#[cfg(debug_assertions)]\nuse crate::util::AnyValueId;\n\nuse crate::builder::ValueRange;\n\n/// Behavior of arguments when they are encountered while parsing\n///\n/// # Examples\n///\n/// ```rust\n/// # #[cfg(feature = \"help\")] {\n/// # use clap_builder as clap;\n/// # use clap::Command;\n/// # use clap::Arg;\n/// let cmd = Command::new(\"mycmd\")\n///     .arg(\n///         Arg::new(\"special-help\")\n///             .short('?')\n///             .action(clap::ArgAction::Help)\n///     );\n///\n/// // Existing help still exists\n/// let err = cmd.clone().try_get_matches_from([\"mycmd\", \"-h\"]).unwrap_err();\n/// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);\n///\n/// // New help available\n/// let err = cmd.try_get_matches_from([\"mycmd\", \"-?\"]).unwrap_err();\n/// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);\n/// # }\n/// ```\n#[derive(Clone, Debug)]\n#[non_exhaustive]\n#[allow(missing_copy_implementations)] // In the future, we may accept `Box<dyn ...>`\npub enum ArgAction {\n    /// When encountered, store the associated value(s) in [`ArgMatches`][crate::ArgMatches]\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** If the argument has previously been seen, it will result in a\n    /// [`ArgumentConflict`][crate::error::ErrorKind::ArgumentConflict] unless\n    /// [`Command::args_override_self(true)`][crate::Command::args_override_self] is set.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::Set)\n    ///     );\n    ///\n    /// let matches = cmd.try_get_matches_from([\"mycmd\", \"--flag\", \"value\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_many::<String>(\"flag\").unwrap_or_default().map(|v| v.as_str()).collect::<Vec<_>>(),\n    ///     vec![\"value\"]\n    /// );\n    /// ```\n    Set,\n    /// When encountered, store the associated value(s) in [`ArgMatches`][crate::ArgMatches]\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::Append)\n    ///     );\n    ///\n    /// let matches = cmd.try_get_matches_from([\"mycmd\", \"--flag\", \"value1\", \"--flag\", \"value2\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_many::<String>(\"flag\").unwrap_or_default().map(|v| v.as_str()).collect::<Vec<_>>(),\n    ///     vec![\"value1\", \"value2\"]\n    /// );\n    /// ```\n    Append,\n    /// When encountered, act as if `\"true\"` was encountered on the command-line\n    ///\n    /// If no [`default_value`][super::Arg::default_value] is set, it will be `false`.\n    ///\n    /// No value is allowed. To optionally accept a value, see\n    /// [`Arg::default_missing_value`][super::Arg::default_missing_value]\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** If the argument has previously been seen, it will result in a\n    /// [`ArgumentConflict`][crate::error::ErrorKind::ArgumentConflict] unless\n    /// [`Command::args_override_self(true)`][crate::Command::args_override_self] is set.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::SetTrue)\n    ///     );\n    ///\n    /// let matches = cmd.clone().try_get_matches_from([\"mycmd\", \"--flag\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_flag(\"flag\"),\n    ///     true\n    /// );\n    ///\n    /// let matches = cmd.try_get_matches_from([\"mycmd\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_flag(\"flag\"),\n    ///     false\n    /// );\n    /// ```\n    ///\n    /// You can use [`TypedValueParser::map`][crate::builder::TypedValueParser::map] to have the\n    /// flag control an application-specific type:\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// # use clap::builder::TypedValueParser as _;\n    /// # use clap::builder::BoolishValueParser;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::SetTrue)\n    ///             .value_parser(\n    ///                 BoolishValueParser::new()\n    ///                 .map(|b| -> usize {\n    ///                     if b { 10 } else { 5 }\n    ///                 })\n    ///             )\n    ///     );\n    ///\n    /// let matches = cmd.clone().try_get_matches_from([\"mycmd\", \"--flag\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_one::<usize>(\"flag\").copied(),\n    ///     Some(10)\n    /// );\n    ///\n    /// let matches = cmd.try_get_matches_from([\"mycmd\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_one::<usize>(\"flag\").copied(),\n    ///     Some(5)\n    /// );\n    /// ```\n    SetTrue,\n    /// When encountered, act as if `\"false\"` was encountered on the command-line\n    ///\n    /// If no [`default_value`][super::Arg::default_value] is set, it will be `true`.\n    ///\n    /// No value is allowed. To optionally accept a value, see\n    /// [`Arg::default_missing_value`][super::Arg::default_missing_value]\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** If the argument has previously been seen, it will result in a\n    /// [`ArgumentConflict`][crate::error::ErrorKind::ArgumentConflict] unless\n    /// [`Command::args_override_self(true)`][crate::Command::args_override_self] is set.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::SetFalse)\n    ///     );\n    ///\n    /// let matches = cmd.clone().try_get_matches_from([\"mycmd\", \"--flag\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_flag(\"flag\"),\n    ///     false\n    /// );\n    ///\n    /// let matches = cmd.try_get_matches_from([\"mycmd\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_flag(\"flag\"),\n    ///     true\n    /// );\n    /// ```\n    SetFalse,\n    /// When encountered, increment a `u8` counter starting from `0`.\n    ///\n    /// If no [`default_value`][super::Arg::default_value] is set, it will be `0`.\n    ///\n    /// No value is allowed. To optionally accept a value, see\n    /// [`Arg::default_missing_value`][super::Arg::default_missing_value]\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::Count)\n    ///     );\n    ///\n    /// let matches = cmd.clone().try_get_matches_from([\"mycmd\", \"--flag\", \"--flag\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_count(\"flag\"),\n    ///     2\n    /// );\n    ///\n    /// let matches = cmd.try_get_matches_from([\"mycmd\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_count(\"flag\"),\n    ///     0\n    /// );\n    /// ```\n    Count,\n    /// When encountered, display [`Command::print_help`][super::Command::print_help]\n    ///\n    /// Depending on the flag, [`Command::print_long_help`][super::Command::print_long_help] may be shown\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"special-help\")\n    ///             .short('?')\n    ///             .action(clap::ArgAction::Help)\n    ///     );\n    ///\n    /// // Existing help still exists\n    /// let err = cmd.clone().try_get_matches_from([\"mycmd\", \"-h\"]).unwrap_err();\n    /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);\n    ///\n    /// // New help available\n    /// let err = cmd.try_get_matches_from([\"mycmd\", \"-?\"]).unwrap_err();\n    /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);\n    /// # }\n    /// ```\n    Help,\n    /// When encountered, display [`Command::print_help`][super::Command::print_help]\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"special-help\")\n    ///             .short('?')\n    ///             .action(clap::ArgAction::HelpShort)\n    ///     );\n    ///\n    /// // Existing help still exists\n    /// let err = cmd.clone().try_get_matches_from([\"mycmd\", \"-h\"]).unwrap_err();\n    /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);\n    ///\n    /// // New help available\n    /// let err = cmd.try_get_matches_from([\"mycmd\", \"-?\"]).unwrap_err();\n    /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);\n    /// # }\n    /// ```\n    HelpShort,\n    /// When encountered, display [`Command::print_long_help`][super::Command::print_long_help]\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"special-help\")\n    ///             .short('?')\n    ///             .action(clap::ArgAction::HelpLong)\n    ///     );\n    ///\n    /// // Existing help still exists\n    /// let err = cmd.clone().try_get_matches_from([\"mycmd\", \"-h\"]).unwrap_err();\n    /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);\n    ///\n    /// // New help available\n    /// let err = cmd.try_get_matches_from([\"mycmd\", \"-?\"]).unwrap_err();\n    /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);\n    /// # }\n    /// ```\n    HelpLong,\n    /// When encountered, display [`Command::version`][super::Command::version]\n    ///\n    /// Depending on the flag, [`Command::long_version`][super::Command::long_version] may be shown\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .version(\"1.0.0\")\n    ///     .arg(\n    ///         Arg::new(\"special-version\")\n    ///             .long(\"special-version\")\n    ///             .action(clap::ArgAction::Version)\n    ///     );\n    ///\n    /// // Existing version still exists\n    /// let err = cmd.clone().try_get_matches_from([\"mycmd\", \"--version\"]).unwrap_err();\n    /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayVersion);\n    ///\n    /// // New version available\n    /// let err = cmd.try_get_matches_from([\"mycmd\", \"--special-version\"]).unwrap_err();\n    /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayVersion);\n    /// ```\n    Version,\n}\n\nimpl ArgAction {\n    /// Returns whether this action accepts values on the command-line\n    ///\n    /// [`default_values`][super::Arg::default_values] and [`env`][super::Arg::env] may still be\n    /// processed.\n    pub fn takes_values(&self) -> bool {\n        match self {\n            Self::Set => true,\n            Self::Append => true,\n            Self::SetTrue => false,\n            Self::SetFalse => false,\n            Self::Count => false,\n            Self::Help => false,\n            Self::HelpShort => false,\n            Self::HelpLong => false,\n            Self::Version => false,\n        }\n    }\n\n    #[cfg(debug_assertions)]\n    pub(crate) fn max_num_args(&self) -> ValueRange {\n        match self {\n            Self::Set => ValueRange::FULL,\n            Self::Append => ValueRange::FULL,\n            Self::SetTrue => ValueRange::OPTIONAL,\n            Self::SetFalse => ValueRange::OPTIONAL,\n            Self::Count => ValueRange::EMPTY,\n            Self::Help => ValueRange::EMPTY,\n            Self::HelpShort => ValueRange::EMPTY,\n            Self::HelpLong => ValueRange::EMPTY,\n            Self::Version => ValueRange::EMPTY,\n        }\n    }\n\n    pub(crate) fn default_num_args(&self) -> ValueRange {\n        match self {\n            Self::Set => ValueRange::SINGLE,\n            Self::Append => ValueRange::SINGLE,\n            Self::SetTrue => ValueRange::EMPTY,\n            Self::SetFalse => ValueRange::EMPTY,\n            Self::Count => ValueRange::EMPTY,\n            Self::Help => ValueRange::EMPTY,\n            Self::HelpShort => ValueRange::EMPTY,\n            Self::HelpLong => ValueRange::EMPTY,\n            Self::Version => ValueRange::EMPTY,\n        }\n    }\n\n    pub(crate) fn default_value(&self) -> Option<&'static std::ffi::OsStr> {\n        match self {\n            Self::Set => None,\n            Self::Append => None,\n            Self::SetTrue => Some(std::ffi::OsStr::new(\"false\")),\n            Self::SetFalse => Some(std::ffi::OsStr::new(\"true\")),\n            Self::Count => Some(std::ffi::OsStr::new(\"0\")),\n            Self::Help => None,\n            Self::HelpShort => None,\n            Self::HelpLong => None,\n            Self::Version => None,\n        }\n    }\n\n    pub(crate) fn default_missing_value(&self) -> Option<&'static std::ffi::OsStr> {\n        match self {\n            Self::Set => None,\n            Self::Append => None,\n            Self::SetTrue => Some(std::ffi::OsStr::new(\"true\")),\n            Self::SetFalse => Some(std::ffi::OsStr::new(\"false\")),\n            Self::Count => None,\n            Self::Help => None,\n            Self::HelpShort => None,\n            Self::HelpLong => None,\n            Self::Version => None,\n        }\n    }\n\n    pub(crate) fn default_value_parser(&self) -> Option<super::ValueParser> {\n        match self {\n            Self::Set => None,\n            Self::Append => None,\n            Self::SetTrue => Some(super::ValueParser::bool()),\n            Self::SetFalse => Some(super::ValueParser::bool()),\n            Self::Count => Some(crate::value_parser!(u8).into()),\n            Self::Help => None,\n            Self::HelpShort => None,\n            Self::HelpLong => None,\n            Self::Version => None,\n        }\n    }\n\n    #[cfg(debug_assertions)]\n    pub(crate) fn value_type_id(&self) -> Option<AnyValueId> {\n        match self {\n            Self::Set => None,\n            Self::Append => None,\n            Self::SetTrue => None,\n            Self::SetFalse => None,\n            Self::Count => Some(AnyValueId::of::<CountType>()),\n            Self::Help => None,\n            Self::HelpShort => None,\n            Self::HelpLong => None,\n            Self::Version => None,\n        }\n    }\n}\n\npub(crate) type CountType = u8;\n"
  },
  {
    "path": "clap_builder/src/builder/app_settings.rs",
    "content": "#[allow(unused)]\nuse crate::Arg;\n#[allow(unused)]\nuse crate::Command;\n\n#[derive(Default, Copy, Clone, Debug, PartialEq, Eq)]\npub(crate) struct AppFlags(u32);\n\nimpl AppFlags {\n    pub(crate) fn set(&mut self, setting: AppSettings) {\n        self.0 |= setting.bit();\n    }\n\n    pub(crate) fn unset(&mut self, setting: AppSettings) {\n        self.0 &= !setting.bit();\n    }\n\n    pub(crate) fn is_set(&self, setting: AppSettings) -> bool {\n        self.0 & setting.bit() != 0\n    }\n\n    pub(crate) fn insert(&mut self, other: Self) {\n        self.0 |= other.0;\n    }\n}\n\nimpl std::ops::BitOr for AppFlags {\n    type Output = Self;\n\n    fn bitor(mut self, rhs: Self) -> Self::Output {\n        self.insert(rhs);\n        self\n    }\n}\n\n/// Application level settings, which affect how [`Command`] operates\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** When these settings are used, they apply only to current command, and are *not*\n/// propagated down or up through child or parent subcommands\n///\n/// </div>\n///\n/// [`Command`]: crate::Command\n#[derive(Debug, PartialEq, Copy, Clone)]\n#[repr(u8)]\npub(crate) enum AppSettings {\n    IgnoreErrors,\n    AllowHyphenValues,\n    AllowNegativeNumbers,\n    AllArgsOverrideSelf,\n    AllowMissingPositional,\n    TrailingVarArg,\n    DontDelimitTrailingValues,\n    InferLongArgs,\n    InferSubcommands,\n    SubcommandRequired,\n    AllowExternalSubcommands,\n    Multicall,\n    SubcommandsNegateReqs,\n    ArgsNegateSubcommands,\n    SubcommandPrecedenceOverArg,\n    FlattenHelp,\n    ArgRequiredElseHelp,\n    NextLineHelp,\n    DisableColoredHelp,\n    DisableHelpFlag,\n    DisableHelpSubcommand,\n    DisableVersionFlag,\n    PropagateVersion,\n    Hidden,\n    HidePossibleValues,\n    HelpExpected,\n    NoBinaryName,\n    #[allow(dead_code)]\n    ColorAuto,\n    ColorAlways,\n    ColorNever,\n    Built,\n    BinNameBuilt,\n}\n\nimpl AppSettings {\n    fn bit(self) -> u32 {\n        1 << (self as u8)\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/arg.rs",
    "content": "// Std\n#[cfg(feature = \"env\")]\nuse std::env;\n#[cfg(feature = \"env\")]\nuse std::ffi::OsString;\nuse std::{\n    cmp::{Ord, Ordering},\n    fmt::{self, Display, Formatter},\n    str,\n};\n\n// Internal\nuse super::{ArgFlags, ArgSettings};\nuse crate::ArgAction;\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::Id;\nuse crate::ValueHint;\nuse crate::builder::ArgPredicate;\nuse crate::builder::IntoResettable;\nuse crate::builder::OsStr;\nuse crate::builder::PossibleValue;\nuse crate::builder::Str;\nuse crate::builder::StyledStr;\nuse crate::builder::Styles;\nuse crate::builder::ValueRange;\n#[cfg(feature = \"unstable-ext\")]\nuse crate::builder::ext::Extension;\nuse crate::builder::ext::Extensions;\nuse crate::util::AnyValueId;\n\n/// The abstract representation of a command line argument. Used to set all the options and\n/// relationships that define a valid argument for the program.\n///\n/// There are two methods for constructing [`Arg`]s, using the builder pattern and setting options\n/// manually, or using a usage string which is far less verbose but has fewer options. You can also\n/// use a combination of the two methods to achieve the best of both worlds.\n///\n/// - [Basic API][crate::Arg#basic-api]\n/// - [Value Handling][crate::Arg#value-handling]\n/// - [Help][crate::Arg#help-1]\n/// - [Advanced Argument Relations][crate::Arg#advanced-argument-relations]\n/// - [Reflection][crate::Arg#reflection]\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::{Arg, arg, ArgAction};\n/// // Using the traditional builder pattern and setting each option manually\n/// let cfg = Arg::new(\"config\")\n///       .short('c')\n///       .long(\"config\")\n///       .action(ArgAction::Set)\n///       .value_name(\"FILE\")\n///       .help(\"Provides a config file to myprog\");\n/// // Using a usage string (setting a similar argument to the one above)\n/// let input = arg!(-i --input <FILE> \"Provides an input file to the program\");\n/// ```\n#[derive(Default, Clone)]\npub struct Arg {\n    pub(crate) id: Id,\n    pub(crate) help: Option<StyledStr>,\n    pub(crate) long_help: Option<StyledStr>,\n    pub(crate) action: Option<ArgAction>,\n    pub(crate) value_parser: Option<super::ValueParser>,\n    pub(crate) blacklist: Vec<Id>,\n    pub(crate) settings: ArgFlags,\n    pub(crate) overrides: Vec<Id>,\n    pub(crate) groups: Vec<Id>,\n    pub(crate) requires: Vec<(ArgPredicate, Id)>,\n    pub(crate) r_ifs: Vec<(Id, OsStr)>,\n    pub(crate) r_ifs_all: Vec<(Id, OsStr)>,\n    pub(crate) r_unless: Vec<Id>,\n    pub(crate) r_unless_all: Vec<Id>,\n    pub(crate) short: Option<char>,\n    pub(crate) long: Option<Str>,\n    pub(crate) aliases: Vec<(Str, bool)>, // (name, visible)\n    pub(crate) short_aliases: Vec<(char, bool)>, // (name, visible)\n    pub(crate) disp_ord: Option<usize>,\n    pub(crate) val_names: Vec<Str>,\n    pub(crate) num_vals: Option<ValueRange>,\n    pub(crate) val_delim: Option<char>,\n    pub(crate) default_vals: Vec<OsStr>,\n    pub(crate) default_vals_ifs: Vec<(Id, ArgPredicate, Option<Vec<OsStr>>)>,\n    pub(crate) default_missing_vals: Vec<OsStr>,\n    #[cfg(feature = \"env\")]\n    pub(crate) env: Option<(OsStr, Option<OsString>)>,\n    pub(crate) terminator: Option<Str>,\n    pub(crate) index: Option<usize>,\n    pub(crate) help_heading: Option<Option<Str>>,\n    pub(crate) ext: Extensions,\n}\n\n/// # Basic API\nimpl Arg {\n    /// Create a new [`Arg`] with a unique name.\n    ///\n    /// The name is used to check whether or not the argument was used at\n    /// runtime, get values, set relationships with other args, etc..\n    ///\n    /// By default, an `Arg` is\n    /// - Positional, see [`Arg::short`] or [`Arg::long`] turn it into an option\n    /// - Accept a single value, see [`Arg::action`] to override this\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** In the case of arguments that take values (i.e. [`Arg::action(ArgAction::Set)`])\n    /// and positional arguments (i.e. those without a preceding `-` or `--`) the name will also\n    /// be displayed when the user prints the usage/help information of the program.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Arg::new(\"config\")\n    /// # ;\n    /// ```\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    pub fn new(id: impl Into<Id>) -> Self {\n        Arg::default().id(id)\n    }\n\n    /// Set the identifier used for referencing this argument in the clap API.\n    ///\n    /// See [`Arg::new`] for more details.\n    #[must_use]\n    pub fn id(mut self, id: impl Into<Id>) -> Self {\n        self.id = id.into();\n        self\n    }\n\n    /// Sets the short version of the argument without the preceding `-`.\n    ///\n    /// By default `V` and `h` are used by the auto-generated `version` and `help` arguments,\n    /// respectively. You will need to disable the auto-generated flags\n    /// ([`disable_help_flag`][crate::Command::disable_help_flag],\n    /// [`disable_version_flag`][crate::Command::disable_version_flag]) and define your own.\n    ///\n    /// # Examples\n    ///\n    /// When calling `short`, use a single valid UTF-8 character which will allow using the\n    /// argument via a single hyphen (`-`) such as `-c`:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg,  ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"config\")\n    ///         .short('c')\n    ///         .action(ArgAction::Set))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"-c\", \"file.toml\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"config\").map(String::as_str), Some(\"file.toml\"));\n    /// ```\n    ///\n    /// To use `-h` for your own flag and still have help:\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg,  ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .disable_help_flag(true)\n    ///     .arg(Arg::new(\"host\")\n    ///         .short('h')\n    ///         .long(\"host\"))\n    ///     .arg(Arg::new(\"help\")\n    ///         .long(\"help\")\n    ///         .global(true)\n    ///         .action(ArgAction::Help))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"-h\", \"wikipedia.org\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"host\").map(String::as_str), Some(\"wikipedia.org\"));\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn short(mut self, s: impl IntoResettable<char>) -> Self {\n        if let Some(s) = s.into_resettable().into_option() {\n            debug_assert!(s != '-', \"short option name cannot be `-`\");\n            self.short = Some(s);\n        } else {\n            self.short = None;\n        }\n        self\n    }\n\n    /// Sets the long version of the argument without the preceding `--`.\n    ///\n    /// By default `version` and `help` are used by the auto-generated `version` and `help`\n    /// arguments, respectively. You may use the word `version` or `help` for the long form of your\n    /// own arguments, in which case `clap` simply will not assign those to the auto-generated\n    /// `version` or `help` arguments.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Any leading `-` characters will be stripped\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// To set `long` use a word containing valid UTF-8. If you supply a double leading\n    /// `--` such as `--config` they will be stripped. Hyphens in the middle of the word, however,\n    /// will *not* be stripped (i.e. `config-file` is allowed).\n    ///\n    /// Setting `long` allows using the argument via a double hyphen (`--`) such as `--config`\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .long(\"config\")\n    ///         .action(ArgAction::Set))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--config\", \"file.toml\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"cfg\").map(String::as_str), Some(\"file.toml\"));\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn long(mut self, l: impl IntoResettable<Str>) -> Self {\n        self.long = l.into_resettable().into_option();\n        self\n    }\n\n    /// Add an alias, which functions as a hidden long flag.\n    ///\n    /// This is more efficient, and easier than creating multiple hidden arguments as one only\n    /// needs to check for the existence of this command, and not all variants.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///             .arg(Arg::new(\"test\")\n    ///             .long(\"test\")\n    ///             .alias(\"alias\")\n    ///             .action(ArgAction::Set))\n    ///        .get_matches_from(vec![\n    ///             \"prog\", \"--alias\", \"cool\"\n    ///         ]);\n    /// assert_eq!(m.get_one::<String>(\"test\").unwrap(), \"cool\");\n    /// ```\n    #[must_use]\n    pub fn alias(mut self, name: impl IntoResettable<Str>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            self.aliases.push((name, false));\n        } else {\n            self.aliases.clear();\n        }\n        self\n    }\n\n    /// Add an alias, which functions as a hidden short flag.\n    ///\n    /// This is more efficient, and easier than creating multiple hidden arguments as one only\n    /// needs to check for the existence of this command, and not all variants.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///             .arg(Arg::new(\"test\")\n    ///             .short('t')\n    ///             .short_alias('e')\n    ///             .action(ArgAction::Set))\n    ///        .get_matches_from(vec![\n    ///             \"prog\", \"-e\", \"cool\"\n    ///         ]);\n    /// assert_eq!(m.get_one::<String>(\"test\").unwrap(), \"cool\");\n    /// ```\n    #[must_use]\n    pub fn short_alias(mut self, name: impl IntoResettable<char>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            debug_assert!(name != '-', \"short alias name cannot be `-`\");\n            self.short_aliases.push((name, false));\n        } else {\n            self.short_aliases.clear();\n        }\n        self\n    }\n\n    /// Add aliases, which function as hidden long flags.\n    ///\n    /// This is more efficient, and easier than creating multiple hidden subcommands as one only\n    /// needs to check for the existence of this command, and not all variants.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///             .arg(Arg::new(\"test\")\n    ///                     .long(\"test\")\n    ///                     .aliases([\"do-stuff\", \"do-tests\", \"tests\"])\n    ///                     .action(ArgAction::SetTrue)\n    ///                     .help(\"the file to add\")\n    ///                     .required(false))\n    ///             .get_matches_from(vec![\n    ///                 \"prog\", \"--do-tests\"\n    ///             ]);\n    /// assert_eq!(m.get_flag(\"test\"), true);\n    /// ```\n    #[must_use]\n    pub fn aliases(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {\n        self.aliases\n            .extend(names.into_iter().map(|x| (x.into(), false)));\n        self\n    }\n\n    /// Add aliases, which functions as a hidden short flag.\n    ///\n    /// This is more efficient, and easier than creating multiple hidden subcommands as one only\n    /// needs to check for the existence of this command, and not all variants.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///             .arg(Arg::new(\"test\")\n    ///                     .short('t')\n    ///                     .short_aliases(['e', 's'])\n    ///                     .action(ArgAction::SetTrue)\n    ///                     .help(\"the file to add\")\n    ///                     .required(false))\n    ///             .get_matches_from(vec![\n    ///                 \"prog\", \"-s\"\n    ///             ]);\n    /// assert_eq!(m.get_flag(\"test\"), true);\n    /// ```\n    #[must_use]\n    pub fn short_aliases(mut self, names: impl IntoIterator<Item = char>) -> Self {\n        for s in names {\n            debug_assert!(s != '-', \"short alias name cannot be `-`\");\n            self.short_aliases.push((s, false));\n        }\n        self\n    }\n\n    /// Add an alias, which functions as a visible long flag.\n    ///\n    /// Like [`Arg::alias`], except that they are visible inside the help message.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///             .arg(Arg::new(\"test\")\n    ///                 .visible_alias(\"something-awesome\")\n    ///                 .long(\"test\")\n    ///                 .action(ArgAction::Set))\n    ///        .get_matches_from(vec![\n    ///             \"prog\", \"--something-awesome\", \"coffee\"\n    ///         ]);\n    /// assert_eq!(m.get_one::<String>(\"test\").unwrap(), \"coffee\");\n    /// ```\n    /// [`Command::alias`]: Arg::alias()\n    #[must_use]\n    pub fn visible_alias(mut self, name: impl IntoResettable<Str>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            self.aliases.push((name, true));\n        } else {\n            self.aliases.clear();\n        }\n        self\n    }\n\n    /// Add an alias, which functions as a visible short flag.\n    ///\n    /// Like [`Arg::short_alias`], except that they are visible inside the help message.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///             .arg(Arg::new(\"test\")\n    ///                 .long(\"test\")\n    ///                 .visible_short_alias('t')\n    ///                 .action(ArgAction::Set))\n    ///        .get_matches_from(vec![\n    ///             \"prog\", \"-t\", \"coffee\"\n    ///         ]);\n    /// assert_eq!(m.get_one::<String>(\"test\").unwrap(), \"coffee\");\n    /// ```\n    #[must_use]\n    pub fn visible_short_alias(mut self, name: impl IntoResettable<char>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            debug_assert!(name != '-', \"short alias name cannot be `-`\");\n            self.short_aliases.push((name, true));\n        } else {\n            self.short_aliases.clear();\n        }\n        self\n    }\n\n    /// Add aliases, which function as visible long flags.\n    ///\n    /// Like [`Arg::aliases`], except that they are visible inside the help message.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///             .arg(Arg::new(\"test\")\n    ///                 .long(\"test\")\n    ///                 .action(ArgAction::SetTrue)\n    ///                 .visible_aliases([\"something\", \"awesome\", \"cool\"]))\n    ///        .get_matches_from(vec![\n    ///             \"prog\", \"--awesome\"\n    ///         ]);\n    /// assert_eq!(m.get_flag(\"test\"), true);\n    /// ```\n    /// [`Command::aliases`]: Arg::aliases()\n    #[must_use]\n    pub fn visible_aliases(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {\n        self.aliases\n            .extend(names.into_iter().map(|n| (n.into(), true)));\n        self\n    }\n\n    /// Add aliases, which function as visible short flags.\n    ///\n    /// Like [`Arg::short_aliases`], except that they are visible inside the help message.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///             .arg(Arg::new(\"test\")\n    ///                 .long(\"test\")\n    ///                 .action(ArgAction::SetTrue)\n    ///                 .visible_short_aliases(['t', 'e']))\n    ///        .get_matches_from(vec![\n    ///             \"prog\", \"-t\"\n    ///         ]);\n    /// assert_eq!(m.get_flag(\"test\"), true);\n    /// ```\n    #[must_use]\n    pub fn visible_short_aliases(mut self, names: impl IntoIterator<Item = char>) -> Self {\n        for n in names {\n            debug_assert!(n != '-', \"short alias name cannot be `-`\");\n            self.short_aliases.push((n, true));\n        }\n        self\n    }\n\n    /// Specifies the index of a positional argument **starting at** 1.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The index refers to position according to **other positional argument**. It does\n    /// not define position in the argument list as a whole.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** You can optionally leave off the `index` method, and the index will be\n    /// assigned in order of evaluation. Utilizing the `index` method allows for setting\n    /// indexes out of order\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This is only meant to be used for positional arguments and shouldn't to be used\n    /// with [`Arg::short`] or [`Arg::long`].\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** When utilized with [`Arg::num_args(1..)`][Arg::num_args], only the **last** positional argument\n    /// may be defined as having a variable number of arguments (i.e. with the highest index)\n    ///\n    /// </div>\n    ///\n    /// # Panics\n    ///\n    /// [`Command`] will [`panic!`] if indexes are skipped (such as defining `index(1)` and `index(3)`\n    /// but not `index(2)`, or a positional argument is defined as multiple and is not the highest\n    /// index (debug builds)\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Arg::new(\"config\")\n    ///     .index(1)\n    /// # ;\n    /// ```\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"mode\")\n    ///         .index(1))\n    ///     .arg(Arg::new(\"debug\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--debug\", \"fast\"\n    ///     ]);\n    ///\n    /// assert!(m.contains_id(\"mode\"));\n    /// assert_eq!(m.get_one::<String>(\"mode\").unwrap(), \"fast\"); // notice index(1) means \"first positional\"\n    ///                                                           // *not* first argument\n    /// ```\n    /// [`Arg::short`]: Arg::short()\n    /// [`Arg::long`]: Arg::long()\n    /// [`Arg::num_args(true)`]: Arg::num_args()\n    /// [`Command`]: crate::Command\n    #[inline]\n    #[must_use]\n    pub fn index(mut self, idx: impl IntoResettable<usize>) -> Self {\n        self.index = idx.into_resettable().into_option();\n        self\n    }\n\n    /// This is a \"var arg\" and everything that follows should be captured by it, as if the user had\n    /// used a `--`.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** To start the trailing \"var arg\" on unknown flags (and not just a positional\n    /// value), set [`allow_hyphen_values`][Arg::allow_hyphen_values].  Either way, users still\n    /// have the option to explicitly escape ambiguous arguments with `--`.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** [`Arg::value_delimiter`] still applies if set.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this requires [`Arg::num_args(..)`].\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg};\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(arg!(<cmd> ... \"commands to run\").trailing_var_arg(true))\n    ///     .get_matches_from(vec![\"myprog\", \"arg1\", \"-r\", \"val1\"]);\n    ///\n    /// let trail: Vec<_> = m.get_many::<String>(\"cmd\").unwrap().collect();\n    /// assert_eq!(trail, [\"arg1\", \"-r\", \"val1\"]);\n    /// ```\n    /// [`Arg::num_args(..)`]: crate::Arg::num_args()\n    pub fn trailing_var_arg(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::TrailingVarArg)\n        } else {\n            self.unset_setting(ArgSettings::TrailingVarArg)\n        }\n    }\n\n    /// This arg is the last, or final, positional argument (i.e. has the highest\n    /// index) and is *only* able to be accessed via the `--` syntax (i.e. `$ prog args --\n    /// last_arg`).\n    ///\n    /// Even, if no other arguments are left to parse, if the user omits the `--` syntax\n    /// they will receive an [`UnknownArgument`] error. Setting an argument to `.last(true)` also\n    /// allows one to access this arg early using the `--` syntax. Accessing an arg early, even with\n    /// the `--` syntax is otherwise not possible.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This will change the usage string to look like `$ prog [OPTIONS] [-- <ARG>]` if\n    /// `ARG` is marked as `.last(true)`.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This setting will imply [`crate::Command::dont_collapse_args_in_usage`] because failing\n    /// to set this can make the usage string very confusing.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE**: This setting only applies to positional arguments, and has no effect on OPTIONS\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this requires [taking values][Arg::num_args]\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **WARNING:** Using this setting *and* having child subcommands is not\n    /// recommended with the exception of *also* using\n    /// [`crate::Command::args_conflicts_with_subcommands`]\n    /// (or [`crate::Command::subcommand_negates_reqs`] if the argument marked `Last` is also\n    /// marked [`Arg::required`])\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Arg, ArgAction};\n    /// Arg::new(\"args\")\n    ///     .action(ArgAction::Set)\n    ///     .last(true)\n    /// # ;\n    /// ```\n    ///\n    /// Setting `last` ensures the arg has the highest [index] of all positional args\n    /// and requires that the `--` syntax be used to access it early.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"first\"))\n    ///     .arg(Arg::new(\"second\"))\n    ///     .arg(Arg::new(\"third\")\n    ///         .action(ArgAction::Set)\n    ///         .last(true))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"one\", \"--\", \"three\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok());\n    /// let m = res.unwrap();\n    /// assert_eq!(m.get_one::<String>(\"third\").unwrap(), \"three\");\n    /// assert_eq!(m.get_one::<String>(\"second\"), None);\n    /// ```\n    ///\n    /// Even if the positional argument marked `Last` is the only argument left to parse,\n    /// failing to use the `--` syntax results in an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"first\"))\n    ///     .arg(Arg::new(\"second\"))\n    ///     .arg(Arg::new(\"third\")\n    ///         .action(ArgAction::Set)\n    ///         .last(true))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"one\", \"two\", \"three\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);\n    /// ```\n    /// [index]: Arg::index()\n    /// [`UnknownArgument`]: crate::error::ErrorKind::UnknownArgument\n    #[inline]\n    #[must_use]\n    pub fn last(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::Last)\n        } else {\n            self.unset_setting(ArgSettings::Last)\n        }\n    }\n\n    /// Specifies that the argument must be present.\n    ///\n    /// Required by default means it is required, when no other conflicting rules or overrides have\n    /// been evaluated. Conflicting rules take precedence over being required.\n    ///\n    /// **Pro tip:** Flags (i.e. not positional, or arguments that take values) shouldn't be\n    /// required by default. This is because if a flag were to be required, it should simply be\n    /// implied. No additional information is required from user. Flags by their very nature are\n    /// simply boolean on/off switches. The only time a user *should* be required to use a flag\n    /// is if the operation is destructive in nature, and the user is essentially proving to you,\n    /// \"Yes, I know what I'm doing.\"\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .required(true)\n    /// # ;\n    /// ```\n    ///\n    /// Setting required requires that the argument be used at runtime.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required(true)\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--config\", \"file.conf\",\n    ///     ]);\n    ///\n    /// assert!(res.is_ok());\n    /// ```\n    ///\n    /// Setting required and then *not* supplying that argument at runtime is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required(true)\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn required(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::Required)\n        } else {\n            self.unset_setting(ArgSettings::Required)\n        }\n    }\n\n    /// Sets an argument that is required when this one is present\n    ///\n    /// i.e. when using this argument, the following argument *must* be present.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** [Conflicting] rules and [override] rules take precedence over being required\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .requires(\"input\")\n    /// # ;\n    /// ```\n    ///\n    /// Setting [`Arg::requires(name)`] requires that the argument be used at runtime if the\n    /// defining argument is used. If the defining argument isn't used, the other argument isn't\n    /// required\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .requires(\"input\")\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"input\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok()); // We didn't use cfg, so input wasn't required\n    /// ```\n    ///\n    /// Setting [`Arg::requires(name)`] and *not* supplying that argument is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .requires(\"input\")\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"input\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--config\", \"file.conf\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [`Arg::requires(name)`]: Arg::requires()\n    /// [Conflicting]: Arg::conflicts_with()\n    /// [override]: Arg::overrides_with()\n    #[must_use]\n    pub fn requires(mut self, arg_id: impl IntoResettable<Id>) -> Self {\n        if let Some(arg_id) = arg_id.into_resettable().into_option() {\n            self.requires.push((ArgPredicate::IsPresent, arg_id));\n        } else {\n            self.requires.clear();\n        }\n        self\n    }\n\n    /// This argument must be passed alone; it conflicts with all other arguments.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .exclusive(true)\n    /// # ;\n    /// ```\n    ///\n    /// Setting an exclusive argument and having any other arguments present at runtime\n    /// is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"exclusive\")\n    ///         .action(ArgAction::Set)\n    ///         .exclusive(true)\n    ///         .long(\"exclusive\"))\n    ///     .arg(Arg::new(\"debug\")\n    ///         .long(\"debug\"))\n    ///     .arg(Arg::new(\"input\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--exclusive\", \"file.conf\", \"file.txt\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::ArgumentConflict);\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn exclusive(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::Exclusive)\n        } else {\n            self.unset_setting(ArgSettings::Exclusive)\n        }\n    }\n\n    /// Specifies that an argument can be matched to all child [`Subcommand`]s.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Global arguments *only* propagate down, **not** up (to parent commands), however\n    /// their values once a user uses them will be propagated back up to parents. In effect, this\n    /// means one should *define* all global arguments at the top level, however it doesn't matter\n    /// where the user *uses* the global argument.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// Assume an application with two subcommands, and you'd like to define a\n    /// `--verbose` flag that can be called on any of the subcommands and parent, but you don't\n    /// want to clutter the source with three duplicate [`Arg`] definitions.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"verb\")\n    ///         .long(\"verbose\")\n    ///         .short('v')\n    ///         .action(ArgAction::SetTrue)\n    ///         .global(true))\n    ///     .subcommand(Command::new(\"test\"))\n    ///     .subcommand(Command::new(\"do-stuff\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"do-stuff\", \"--verbose\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.subcommand_name(), Some(\"do-stuff\"));\n    /// let sub_m = m.subcommand_matches(\"do-stuff\").unwrap();\n    /// assert_eq!(sub_m.get_flag(\"verb\"), true);\n    /// ```\n    ///\n    /// [`Subcommand`]: crate::Subcommand\n    #[inline]\n    #[must_use]\n    pub fn global(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::Global)\n        } else {\n            self.unset_setting(ArgSettings::Global)\n        }\n    }\n\n    #[inline]\n    pub(crate) fn is_set(&self, s: ArgSettings) -> bool {\n        self.settings.is_set(s)\n    }\n\n    #[inline]\n    #[must_use]\n    pub(crate) fn setting(mut self, setting: ArgSettings) -> Self {\n        self.settings.set(setting);\n        self\n    }\n\n    #[inline]\n    #[must_use]\n    pub(crate) fn unset_setting(mut self, setting: ArgSettings) -> Self {\n        self.settings.unset(setting);\n        self\n    }\n\n    /// Extend [`Arg`] with [`ArgExt`] data\n    #[cfg(feature = \"unstable-ext\")]\n    #[allow(clippy::should_implement_trait)]\n    pub fn add<T: ArgExt + Extension>(mut self, tagged: T) -> Self {\n        self.ext.set(tagged);\n        self\n    }\n}\n\n/// # Value Handling\nimpl Arg {\n    /// Specify how to react to an argument when parsing it.\n    ///\n    /// [`ArgAction`] controls things like\n    /// - Overwriting previous values with new ones\n    /// - Appending new values to all previous ones\n    /// - Counting how many times a flag occurs\n    ///\n    /// The default action is `ArgAction::Set`\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::Append)\n    ///     );\n    ///\n    /// let matches = cmd.try_get_matches_from([\"mycmd\", \"--flag\", \"value\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_many::<String>(\"flag\").unwrap_or_default().map(|v| v.as_str()).collect::<Vec<_>>(),\n    ///     vec![\"value\"]\n    /// );\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn action(mut self, action: impl IntoResettable<ArgAction>) -> Self {\n        self.action = action.into_resettable().into_option();\n        self\n    }\n\n    /// Specify the typed behavior of the argument.\n    ///\n    /// This allows parsing and validating a value before storing it into\n    /// [`ArgMatches`][crate::ArgMatches] as the given type.\n    ///\n    /// Possible value parsers include:\n    /// - [`value_parser!(T)`][crate::value_parser!] for auto-selecting a value parser for a given type\n    ///   - Or [range expressions like `0..=1`][std::ops::RangeBounds] as a shorthand for [`RangedI64ValueParser`][crate::builder::RangedI64ValueParser]\n    /// - `Fn(&str) -> Result<T, E>`\n    /// - `[&str]` and [`PossibleValuesParser`][crate::builder::PossibleValuesParser] for static enumerated values\n    /// - [`BoolishValueParser`][crate::builder::BoolishValueParser], and [`FalseyValueParser`][crate::builder::FalseyValueParser] for alternative `bool` implementations\n    /// - [`NonEmptyStringValueParser`][crate::builder::NonEmptyStringValueParser] for basic validation for strings\n    /// - or any other [`TypedValueParser`][crate::builder::TypedValueParser] implementation\n    ///\n    /// The default value is [`ValueParser::string`][crate::builder::ValueParser::string].\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::ArgAction;\n    /// let mut cmd = clap::Command::new(\"raw\")\n    ///     .arg(\n    ///         clap::Arg::new(\"color\")\n    ///             .long(\"color\")\n    ///             .value_parser([\"always\", \"auto\", \"never\"])\n    ///             .default_value(\"auto\")\n    ///     )\n    ///     .arg(\n    ///         clap::Arg::new(\"hostname\")\n    ///             .long(\"hostname\")\n    ///             .value_parser(clap::builder::NonEmptyStringValueParser::new())\n    ///             .action(ArgAction::Set)\n    ///             .required(true)\n    ///     )\n    ///     .arg(\n    ///         clap::Arg::new(\"port\")\n    ///             .long(\"port\")\n    ///             .value_parser(clap::value_parser!(u16).range(3000..))\n    ///             .action(ArgAction::Set)\n    ///             .required(true)\n    ///     );\n    ///\n    /// let m = cmd.try_get_matches_from_mut(\n    ///     [\"cmd\", \"--hostname\", \"rust-lang.org\", \"--port\", \"3001\"]\n    /// ).unwrap();\n    ///\n    /// let color: &String = m.get_one(\"color\")\n    ///     .expect(\"default\");\n    /// assert_eq!(color, \"auto\");\n    ///\n    /// let hostname: &String = m.get_one(\"hostname\")\n    ///     .expect(\"required\");\n    /// assert_eq!(hostname, \"rust-lang.org\");\n    ///\n    /// let port: u16 = *m.get_one(\"port\")\n    ///     .expect(\"required\");\n    /// assert_eq!(port, 3001);\n    /// ```\n    pub fn value_parser(mut self, parser: impl IntoResettable<super::ValueParser>) -> Self {\n        self.value_parser = parser.into_resettable().into_option();\n        self\n    }\n\n    /// Specifies the number of arguments parsed per occurrence\n    ///\n    /// For example, if you had a `-f <file>` argument where you wanted exactly 3 'files' you would\n    /// set `.num_args(3)`, and this argument wouldn't be satisfied unless the user\n    /// provided 3 and only 3 values.\n    ///\n    /// Users may specify values for arguments in any of the following methods\n    ///\n    /// - Using a space such as `-o value` or `--option value`\n    /// - Using an equals and no space such as `-o=value` or `--option=value`\n    /// - Use a short and no space such as `-ovalue`\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **WARNING:**\n    ///\n    /// Setting a variable number of values (e.g. `1..=10`) for an argument without\n    /// other details can be dangerous in some circumstances. Because multiple values are\n    /// allowed, `--option val1 val2 val3` is perfectly valid. Be careful when designing a CLI\n    /// where **positional arguments** or **subcommands** are *also* expected as `clap` will continue\n    /// parsing *values* until one of the following happens:\n    ///\n    /// - It reaches the maximum number of values\n    /// - It reaches a specific number of values\n    /// - It finds another flag or option (i.e. something that starts with a `-`)\n    /// - It reaches the [`Arg::value_terminator`] if set\n    ///\n    /// Alternatively,\n    /// - Use a delimiter between values with [`Arg::value_delimiter`]\n    /// - Require a flag occurrence per value with [`ArgAction::Append`]\n    /// - Require positional arguments to appear after `--` with [`Arg::last`]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// Option:\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"mode\")\n    ///         .long(\"mode\")\n    ///         .num_args(1))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--mode\", \"fast\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"mode\").unwrap(), \"fast\");\n    /// ```\n    ///\n    /// Flag/option hybrid (see also [`default_missing_value`][Arg::default_missing_value])\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let cmd = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"mode\")\n    ///         .long(\"mode\")\n    ///         .default_missing_value(\"slow\")\n    ///         .default_value(\"plaid\")\n    ///         .num_args(0..=1));\n    ///\n    /// let m = cmd.clone()\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--mode\", \"fast\"\n    ///     ]);\n    /// assert_eq!(m.get_one::<String>(\"mode\").unwrap(), \"fast\");\n    ///\n    /// let m = cmd.clone()\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--mode\",\n    ///     ]);\n    /// assert_eq!(m.get_one::<String>(\"mode\").unwrap(), \"slow\");\n    ///\n    /// let m = cmd.clone()\n    ///     .get_matches_from(vec![\n    ///         \"prog\",\n    ///     ]);\n    /// assert_eq!(m.get_one::<String>(\"mode\").unwrap(), \"plaid\");\n    /// ```\n    ///\n    /// Tuples\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let cmd = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"file\")\n    ///         .action(ArgAction::Set)\n    ///         .num_args(2)\n    ///         .short('F'));\n    ///\n    /// let m = cmd.clone()\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"-F\", \"in-file\", \"out-file\"\n    ///     ]);\n    /// assert_eq!(\n    ///     m.get_many::<String>(\"file\").unwrap_or_default().map(|v| v.as_str()).collect::<Vec<_>>(),\n    ///     vec![\"in-file\", \"out-file\"]\n    /// );\n    ///\n    /// let res = cmd.clone()\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"-F\", \"file1\"\n    ///     ]);\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::WrongNumberOfValues);\n    /// ```\n    ///\n    /// A common mistake is to define an option which allows multiple values and a positional\n    /// argument.\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let cmd = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"file\")\n    ///         .action(ArgAction::Set)\n    ///         .num_args(0..)\n    ///         .short('F'))\n    ///     .arg(Arg::new(\"word\"));\n    ///\n    /// let m = cmd.clone().get_matches_from(vec![\n    ///     \"prog\", \"-F\", \"file1\", \"file2\", \"file3\", \"word\"\n    /// ]);\n    /// let files: Vec<_> = m.get_many::<String>(\"file\").unwrap().collect();\n    /// assert_eq!(files, [\"file1\", \"file2\", \"file3\", \"word\"]); // wait...what?!\n    /// assert!(!m.contains_id(\"word\")); // but we clearly used word!\n    ///\n    /// // but this works\n    /// let m = cmd.clone().get_matches_from(vec![\n    ///     \"prog\", \"word\", \"-F\", \"file1\", \"file2\", \"file3\",\n    /// ]);\n    /// let files: Vec<_> = m.get_many::<String>(\"file\").unwrap().collect();\n    /// assert_eq!(files, [\"file1\", \"file2\", \"file3\"]);\n    /// assert_eq!(m.get_one::<String>(\"word\").unwrap(), \"word\");\n    /// ```\n    /// The problem is `clap` doesn't know when to stop parsing values for \"file\".\n    ///\n    /// A solution for the example above is to limit how many values with a maximum, or specific\n    /// number, or to say [`ArgAction::Append`] is ok, but multiple values are not.\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"file\")\n    ///         .action(ArgAction::Append)\n    ///         .short('F'))\n    ///     .arg(Arg::new(\"word\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"-F\", \"file1\", \"-F\", \"file2\", \"-F\", \"file3\", \"word\"\n    ///     ]);\n    ///\n    /// let files: Vec<_> = m.get_many::<String>(\"file\").unwrap().collect();\n    /// assert_eq!(files, [\"file1\", \"file2\", \"file3\"]);\n    /// assert_eq!(m.get_one::<String>(\"word\").unwrap(), \"word\");\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn num_args(mut self, qty: impl IntoResettable<ValueRange>) -> Self {\n        self.num_vals = qty.into_resettable().into_option();\n        self\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::num_args`\")\n    )]\n    pub fn number_of_values(self, qty: usize) -> Self {\n        self.num_args(qty)\n    }\n\n    /// Placeholder for the argument's value in the help message / usage.\n    ///\n    /// This name is cosmetic only; the name is **not** used to access arguments.\n    /// This setting can be very helpful when describing the type of input the user should be\n    /// using, such as `FILE`, `INTERFACE`, etc. Although not required, it's somewhat convention to\n    /// use all capital letters for the value name.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** implicitly sets [`Arg::action(ArgAction::Set)`]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Arg::new(\"cfg\")\n    ///     .long(\"config\")\n    ///     .value_name(\"FILE\")\n    /// # ;\n    /// ```\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"config\")\n    ///         .long(\"config\")\n    ///         .value_name(\"FILE\")\n    ///         .help(\"Some help text\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    /// Running the above program produces the following output\n    ///\n    /// ```text\n    /// valnames\n    ///\n    /// Usage: valnames [OPTIONS]\n    ///\n    /// Options:\n    ///     --config <FILE>     Some help text\n    ///     -h, --help          Print help information\n    ///     -V, --version       Print version information\n    /// ```\n    /// [positional]: Arg::index()\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    #[inline]\n    #[must_use]\n    pub fn value_name(mut self, name: impl IntoResettable<Str>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            self.value_names([name])\n        } else {\n            self.val_names.clear();\n            self\n        }\n    }\n\n    /// Placeholders for the argument's values in the help message / usage.\n    ///\n    /// These names are cosmetic only, used for help and usage strings only. The names are **not**\n    /// used to access arguments. The values of the arguments are accessed in numeric order (i.e.\n    /// if you specify two names `one` and `two` `one` will be the first matched value, `two` will\n    /// be the second).\n    ///\n    /// This setting can be very helpful when describing the type of input the user should be\n    /// using, such as `FILE`, `INTERFACE`, etc. Although not required, it's somewhat convention to\n    /// use all capital letters for the value name.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **TIP:** It may help to use [`Arg::next_line_help(true)`] if there are long, or\n    /// multiple value names in order to not throw off the help text alignment of all options.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** implicitly sets [`Arg::action(ArgAction::Set)`] and [`Arg::num_args(1..)`].\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Arg::new(\"speed\")\n    ///     .short('s')\n    ///     .value_names([\"fast\", \"slow\"]);\n    /// ```\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"io\")\n    ///         .long(\"io-files\")\n    ///         .value_names([\"INFILE\", \"OUTFILE\"]))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// Running the above program produces the following output\n    ///\n    /// ```text\n    /// valnames\n    ///\n    /// Usage: valnames [OPTIONS]\n    ///\n    /// Options:\n    ///     -h, --help                       Print help information\n    ///     --io-files <INFILE> <OUTFILE>    Some help text\n    ///     -V, --version                    Print version information\n    /// ```\n    /// [`Arg::next_line_help(true)`]: Arg::next_line_help()\n    /// [`Arg::num_args`]: Arg::num_args()\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    /// [`Arg::num_args(1..)`]: Arg::num_args()\n    #[must_use]\n    pub fn value_names(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {\n        self.val_names = names.into_iter().map(|s| s.into()).collect();\n        self\n    }\n\n    /// Provide the shell a hint about how to complete this argument.\n    ///\n    /// See [`ValueHint`] for more information.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** implicitly sets [`Arg::action(ArgAction::Set)`][ArgAction::Set].\n    ///\n    /// </div>\n    ///\n    /// For example, to take a username as argument:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Arg, ValueHint};\n    /// Arg::new(\"user\")\n    ///     .short('u')\n    ///     .long(\"user\")\n    ///     .value_hint(ValueHint::Username);\n    /// ```\n    ///\n    /// To take a full command line and its arguments (for example, when writing a command wrapper):\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ValueHint, ArgAction};\n    /// Command::new(\"prog\")\n    ///     .trailing_var_arg(true)\n    ///     .arg(\n    ///         Arg::new(\"command\")\n    ///             .action(ArgAction::Set)\n    ///             .num_args(1..)\n    ///             .value_hint(ValueHint::CommandWithArguments)\n    ///     );\n    /// ```\n    #[must_use]\n    pub fn value_hint(mut self, value_hint: impl IntoResettable<ValueHint>) -> Self {\n        // HACK: we should use `Self::add` and `Self::remove` to type-check that `ArgExt` is used\n        match value_hint.into_resettable().into_option() {\n            Some(value_hint) => {\n                self.ext.set(value_hint);\n            }\n            None => {\n                self.ext.remove::<ValueHint>();\n            }\n        }\n        self\n    }\n\n    /// Match values against [`PossibleValuesParser`][crate::builder::PossibleValuesParser] without matching case.\n    ///\n    /// When other arguments are conditionally required based on the\n    /// value of a case-insensitive argument, the equality check done\n    /// by [`Arg::required_if_eq`], [`Arg::required_if_eq_any`], or\n    /// [`Arg::required_if_eq_all`] is case-insensitive.\n    ///\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this requires [taking values][Arg::num_args]\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** To do unicode case folding, enable the `unicode` feature flag.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"pv\")\n    ///     .arg(Arg::new(\"option\")\n    ///         .long(\"option\")\n    ///         .action(ArgAction::Set)\n    ///         .ignore_case(true)\n    ///         .value_parser([\"test123\"]))\n    ///     .get_matches_from(vec![\n    ///         \"pv\", \"--option\", \"TeSt123\",\n    ///     ]);\n    ///\n    /// assert!(m.get_one::<String>(\"option\").unwrap().eq_ignore_ascii_case(\"test123\"));\n    /// ```\n    ///\n    /// This setting also works when multiple values can be defined:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"pv\")\n    ///     .arg(Arg::new(\"option\")\n    ///         .short('o')\n    ///         .long(\"option\")\n    ///         .action(ArgAction::Set)\n    ///         .ignore_case(true)\n    ///         .num_args(1..)\n    ///         .value_parser([\"test123\", \"test321\"]))\n    ///     .get_matches_from(vec![\n    ///         \"pv\", \"--option\", \"TeSt123\", \"teST123\", \"tESt321\"\n    ///     ]);\n    ///\n    /// let matched_vals = m.get_many::<String>(\"option\").unwrap().collect::<Vec<_>>();\n    /// assert_eq!(&*matched_vals, &[\"TeSt123\", \"teST123\", \"tESt321\"]);\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn ignore_case(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::IgnoreCase)\n        } else {\n            self.unset_setting(ArgSettings::IgnoreCase)\n        }\n    }\n\n    /// Allows values which start with a leading hyphen (`-`)\n    ///\n    /// To limit values to just numbers, see\n    /// [`allow_negative_numbers`][Arg::allow_negative_numbers].\n    ///\n    /// See also [`trailing_var_arg`][Arg::trailing_var_arg].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this requires [taking values][Arg::num_args]\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **WARNING:** Prior arguments with `allow_hyphen_values(true)` get precedence over known\n    /// flags but known flags get precedence over the next possible positional argument with\n    /// `allow_hyphen_values(true)`.  When combined with [`Arg::num_args(..)`][Arg::num_args],\n    /// [`Arg::value_terminator`] is one way to ensure processing stops.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **WARNING**: Take caution when using this setting combined with another argument using\n    /// [`Arg::num_args`], as this becomes ambiguous `$ prog --arg -- -- val`. All\n    /// three `--, --, val` will be values when the user may have thought the second `--` would\n    /// constitute the normal, \"Only positional args follow\" idiom.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"pat\")\n    ///         .action(ArgAction::Set)\n    ///         .allow_hyphen_values(true)\n    ///         .long(\"pattern\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--pattern\", \"-file\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"pat\").unwrap(), \"-file\");\n    /// ```\n    ///\n    /// Not setting `Arg::allow_hyphen_values(true)` and supplying a value which starts with a\n    /// hyphen is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"pat\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"pattern\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--pattern\", \"-file\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);\n    /// ```\n    /// [`Arg::num_args(1)`]: Arg::num_args()\n    #[inline]\n    #[must_use]\n    pub fn allow_hyphen_values(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::AllowHyphenValues)\n        } else {\n            self.unset_setting(ArgSettings::AllowHyphenValues)\n        }\n    }\n\n    /// Allows negative numbers to pass as values.\n    ///\n    /// This is similar to [`Arg::allow_hyphen_values`] except that it only allows numbers,\n    /// all other undefined leading hyphens will fail to parse.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this requires [taking values][Arg::num_args]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let res = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"num\").allow_negative_numbers(true))\n    ///     .try_get_matches_from(vec![\n    ///         \"myprog\", \"-20\"\n    ///     ]);\n    /// assert!(res.is_ok());\n    /// let m = res.unwrap();\n    /// assert_eq!(m.get_one::<String>(\"num\").unwrap(), \"-20\");\n    /// ```\n    #[inline]\n    pub fn allow_negative_numbers(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::AllowNegativeNumbers)\n        } else {\n            self.unset_setting(ArgSettings::AllowNegativeNumbers)\n        }\n    }\n\n    /// Requires that options use the `--option=val` syntax\n    ///\n    /// i.e. an equals between the option and associated value.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this requires [taking values][Arg::num_args]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// Setting `require_equals` requires that the option have an equals sign between\n    /// it and the associated value.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .require_equals(true)\n    ///         .long(\"config\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--config=file.conf\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok());\n    /// ```\n    ///\n    /// Setting `require_equals` and *not* supplying the equals will cause an\n    /// error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .require_equals(true)\n    ///         .long(\"config\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--config\", \"file.conf\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::NoEquals);\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn require_equals(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::RequireEquals)\n        } else {\n            self.unset_setting(ArgSettings::RequireEquals)\n        }\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::value_delimiter`\")\n    )]\n    pub fn use_value_delimiter(mut self, yes: bool) -> Self {\n        if yes {\n            self.val_delim.get_or_insert(',');\n        } else {\n            self.val_delim = None;\n        }\n        self\n    }\n\n    /// Allow grouping of multiple values via a delimiter.\n    ///\n    /// i.e. allow values (`val1,val2,val3`) to be parsed as three values (`val1`, `val2`,\n    /// and `val3`) instead of one value (`val1,val2,val3`).\n    ///\n    /// See also [`Command::dont_delimit_trailing_values`][crate::Command::dont_delimit_trailing_values].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"config\")\n    ///         .short('c')\n    ///         .long(\"config\")\n    ///         .value_delimiter(','))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--config=val1,val2,val3\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_many::<String>(\"config\").unwrap().collect::<Vec<_>>(), [\"val1\", \"val2\", \"val3\"])\n    /// ```\n    /// [`Arg::value_delimiter(',')`]: Arg::value_delimiter()\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    #[inline]\n    #[must_use]\n    pub fn value_delimiter(mut self, d: impl IntoResettable<char>) -> Self {\n        self.val_delim = d.into_resettable().into_option();\n        self\n    }\n\n    /// Sentinel to **stop** parsing multiple values of a given argument.\n    ///\n    /// By default when\n    /// one sets [`num_args(1..)`] on an argument, clap will continue parsing values for that\n    /// argument until it reaches another valid argument, or one of the other more specific settings\n    /// for multiple values is used (such as [`num_args`]).\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This setting only applies to [options] and [positional arguments]\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** When the terminator is passed in on the command line, it is **not** stored as one\n    /// of the values\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// Arg::new(\"vals\")\n    ///     .action(ArgAction::Set)\n    ///     .num_args(1..)\n    ///     .value_terminator(\";\")\n    /// # ;\n    /// ```\n    ///\n    /// The following example uses two arguments, a sequence of commands, and the location in which\n    /// to perform them\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cmds\")\n    ///         .action(ArgAction::Set)\n    ///         .num_args(1..)\n    ///         .allow_hyphen_values(true)\n    ///         .value_terminator(\";\"))\n    ///     .arg(Arg::new(\"location\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"find\", \"-type\", \"f\", \"-name\", \"special\", \";\", \"/home/clap\"\n    ///     ]);\n    /// let cmds: Vec<_> = m.get_many::<String>(\"cmds\").unwrap().collect();\n    /// assert_eq!(&cmds, &[\"find\", \"-type\", \"f\", \"-name\", \"special\"]);\n    /// assert_eq!(m.get_one::<String>(\"location\").unwrap(), \"/home/clap\");\n    /// ```\n    /// [options]: Arg::action\n    /// [positional arguments]: Arg::index()\n    /// [`num_args(1..)`]: Arg::num_args()\n    /// [`num_args`]: Arg::num_args()\n    #[inline]\n    #[must_use]\n    pub fn value_terminator(mut self, term: impl IntoResettable<Str>) -> Self {\n        self.terminator = term.into_resettable().into_option();\n        self\n    }\n\n    /// Consume all following arguments.\n    ///\n    /// Do not parse them individually, but rather pass them in entirety.\n    ///\n    /// It is worth noting that setting this requires all values to come after a `--` to indicate\n    /// they should all be captured. For example:\n    ///\n    /// ```text\n    /// --foo something -- -v -v -v -b -b -b --baz -q -u -x\n    /// ```\n    ///\n    /// Will result in everything after `--` to be considered one raw argument. This behavior\n    /// may not be exactly what you are expecting and using [`Arg::trailing_var_arg`]\n    /// may be more appropriate.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Implicitly sets [`Arg::action(ArgAction::Set)`], [`Arg::num_args(1..)`],\n    /// [`Arg::allow_hyphen_values(true)`], and [`Arg::last(true)`] when set to `true`.\n    ///\n    /// </div>\n    ///\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    /// [`Arg::num_args(1..)`]: Arg::num_args()\n    /// [`Arg::allow_hyphen_values(true)`]: Arg::allow_hyphen_values()\n    /// [`Arg::last(true)`]: Arg::last()\n    #[inline]\n    #[must_use]\n    pub fn raw(mut self, yes: bool) -> Self {\n        if yes {\n            self.num_vals.get_or_insert_with(|| (1..).into());\n        }\n        self.allow_hyphen_values(yes).last(yes)\n    }\n\n    /// Value for the argument when not present.\n    ///\n    /// Like with command-line values, this will be split by [`Arg::value_delimiter`].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** If the user *does not* use this argument at runtime [`ArgMatches::contains_id`] will\n    /// still return `true`. If you wish to determine whether the argument was used at runtime or\n    /// not, consider [`ArgMatches::value_source`][crate::ArgMatches::value_source].\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This setting is perfectly compatible with [`Arg::default_value_if`] but slightly\n    /// different. `Arg::default_value` *only* takes effect when the user has not provided this arg\n    /// at runtime. `Arg::default_value_if` however only takes effect when the user has not provided\n    /// a value at runtime **and** these other conditions are met as well. If you have set\n    /// `Arg::default_value` and `Arg::default_value_if`, and the user **did not** provide this arg\n    /// at runtime, nor were the conditions met for `Arg::default_value_if`, the `Arg::default_value`\n    /// will be applied.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// First we use the default value without providing any value at runtime.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, parser::ValueSource};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"opt\")\n    ///         .long(\"myopt\")\n    ///         .default_value(\"myval\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"opt\").unwrap(), \"myval\");\n    /// assert!(m.contains_id(\"opt\"));\n    /// assert_eq!(m.value_source(\"opt\"), Some(ValueSource::DefaultValue));\n    /// ```\n    ///\n    /// Next we provide a value at runtime to override the default.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, parser::ValueSource};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"opt\")\n    ///         .long(\"myopt\")\n    ///         .default_value(\"myval\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--myopt=non_default\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"opt\").unwrap(), \"non_default\");\n    /// assert!(m.contains_id(\"opt\"));\n    /// assert_eq!(m.value_source(\"opt\"), Some(ValueSource::CommandLine));\n    /// ```\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    /// [`ArgMatches::contains_id`]: crate::ArgMatches::contains_id()\n    /// [`Arg::default_value_if`]: Arg::default_value_if()\n    #[inline]\n    #[must_use]\n    pub fn default_value(mut self, val: impl IntoResettable<OsStr>) -> Self {\n        if let Some(val) = val.into_resettable().into_option() {\n            self.default_values([val])\n        } else {\n            self.default_vals.clear();\n            self\n        }\n    }\n\n    #[inline]\n    #[must_use]\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::default_value`\")\n    )]\n    pub fn default_value_os(self, val: impl Into<OsStr>) -> Self {\n        self.default_values([val])\n    }\n\n    /// Value for the argument when not present.\n    ///\n    /// See [`Arg::default_value`].\n    ///\n    /// [`Arg::default_value`]: Arg::default_value()\n    #[inline]\n    #[must_use]\n    pub fn default_values(mut self, vals: impl IntoIterator<Item = impl Into<OsStr>>) -> Self {\n        self.default_vals = vals.into_iter().map(|s| s.into()).collect();\n        self\n    }\n\n    #[inline]\n    #[must_use]\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::default_values`\")\n    )]\n    pub fn default_values_os(self, vals: impl IntoIterator<Item = impl Into<OsStr>>) -> Self {\n        self.default_values(vals)\n    }\n\n    /// Value for the argument when the flag is present but no value is specified.\n    ///\n    /// This configuration option is often used to give the user a shortcut and allow them to\n    /// efficiently specify an option argument without requiring an explicitly value. The `--color`\n    /// argument is a common example. By supplying a default, such as `default_missing_value(\"always\")`,\n    /// the user can quickly just add `--color` to the command line to produce the desired color output.\n    ///\n    /// Like with command-line values, this will be split by [`Arg::value_delimiter`].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** using this configuration option requires the use of the\n    /// [`.num_args(0..N)`][Arg::num_args] and the\n    /// [`.require_equals(true)`][Arg::require_equals] configuration option. These are required in\n    /// order to unambiguously determine what, if any, value was supplied for the argument.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// For POSIX style `--color`:\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, parser::ValueSource};\n    /// fn cli() -> Command {\n    ///     Command::new(\"prog\")\n    ///         .arg(Arg::new(\"color\").long(\"color\")\n    ///             .value_name(\"WHEN\")\n    ///             .value_parser([\"always\", \"auto\", \"never\"])\n    ///             .default_value(\"auto\")\n    ///             .num_args(0..=1)\n    ///             .require_equals(true)\n    ///             .default_missing_value(\"always\")\n    ///             .help(\"Specify WHEN to colorize output.\")\n    ///         )\n    /// }\n    ///\n    /// // first, we'll provide no arguments\n    /// let m  = cli().get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    /// assert_eq!(m.get_one::<String>(\"color\").unwrap(), \"auto\");\n    /// assert_eq!(m.value_source(\"color\"), Some(ValueSource::DefaultValue));\n    ///\n    /// // next, we'll provide a runtime value to override the default (as usually done).\n    /// let m  = cli().get_matches_from(vec![\n    ///         \"prog\", \"--color=never\"\n    ///     ]);\n    /// assert_eq!(m.get_one::<String>(\"color\").unwrap(), \"never\");\n    /// assert_eq!(m.value_source(\"color\"), Some(ValueSource::CommandLine));\n    ///\n    /// // finally, we will use the shortcut and only provide the argument without a value.\n    /// let m  = cli().get_matches_from(vec![\n    ///         \"prog\", \"--color\"\n    ///     ]);\n    /// assert_eq!(m.get_one::<String>(\"color\").unwrap(), \"always\");\n    /// assert_eq!(m.value_source(\"color\"), Some(ValueSource::CommandLine));\n    /// ```\n    ///\n    /// For bool literals:\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, parser::ValueSource, value_parser};\n    /// fn cli() -> Command {\n    ///     Command::new(\"prog\")\n    ///         .arg(Arg::new(\"create\").long(\"create\")\n    ///             .value_name(\"BOOL\")\n    ///             .value_parser(value_parser!(bool))\n    ///             .num_args(0..=1)\n    ///             .require_equals(true)\n    ///             .default_missing_value(\"true\")\n    ///         )\n    /// }\n    ///\n    /// // first, we'll provide no arguments\n    /// let m  = cli().get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    /// assert_eq!(m.get_one::<bool>(\"create\").copied(), None);\n    ///\n    /// // next, we'll provide a runtime value to override the default (as usually done).\n    /// let m  = cli().get_matches_from(vec![\n    ///         \"prog\", \"--create=false\"\n    ///     ]);\n    /// assert_eq!(m.get_one::<bool>(\"create\").copied(), Some(false));\n    /// assert_eq!(m.value_source(\"create\"), Some(ValueSource::CommandLine));\n    ///\n    /// // finally, we will use the shortcut and only provide the argument without a value.\n    /// let m  = cli().get_matches_from(vec![\n    ///         \"prog\", \"--create\"\n    ///     ]);\n    /// assert_eq!(m.get_one::<bool>(\"create\").copied(), Some(true));\n    /// assert_eq!(m.value_source(\"create\"), Some(ValueSource::CommandLine));\n    /// ```\n    ///\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    /// [`Arg::default_value`]: Arg::default_value()\n    #[inline]\n    #[must_use]\n    pub fn default_missing_value(mut self, val: impl IntoResettable<OsStr>) -> Self {\n        if let Some(val) = val.into_resettable().into_option() {\n            self.default_missing_values_os([val])\n        } else {\n            self.default_missing_vals.clear();\n            self\n        }\n    }\n\n    /// Value for the argument when the flag is present but no value is specified.\n    ///\n    /// See [`Arg::default_missing_value`].\n    ///\n    /// [`Arg::default_missing_value`]: Arg::default_missing_value()\n    /// [`OsStr`]: std::ffi::OsStr\n    #[inline]\n    #[must_use]\n    pub fn default_missing_value_os(self, val: impl Into<OsStr>) -> Self {\n        self.default_missing_values_os([val])\n    }\n\n    /// Value for the argument when the flag is present but no value is specified.\n    ///\n    /// See [`Arg::default_missing_value`].\n    ///\n    /// [`Arg::default_missing_value`]: Arg::default_missing_value()\n    #[inline]\n    #[must_use]\n    pub fn default_missing_values(self, vals: impl IntoIterator<Item = impl Into<OsStr>>) -> Self {\n        self.default_missing_values_os(vals)\n    }\n\n    /// Value for the argument when the flag is present but no value is specified.\n    ///\n    /// See [`Arg::default_missing_values`].\n    ///\n    /// [`Arg::default_missing_values`]: Arg::default_missing_values()\n    /// [`OsStr`]: std::ffi::OsStr\n    #[inline]\n    #[must_use]\n    pub fn default_missing_values_os(\n        mut self,\n        vals: impl IntoIterator<Item = impl Into<OsStr>>,\n    ) -> Self {\n        self.default_missing_vals = vals.into_iter().map(|s| s.into()).collect();\n        self\n    }\n\n    /// Read from `name` environment variable when argument is not present.\n    ///\n    /// If it is not present in the environment, then default\n    /// rules will apply.\n    ///\n    /// If user sets the argument in the environment:\n    /// - When [`Arg::action(ArgAction::Set)`] is not set, the flag is considered raised.\n    /// - When [`Arg::action(ArgAction::Set)`] is set,\n    ///   [`ArgMatches::get_one`][crate::ArgMatches::get_one] will\n    ///   return value of the environment variable.\n    ///\n    /// If user doesn't set the argument in the environment:\n    /// - When [`Arg::action(ArgAction::Set)`] is not set, the flag is considered off.\n    /// - When [`Arg::action(ArgAction::Set)`] is set,\n    ///   [`ArgMatches::get_one`][crate::ArgMatches::get_one] will\n    ///   return the default specified.\n    ///\n    /// Like with command-line values, this will be split by [`Arg::value_delimiter`].\n    ///\n    /// # Examples\n    ///\n    /// In this example, we show the variable coming from the environment:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::env;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// # unsafe {\n    /// env::set_var(\"MY_FLAG\", \"env\");\n    /// # }\n    ///\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .env(\"MY_FLAG\")\n    ///         .action(ArgAction::Set))\n    ///     .get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"flag\").unwrap(), \"env\");\n    /// ```\n    ///\n    /// In this example, because `prog` is a flag that accepts an optional, case-insensitive\n    /// boolean literal.\n    ///\n    /// Note that the value parser controls how flags are parsed.  In this case we've selected\n    /// [`FalseyValueParser`][crate::builder::FalseyValueParser].  A `false` literal is `n`, `no`,\n    /// `f`, `false`, `off` or `0`.  An absent environment variable will also be considered as\n    /// `false`.  Anything else will considered as `true`.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::env;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// # use clap::builder::FalseyValueParser;\n    ///\n    /// # unsafe {\n    /// env::set_var(\"TRUE_FLAG\", \"true\");\n    /// env::set_var(\"FALSE_FLAG\", \"0\");\n    /// # }\n    ///\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"true_flag\")\n    ///         .long(\"true_flag\")\n    ///         .action(ArgAction::SetTrue)\n    ///         .value_parser(FalseyValueParser::new())\n    ///         .env(\"TRUE_FLAG\"))\n    ///     .arg(Arg::new(\"false_flag\")\n    ///         .long(\"false_flag\")\n    ///         .action(ArgAction::SetTrue)\n    ///         .value_parser(FalseyValueParser::new())\n    ///         .env(\"FALSE_FLAG\"))\n    ///     .arg(Arg::new(\"absent_flag\")\n    ///         .long(\"absent_flag\")\n    ///         .action(ArgAction::SetTrue)\n    ///         .value_parser(FalseyValueParser::new())\n    ///         .env(\"ABSENT_FLAG\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert!(m.get_flag(\"true_flag\"));\n    /// assert!(!m.get_flag(\"false_flag\"));\n    /// assert!(!m.get_flag(\"absent_flag\"));\n    /// ```\n    ///\n    /// In this example, we show the variable coming from an option on the CLI:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::env;\n    /// # use clap::{Command, Arg, ArgAction};\n    ///\n    /// # unsafe {\n    /// env::set_var(\"MY_FLAG\", \"env\");\n    /// # }\n    ///\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .env(\"MY_FLAG\")\n    ///         .action(ArgAction::Set))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--flag\", \"opt\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"flag\").unwrap(), \"opt\");\n    /// ```\n    ///\n    /// In this example, we show the variable coming from the environment even with the\n    /// presence of a default:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::env;\n    /// # use clap::{Command, Arg, ArgAction};\n    ///\n    /// # unsafe {\n    /// env::set_var(\"MY_FLAG\", \"env\");\n    /// # }\n    ///\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .env(\"MY_FLAG\")\n    ///         .action(ArgAction::Set)\n    ///         .default_value(\"default\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"flag\").unwrap(), \"env\");\n    /// ```\n    ///\n    /// In this example, we show the use of multiple values in a single environment variable:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::env;\n    /// # use clap::{Command, Arg, ArgAction};\n    ///\n    /// # unsafe {\n    /// env::set_var(\"MY_FLAG_MULTI\", \"env1,env2\");\n    /// # }\n    ///\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .env(\"MY_FLAG_MULTI\")\n    ///         .action(ArgAction::Set)\n    ///         .num_args(1..)\n    ///         .value_delimiter(','))\n    ///     .get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_many::<String>(\"flag\").unwrap().collect::<Vec<_>>(), vec![\"env1\", \"env2\"]);\n    /// ```\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    /// [`Arg::value_delimiter(',')`]: Arg::value_delimiter()\n    #[cfg(feature = \"env\")]\n    #[inline]\n    #[must_use]\n    pub fn env(mut self, name: impl IntoResettable<OsStr>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            let value = env::var_os(&name);\n            self.env = Some((name, value));\n        } else {\n            self.env = None;\n        }\n        self\n    }\n\n    #[cfg(feature = \"env\")]\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::env`\")\n    )]\n    pub fn env_os(self, name: impl Into<OsStr>) -> Self {\n        self.env(name)\n    }\n}\n\n/// # Help\nimpl Arg {\n    /// Sets the description of the argument for short help (`-h`).\n    ///\n    /// Typically, this is a short (one line) description of the arg.\n    ///\n    /// If [`Arg::long_help`] is not specified, this message will be displayed for `--help`.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Only `Arg::help` is used in completion script generation in order to be concise\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// Any valid UTF-8 is allowed in the help text. The one exception is when one wishes to\n    /// include a newline in the help text and have the following text be properly aligned with all\n    /// the other help text.\n    ///\n    /// Setting `help` displays a short message to the side of the argument when the user passes\n    /// `-h` or `--help` (by default).\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .long(\"config\")\n    ///         .help(\"Some help text describing the --config arg\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// The above example displays\n    ///\n    /// ```notrust\n    /// helptest\n    ///\n    /// Usage: helptest [OPTIONS]\n    ///\n    /// Options:\n    ///     --config     Some help text describing the --config arg\n    /// -h, --help       Print help information\n    /// -V, --version    Print version information\n    /// ```\n    /// [`Arg::long_help`]: Arg::long_help()\n    #[inline]\n    #[must_use]\n    pub fn help(mut self, h: impl IntoResettable<StyledStr>) -> Self {\n        self.help = h.into_resettable().into_option();\n        self\n    }\n\n    /// Sets the description of the argument for long help (`--help`).\n    ///\n    /// Typically this a more detailed (multi-line) message\n    /// that describes the arg.\n    ///\n    /// If [`Arg::help`] is not specified, this message will be displayed for `-h`.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Only [`Arg::help`] is used in completion script generation in order to be concise\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// Any valid UTF-8 is allowed in the help text. The one exception is when one wishes to\n    /// include a newline in the help text and have the following text be properly aligned with all\n    /// the other help text.\n    ///\n    /// Setting `help` displays a short message to the side of the argument when the user passes\n    /// `-h` or `--help` (by default).\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .long(\"config\")\n    ///         .long_help(\n    /// \"The config file used by the myprog must be in JSON format\n    /// with only valid keys and may not contain other nonsense\n    /// that cannot be read by this program. Obviously I'm going on\n    /// and on, so I'll stop now.\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// The above example displays\n    ///\n    /// ```text\n    /// prog\n    ///\n    /// Usage: prog [OPTIONS]\n    ///\n    /// Options:\n    ///         --config\n    ///             The config file used by the myprog must be in JSON format\n    ///             with only valid keys and may not contain other nonsense\n    ///             that cannot be read by this program. Obviously I'm going on\n    ///             and on, so I'll stop now.\n    ///\n    ///     -h, --help\n    ///             Print help information\n    ///\n    ///     -V, --version\n    ///             Print version information\n    /// ```\n    /// [`Arg::help`]: Arg::help()\n    #[inline]\n    #[must_use]\n    pub fn long_help(mut self, h: impl IntoResettable<StyledStr>) -> Self {\n        self.long_help = h.into_resettable().into_option();\n        self\n    }\n\n    /// Allows custom ordering of args within the help message.\n    ///\n    /// `Arg`s with a lower value will be displayed first in the help message.\n    /// Those with the same display order will be sorted.\n    ///\n    /// `Arg`s are automatically assigned a display order based on the order they are added to the\n    /// [`Command`][crate::Command].\n    /// Overriding this is helpful when the order arguments are added in isn't the same as the\n    /// display order, whether in one-off cases or to automatically sort arguments.\n    ///\n    /// To change, see [`Command::next_display_order`][crate::Command::next_display_order].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This setting is ignored for [positional arguments] which are always displayed in\n    /// [index] order.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"boat\")\n    ///         .short('b')\n    ///         .long(\"boat\")\n    ///         .action(ArgAction::Set)\n    ///         .display_order(0)  // Sort\n    ///         .help(\"Some help and text\"))\n    ///     .arg(Arg::new(\"airplane\")\n    ///         .short('a')\n    ///         .long(\"airplane\")\n    ///         .action(ArgAction::Set)\n    ///         .display_order(0)  // Sort\n    ///         .help(\"I should be first!\"))\n    ///     .arg(Arg::new(\"custom-help\")\n    ///         .short('?')\n    ///         .action(ArgAction::Help)\n    ///         .display_order(100)  // Don't sort\n    ///         .help(\"Alt help\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// The above example displays the following help message\n    ///\n    /// ```text\n    /// cust-ord\n    ///\n    /// Usage: cust-ord [OPTIONS]\n    ///\n    /// Options:\n    ///     -a, --airplane <airplane>    I should be first!\n    ///     -b, --boat <boar>            Some help and text\n    ///     -h, --help                   Print help information\n    ///     -?                           Alt help\n    /// ```\n    /// [positional arguments]: Arg::index()\n    /// [index]: Arg::index()\n    #[inline]\n    #[must_use]\n    pub fn display_order(mut self, ord: impl IntoResettable<usize>) -> Self {\n        self.disp_ord = ord.into_resettable().into_option();\n        self\n    }\n\n    /// Override the `--help` section this appears in.\n    ///\n    /// For more on the default help heading, see\n    /// [`Command::next_help_heading`][crate::Command::next_help_heading].\n    #[inline]\n    #[must_use]\n    pub fn help_heading(mut self, heading: impl IntoResettable<Str>) -> Self {\n        self.help_heading = Some(heading.into_resettable().into_option());\n        self\n    }\n\n    /// Render the [help][Arg::help] on the line after the argument.\n    ///\n    /// This can be helpful for arguments with very long or complex help messages.\n    /// This can also be helpful for arguments with very long flag names, or many/long value names.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** To apply this setting to all arguments and subcommands, consider using\n    /// [`crate::Command::next_line_help`]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"opt\")\n    ///         .long(\"long-option-flag\")\n    ///         .short('o')\n    ///         .action(ArgAction::Set)\n    ///         .next_line_help(true)\n    ///         .value_names([\"value1\", \"value2\"])\n    ///         .help(\"Some really long help and complex\\n\\\n    ///                help that makes more sense to be\\n\\\n    ///                on a line after the option\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// The above example displays the following help message\n    ///\n    /// ```text\n    /// nlh\n    ///\n    /// Usage: nlh [OPTIONS]\n    ///\n    /// Options:\n    ///     -h, --help       Print help information\n    ///     -V, --version    Print version information\n    ///     -o, --long-option-flag <value1> <value2>\n    ///         Some really long help and complex\n    ///         help that makes more sense to be\n    ///         on a line after the option\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn next_line_help(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::NextLineHelp)\n        } else {\n            self.unset_setting(ArgSettings::NextLineHelp)\n        }\n    }\n\n    /// Do not display the argument in help message.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This does **not** hide the argument from usage strings on error\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// Setting `Hidden` will hide the argument when displaying help text\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .long(\"config\")\n    ///         .hide(true)\n    ///         .help(\"Some help text describing the --config arg\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// The above example displays\n    ///\n    /// ```text\n    /// helptest\n    ///\n    /// Usage: helptest [OPTIONS]\n    ///\n    /// Options:\n    /// -h, --help       Print help information\n    /// -V, --version    Print version information\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn hide(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::Hidden)\n        } else {\n            self.unset_setting(ArgSettings::Hidden)\n        }\n    }\n\n    /// Do not display the [possible values][crate::builder::ValueParser::possible_values] in the help message.\n    ///\n    /// This is useful for args with many values, or ones which are explained elsewhere in the\n    /// help text.\n    ///\n    /// To set this for all arguments, see\n    /// [`Command::hide_possible_values`][crate::Command::hide_possible_values].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this requires [taking values][Arg::num_args]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"mode\")\n    ///         .long(\"mode\")\n    ///         .value_parser([\"fast\", \"slow\"])\n    ///         .action(ArgAction::Set)\n    ///         .hide_possible_values(true));\n    /// ```\n    /// If we were to run the above program with `--help` the `[values: fast, slow]` portion of\n    /// the help text would be omitted.\n    #[inline]\n    #[must_use]\n    pub fn hide_possible_values(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::HidePossibleValues)\n        } else {\n            self.unset_setting(ArgSettings::HidePossibleValues)\n        }\n    }\n\n    /// Do not display the default value of the argument in the help message.\n    ///\n    /// This is useful when default behavior of an arg is explained elsewhere in the help text.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this requires [taking values][Arg::num_args]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"connect\")\n    ///     .arg(Arg::new(\"host\")\n    ///         .long(\"host\")\n    ///         .default_value(\"localhost\")\n    ///         .action(ArgAction::Set)\n    ///         .hide_default_value(true));\n    ///\n    /// ```\n    ///\n    /// If we were to run the above program with `--help` the `[default: localhost]` portion of\n    /// the help text would be omitted.\n    #[inline]\n    #[must_use]\n    pub fn hide_default_value(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::HideDefaultValue)\n        } else {\n            self.unset_setting(ArgSettings::HideDefaultValue)\n        }\n    }\n\n    /// Do not display in help the environment variable name.\n    ///\n    /// This is useful when the variable option is explained elsewhere in the help text.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"mode\")\n    ///         .long(\"mode\")\n    ///         .env(\"MODE\")\n    ///         .action(ArgAction::Set)\n    ///         .hide_env(true));\n    /// ```\n    ///\n    /// If we were to run the above program with `--help` the `[env: MODE]` portion of the help\n    /// text would be omitted.\n    #[cfg(feature = \"env\")]\n    #[inline]\n    #[must_use]\n    pub fn hide_env(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::HideEnv)\n        } else {\n            self.unset_setting(ArgSettings::HideEnv)\n        }\n    }\n\n    /// Do not display in help any values inside the associated ENV variables for the argument.\n    ///\n    /// This is useful when ENV vars contain sensitive values.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"connect\")\n    ///     .arg(Arg::new(\"host\")\n    ///         .long(\"host\")\n    ///         .env(\"CONNECT\")\n    ///         .action(ArgAction::Set)\n    ///         .hide_env_values(true));\n    ///\n    /// ```\n    ///\n    /// If we were to run the above program with `$ CONNECT=super_secret connect --help` the\n    /// `[default: CONNECT=super_secret]` portion of the help text would be omitted.\n    #[cfg(feature = \"env\")]\n    #[inline]\n    #[must_use]\n    pub fn hide_env_values(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::HideEnvValues)\n        } else {\n            self.unset_setting(ArgSettings::HideEnvValues)\n        }\n    }\n\n    /// Hides an argument from short help (`-h`).\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This does **not** hide the argument from usage strings on error\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this option will cause next-line-help output style to be used\n    /// when long help (`--help`) is called.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Arg::new(\"debug\")\n    ///     .hide_short_help(true);\n    /// ```\n    ///\n    /// Setting `hide_short_help(true)` will hide the argument when displaying short help text\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .long(\"config\")\n    ///         .hide_short_help(true)\n    ///         .help(\"Some help text describing the --config arg\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"-h\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// The above example displays\n    ///\n    /// ```text\n    /// helptest\n    ///\n    /// Usage: helptest [OPTIONS]\n    ///\n    /// Options:\n    /// -h, --help       Print help information\n    /// -V, --version    Print version information\n    /// ```\n    ///\n    /// However, when --help is called\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .long(\"config\")\n    ///         .hide_short_help(true)\n    ///         .help(\"Some help text describing the --config arg\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// Then the following would be displayed\n    ///\n    /// ```text\n    /// helptest\n    ///\n    /// Usage: helptest [OPTIONS]\n    ///\n    /// Options:\n    ///     --config     Some help text describing the --config arg\n    /// -h, --help       Print help information\n    /// -V, --version    Print version information\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn hide_short_help(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::HiddenShortHelp)\n        } else {\n            self.unset_setting(ArgSettings::HiddenShortHelp)\n        }\n    }\n\n    /// Hides an argument from long help (`--help`).\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This does **not** hide the argument from usage strings on error\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this option will cause next-line-help output style to be used\n    /// when long help (`--help`) is called.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// Setting `hide_long_help(true)` will hide the argument when displaying long help text\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .long(\"config\")\n    ///         .hide_long_help(true)\n    ///         .help(\"Some help text describing the --config arg\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// The above example displays\n    ///\n    /// ```text\n    /// helptest\n    ///\n    /// Usage: helptest [OPTIONS]\n    ///\n    /// Options:\n    /// -h, --help       Print help information\n    /// -V, --version    Print version information\n    /// ```\n    ///\n    /// However, when -h is called\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .long(\"config\")\n    ///         .hide_long_help(true)\n    ///         .help(\"Some help text describing the --config arg\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"-h\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// Then the following would be displayed\n    ///\n    /// ```text\n    /// helptest\n    ///\n    /// Usage: helptest [OPTIONS]\n    ///\n    /// OPTIONS:\n    ///     --config     Some help text describing the --config arg\n    /// -h, --help       Print help information\n    /// -V, --version    Print version information\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn hide_long_help(self, yes: bool) -> Self {\n        if yes {\n            self.setting(ArgSettings::HiddenLongHelp)\n        } else {\n            self.unset_setting(ArgSettings::HiddenLongHelp)\n        }\n    }\n}\n\n/// # Advanced Argument Relations\nimpl Arg {\n    /// The name of the [`ArgGroup`] the argument belongs to.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// Arg::new(\"debug\")\n    ///     .long(\"debug\")\n    ///     .action(ArgAction::SetTrue)\n    ///     .group(\"mode\")\n    /// # ;\n    /// ```\n    ///\n    /// Multiple arguments can be a member of a single group and then the group checked as if it\n    /// was one of said arguments.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"debug\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue)\n    ///         .group(\"mode\"))\n    ///     .arg(Arg::new(\"verbose\")\n    ///         .long(\"verbose\")\n    ///         .action(ArgAction::SetTrue)\n    ///         .group(\"mode\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--debug\"\n    ///     ]);\n    /// assert!(m.contains_id(\"mode\"));\n    /// ```\n    ///\n    /// [`ArgGroup`]: crate::ArgGroup\n    #[must_use]\n    pub fn group(mut self, group_id: impl IntoResettable<Id>) -> Self {\n        if let Some(group_id) = group_id.into_resettable().into_option() {\n            self.groups.push(group_id);\n        } else {\n            self.groups.clear();\n        }\n        self\n    }\n\n    /// The names of [`ArgGroup`]'s the argument belongs to.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// Arg::new(\"debug\")\n    ///     .long(\"debug\")\n    ///     .action(ArgAction::SetTrue)\n    ///     .groups([\"mode\", \"verbosity\"])\n    /// # ;\n    /// ```\n    ///\n    /// Arguments can be members of multiple groups and then the group checked as if it\n    /// was one of said arguments.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"debug\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue)\n    ///         .groups([\"mode\", \"verbosity\"]))\n    ///     .arg(Arg::new(\"verbose\")\n    ///         .long(\"verbose\")\n    ///         .action(ArgAction::SetTrue)\n    ///         .groups([\"mode\", \"verbosity\"]))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--debug\"\n    ///     ]);\n    /// assert!(m.contains_id(\"mode\"));\n    /// assert!(m.contains_id(\"verbosity\"));\n    /// ```\n    ///\n    /// [`ArgGroup`]: crate::ArgGroup\n    #[must_use]\n    pub fn groups(mut self, group_ids: impl IntoIterator<Item = impl Into<Id>>) -> Self {\n        self.groups.extend(group_ids.into_iter().map(Into::into));\n        self\n    }\n\n    /// Specifies the value of the argument if `arg` has been used at runtime.\n    ///\n    /// If `default` is set to `None`, `default_value` will be removed.\n    ///\n    /// Like with command-line values, this will be split by [`Arg::value_delimiter`].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This setting is perfectly compatible with [`Arg::default_value`] but slightly\n    /// different. `Arg::default_value` *only* takes effect when the user has not provided this arg\n    /// at runtime. This setting however only takes effect when the user has not provided a value at\n    /// runtime **and** these other conditions are met as well. If you have set `Arg::default_value`\n    /// and `Arg::default_value_if`, and the user **did not** provide this arg at runtime, nor were\n    /// the conditions met for `Arg::default_value_if`, the `Arg::default_value` will be applied.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// First we use the default value only if another arg is present at runtime.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// # use clap::builder::{ArgPredicate};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .default_value_if(\"flag\", ArgPredicate::IsPresent, Some(\"default\")))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--flag\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"other\").unwrap(), \"default\");\n    /// ```\n    ///\n    /// Next we run the same test, but without providing `--flag`.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .default_value_if(\"flag\", \"true\", Some(\"default\")))\n    ///     .get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"other\"), None);\n    /// ```\n    ///\n    /// Now lets only use the default value if `--opt` contains the value `special`.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"opt\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"opt\"))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .default_value_if(\"opt\", \"special\", Some(\"default\")))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--opt\", \"special\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"other\").unwrap(), \"default\");\n    /// ```\n    ///\n    /// We can run the same test and provide any value *other than* `special` and we won't get a\n    /// default value.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"opt\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"opt\"))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .default_value_if(\"opt\", \"special\", Some(\"default\")))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--opt\", \"hahaha\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"other\"), None);\n    /// ```\n    ///\n    /// If we want to unset the default value for an Arg based on the presence or\n    /// value of some other Arg.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .default_value(\"default\")\n    ///         .default_value_if(\"flag\", \"true\", None))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--flag\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"other\"), None);\n    /// ```\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    /// [`Arg::default_value`]: Arg::default_value()\n    #[must_use]\n    pub fn default_value_if(\n        mut self,\n        arg_id: impl Into<Id>,\n        predicate: impl Into<ArgPredicate>,\n        default: impl IntoResettable<OsStr>,\n    ) -> Self {\n        self.default_vals_ifs.push((\n            arg_id.into(),\n            predicate.into(),\n            default\n                .into_resettable()\n                .into_option()\n                .map(|os_str| vec![os_str]),\n        ));\n        self\n    }\n\n    /// Specifies the values of the argument if `arg` has been used at runtime.\n    ///\n    /// See [`Arg::default_value_if`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// use clap_builder::arg;\n    /// use clap_builder::Command;\n    /// use clap_builder::Arg;\n    /// let r = Command::new(\"df\")\n    ///    .arg(arg!(--opt <FILE> \"some arg\"))\n    ///    .arg(\n    ///        Arg::new(\"args\")\n    ///            .long(\"args\")\n    ///            .num_args(2)\n    ///            .default_values_if(\"opt\", \"value\", [\"df1\",\"df2\"]),\n    ///    )\n    ///    .try_get_matches_from(vec![\"\", \"--opt\", \"value\"]);\n    ///\n    /// let m = r.unwrap();\n    /// assert_eq!(\n    ///    m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n    ///    [\"df1\", \"df2\"]\n    /// );\n    /// ```\n    ///\n    /// [`Arg::default_value_if`]: Arg::default_value_if()\n    #[must_use]\n    pub fn default_values_if(\n        mut self,\n        arg_id: impl Into<Id>,\n        predicate: impl Into<ArgPredicate>,\n        defaults: impl IntoIterator<Item = impl Into<OsStr>>,\n    ) -> Self {\n        self.default_vals_ifs.push((\n            arg_id.into(),\n            predicate.into(),\n            Some(defaults.into_iter().map(|item| item.into()).collect()),\n        ));\n        self\n    }\n\n    #[must_use]\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::default_value_if`\")\n    )]\n    pub fn default_value_if_os(\n        self,\n        arg_id: impl Into<Id>,\n        predicate: impl Into<ArgPredicate>,\n        default: impl IntoResettable<OsStr>,\n    ) -> Self {\n        self.default_value_if(arg_id, predicate, default)\n    }\n\n    /// Specifies multiple values and conditions in the same manner as [`Arg::default_value_if`].\n    ///\n    /// The method takes a slice of tuples in the `(arg, predicate, default)` format.\n    ///\n    /// Like with command-line values, this will be split by [`Arg::value_delimiter`].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE**: The conditions are stored in order and evaluated in the same order. I.e. the first\n    /// if multiple conditions are true, the first one found will be applied and the ultimate value.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// First we use the default value only if another arg is present at runtime.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"opt\")\n    ///         .long(\"opt\")\n    ///         .action(ArgAction::Set))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .default_value_ifs([\n    ///             (\"flag\", \"true\", Some(\"default\")),\n    ///             (\"opt\", \"channel\", Some(\"chan\")),\n    ///         ]))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--opt\", \"channel\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"other\").unwrap(), \"chan\");\n    /// ```\n    ///\n    /// Next we run the same test, but without providing `--flag`.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .default_value_ifs([\n    ///             (\"flag\", \"true\", Some(\"default\")),\n    ///             (\"opt\", \"channel\", Some(\"chan\")),\n    ///         ]))\n    ///     .get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"other\"), None);\n    /// ```\n    ///\n    /// We can also see that these values are applied in order, and if more than one condition is\n    /// true, only the first evaluated \"wins\"\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// # use clap::builder::ArgPredicate;\n    /// let m = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .long(\"flag\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"opt\")\n    ///         .long(\"opt\")\n    ///         .action(ArgAction::Set))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .default_value_ifs([\n    ///             (\"flag\", ArgPredicate::IsPresent, Some(\"default\")),\n    ///             (\"opt\", ArgPredicate::Equals(\"channel\".into()), Some(\"chan\")),\n    ///         ]))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--opt\", \"channel\", \"--flag\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"other\").unwrap(), \"default\");\n    /// ```\n    /// [`Arg::action(ArgAction::Set)`]: Arg::action()\n    /// [`Arg::default_value_if`]: Arg::default_value_if()\n    #[must_use]\n    pub fn default_value_ifs(\n        mut self,\n        ifs: impl IntoIterator<\n            Item = (\n                impl Into<Id>,\n                impl Into<ArgPredicate>,\n                impl IntoResettable<OsStr>,\n            ),\n        >,\n    ) -> Self {\n        for (arg, predicate, default) in ifs {\n            self = self.default_value_if(arg, predicate, default);\n        }\n        self\n    }\n\n    /// Specifies multiple values and conditions in the same manner as [`Arg::default_values_if`].\n    ///\n    /// See [`Arg::default_values_if`].\n    ///\n    /// [`Arg::default_values_if`]: Arg::default_values_if()\n    #[must_use]\n    pub fn default_values_ifs(\n        mut self,\n        ifs: impl IntoIterator<\n            Item = (\n                impl Into<Id>,\n                impl Into<ArgPredicate>,\n                impl IntoIterator<Item = impl Into<OsStr>>,\n            ),\n        >,\n    ) -> Self {\n        for (arg, predicate, default) in ifs {\n            self = self.default_values_if(arg, predicate, default);\n        }\n        self\n    }\n\n    #[must_use]\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::default_value_ifs`\")\n    )]\n    pub fn default_value_ifs_os(\n        self,\n        ifs: impl IntoIterator<\n            Item = (\n                impl Into<Id>,\n                impl Into<ArgPredicate>,\n                impl IntoResettable<OsStr>,\n            ),\n        >,\n    ) -> Self {\n        self.default_value_ifs(ifs)\n    }\n\n    /// Set this arg as [required] as long as the specified argument is not present at runtime.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **TIP:** Using `Arg::required_unless_present` implies [`Arg::required`] and is therefore not\n    /// mandatory to also set.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .required_unless_present(\"debug\")\n    /// # ;\n    /// ```\n    ///\n    /// In the following example, the required argument is *not* provided,\n    /// but it's not an error because the `unless` arg has been supplied.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_unless_present(\"dbg\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"dbg\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--debug\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok());\n    /// ```\n    ///\n    /// Setting `Arg::required_unless_present(name)` and *not* supplying `name` or this arg is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_unless_present(\"dbg\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"dbg\")\n    ///         .long(\"debug\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [required]: Arg::required()\n    #[must_use]\n    pub fn required_unless_present(mut self, arg_id: impl IntoResettable<Id>) -> Self {\n        if let Some(arg_id) = arg_id.into_resettable().into_option() {\n            self.r_unless.push(arg_id);\n        } else {\n            self.r_unless.clear();\n        }\n        self\n    }\n\n    /// Sets this arg as [required] unless *all* of the specified arguments are present at runtime.\n    ///\n    /// In other words, parsing will succeed only if user either\n    /// * supplies the `self` arg.\n    /// * supplies *all* of the `names` arguments.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** If you wish for this argument to only be required unless *any of* these args are\n    /// present see [`Arg::required_unless_present_any`]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .required_unless_present_all([\"cfg\", \"dbg\"])\n    /// # ;\n    /// ```\n    ///\n    /// In the following example, the required argument is *not* provided, but it's not an error\n    /// because *all* of the `names` args have been supplied.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_unless_present_all([\"dbg\", \"infile\"])\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"dbg\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"infile\")\n    ///         .short('i')\n    ///         .action(ArgAction::Set))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--debug\", \"-i\", \"file\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok());\n    /// ```\n    ///\n    /// Setting [`Arg::required_unless_present_all(names)`] and *not* supplying\n    /// either *all* of `unless` args or the `self` arg is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_unless_present_all([\"dbg\", \"infile\"])\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"dbg\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"infile\")\n    ///         .short('i')\n    ///         .action(ArgAction::Set))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [required]: Arg::required()\n    /// [`Arg::required_unless_present_any`]: Arg::required_unless_present_any()\n    /// [`Arg::required_unless_present_all(names)`]: Arg::required_unless_present_all()\n    #[must_use]\n    pub fn required_unless_present_all(\n        mut self,\n        names: impl IntoIterator<Item = impl Into<Id>>,\n    ) -> Self {\n        self.r_unless_all.extend(names.into_iter().map(Into::into));\n        self\n    }\n\n    /// Sets this arg as [required] unless *any* of the specified arguments are present at runtime.\n    ///\n    /// In other words, parsing will succeed only if user either\n    /// * supplies the `self` arg.\n    /// * supplies *one or more* of the `unless` arguments.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** If you wish for this argument to be required unless *all of* these args are\n    /// present see [`Arg::required_unless_present_all`]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .required_unless_present_any([\"cfg\", \"dbg\"])\n    /// # ;\n    /// ```\n    ///\n    /// Setting [`Arg::required_unless_present_any(names)`] requires that the argument be used at runtime\n    /// *unless* *at least one of* the args in `names` are present. In the following example, the\n    /// required argument is *not* provided, but it's not an error because one the `unless` args\n    /// have been supplied.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_unless_present_any([\"dbg\", \"infile\"])\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"dbg\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"infile\")\n    ///         .short('i')\n    ///         .action(ArgAction::Set))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--debug\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok());\n    /// ```\n    ///\n    /// Setting [`Arg::required_unless_present_any(names)`] and *not* supplying *at least one of* `names`\n    /// or this arg is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_unless_present_any([\"dbg\", \"infile\"])\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"dbg\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"infile\")\n    ///         .short('i')\n    ///         .action(ArgAction::Set))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [required]: Arg::required()\n    /// [`Arg::required_unless_present_any(names)`]: Arg::required_unless_present_any()\n    /// [`Arg::required_unless_present_all`]: Arg::required_unless_present_all()\n    #[must_use]\n    pub fn required_unless_present_any(\n        mut self,\n        names: impl IntoIterator<Item = impl Into<Id>>,\n    ) -> Self {\n        self.r_unless.extend(names.into_iter().map(Into::into));\n        self\n    }\n\n    /// This argument is [required] only if the specified `arg` is present at runtime and its value\n    /// equals `val`.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .required_if_eq(\"other_arg\", \"value\")\n    /// # ;\n    /// ```\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .required_if_eq(\"other\", \"special\")\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .action(ArgAction::Set))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--other\", \"not-special\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok()); // We didn't use --other=special, so \"cfg\" wasn't required\n    ///\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .required_if_eq(\"other\", \"special\")\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .action(ArgAction::Set))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--other\", \"special\"\n    ///     ]);\n    ///\n    /// // We did use --other=special so \"cfg\" had become required but was missing.\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    ///\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .required_if_eq(\"other\", \"special\")\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .action(ArgAction::Set))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--other\", \"SPECIAL\"\n    ///     ]);\n    ///\n    /// // By default, the comparison is case-sensitive, so \"cfg\" wasn't required\n    /// assert!(res.is_ok());\n    ///\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .required_if_eq(\"other\", \"special\")\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"other\")\n    ///         .long(\"other\")\n    ///         .ignore_case(true)\n    ///         .action(ArgAction::Set))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--other\", \"SPECIAL\"\n    ///     ]);\n    ///\n    /// // However, case-insensitive comparisons can be enabled.  This typically occurs when using Arg::possible_values().\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [`Arg::requires(name)`]: Arg::requires()\n    /// [Conflicting]: Arg::conflicts_with()\n    /// [required]: Arg::required()\n    #[must_use]\n    pub fn required_if_eq(mut self, arg_id: impl Into<Id>, val: impl Into<OsStr>) -> Self {\n        self.r_ifs.push((arg_id.into(), val.into()));\n        self\n    }\n\n    /// Specify this argument is [required] based on multiple conditions.\n    ///\n    /// The conditions are set up in a `(arg, val)` style tuple. The requirement will only become\n    /// valid if one of the specified `arg`'s value equals its corresponding `val`.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .required_if_eq_any([\n    ///         (\"extra\", \"val\"),\n    ///         (\"option\", \"spec\")\n    ///     ])\n    /// # ;\n    /// ```\n    ///\n    /// Setting `Arg::required_if_eq_any([(arg, val)])` makes this arg required if any of the `arg`s\n    /// are used at runtime and it's corresponding value is equal to `val`. If the `arg`'s value is\n    /// anything other than `val`, this argument isn't required.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_if_eq_any([\n    ///             (\"extra\", \"val\"),\n    ///             (\"option\", \"spec\")\n    ///         ])\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"extra\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"extra\"))\n    ///     .arg(Arg::new(\"option\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"option\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--option\", \"other\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok()); // We didn't use --option=spec, or --extra=val so \"cfg\" isn't required\n    /// ```\n    ///\n    /// Setting `Arg::required_if_eq_any([(arg, val)])` and having any of the `arg`s used with its\n    /// value of `val` but *not* using this arg is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_if_eq_any([\n    ///             (\"extra\", \"val\"),\n    ///             (\"option\", \"spec\")\n    ///         ])\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"extra\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"extra\"))\n    ///     .arg(Arg::new(\"option\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"option\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--option\", \"spec\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [`Arg::requires(name)`]: Arg::requires()\n    /// [Conflicting]: Arg::conflicts_with()\n    /// [required]: Arg::required()\n    #[must_use]\n    pub fn required_if_eq_any(\n        mut self,\n        ifs: impl IntoIterator<Item = (impl Into<Id>, impl Into<OsStr>)>,\n    ) -> Self {\n        self.r_ifs\n            .extend(ifs.into_iter().map(|(id, val)| (id.into(), val.into())));\n        self\n    }\n\n    /// Specify this argument is [required] based on multiple conditions.\n    ///\n    /// The conditions are set up in a `(arg, val)` style tuple. The requirement will only become\n    /// valid if every one of the specified `arg`'s value equals its corresponding `val`.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .required_if_eq_all([\n    ///         (\"extra\", \"val\"),\n    ///         (\"option\", \"spec\")\n    ///     ])\n    /// # ;\n    /// ```\n    ///\n    /// Setting `Arg::required_if_eq_all([(arg, val)])` makes this arg required if all of the `arg`s\n    /// are used at runtime and every value is equal to its corresponding `val`. If the `arg`'s value is\n    /// anything other than `val`, this argument isn't required.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_if_eq_all([\n    ///             (\"extra\", \"val\"),\n    ///             (\"option\", \"spec\")\n    ///         ])\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"extra\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"extra\"))\n    ///     .arg(Arg::new(\"option\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"option\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--option\", \"spec\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok()); // We didn't use --option=spec --extra=val so \"cfg\" isn't required\n    /// ```\n    ///\n    /// Setting `Arg::required_if_eq_all([(arg, val)])` and having all of the `arg`s used with its\n    /// value of `val` but *not* using this arg is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .required_if_eq_all([\n    ///             (\"extra\", \"val\"),\n    ///             (\"option\", \"spec\")\n    ///         ])\n    ///         .action(ArgAction::Set)\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"extra\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"extra\"))\n    ///     .arg(Arg::new(\"option\")\n    ///         .action(ArgAction::Set)\n    ///         .long(\"option\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--extra\", \"val\", \"--option\", \"spec\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [required]: Arg::required()\n    #[must_use]\n    pub fn required_if_eq_all(\n        mut self,\n        ifs: impl IntoIterator<Item = (impl Into<Id>, impl Into<OsStr>)>,\n    ) -> Self {\n        self.r_ifs_all\n            .extend(ifs.into_iter().map(|(id, val)| (id.into(), val.into())));\n        self\n    }\n\n    /// Require another argument if this arg matches the [`ArgPredicate`]\n    ///\n    /// This method takes `value, another_arg` pair. At runtime, clap will check\n    /// if this arg (`self`) matches the [`ArgPredicate`].\n    /// If it does, `another_arg` will be marked as required.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .requires_if(\"val\", \"arg\")\n    /// # ;\n    /// ```\n    ///\n    /// Setting `Arg::requires_if(val, arg)` requires that the `arg` be used at runtime if the\n    /// defining argument's value is equal to `val`. If the defining argument is anything other than\n    /// `val`, the other argument isn't required.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .requires_if(\"my.cfg\", \"other\")\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"other\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--config\", \"some.cfg\"\n    ///     ]);\n    ///\n    /// assert!(res.is_ok()); // We didn't use --config=my.cfg, so other wasn't required\n    /// ```\n    ///\n    /// Setting `Arg::requires_if(val, arg)` and setting the value to `val` but *not* supplying\n    /// `arg` is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .requires_if(\"my.cfg\", \"input\")\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"input\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--config\", \"my.cfg\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [`Arg::requires(name)`]: Arg::requires()\n    /// [Conflicting]: Arg::conflicts_with()\n    /// [override]: Arg::overrides_with()\n    #[must_use]\n    pub fn requires_if(mut self, val: impl Into<ArgPredicate>, arg_id: impl Into<Id>) -> Self {\n        self.requires.push((val.into(), arg_id.into()));\n        self\n    }\n\n    /// Allows multiple conditional requirements.\n    ///\n    /// The requirement will only become valid if this arg's value matches the\n    /// [`ArgPredicate`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .requires_ifs([\n    ///         (\"val\", \"arg\"),\n    ///         (\"other_val\", \"arg2\"),\n    ///     ])\n    /// # ;\n    /// ```\n    ///\n    /// Setting `Arg::requires_ifs([\"val\", \"arg\"])` requires that the `arg` be used at runtime if the\n    /// defining argument's value is equal to `val`. If the defining argument's value is anything other\n    /// than `val`, `arg` isn't required.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .requires_ifs([\n    ///             (\"special.conf\", \"opt\"),\n    ///             (\"other.conf\", \"other\"),\n    ///         ])\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"opt\")\n    ///         .long(\"option\")\n    ///         .action(ArgAction::Set))\n    ///     .arg(Arg::new(\"other\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--config\", \"special.conf\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err()); // We  used --config=special.conf so --option <val> is required\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    ///\n    /// Setting `Arg::requires_ifs` with [`ArgPredicate::IsPresent`] and *not* supplying all the\n    /// arguments is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction, builder::ArgPredicate};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .requires_ifs([\n    ///             (ArgPredicate::IsPresent, \"input\"),\n    ///             (ArgPredicate::IsPresent, \"output\"),\n    ///         ])\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"input\"))\n    ///     .arg(Arg::new(\"output\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--config\", \"file.conf\", \"in.txt\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// // We didn't use output\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    ///\n    /// [`Arg::requires(name)`]: Arg::requires()\n    /// [Conflicting]: Arg::conflicts_with()\n    /// [override]: Arg::overrides_with()\n    #[must_use]\n    pub fn requires_ifs(\n        mut self,\n        ifs: impl IntoIterator<Item = (impl Into<ArgPredicate>, impl Into<Id>)>,\n    ) -> Self {\n        self.requires\n            .extend(ifs.into_iter().map(|(val, arg)| (val.into(), arg.into())));\n        self\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::requires_ifs`\")\n    )]\n    pub fn requires_all(self, ids: impl IntoIterator<Item = impl Into<Id>>) -> Self {\n        self.requires_ifs(ids.into_iter().map(|id| (ArgPredicate::IsPresent, id)))\n    }\n\n    /// This argument is mutually exclusive with the specified argument.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Conflicting rules take precedence over being required by default. Conflict rules\n    /// only need to be set for one of the two arguments, they do not need to be set for each.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Defining a conflict is two-way, but does *not* need to defined for both arguments\n    /// (i.e. if A conflicts with B, defining `A.conflicts_with(B)` is sufficient. You do not\n    /// need to also do `B.conflicts_with(A)`)\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** [`Arg::conflicts_with_all(names)`] allows specifying an argument which conflicts with more than one argument.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE** [`Arg::exclusive(true)`] allows specifying an argument which conflicts with every other argument.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** All arguments implicitly conflict with themselves.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .conflicts_with(\"debug\")\n    /// # ;\n    /// ```\n    ///\n    /// Setting conflicting argument, and having both arguments present at runtime is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .conflicts_with(\"debug\")\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"debug\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--debug\", \"--config\", \"file.conf\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::ArgumentConflict);\n    /// ```\n    ///\n    /// [`Arg::conflicts_with_all(names)`]: Arg::conflicts_with_all()\n    /// [`Arg::exclusive(true)`]: Arg::exclusive()\n    #[must_use]\n    pub fn conflicts_with(mut self, arg_id: impl IntoResettable<Id>) -> Self {\n        if let Some(arg_id) = arg_id.into_resettable().into_option() {\n            self.blacklist.push(arg_id);\n        } else {\n            self.blacklist.clear();\n        }\n        self\n    }\n\n    /// This argument is mutually exclusive with the specified arguments.\n    ///\n    /// See [`Arg::conflicts_with`].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Conflicting rules take precedence over being required by default. Conflict rules\n    /// only need to be set for one of the two arguments, they do not need to be set for each.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Defining a conflict is two-way, but does *not* need to defined for both arguments\n    /// (i.e. if A conflicts with B, defining `A.conflicts_with(B)` is sufficient. You do not need\n    /// need to also do `B.conflicts_with(A)`)\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** [`Arg::exclusive(true)`] allows specifying an argument which conflicts with every other argument.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// Arg::new(\"config\")\n    ///     .conflicts_with_all([\"debug\", \"input\"])\n    /// # ;\n    /// ```\n    ///\n    /// Setting conflicting argument, and having any of the arguments present at runtime with a\n    /// conflicting argument is an error.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"cfg\")\n    ///         .action(ArgAction::Set)\n    ///         .conflicts_with_all([\"debug\", \"input\"])\n    ///         .long(\"config\"))\n    ///     .arg(Arg::new(\"debug\")\n    ///         .long(\"debug\"))\n    ///     .arg(Arg::new(\"input\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"prog\", \"--config\", \"file.conf\", \"file.txt\"\n    ///     ]);\n    ///\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::ArgumentConflict);\n    /// ```\n    /// [`Arg::conflicts_with`]: Arg::conflicts_with()\n    /// [`Arg::exclusive(true)`]: Arg::exclusive()\n    #[must_use]\n    pub fn conflicts_with_all(mut self, names: impl IntoIterator<Item = impl Into<Id>>) -> Self {\n        self.blacklist.extend(names.into_iter().map(Into::into));\n        self\n    }\n\n    /// Sets an overridable argument.\n    ///\n    /// i.e. this argument and the following argument\n    /// will override each other in POSIX style (whichever argument was specified at runtime\n    /// **last** \"wins\")\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** When an argument is overridden it is essentially as if it never was used, any\n    /// conflicts, requirements, etc. are evaluated **after** all \"overrides\" have been removed\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Overriding an argument implies they [conflict][Arg::conflicts_with`].\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(arg!(-f --flag \"some flag\")\n    ///         .conflicts_with(\"debug\"))\n    ///     .arg(arg!(-d --debug \"other flag\"))\n    ///     .arg(arg!(-c --color \"third flag\")\n    ///         .overrides_with(\"flag\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"-f\", \"-d\", \"-c\"]);\n    ///             //    ^~~~~~~~~~~~^~~~~ flag is overridden by color\n    ///\n    /// assert!(m.get_flag(\"color\"));\n    /// assert!(m.get_flag(\"debug\")); // even though flag conflicts with debug, it's as if flag\n    ///                                 // was never used because it was overridden with color\n    /// assert!(!m.get_flag(\"flag\"));\n    /// ```\n    #[must_use]\n    pub fn overrides_with(mut self, arg_id: impl IntoResettable<Id>) -> Self {\n        if let Some(arg_id) = arg_id.into_resettable().into_option() {\n            self.overrides.push(arg_id);\n        } else {\n            self.overrides.clear();\n        }\n        self\n    }\n\n    /// Sets multiple mutually overridable arguments by name.\n    ///\n    /// i.e. this argument and the following argument will override each other in POSIX style\n    /// (whichever argument was specified at runtime **last** \"wins\")\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** When an argument is overridden it is essentially as if it never was used, any\n    /// conflicts, requirements, etc. are evaluated **after** all \"overrides\" have been removed\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Overriding an argument implies they [conflict][Arg::conflicts_with_all`].\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg};\n    /// let m = Command::new(\"prog\")\n    ///     .arg(arg!(-f --flag \"some flag\")\n    ///         .conflicts_with(\"color\"))\n    ///     .arg(arg!(-d --debug \"other flag\"))\n    ///     .arg(arg!(-c --color \"third flag\")\n    ///         .overrides_with_all([\"flag\", \"debug\"]))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"-f\", \"-d\", \"-c\"]);\n    ///             //    ^~~~~~^~~~~~~~~ flag and debug are overridden by color\n    ///\n    /// assert!(m.get_flag(\"color\")); // even though flag conflicts with color, it's as if flag\n    ///                                 // and debug were never used because they were overridden\n    ///                                 // with color\n    /// assert!(!m.get_flag(\"debug\"));\n    /// assert!(!m.get_flag(\"flag\"));\n    /// ```\n    #[must_use]\n    pub fn overrides_with_all(mut self, names: impl IntoIterator<Item = impl Into<Id>>) -> Self {\n        self.overrides.extend(names.into_iter().map(Into::into));\n        self\n    }\n}\n\n/// # Reflection\nimpl Arg {\n    /// Get the name of the argument\n    #[inline]\n    pub fn get_id(&self) -> &Id {\n        &self.id\n    }\n\n    /// Get the help specified for this argument, if any\n    #[inline]\n    pub fn get_help(&self) -> Option<&StyledStr> {\n        self.help.as_ref()\n    }\n\n    /// Get the long help specified for this argument, if any\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// let arg = Arg::new(\"foo\").long_help(\"long help\");\n    /// assert_eq!(Some(\"long help\".to_owned()), arg.get_long_help().map(|s| s.to_string()));\n    /// ```\n    ///\n    #[inline]\n    pub fn get_long_help(&self) -> Option<&StyledStr> {\n        self.long_help.as_ref()\n    }\n\n    /// Get the placement within help\n    #[inline]\n    pub fn get_display_order(&self) -> usize {\n        self.disp_ord.unwrap_or(999)\n    }\n\n    /// Get the help heading specified for this argument, if any\n    #[inline]\n    pub fn get_help_heading(&self) -> Option<&str> {\n        self.help_heading\n            .as_ref()\n            .map(|s| s.as_deref())\n            .unwrap_or_default()\n    }\n\n    /// Get the short option name for this argument, if any\n    #[inline]\n    pub fn get_short(&self) -> Option<char> {\n        self.short\n    }\n\n    /// Get visible short aliases for this argument, if any\n    #[inline]\n    pub fn get_visible_short_aliases(&self) -> Option<Vec<char>> {\n        if self.short_aliases.is_empty() {\n            None\n        } else {\n            Some(\n                self.short_aliases\n                    .iter()\n                    .filter_map(|(c, v)| if *v { Some(c) } else { None })\n                    .copied()\n                    .collect(),\n            )\n        }\n    }\n\n    /// Get *all* short aliases for this argument, if any, both visible and hidden.\n    #[inline]\n    pub fn get_all_short_aliases(&self) -> Option<Vec<char>> {\n        if self.short_aliases.is_empty() {\n            None\n        } else {\n            Some(self.short_aliases.iter().map(|(s, _)| s).copied().collect())\n        }\n    }\n\n    /// Get the short option name and its visible aliases, if any\n    #[inline]\n    pub fn get_short_and_visible_aliases(&self) -> Option<Vec<char>> {\n        let mut shorts = match self.short {\n            Some(short) => vec![short],\n            None => return None,\n        };\n        if let Some(aliases) = self.get_visible_short_aliases() {\n            shorts.extend(aliases);\n        }\n        Some(shorts)\n    }\n\n    /// Get the long option name for this argument, if any\n    #[inline]\n    pub fn get_long(&self) -> Option<&str> {\n        self.long.as_deref()\n    }\n\n    /// Get visible aliases for this argument, if any\n    #[inline]\n    pub fn get_visible_aliases(&self) -> Option<Vec<&str>> {\n        if self.aliases.is_empty() {\n            None\n        } else {\n            Some(\n                self.aliases\n                    .iter()\n                    .filter_map(|(s, v)| if *v { Some(s.as_str()) } else { None })\n                    .collect(),\n            )\n        }\n    }\n\n    /// Get *all* aliases for this argument, if any, both visible and hidden.\n    #[inline]\n    pub fn get_all_aliases(&self) -> Option<Vec<&str>> {\n        if self.aliases.is_empty() {\n            None\n        } else {\n            Some(self.aliases.iter().map(|(s, _)| s.as_str()).collect())\n        }\n    }\n\n    /// Get the long option name and its visible aliases, if any\n    #[inline]\n    pub fn get_long_and_visible_aliases(&self) -> Option<Vec<&str>> {\n        let mut longs = match self.get_long() {\n            Some(long) => vec![long],\n            None => return None,\n        };\n        if let Some(aliases) = self.get_visible_aliases() {\n            longs.extend(aliases);\n        }\n        Some(longs)\n    }\n\n    /// Get hidden aliases for this argument, if any\n    #[inline]\n    pub fn get_aliases(&self) -> Option<Vec<&str>> {\n        if self.aliases.is_empty() {\n            None\n        } else {\n            Some(\n                self.aliases\n                    .iter()\n                    .filter_map(|(s, v)| if !*v { Some(s.as_str()) } else { None })\n                    .collect(),\n            )\n        }\n    }\n\n    /// Get the names of possible values for this argument. Only useful for user\n    /// facing applications, such as building help messages or man files\n    pub fn get_possible_values(&self) -> Vec<PossibleValue> {\n        if !self.is_takes_value_set() {\n            vec![]\n        } else {\n            self.get_value_parser()\n                .possible_values()\n                .map(|pvs| pvs.collect())\n                .unwrap_or_default()\n        }\n    }\n\n    /// Get the names of values for this argument.\n    #[inline]\n    pub fn get_value_names(&self) -> Option<&[Str]> {\n        if self.val_names.is_empty() {\n            None\n        } else {\n            Some(&self.val_names)\n        }\n    }\n\n    /// Get the number of values for this argument.\n    #[inline]\n    pub fn get_num_args(&self) -> Option<ValueRange> {\n        self.num_vals\n    }\n\n    #[inline]\n    pub(crate) fn get_min_vals(&self) -> usize {\n        self.get_num_args().expect(INTERNAL_ERROR_MSG).min_values()\n    }\n\n    /// Get the delimiter between multiple values\n    #[inline]\n    pub fn get_value_delimiter(&self) -> Option<char> {\n        self.val_delim\n    }\n\n    /// Get the value terminator for this argument. The `value_terminator` is a value\n    /// that terminates parsing of multi-valued arguments.\n    #[inline]\n    pub fn get_value_terminator(&self) -> Option<&Str> {\n        self.terminator.as_ref()\n    }\n\n    /// Get the index of this argument, if any\n    #[inline]\n    pub fn get_index(&self) -> Option<usize> {\n        self.index\n    }\n\n    /// Get the value hint of this argument\n    pub fn get_value_hint(&self) -> ValueHint {\n        // HACK: we should use `Self::add` and `Self::remove` to type-check that `ArgExt` is used\n        self.ext.get::<ValueHint>().copied().unwrap_or_else(|| {\n            if self.is_takes_value_set() {\n                let type_id = self.get_value_parser().type_id();\n                if type_id == AnyValueId::of::<std::path::PathBuf>() {\n                    ValueHint::AnyPath\n                } else {\n                    ValueHint::default()\n                }\n            } else {\n                ValueHint::default()\n            }\n        })\n    }\n\n    /// Get the environment variable name specified for this argument, if any\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::ffi::OsStr;\n    /// # use clap::Arg;\n    /// let arg = Arg::new(\"foo\").env(\"ENVIRONMENT\");\n    /// assert_eq!(arg.get_env(), Some(OsStr::new(\"ENVIRONMENT\")));\n    /// ```\n    #[cfg(feature = \"env\")]\n    pub fn get_env(&self) -> Option<&std::ffi::OsStr> {\n        self.env.as_ref().map(|x| x.0.as_os_str())\n    }\n\n    /// Get the default values specified for this argument, if any\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// let arg = Arg::new(\"foo\").default_value(\"default value\");\n    /// assert_eq!(arg.get_default_values(), &[\"default value\"]);\n    /// ```\n    pub fn get_default_values(&self) -> &[OsStr] {\n        &self.default_vals\n    }\n\n    /// Checks whether this argument is a positional or not.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Arg;\n    /// let arg = Arg::new(\"foo\");\n    /// assert_eq!(arg.is_positional(), true);\n    ///\n    /// let arg = Arg::new(\"foo\").long(\"foo\");\n    /// assert_eq!(arg.is_positional(), false);\n    /// ```\n    pub fn is_positional(&self) -> bool {\n        self.get_long().is_none() && self.get_short().is_none()\n    }\n\n    /// Reports whether [`Arg::required`] is set\n    pub fn is_required_set(&self) -> bool {\n        self.is_set(ArgSettings::Required)\n    }\n\n    pub(crate) fn is_multiple_values_set(&self) -> bool {\n        self.get_num_args().unwrap_or_default().is_multiple()\n    }\n\n    pub(crate) fn is_takes_value_set(&self) -> bool {\n        self.get_num_args()\n            .unwrap_or_else(|| 1.into())\n            .takes_values()\n    }\n\n    /// Report whether [`Arg::allow_hyphen_values`] is set\n    pub fn is_allow_hyphen_values_set(&self) -> bool {\n        self.is_set(ArgSettings::AllowHyphenValues)\n    }\n\n    /// Report whether [`Arg::allow_negative_numbers`] is set\n    pub fn is_allow_negative_numbers_set(&self) -> bool {\n        self.is_set(ArgSettings::AllowNegativeNumbers)\n    }\n\n    /// Behavior when parsing the argument\n    pub fn get_action(&self) -> &ArgAction {\n        const DEFAULT: ArgAction = ArgAction::Set;\n        self.action.as_ref().unwrap_or(&DEFAULT)\n    }\n\n    /// Configured parser for argument values\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// let cmd = clap::Command::new(\"raw\")\n    ///     .arg(\n    ///         clap::Arg::new(\"port\")\n    ///             .value_parser(clap::value_parser!(usize))\n    ///     );\n    /// let value_parser = cmd.get_arguments()\n    ///     .find(|a| a.get_id() == \"port\").unwrap()\n    ///     .get_value_parser();\n    /// println!(\"{value_parser:?}\");\n    /// ```\n    pub fn get_value_parser(&self) -> &super::ValueParser {\n        if let Some(value_parser) = self.value_parser.as_ref() {\n            value_parser\n        } else {\n            static DEFAULT: super::ValueParser = super::ValueParser::string();\n            &DEFAULT\n        }\n    }\n\n    /// Report whether [`Arg::global`] is set\n    pub fn is_global_set(&self) -> bool {\n        self.is_set(ArgSettings::Global)\n    }\n\n    /// Report whether [`Arg::next_line_help`] is set\n    pub fn is_next_line_help_set(&self) -> bool {\n        self.is_set(ArgSettings::NextLineHelp)\n    }\n\n    /// Report whether [`Arg::hide`] is set\n    pub fn is_hide_set(&self) -> bool {\n        self.is_set(ArgSettings::Hidden)\n    }\n\n    /// Report whether [`Arg::hide_default_value`] is set\n    pub fn is_hide_default_value_set(&self) -> bool {\n        self.is_set(ArgSettings::HideDefaultValue)\n    }\n\n    /// Report whether [`Arg::hide_possible_values`] is set\n    pub fn is_hide_possible_values_set(&self) -> bool {\n        self.is_set(ArgSettings::HidePossibleValues)\n    }\n\n    /// Report whether [`Arg::hide_env`] is set\n    #[cfg(feature = \"env\")]\n    pub fn is_hide_env_set(&self) -> bool {\n        self.is_set(ArgSettings::HideEnv)\n    }\n\n    /// Report whether [`Arg::hide_env_values`] is set\n    #[cfg(feature = \"env\")]\n    pub fn is_hide_env_values_set(&self) -> bool {\n        self.is_set(ArgSettings::HideEnvValues)\n    }\n\n    /// Report whether [`Arg::hide_short_help`] is set\n    pub fn is_hide_short_help_set(&self) -> bool {\n        self.is_set(ArgSettings::HiddenShortHelp)\n    }\n\n    /// Report whether [`Arg::hide_long_help`] is set\n    pub fn is_hide_long_help_set(&self) -> bool {\n        self.is_set(ArgSettings::HiddenLongHelp)\n    }\n\n    /// Report whether [`Arg::require_equals`] is set\n    pub fn is_require_equals_set(&self) -> bool {\n        self.is_set(ArgSettings::RequireEquals)\n    }\n\n    /// Reports whether [`Arg::exclusive`] is set\n    pub fn is_exclusive_set(&self) -> bool {\n        self.is_set(ArgSettings::Exclusive)\n    }\n\n    /// Report whether [`Arg::trailing_var_arg`] is set\n    pub fn is_trailing_var_arg_set(&self) -> bool {\n        self.is_set(ArgSettings::TrailingVarArg)\n    }\n\n    /// Reports whether [`Arg::last`] is set\n    pub fn is_last_set(&self) -> bool {\n        self.is_set(ArgSettings::Last)\n    }\n\n    /// Reports whether [`Arg::ignore_case`] is set\n    pub fn is_ignore_case_set(&self) -> bool {\n        self.is_set(ArgSettings::IgnoreCase)\n    }\n\n    /// Access an [`ArgExt`]\n    #[cfg(feature = \"unstable-ext\")]\n    pub fn get<T: ArgExt + Extension>(&self) -> Option<&T> {\n        self.ext.get::<T>()\n    }\n\n    /// Remove an [`ArgExt`]\n    #[cfg(feature = \"unstable-ext\")]\n    pub fn remove<T: ArgExt + Extension>(mut self) -> Option<T> {\n        self.ext.remove::<T>()\n    }\n}\n\n/// # Internally used only\nimpl Arg {\n    pub(crate) fn _build(&mut self) {\n        if self.action.is_none() {\n            if self.num_vals == Some(ValueRange::EMPTY) {\n                let action = ArgAction::SetTrue;\n                self.action = Some(action);\n            } else {\n                let action =\n                    if self.is_positional() && self.num_vals.unwrap_or_default().is_unbounded() {\n                        // Allow collecting arguments interleaved with flags\n                        //\n                        // Bounded values are probably a group and the user should explicitly opt-in to\n                        // Append\n                        ArgAction::Append\n                    } else {\n                        ArgAction::Set\n                    };\n                self.action = Some(action);\n            }\n        }\n        if let Some(action) = self.action.as_ref() {\n            if let Some(default_value) = action.default_value() {\n                if self.default_vals.is_empty() {\n                    self.default_vals = vec![default_value.into()];\n                }\n            }\n            if let Some(default_value) = action.default_missing_value() {\n                if self.default_missing_vals.is_empty() {\n                    self.default_missing_vals = vec![default_value.into()];\n                }\n            }\n        }\n\n        if self.value_parser.is_none() {\n            if let Some(default) = self.action.as_ref().and_then(|a| a.default_value_parser()) {\n                self.value_parser = Some(default);\n            } else {\n                self.value_parser = Some(super::ValueParser::string());\n            }\n        }\n\n        let val_names_len = self.val_names.len();\n        if val_names_len > 1 {\n            self.num_vals.get_or_insert(val_names_len.into());\n        } else {\n            let nargs = self.get_action().default_num_args();\n            self.num_vals.get_or_insert(nargs);\n        }\n    }\n\n    // Used for positionals when printing\n    pub(crate) fn name_no_brackets(&self) -> String {\n        debug!(\"Arg::name_no_brackets:{}\", self.get_id());\n        let delim = \" \";\n        if !self.val_names.is_empty() {\n            debug!(\"Arg::name_no_brackets: val_names={:#?}\", self.val_names);\n\n            if self.val_names.len() > 1 {\n                self.val_names\n                    .iter()\n                    .map(|n| format!(\"<{n}>\"))\n                    .collect::<Vec<_>>()\n                    .join(delim)\n            } else {\n                self.val_names\n                    .first()\n                    .expect(INTERNAL_ERROR_MSG)\n                    .as_str()\n                    .to_owned()\n            }\n        } else {\n            debug!(\"Arg::name_no_brackets: just name\");\n            self.get_id().as_str().to_owned()\n        }\n    }\n\n    pub(crate) fn stylized(&self, styles: &Styles, required: Option<bool>) -> StyledStr {\n        use std::fmt::Write as _;\n        let literal = styles.get_literal();\n\n        let mut styled = StyledStr::new();\n        // Write the name such --long or -l\n        if let Some(l) = self.get_long() {\n            let _ = write!(styled, \"{literal}--{l}{literal:#}\",);\n        } else if let Some(s) = self.get_short() {\n            let _ = write!(styled, \"{literal}-{s}{literal:#}\");\n        }\n        styled.push_styled(&self.stylize_arg_suffix(styles, required));\n        styled\n    }\n\n    pub(crate) fn stylize_arg_suffix(&self, styles: &Styles, required: Option<bool>) -> StyledStr {\n        use std::fmt::Write as _;\n        let literal = styles.get_literal();\n        let placeholder = styles.get_placeholder();\n        let mut styled = StyledStr::new();\n\n        let mut need_closing_bracket = false;\n        if self.is_takes_value_set() && !self.is_positional() {\n            let is_optional_val = self.get_min_vals() == 0;\n            let (style, start) = if self.is_require_equals_set() {\n                if is_optional_val {\n                    need_closing_bracket = true;\n                    (placeholder, \"[=\")\n                } else {\n                    (literal, \"=\")\n                }\n            } else if is_optional_val {\n                need_closing_bracket = true;\n                (placeholder, \" [\")\n            } else {\n                (placeholder, \" \")\n            };\n            let _ = write!(styled, \"{style}{start}{style:#}\");\n        }\n        if self.is_takes_value_set() || self.is_positional() {\n            let required = required.unwrap_or_else(|| self.is_required_set());\n            let arg_val = self.render_arg_val(required);\n            let _ = write!(styled, \"{placeholder}{arg_val}{placeholder:#}\",);\n        } else if matches!(*self.get_action(), ArgAction::Count) {\n            let _ = write!(styled, \"{placeholder}...{placeholder:#}\",);\n        }\n        if need_closing_bracket {\n            let _ = write!(styled, \"{placeholder}]{placeholder:#}\",);\n        }\n\n        styled\n    }\n\n    /// Write the values such as `<name1> <name2>`\n    fn render_arg_val(&self, required: bool) -> String {\n        let mut rendered = String::new();\n\n        let num_vals = self.get_num_args().unwrap_or_else(|| 1.into());\n\n        let mut val_names = if self.val_names.is_empty() {\n            vec![self.id.as_internal_str().to_owned()]\n        } else {\n            self.val_names.clone()\n        };\n        if val_names.len() == 1 {\n            let min = num_vals.min_values().max(1);\n            let val_name = val_names.pop().unwrap();\n            val_names = vec![val_name; min];\n        }\n\n        debug_assert!(self.is_takes_value_set());\n        for (n, val_name) in val_names.iter().enumerate() {\n            let arg_name = if self.is_positional() && (num_vals.min_values() == 0 || !required) {\n                format!(\"[{val_name}]\")\n            } else {\n                format!(\"<{val_name}>\")\n            };\n\n            if n != 0 {\n                rendered.push(' ');\n            }\n            rendered.push_str(&arg_name);\n        }\n\n        let mut extra_values = false;\n        extra_values |= val_names.len() < num_vals.max_values();\n        if self.is_positional() && matches!(*self.get_action(), ArgAction::Append) {\n            extra_values = true;\n        }\n        if extra_values {\n            rendered.push_str(\"...\");\n        }\n\n        rendered\n    }\n\n    /// Either multiple values or occurrences\n    pub(crate) fn is_multiple(&self) -> bool {\n        self.is_multiple_values_set() || matches!(*self.get_action(), ArgAction::Append)\n    }\n}\n\nimpl From<&'_ Arg> for Arg {\n    fn from(a: &Arg) -> Self {\n        a.clone()\n    }\n}\n\nimpl PartialEq for Arg {\n    fn eq(&self, other: &Arg) -> bool {\n        self.get_id() == other.get_id()\n    }\n}\n\nimpl PartialOrd for Arg {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nimpl Ord for Arg {\n    fn cmp(&self, other: &Arg) -> Ordering {\n        self.get_id().cmp(other.get_id())\n    }\n}\n\nimpl Eq for Arg {}\n\nimpl Display for Arg {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        let plain = Styles::plain();\n        self.stylized(&plain, None).fmt(f)\n    }\n}\n\nimpl fmt::Debug for Arg {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), fmt::Error> {\n        let mut ds = f.debug_struct(\"Arg\");\n\n        #[allow(unused_mut)]\n        let mut ds = ds\n            .field(\"id\", &self.id)\n            .field(\"help\", &self.help)\n            .field(\"long_help\", &self.long_help)\n            .field(\"action\", &self.action)\n            .field(\"value_parser\", &self.value_parser)\n            .field(\"blacklist\", &self.blacklist)\n            .field(\"settings\", &self.settings)\n            .field(\"overrides\", &self.overrides)\n            .field(\"groups\", &self.groups)\n            .field(\"requires\", &self.requires)\n            .field(\"r_ifs\", &self.r_ifs)\n            .field(\"r_unless\", &self.r_unless)\n            .field(\"short\", &self.short)\n            .field(\"long\", &self.long)\n            .field(\"aliases\", &self.aliases)\n            .field(\"short_aliases\", &self.short_aliases)\n            .field(\"disp_ord\", &self.disp_ord)\n            .field(\"val_names\", &self.val_names)\n            .field(\"num_vals\", &self.num_vals)\n            .field(\"val_delim\", &self.val_delim)\n            .field(\"default_vals\", &self.default_vals)\n            .field(\"default_vals_ifs\", &self.default_vals_ifs)\n            .field(\"terminator\", &self.terminator)\n            .field(\"index\", &self.index)\n            .field(\"help_heading\", &self.help_heading)\n            .field(\"default_missing_vals\", &self.default_missing_vals)\n            .field(\"ext\", &self.ext);\n\n        #[cfg(feature = \"env\")]\n        {\n            ds = ds.field(\"env\", &self.env);\n        }\n\n        ds.finish()\n    }\n}\n\n/// User-provided data that can be attached to an [`Arg`]\n#[cfg(feature = \"unstable-ext\")]\npub trait ArgExt: Extension {}\n\n// Flags\n#[cfg(test)]\nmod test {\n    use super::Arg;\n    use super::ArgAction;\n\n    #[test]\n    fn flag_display_long() {\n        let mut f = Arg::new(\"flg\").long(\"flag\").action(ArgAction::SetTrue);\n        f._build();\n\n        assert_eq!(f.to_string(), \"--flag\");\n    }\n\n    #[test]\n    fn flag_display_short() {\n        let mut f2 = Arg::new(\"flg\").short('f').action(ArgAction::SetTrue);\n        f2._build();\n\n        assert_eq!(f2.to_string(), \"-f\");\n    }\n\n    #[test]\n    fn flag_display_count() {\n        let mut f2 = Arg::new(\"flg\").long(\"flag\").action(ArgAction::Count);\n        f2._build();\n\n        assert_eq!(f2.to_string(), \"--flag...\");\n    }\n\n    #[test]\n    fn flag_display_single_alias() {\n        let mut f = Arg::new(\"flg\")\n            .long(\"flag\")\n            .visible_alias(\"als\")\n            .action(ArgAction::SetTrue);\n        f._build();\n\n        assert_eq!(f.to_string(), \"--flag\");\n    }\n\n    #[test]\n    fn flag_display_multiple_aliases() {\n        let mut f = Arg::new(\"flg\").short('f').action(ArgAction::SetTrue);\n        f.aliases = vec![\n            (\"alias_not_visible\".into(), false),\n            (\"f2\".into(), true),\n            (\"f3\".into(), true),\n            (\"f4\".into(), true),\n        ];\n        f._build();\n\n        assert_eq!(f.to_string(), \"-f\");\n    }\n\n    #[test]\n    fn flag_display_single_short_alias() {\n        let mut f = Arg::new(\"flg\").short('a').action(ArgAction::SetTrue);\n        f.short_aliases = vec![('b', true)];\n        f._build();\n\n        assert_eq!(f.to_string(), \"-a\");\n    }\n\n    #[test]\n    fn flag_display_multiple_short_aliases() {\n        let mut f = Arg::new(\"flg\").short('a').action(ArgAction::SetTrue);\n        f.short_aliases = vec![('b', false), ('c', true), ('d', true), ('e', true)];\n        f._build();\n\n        assert_eq!(f.to_string(), \"-a\");\n    }\n\n    // Options\n\n    #[test]\n    fn option_display_multiple_occurrences() {\n        let mut o = Arg::new(\"opt\").long(\"option\").action(ArgAction::Append);\n        o._build();\n\n        assert_eq!(o.to_string(), \"--option <opt>\");\n    }\n\n    #[test]\n    fn option_display_multiple_values() {\n        let mut o = Arg::new(\"opt\")\n            .long(\"option\")\n            .action(ArgAction::Set)\n            .num_args(1..);\n        o._build();\n\n        assert_eq!(o.to_string(), \"--option <opt>...\");\n    }\n\n    #[test]\n    fn option_display_zero_or_more_values() {\n        let mut o = Arg::new(\"opt\")\n            .long(\"option\")\n            .action(ArgAction::Set)\n            .num_args(0..);\n        o._build();\n\n        assert_eq!(o.to_string(), \"--option [<opt>...]\");\n    }\n\n    #[test]\n    fn option_display_one_or_more_values() {\n        let mut o = Arg::new(\"opt\")\n            .long(\"option\")\n            .action(ArgAction::Set)\n            .num_args(1..);\n        o._build();\n\n        assert_eq!(o.to_string(), \"--option <opt>...\");\n    }\n\n    #[test]\n    fn option_display_zero_or_more_values_with_value_name() {\n        let mut o = Arg::new(\"opt\")\n            .short('o')\n            .action(ArgAction::Set)\n            .num_args(0..)\n            .value_names([\"file\"]);\n        o._build();\n\n        assert_eq!(o.to_string(), \"-o [<file>...]\");\n    }\n\n    #[test]\n    fn option_display_one_or_more_values_with_value_name() {\n        let mut o = Arg::new(\"opt\")\n            .short('o')\n            .action(ArgAction::Set)\n            .num_args(1..)\n            .value_names([\"file\"]);\n        o._build();\n\n        assert_eq!(o.to_string(), \"-o <file>...\");\n    }\n\n    #[test]\n    fn option_display_optional_value() {\n        let mut o = Arg::new(\"opt\")\n            .long(\"option\")\n            .action(ArgAction::Set)\n            .num_args(0..=1);\n        o._build();\n\n        assert_eq!(o.to_string(), \"--option [<opt>]\");\n    }\n\n    #[test]\n    fn option_display_value_names() {\n        let mut o = Arg::new(\"opt\")\n            .short('o')\n            .action(ArgAction::Set)\n            .value_names([\"file\", \"name\"]);\n        o._build();\n\n        assert_eq!(o.to_string(), \"-o <file> <name>\");\n    }\n\n    #[test]\n    fn option_display3() {\n        let mut o = Arg::new(\"opt\")\n            .short('o')\n            .num_args(1..)\n            .action(ArgAction::Set)\n            .value_names([\"file\", \"name\"]);\n        o._build();\n\n        assert_eq!(o.to_string(), \"-o <file> <name>...\");\n    }\n\n    #[test]\n    fn option_display_single_alias() {\n        let mut o = Arg::new(\"opt\")\n            .long(\"option\")\n            .action(ArgAction::Set)\n            .visible_alias(\"als\");\n        o._build();\n\n        assert_eq!(o.to_string(), \"--option <opt>\");\n    }\n\n    #[test]\n    fn option_display_multiple_aliases() {\n        let mut o = Arg::new(\"opt\")\n            .long(\"option\")\n            .action(ArgAction::Set)\n            .visible_aliases([\"als2\", \"als3\", \"als4\"])\n            .alias(\"als_not_visible\");\n        o._build();\n\n        assert_eq!(o.to_string(), \"--option <opt>\");\n    }\n\n    #[test]\n    fn option_display_single_short_alias() {\n        let mut o = Arg::new(\"opt\")\n            .short('a')\n            .action(ArgAction::Set)\n            .visible_short_alias('b');\n        o._build();\n\n        assert_eq!(o.to_string(), \"-a <opt>\");\n    }\n\n    #[test]\n    fn option_display_multiple_short_aliases() {\n        let mut o = Arg::new(\"opt\")\n            .short('a')\n            .action(ArgAction::Set)\n            .visible_short_aliases(['b', 'c', 'd'])\n            .short_alias('e');\n        o._build();\n\n        assert_eq!(o.to_string(), \"-a <opt>\");\n    }\n\n    // Positionals\n\n    #[test]\n    fn positional_display_multiple_values() {\n        let mut p = Arg::new(\"pos\").index(1).num_args(1..);\n        p._build();\n\n        assert_eq!(p.to_string(), \"[pos]...\");\n    }\n\n    #[test]\n    fn positional_display_multiple_values_required() {\n        let mut p = Arg::new(\"pos\").index(1).num_args(1..).required(true);\n        p._build();\n\n        assert_eq!(p.to_string(), \"<pos>...\");\n    }\n\n    #[test]\n    fn positional_display_zero_or_more_values() {\n        let mut p = Arg::new(\"pos\").index(1).num_args(0..);\n        p._build();\n\n        assert_eq!(p.to_string(), \"[pos]...\");\n    }\n\n    #[test]\n    fn positional_display_one_or_more_values() {\n        let mut p = Arg::new(\"pos\").index(1).num_args(1..);\n        p._build();\n\n        assert_eq!(p.to_string(), \"[pos]...\");\n    }\n\n    #[test]\n    fn positional_display_one_or_more_values_required() {\n        let mut p = Arg::new(\"pos\").index(1).num_args(1..).required(true);\n        p._build();\n\n        assert_eq!(p.to_string(), \"<pos>...\");\n    }\n\n    #[test]\n    fn positional_display_optional_value() {\n        let mut p = Arg::new(\"pos\")\n            .index(1)\n            .num_args(0..=1)\n            .action(ArgAction::Set);\n        p._build();\n\n        assert_eq!(p.to_string(), \"[pos]\");\n    }\n\n    #[test]\n    fn positional_display_multiple_occurrences() {\n        let mut p = Arg::new(\"pos\").index(1).action(ArgAction::Append);\n        p._build();\n\n        assert_eq!(p.to_string(), \"[pos]...\");\n    }\n\n    #[test]\n    fn positional_display_multiple_occurrences_required() {\n        let mut p = Arg::new(\"pos\")\n            .index(1)\n            .action(ArgAction::Append)\n            .required(true);\n        p._build();\n\n        assert_eq!(p.to_string(), \"<pos>...\");\n    }\n\n    #[test]\n    fn positional_display_required() {\n        let mut p = Arg::new(\"pos\").index(1).required(true);\n        p._build();\n\n        assert_eq!(p.to_string(), \"<pos>\");\n    }\n\n    #[test]\n    fn positional_display_val_names() {\n        let mut p = Arg::new(\"pos\").index(1).value_names([\"file1\", \"file2\"]);\n        p._build();\n\n        assert_eq!(p.to_string(), \"[file1] [file2]\");\n    }\n\n    #[test]\n    fn positional_display_val_names_required() {\n        let mut p = Arg::new(\"pos\")\n            .index(1)\n            .value_names([\"file1\", \"file2\"])\n            .required(true);\n        p._build();\n\n        assert_eq!(p.to_string(), \"<file1> <file2>\");\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/arg_group.rs",
    "content": "// Internal\nuse crate::builder::IntoResettable;\nuse crate::util::Id;\n\n/// Specifies a logical group of [arguments]\n///\n/// You can use this for\n/// - applying validation to an entire group, like [`ArgGroup::multiple`]\n/// - validate relationships between an argument and a group, like [conflicts] or [requirements]\n/// - check which argument in a group was specified on the command-line\n///\n/// For visually grouping arguments in help, see instead\n/// [`Arg::help_heading`][crate::Arg::help_heading].\n///\n/// # Examples\n///\n/// The following example demonstrates using an `ArgGroup` to ensure that one, and only one, of\n/// the arguments from the specified group is present at runtime.\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::{Command, arg, ArgGroup, error::ErrorKind};\n/// let result = Command::new(\"cmd\")\n///     .arg(arg!(--\"set-ver\" <ver> \"set the version manually\"))\n///     .arg(arg!(--major           \"auto increase major\"))\n///     .arg(arg!(--minor           \"auto increase minor\"))\n///     .arg(arg!(--patch           \"auto increase patch\"))\n///     .group(ArgGroup::new(\"vers\")\n///          .args([\"set-ver\", \"major\", \"minor\", \"patch\"])\n///          .required(true))\n///     .try_get_matches_from(vec![\"cmd\", \"--major\", \"--patch\"]);\n/// // Because we used two args in the group it's an error\n/// assert!(result.is_err());\n/// let err = result.unwrap_err();\n/// assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n/// ```\n///\n/// This next example shows a passing parse of the same scenario\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::{Command, arg, ArgGroup, Id};\n/// let result = Command::new(\"cmd\")\n///     .arg(arg!(--\"set-ver\" <ver> \"set the version manually\"))\n///     .arg(arg!(--major           \"auto increase major\"))\n///     .arg(arg!(--minor           \"auto increase minor\"))\n///     .arg(arg!(--patch           \"auto increase patch\"))\n///     .group(ArgGroup::new(\"vers\")\n///          .args([\"set-ver\", \"major\", \"minor\",\"patch\"])\n///          .required(true))\n///     .try_get_matches_from(vec![\"cmd\", \"--major\"]);\n/// assert!(result.is_ok());\n/// let matches = result.unwrap();\n/// // We may not know which of the args was used, so we can test for the group...\n/// assert!(matches.contains_id(\"vers\"));\n/// // We can also ask the group which arg was used\n/// assert_eq!(matches\n///     .get_one::<Id>(\"vers\")\n///     .expect(\"`vers` is required\")\n///     .as_str(),\n///     \"major\"\n/// );\n/// // we could also alternatively check each arg individually (not shown here)\n/// ```\n/// [arguments]: crate::Arg\n/// [conflicts]: crate::Arg::conflicts_with()\n/// [requirements]: crate::Arg::requires()\n#[derive(Default, Clone, Debug, PartialEq, Eq)]\npub struct ArgGroup {\n    pub(crate) id: Id,\n    pub(crate) args: Vec<Id>,\n    pub(crate) required: bool,\n    pub(crate) requires: Vec<Id>,\n    pub(crate) conflicts: Vec<Id>,\n    pub(crate) multiple: bool,\n}\n\n/// # Builder\nimpl ArgGroup {\n    /// Create a `ArgGroup` using a unique name.\n    ///\n    /// The name will be used to get values from the group or refer to the group inside of conflict\n    /// and requirement rules.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, ArgGroup};\n    /// ArgGroup::new(\"config\")\n    /// # ;\n    /// ```\n    pub fn new(id: impl Into<Id>) -> Self {\n        ArgGroup::default().id(id)\n    }\n\n    /// Sets the group name.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, ArgGroup};\n    /// ArgGroup::default().id(\"config\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn id(mut self, id: impl Into<Id>) -> Self {\n        self.id = id.into();\n        self\n    }\n\n    /// Adds an [argument] to this group by name\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgGroup, ArgAction};\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"color\")\n    ///         .short('c')\n    ///         .action(ArgAction::SetTrue))\n    ///     .group(ArgGroup::new(\"req_flags\")\n    ///         .arg(\"flag\")\n    ///         .arg(\"color\"))\n    ///     .get_matches_from(vec![\"myprog\", \"-f\"]);\n    /// // maybe we don't know which of the two flags was used...\n    /// assert!(m.contains_id(\"req_flags\"));\n    /// // but we can also check individually if needed\n    /// assert!(m.contains_id(\"flag\"));\n    /// ```\n    /// [argument]: crate::Arg\n    #[must_use]\n    pub fn arg(mut self, arg_id: impl IntoResettable<Id>) -> Self {\n        if let Some(arg_id) = arg_id.into_resettable().into_option() {\n            self.args.push(arg_id);\n        } else {\n            self.args.clear();\n        }\n        self\n    }\n\n    /// Adds multiple [arguments] to this group by name\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgGroup, ArgAction};\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"color\")\n    ///         .short('c')\n    ///         .action(ArgAction::SetTrue))\n    ///     .group(ArgGroup::new(\"req_flags\")\n    ///         .args([\"flag\", \"color\"]))\n    ///     .get_matches_from(vec![\"myprog\", \"-f\"]);\n    /// // maybe we don't know which of the two flags was used...\n    /// assert!(m.contains_id(\"req_flags\"));\n    /// // but we can also check individually if needed\n    /// assert!(m.contains_id(\"flag\"));\n    /// ```\n    /// [arguments]: crate::Arg\n    #[must_use]\n    pub fn args(mut self, ns: impl IntoIterator<Item = impl Into<Id>>) -> Self {\n        for n in ns {\n            self = self.arg(n);\n        }\n        self\n    }\n\n    /// Getters for all args. It will return a vector of `Id`\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{ArgGroup};\n    /// let args: Vec<&str> = vec![\"a1\".into(), \"a4\".into()];\n    /// let grp = ArgGroup::new(\"program\").args(&args);\n    ///\n    /// for (pos, arg) in grp.get_args().enumerate() {\n    ///     assert_eq!(*arg, args[pos]);\n    /// }\n    /// ```\n    pub fn get_args(&self) -> impl Iterator<Item = &Id> {\n        self.args.iter()\n    }\n\n    /// Allows more than one of the [`Arg`]s in this group to be used. (Default: `false`)\n    ///\n    /// # Examples\n    ///\n    /// Notice in this example we use *both* the `-f` and `-c` flags which are both part of the\n    /// group\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgGroup, ArgAction};\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"color\")\n    ///         .short('c')\n    ///         .action(ArgAction::SetTrue))\n    ///     .group(ArgGroup::new(\"req_flags\")\n    ///         .args([\"flag\", \"color\"])\n    ///         .multiple(true))\n    ///     .get_matches_from(vec![\"myprog\", \"-f\", \"-c\"]);\n    /// // maybe we don't know which of the two flags was used...\n    /// assert!(m.contains_id(\"req_flags\"));\n    /// ```\n    /// In this next example, we show the default behavior (i.e. `multiple(false)`) which will throw\n    /// an error if more than one of the args in the group was used.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgGroup, error::ErrorKind, ArgAction};\n    /// let result = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"color\")\n    ///         .short('c')\n    ///         .action(ArgAction::SetTrue))\n    ///     .group(ArgGroup::new(\"req_flags\")\n    ///         .args([\"flag\", \"color\"]))\n    ///     .try_get_matches_from(vec![\"myprog\", \"-f\", \"-c\"]);\n    /// // Because we used both args in the group it's an error\n    /// assert!(result.is_err());\n    /// let err = result.unwrap_err();\n    /// assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n    /// ```\n    ///\n    /// [`Arg`]: crate::Arg\n    #[inline]\n    #[must_use]\n    pub fn multiple(mut self, yes: bool) -> Self {\n        self.multiple = yes;\n        self\n    }\n\n    /// Return true if the group allows more than one of the arguments\n    /// in this group to be used. (Default: `false`)\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{ArgGroup};\n    /// let mut group = ArgGroup::new(\"myprog\")\n    ///     .args([\"f\", \"c\"])\n    ///     .multiple(true);\n    ///\n    /// assert!(group.is_multiple());\n    /// ```\n    pub fn is_multiple(&mut self) -> bool {\n        self.multiple\n    }\n\n    /// Require an argument from the group to be present when parsing.\n    ///\n    /// This is unless conflicting with another argument.  A required group will be displayed in\n    /// the usage string of the application in the format `<arg|arg2|arg3>`.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This setting only applies to the current [`Command`] / [`Subcommand`]s, and not\n    /// globally.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** By default, [`ArgGroup::multiple`] is set to `false` which when combined with\n    /// `ArgGroup::required(true)` states, \"One and *only one* arg must be used from this group.\n    /// Use of more than one arg is an error.\" Vice setting `ArgGroup::multiple(true)` which\n    /// states, '*At least* one arg from this group must be used. Using multiple is OK.\"\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgGroup, error::ErrorKind, ArgAction};\n    /// let result = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"color\")\n    ///         .short('c')\n    ///         .action(ArgAction::SetTrue))\n    ///     .group(ArgGroup::new(\"req_flags\")\n    ///         .args([\"flag\", \"color\"])\n    ///         .required(true))\n    ///     .try_get_matches_from(vec![\"myprog\"]);\n    /// // Because we didn't use any of the args in the group, it's an error\n    /// assert!(result.is_err());\n    /// let err = result.unwrap_err();\n    /// assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    ///\n    /// [`Subcommand`]: crate::Subcommand\n    /// [`ArgGroup::multiple`]: ArgGroup::multiple()\n    /// [`Command`]: crate::Command\n    #[inline]\n    #[must_use]\n    pub fn required(mut self, yes: bool) -> Self {\n        self.required = yes;\n        self\n    }\n\n    /// Specify an argument or group that must be present when this group is.\n    ///\n    /// This is not to be confused with a [required group]. Requirement rules function just like\n    /// [argument requirement rules], you can name other arguments or groups that must be present\n    /// when any one of the arguments from this group is used.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The name provided may be an argument or group name\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgGroup, error::ErrorKind, ArgAction};\n    /// let result = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"color\")\n    ///         .short('c')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"debug\")\n    ///         .short('d')\n    ///         .action(ArgAction::SetTrue))\n    ///     .group(ArgGroup::new(\"req_flags\")\n    ///         .args([\"flag\", \"color\"])\n    ///         .requires(\"debug\"))\n    ///     .try_get_matches_from(vec![\"myprog\", \"-c\"]);\n    /// // because we used an arg from the group, and the group requires \"-d\" to be used, it's an\n    /// // error\n    /// assert!(result.is_err());\n    /// let err = result.unwrap_err();\n    /// assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [required group]: ArgGroup::required()\n    /// [argument requirement rules]: crate::Arg::requires()\n    #[must_use]\n    pub fn requires(mut self, id: impl IntoResettable<Id>) -> Self {\n        if let Some(id) = id.into_resettable().into_option() {\n            self.requires.push(id);\n        } else {\n            self.requires.clear();\n        }\n        self\n    }\n\n    /// Specify arguments or groups that must be present when this group is.\n    ///\n    /// This is not to be confused with a [required group]. Requirement rules function just like\n    /// [argument requirement rules], you can name other arguments or groups that must be present\n    /// when one of the arguments from this group is used.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The names provided may be an argument or group name\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgGroup, error::ErrorKind, ArgAction};\n    /// let result = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"color\")\n    ///         .short('c')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"debug\")\n    ///         .short('d')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"verb\")\n    ///         .short('v')\n    ///         .action(ArgAction::SetTrue))\n    ///     .group(ArgGroup::new(\"req_flags\")\n    ///         .args([\"flag\", \"color\"])\n    ///         .requires_all([\"debug\", \"verb\"]))\n    ///     .try_get_matches_from(vec![\"myprog\", \"-c\", \"-d\"]);\n    /// // because we used an arg from the group, and the group requires \"-d\" and \"-v\" to be used,\n    /// // yet we only used \"-d\" it's an error\n    /// assert!(result.is_err());\n    /// let err = result.unwrap_err();\n    /// assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    /// [required group]: ArgGroup::required()\n    /// [argument requirement rules]: crate::Arg::requires_ifs()\n    #[must_use]\n    pub fn requires_all(mut self, ns: impl IntoIterator<Item = impl Into<Id>>) -> Self {\n        for n in ns {\n            self = self.requires(n);\n        }\n        self\n    }\n\n    /// Specify an argument or group that must **not** be present when this group is.\n    ///\n    /// Exclusion (aka conflict) rules function just like [argument exclusion rules], you can name\n    /// other arguments or groups that must *not* be present when one of the arguments from this\n    /// group are used.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The name provided may be an argument, or group name\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgGroup, error::ErrorKind, ArgAction};\n    /// let result = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"color\")\n    ///         .short('c')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"debug\")\n    ///         .short('d')\n    ///         .action(ArgAction::SetTrue))\n    ///     .group(ArgGroup::new(\"req_flags\")\n    ///         .args([\"flag\", \"color\"])\n    ///         .conflicts_with(\"debug\"))\n    ///     .try_get_matches_from(vec![\"myprog\", \"-c\", \"-d\"]);\n    /// // because we used an arg from the group, and the group conflicts with \"-d\", it's an error\n    /// assert!(result.is_err());\n    /// let err = result.unwrap_err();\n    /// assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n    /// ```\n    /// [argument exclusion rules]: crate::Arg::conflicts_with()\n    #[must_use]\n    pub fn conflicts_with(mut self, id: impl IntoResettable<Id>) -> Self {\n        if let Some(id) = id.into_resettable().into_option() {\n            self.conflicts.push(id);\n        } else {\n            self.conflicts.clear();\n        }\n        self\n    }\n\n    /// Specify arguments or groups that must **not** be present when this group is.\n    ///\n    /// Exclusion rules function just like [argument exclusion rules], you can name other arguments\n    /// or groups that must *not* be present when one of the arguments from this group are used.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The names provided may be an argument, or group name\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgGroup, error::ErrorKind, ArgAction};\n    /// let result = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"color\")\n    ///         .short('c')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"debug\")\n    ///         .short('d')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"verb\")\n    ///         .short('v')\n    ///         .action(ArgAction::SetTrue))\n    ///     .group(ArgGroup::new(\"req_flags\")\n    ///         .args([\"flag\", \"color\"])\n    ///         .conflicts_with_all([\"debug\", \"verb\"]))\n    ///     .try_get_matches_from(vec![\"myprog\", \"-c\", \"-v\"]);\n    /// // because we used an arg from the group, and the group conflicts with either \"-v\" or \"-d\"\n    /// // it's an error\n    /// assert!(result.is_err());\n    /// let err = result.unwrap_err();\n    /// assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n    /// ```\n    ///\n    /// [argument exclusion rules]: crate::Arg::conflicts_with_all()\n    #[must_use]\n    pub fn conflicts_with_all(mut self, ns: impl IntoIterator<Item = impl Into<Id>>) -> Self {\n        for n in ns {\n            self = self.conflicts_with(n);\n        }\n        self\n    }\n}\n\n/// # Reflection\nimpl ArgGroup {\n    /// Get the name of the group\n    #[inline]\n    pub fn get_id(&self) -> &Id {\n        &self.id\n    }\n\n    /// Reports whether [`ArgGroup::required`] is set\n    #[inline]\n    pub fn is_required_set(&self) -> bool {\n        self.required\n    }\n}\n\nimpl From<&'_ ArgGroup> for ArgGroup {\n    fn from(g: &ArgGroup) -> Self {\n        g.clone()\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    #[test]\n    fn groups() {\n        let g = ArgGroup::new(\"test\")\n            .arg(\"a1\")\n            .arg(\"a4\")\n            .args([\"a2\", \"a3\"])\n            .required(true)\n            .conflicts_with(\"c1\")\n            .conflicts_with_all([\"c2\", \"c3\"])\n            .conflicts_with(\"c4\")\n            .requires(\"r1\")\n            .requires_all([\"r2\", \"r3\"])\n            .requires(\"r4\");\n\n        let args: Vec<Id> = vec![\"a1\".into(), \"a4\".into(), \"a2\".into(), \"a3\".into()];\n        let reqs: Vec<Id> = vec![\"r1\".into(), \"r2\".into(), \"r3\".into(), \"r4\".into()];\n        let confs: Vec<Id> = vec![\"c1\".into(), \"c2\".into(), \"c3\".into(), \"c4\".into()];\n\n        assert_eq!(g.args, args);\n        assert_eq!(g.requires, reqs);\n        assert_eq!(g.conflicts, confs);\n    }\n\n    #[test]\n    fn test_from() {\n        let g = ArgGroup::new(\"test\")\n            .arg(\"a1\")\n            .arg(\"a4\")\n            .args([\"a2\", \"a3\"])\n            .required(true)\n            .conflicts_with(\"c1\")\n            .conflicts_with_all([\"c2\", \"c3\"])\n            .conflicts_with(\"c4\")\n            .requires(\"r1\")\n            .requires_all([\"r2\", \"r3\"])\n            .requires(\"r4\");\n\n        let args: Vec<Id> = vec![\"a1\".into(), \"a4\".into(), \"a2\".into(), \"a3\".into()];\n        let reqs: Vec<Id> = vec![\"r1\".into(), \"r2\".into(), \"r3\".into(), \"r4\".into()];\n        let confs: Vec<Id> = vec![\"c1\".into(), \"c2\".into(), \"c3\".into(), \"c4\".into()];\n\n        let g2 = ArgGroup::from(&g);\n        assert_eq!(g2.args, args);\n        assert_eq!(g2.requires, reqs);\n        assert_eq!(g2.conflicts, confs);\n    }\n\n    // This test will *fail to compile* if ArgGroup is not Send + Sync\n    #[test]\n    fn arg_group_send_sync() {\n        fn foo<T: Send + Sync>(_: T) {}\n        foo(ArgGroup::new(\"test\"));\n    }\n\n    #[test]\n    fn arg_group_expose_is_multiple_helper() {\n        let args: Vec<Id> = vec![\"a1\".into(), \"a4\".into()];\n\n        let mut grp_multiple = ArgGroup::new(\"test_multiple\").args(&args).multiple(true);\n        assert!(grp_multiple.is_multiple());\n\n        let mut grp_not_multiple = ArgGroup::new(\"test_multiple\").args(&args).multiple(false);\n        assert!(!grp_not_multiple.is_multiple());\n    }\n\n    #[test]\n    fn arg_group_expose_get_args_helper() {\n        let args: Vec<Id> = vec![\"a1\".into(), \"a4\".into()];\n        let grp = ArgGroup::new(\"program\").args(&args);\n\n        for (pos, arg) in grp.get_args().enumerate() {\n            assert_eq!(*arg, args[pos]);\n        }\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/arg_predicate.rs",
    "content": "use crate::builder::OsStr;\n\n/// Operations to perform on argument values\n///\n/// These do not apply to [`ValueSource::DefaultValue`][crate::parser::ValueSource::DefaultValue]\n#[derive(Clone, Debug, PartialEq, Eq)]\n#[cfg_attr(feature = \"unstable-v5\", non_exhaustive)]\npub enum ArgPredicate {\n    /// Is the argument present?\n    IsPresent,\n    /// Does the argument match the specified value?\n    Equals(OsStr),\n}\n\nimpl<S: Into<OsStr>> From<S> for ArgPredicate {\n    fn from(other: S) -> Self {\n        Self::Equals(other.into())\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/arg_settings.rs",
    "content": "#[allow(unused)]\nuse crate::Arg;\n\n#[derive(Default, Copy, Clone, Debug, PartialEq, Eq)]\npub(crate) struct ArgFlags(u32);\n\nimpl ArgFlags {\n    pub(crate) fn set(&mut self, setting: ArgSettings) {\n        self.0 |= setting.bit();\n    }\n\n    pub(crate) fn unset(&mut self, setting: ArgSettings) {\n        self.0 &= !setting.bit();\n    }\n\n    pub(crate) fn is_set(&self, setting: ArgSettings) -> bool {\n        self.0 & setting.bit() != 0\n    }\n\n    pub(crate) fn insert(&mut self, other: Self) {\n        self.0 |= other.0;\n    }\n}\n\nimpl std::ops::BitOr for ArgFlags {\n    type Output = Self;\n\n    fn bitor(mut self, rhs: Self) -> Self::Output {\n        self.insert(rhs);\n        self\n    }\n}\n\n/// Various settings that apply to arguments and may be set, unset, and checked via getter/setter\n/// methods [`Arg::setting`], [`Arg::unset_setting`], and [`Arg::is_set`]. This is what the\n/// [`Arg`] methods which accept a `bool` use internally.\n///\n/// [`Arg`]: crate::Arg\n/// [`Arg::setting`]: crate::Arg::setting()\n/// [`Arg::unset_setting`]: crate::Arg::unset_setting()\n/// [`Arg::is_set`]: crate::Arg::is_set()\n#[derive(Debug, PartialEq, Copy, Clone)]\n#[repr(u8)]\npub(crate) enum ArgSettings {\n    Required,\n    Global,\n    Hidden,\n    NextLineHelp,\n    HidePossibleValues,\n    AllowHyphenValues,\n    AllowNegativeNumbers,\n    RequireEquals,\n    Last,\n    TrailingVarArg,\n    HideDefaultValue,\n    IgnoreCase,\n    #[cfg(feature = \"env\")]\n    HideEnv,\n    #[cfg(feature = \"env\")]\n    HideEnvValues,\n    HiddenShortHelp,\n    HiddenLongHelp,\n    Exclusive,\n}\n\nimpl ArgSettings {\n    fn bit(self) -> u32 {\n        1 << (self as u8)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use crate::Arg;\n\n    #[test]\n    fn setting() {\n        let m = Arg::new(\"setting\").setting(ArgSettings::Required);\n        assert!(m.is_required_set());\n    }\n\n    #[test]\n    fn unset_setting() {\n        let m = Arg::new(\"unset_setting\").setting(ArgSettings::Required);\n        assert!(m.is_required_set());\n\n        let m = m.unset_setting(ArgSettings::Required);\n        assert!(!m.is_required_set(), \"{m:#?}\");\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/command.rs",
    "content": "#![cfg_attr(not(feature = \"usage\"), allow(unused_mut))]\n\n// Std\nuse std::env;\nuse std::ffi::OsString;\nuse std::fmt;\nuse std::io;\nuse std::ops::Index;\nuse std::path::Path;\n\n// Internal\nuse crate::builder::ArgAction;\nuse crate::builder::IntoResettable;\nuse crate::builder::PossibleValue;\nuse crate::builder::Str;\nuse crate::builder::StyledStr;\nuse crate::builder::Styles;\nuse crate::builder::app_settings::{AppFlags, AppSettings};\nuse crate::builder::arg_settings::ArgSettings;\nuse crate::builder::ext::Extension;\nuse crate::builder::ext::Extensions;\nuse crate::builder::{Arg, ArgGroup, ArgPredicate};\nuse crate::error::ErrorKind;\nuse crate::error::Result as ClapResult;\nuse crate::mkeymap::MKeyMap;\nuse crate::output::fmt::Stream;\nuse crate::output::{Usage, fmt::Colorizer, write_help};\nuse crate::parser::{ArgMatcher, ArgMatches, Parser};\nuse crate::util::ChildGraph;\nuse crate::util::{Id, color::ColorChoice};\nuse crate::{Error, INTERNAL_ERROR_MSG};\n\n#[cfg(debug_assertions)]\nuse crate::builder::debug_asserts::assert_app;\n\n/// Build a command-line interface.\n///\n/// This includes defining arguments, subcommands, parser behavior, and help output.\n/// Once all configuration is complete,\n/// the [`Command::get_matches`] family of methods starts the runtime-parsing\n/// process. These methods then return information about the user supplied\n/// arguments (or lack thereof).\n///\n/// When deriving a [`Parser`][crate::Parser], you can use\n/// [`CommandFactory::command`][crate::CommandFactory::command] to access the\n/// `Command`.\n///\n/// - [Basic API][crate::Command#basic-api]\n/// - [Application-wide Settings][crate::Command#application-wide-settings]\n/// - [Command-specific Settings][crate::Command#command-specific-settings]\n/// - [Subcommand-specific Settings][crate::Command#subcommand-specific-settings]\n/// - [Reflection][crate::Command#reflection]\n///\n/// # Examples\n///\n/// ```no_run\n/// # use clap_builder as clap;\n/// # use clap::{Command, Arg};\n/// let m = Command::new(\"My Program\")\n///     .author(\"Me, me@mail.com\")\n///     .version(\"1.0.2\")\n///     .about(\"Explains in brief what the program does\")\n///     .arg(\n///         Arg::new(\"in_file\")\n///     )\n///     .after_help(\"Longer explanation to appear after the options when \\\n///                  displaying the help information from --help or -h\")\n///     .get_matches();\n///\n/// // Your program logic starts here...\n/// ```\n/// [`Command::get_matches`]: Command::get_matches()\n#[derive(Debug, Clone)]\npub struct Command {\n    name: Str,\n    long_flag: Option<Str>,\n    short_flag: Option<char>,\n    display_name: Option<String>,\n    bin_name: Option<String>,\n    author: Option<Str>,\n    version: Option<Str>,\n    long_version: Option<Str>,\n    about: Option<StyledStr>,\n    long_about: Option<StyledStr>,\n    before_help: Option<StyledStr>,\n    before_long_help: Option<StyledStr>,\n    after_help: Option<StyledStr>,\n    after_long_help: Option<StyledStr>,\n    aliases: Vec<(Str, bool)>,             // (name, visible)\n    short_flag_aliases: Vec<(char, bool)>, // (name, visible)\n    long_flag_aliases: Vec<(Str, bool)>,   // (name, visible)\n    usage_str: Option<StyledStr>,\n    usage_name: Option<String>,\n    help_str: Option<StyledStr>,\n    disp_ord: Option<usize>,\n    #[cfg(feature = \"help\")]\n    template: Option<StyledStr>,\n    settings: AppFlags,\n    g_settings: AppFlags,\n    args: MKeyMap,\n    subcommands: Vec<Command>,\n    groups: Vec<ArgGroup>,\n    current_help_heading: Option<Str>,\n    current_disp_ord: Option<usize>,\n    subcommand_value_name: Option<Str>,\n    subcommand_heading: Option<Str>,\n    external_value_parser: Option<super::ValueParser>,\n    long_help_exists: bool,\n    deferred: Option<fn(Command) -> Command>,\n    #[cfg(feature = \"unstable-ext\")]\n    ext: Extensions,\n    app_ext: Extensions,\n}\n\n/// # Basic API\nimpl Command {\n    /// Creates a new instance of an `Command`.\n    ///\n    /// It is common, but not required, to use binary name as the `name`. This\n    /// name will only be displayed to the user when they request to print\n    /// version or help and usage information.\n    ///\n    /// See also [`command!`](crate::command!) and [`crate_name!`](crate::crate_name!).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"My Program\")\n    /// # ;\n    /// ```\n    pub fn new(name: impl Into<Str>) -> Self {\n        /// The actual implementation of `new`, non-generic to save code size.\n        ///\n        /// If we don't do this rustc will unnecessarily generate multiple versions\n        /// of this code.\n        fn new_inner(name: Str) -> Command {\n            Command {\n                name,\n                ..Default::default()\n            }\n        }\n\n        new_inner(name.into())\n    }\n\n    /// Adds an [argument] to the list of valid possibilities.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg, Arg};\n    /// Command::new(\"myprog\")\n    ///     // Adding a single \"flag\" argument with a short and help text, using Arg::new()\n    ///     .arg(\n    ///         Arg::new(\"debug\")\n    ///            .short('d')\n    ///            .help(\"turns on debugging mode\")\n    ///     )\n    ///     // Adding a single \"option\" argument with a short, a long, and help text using the less\n    ///     // verbose Arg::from()\n    ///     .arg(\n    ///         arg!(-c --config <CONFIG> \"Optionally sets a config file to use\")\n    ///     )\n    /// # ;\n    /// ```\n    /// [argument]: Arg\n    #[must_use]\n    pub fn arg(mut self, a: impl Into<Arg>) -> Self {\n        let arg = a.into();\n        self.arg_internal(arg);\n        self\n    }\n\n    fn arg_internal(&mut self, mut arg: Arg) {\n        if let Some(current_disp_ord) = self.current_disp_ord.as_mut() {\n            if !arg.is_positional() {\n                let current = *current_disp_ord;\n                arg.disp_ord.get_or_insert(current);\n                *current_disp_ord = current + 1;\n            }\n        }\n\n        arg.help_heading\n            .get_or_insert_with(|| self.current_help_heading.clone());\n        self.args.push(arg);\n    }\n\n    /// Adds multiple [arguments] to the list of valid possibilities.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg, Arg};\n    /// Command::new(\"myprog\")\n    ///     .args([\n    ///         arg!(-d --debug \"turns on debugging info\"),\n    ///         Arg::new(\"input\").help(\"the input file to use\")\n    ///     ])\n    /// # ;\n    /// ```\n    /// [arguments]: Arg\n    #[must_use]\n    pub fn args(mut self, args: impl IntoIterator<Item = impl Into<Arg>>) -> Self {\n        for arg in args {\n            self = self.arg(arg);\n        }\n        self\n    }\n\n    /// Allows one to mutate an [`Arg`] after it's been added to a [`Command`].\n    ///\n    /// # Panics\n    ///\n    /// If the argument is undefined\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    ///\n    /// let mut cmd = Command::new(\"foo\")\n    ///     .arg(Arg::new(\"bar\")\n    ///         .short('b')\n    ///         .action(ArgAction::SetTrue))\n    ///     .mut_arg(\"bar\", |a| a.short('B'));\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\"foo\", \"-b\"]);\n    ///\n    /// // Since we changed `bar`'s short to \"B\" this should err as there\n    /// // is no `-b` anymore, only `-B`\n    ///\n    /// assert!(res.is_err());\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\"foo\", \"-B\"]);\n    /// assert!(res.is_ok());\n    /// ```\n    #[must_use]\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn mut_arg<F>(mut self, arg_id: impl AsRef<str>, f: F) -> Self\n    where\n        F: FnOnce(Arg) -> Arg,\n    {\n        let id = arg_id.as_ref();\n        let a = self\n            .args\n            .remove_by_name(id)\n            .unwrap_or_else(|| panic!(\"Argument `{id}` is undefined\"));\n\n        self.args.push(f(a));\n        self\n    }\n\n    /// Allows one to mutate all [`Arg`]s after they've been added to a [`Command`].\n    ///\n    /// This does not affect the built-in `--help` or `--version` arguments.\n    ///\n    /// # Examples\n    ///\n    #[cfg_attr(feature = \"string\", doc = \"```\")]\n    #[cfg_attr(not(feature = \"string\"), doc = \"```ignore\")]\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    ///\n    /// let mut cmd = Command::new(\"foo\")\n    ///     .arg(Arg::new(\"bar\")\n    ///         .long(\"bar\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"baz\")\n    ///         .long(\"baz\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .mut_args(|a| {\n    ///         if let Some(l) = a.get_long().map(|l| format!(\"prefix-{l}\")) {\n    ///             a.long(l)\n    ///         } else {\n    ///             a\n    ///         }\n    ///     });\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\"foo\", \"--bar\"]);\n    ///\n    /// // Since we changed `bar`'s long to \"prefix-bar\" this should err as there\n    /// // is no `--bar` anymore, only `--prefix-bar`.\n    ///\n    /// assert!(res.is_err());\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\"foo\", \"--prefix-bar\"]);\n    /// assert!(res.is_ok());\n    /// ```\n    #[must_use]\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn mut_args<F>(mut self, f: F) -> Self\n    where\n        F: FnMut(Arg) -> Arg,\n    {\n        self.args.mut_args(f);\n        self\n    }\n\n    /// Allows one to mutate an [`ArgGroup`] after it's been added to a [`Command`].\n    ///\n    /// # Panics\n    ///\n    /// If the argument is undefined\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg, ArgGroup};\n    ///\n    /// Command::new(\"foo\")\n    ///     .arg(arg!(--\"set-ver\" <ver> \"set the version manually\").required(false))\n    ///     .arg(arg!(--major \"auto increase major\"))\n    ///     .arg(arg!(--minor \"auto increase minor\"))\n    ///     .arg(arg!(--patch \"auto increase patch\"))\n    ///     .group(ArgGroup::new(\"vers\")\n    ///          .args([\"set-ver\", \"major\", \"minor\",\"patch\"])\n    ///          .required(true))\n    ///     .mut_group(\"vers\", |a| a.required(false));\n    /// ```\n    #[must_use]\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn mut_group<F>(mut self, arg_id: impl AsRef<str>, f: F) -> Self\n    where\n        F: FnOnce(ArgGroup) -> ArgGroup,\n    {\n        let id = arg_id.as_ref();\n        let index = self\n            .groups\n            .iter()\n            .position(|g| g.get_id() == id)\n            .unwrap_or_else(|| panic!(\"Group `{id}` is undefined\"));\n        let a = self.groups.remove(index);\n\n        self.groups.push(f(a));\n        self\n    }\n    /// Allows one to mutate a [`Command`] after it's been added as a subcommand.\n    ///\n    /// This can be useful for modifying auto-generated arguments of nested subcommands with\n    /// [`Command::mut_arg`].\n    ///\n    /// # Panics\n    ///\n    /// If the subcommand is undefined\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    ///\n    /// let mut cmd = Command::new(\"foo\")\n    ///         .subcommand(Command::new(\"bar\"))\n    ///         .mut_subcommand(\"bar\", |subcmd| subcmd.disable_help_flag(true));\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\"foo\", \"bar\", \"--help\"]);\n    ///\n    /// // Since we disabled the help flag on the \"bar\" subcommand, this should err.\n    ///\n    /// assert!(res.is_err());\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\"foo\", \"bar\"]);\n    /// assert!(res.is_ok());\n    /// ```\n    #[must_use]\n    pub fn mut_subcommand<F>(mut self, name: impl AsRef<str>, f: F) -> Self\n    where\n        F: FnOnce(Self) -> Self,\n    {\n        let name = name.as_ref();\n        let pos = self.subcommands.iter().position(|s| s.name == name);\n\n        let subcmd = if let Some(idx) = pos {\n            self.subcommands.remove(idx)\n        } else {\n            panic!(\"Command `{name}` is undefined\")\n        };\n\n        self.subcommands.push(f(subcmd));\n        self\n    }\n\n    /// Allows one to mutate all [`Command`]s after they've been added as subcommands.\n    ///\n    /// This does not affect the built-in `--help` or `--version` arguments.\n    ///\n    /// # Examples\n    ///\n    #[cfg_attr(feature = \"string\", doc = \"```\")]\n    #[cfg_attr(not(feature = \"string\"), doc = \"```ignore\")]\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    ///\n    /// let mut cmd = Command::new(\"foo\")\n    ///     .subcommands([\n    ///         Command::new(\"fetch\"),\n    ///         Command::new(\"push\"),\n    ///     ])\n    ///     // Allow title-case subcommands\n    ///     .mut_subcommands(|sub| {\n    ///         let name = sub.get_name();\n    ///         let alias = name.chars().enumerate().map(|(i, c)| {\n    ///             if i == 0 {\n    ///                 c.to_ascii_uppercase()\n    ///             } else {\n    ///                 c\n    ///             }\n    ///         }).collect::<String>();\n    ///         sub.alias(alias)\n    ///     });\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\"foo\", \"fetch\"]);\n    /// assert!(res.is_ok());\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\"foo\", \"Fetch\"]);\n    /// assert!(res.is_ok());\n    /// ```\n    #[must_use]\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn mut_subcommands<F>(mut self, f: F) -> Self\n    where\n        F: FnMut(Command) -> Command,\n    {\n        self.subcommands = self.subcommands.into_iter().map(f).collect();\n        self\n    }\n\n    /// Adds an [`ArgGroup`] to the application.\n    ///\n    /// [`ArgGroup`]s are a family of related arguments.\n    /// By placing them in a logical group, you can build easier requirement and exclusion rules.\n    ///\n    /// Example use cases:\n    /// - Make an entire [`ArgGroup`] required, meaning that one (and *only*\n    ///   one) argument from that group must be present at runtime.\n    /// - Name an [`ArgGroup`] as a conflict to another argument.\n    ///   Meaning any of the arguments that belong to that group will cause a failure if present with\n    ///   the conflicting argument.\n    /// - Ensure exclusion between arguments.\n    /// - Extract a value from a group instead of determining exactly which argument was used.\n    ///\n    /// # Examples\n    ///\n    /// The following example demonstrates using an [`ArgGroup`] to ensure that one, and only one,\n    /// of the arguments from the specified group is present at runtime.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg, ArgGroup};\n    /// Command::new(\"cmd\")\n    ///     .arg(arg!(--\"set-ver\" <ver> \"set the version manually\").required(false))\n    ///     .arg(arg!(--major \"auto increase major\"))\n    ///     .arg(arg!(--minor \"auto increase minor\"))\n    ///     .arg(arg!(--patch \"auto increase patch\"))\n    ///     .group(ArgGroup::new(\"vers\")\n    ///          .args([\"set-ver\", \"major\", \"minor\",\"patch\"])\n    ///          .required(true))\n    /// # ;\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn group(mut self, group: impl Into<ArgGroup>) -> Self {\n        self.groups.push(group.into());\n        self\n    }\n\n    /// Adds multiple [`ArgGroup`]s to the [`Command`] at once.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg, ArgGroup};\n    /// Command::new(\"cmd\")\n    ///     .arg(arg!(--\"set-ver\" <ver> \"set the version manually\").required(false))\n    ///     .arg(arg!(--major         \"auto increase major\"))\n    ///     .arg(arg!(--minor         \"auto increase minor\"))\n    ///     .arg(arg!(--patch         \"auto increase patch\"))\n    ///     .arg(arg!(-c <FILE>       \"a config file\").required(false))\n    ///     .arg(arg!(-i <IFACE>      \"an interface\").required(false))\n    ///     .groups([\n    ///         ArgGroup::new(\"vers\")\n    ///             .args([\"set-ver\", \"major\", \"minor\",\"patch\"])\n    ///             .required(true),\n    ///         ArgGroup::new(\"input\")\n    ///             .args([\"c\", \"i\"])\n    ///     ])\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn groups(mut self, groups: impl IntoIterator<Item = impl Into<ArgGroup>>) -> Self {\n        for g in groups {\n            self = self.group(g.into());\n        }\n        self\n    }\n\n    /// Adds a subcommand to the list of valid possibilities.\n    ///\n    /// Subcommands are effectively sub-[`Command`]s, because they can contain their own arguments,\n    /// subcommands, version, usage, etc. They also function just like [`Command`]s, in that they get\n    /// their own auto generated help, version, and usage.\n    ///\n    /// A subcommand's [`Command::name`] will be used for:\n    /// - The argument the user passes in\n    /// - Programmatically looking up the subcommand\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg};\n    /// Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"config\")\n    ///         .about(\"Controls configuration features\")\n    ///         .arg(arg!(<config> \"Required configuration file to use\")))\n    /// # ;\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn subcommand(self, subcmd: impl Into<Command>) -> Self {\n        let subcmd = subcmd.into();\n        self.subcommand_internal(subcmd)\n    }\n\n    fn subcommand_internal(mut self, mut subcmd: Self) -> Self {\n        if let Some(current_disp_ord) = self.current_disp_ord.as_mut() {\n            let current = *current_disp_ord;\n            subcmd.disp_ord.get_or_insert(current);\n            *current_disp_ord = current + 1;\n        }\n        self.subcommands.push(subcmd);\n        self\n    }\n\n    /// Adds multiple subcommands to the list of valid possibilities.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// # Command::new(\"myprog\")\n    /// .subcommands( [\n    ///        Command::new(\"config\").about(\"Controls configuration functionality\")\n    ///                                 .arg(Arg::new(\"config_file\")),\n    ///        Command::new(\"debug\").about(\"Controls debug functionality\")])\n    /// # ;\n    /// ```\n    /// [`IntoIterator`]: std::iter::IntoIterator\n    #[must_use]\n    pub fn subcommands(mut self, subcmds: impl IntoIterator<Item = impl Into<Self>>) -> Self {\n        for subcmd in subcmds {\n            self = self.subcommand(subcmd);\n        }\n        self\n    }\n\n    /// Delay initialization for parts of the `Command`\n    ///\n    /// This is useful for large applications to delay definitions of subcommands until they are\n    /// being invoked.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg};\n    /// Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"config\")\n    ///         .about(\"Controls configuration features\")\n    ///         .defer(|cmd| {\n    ///             cmd.arg(arg!(<config> \"Required configuration file to use\"))\n    ///         })\n    ///     )\n    /// # ;\n    /// ```\n    pub fn defer(mut self, deferred: fn(Command) -> Command) -> Self {\n        self.deferred = Some(deferred);\n        self\n    }\n\n    /// Catch problems earlier in the development cycle.\n    ///\n    /// Most error states are handled as asserts under the assumption they are programming mistake\n    /// and not something to handle at runtime.  Rather than relying on tests (manual or automated)\n    /// that exhaustively test your CLI to ensure the asserts are evaluated, this will run those\n    /// asserts in a way convenient for running as a test.\n    ///\n    /// **Note:** This will not help with asserts in [`ArgMatches`], those will need exhaustive\n    /// testing of your CLI.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// fn cmd() -> Command {\n    ///     Command::new(\"foo\")\n    ///         .arg(\n    ///             Arg::new(\"bar\").short('b').action(ArgAction::SetTrue)\n    ///         )\n    /// }\n    ///\n    /// #[test]\n    /// fn verify_app() {\n    ///     cmd().debug_assert();\n    /// }\n    ///\n    /// let m = cmd().get_matches_from(vec![\"foo\", \"-b\"]);\n    /// println!(\"{}\", m.get_flag(\"bar\"));\n    /// ```\n    #[allow(clippy::test_attr_in_doctest)]\n    pub fn debug_assert(mut self) {\n        self.build();\n    }\n\n    /// Custom error message for post-parsing validation\n    ///\n    /// **Note:** this will ensure the `Command` has been sufficiently [built][Command::build] for any\n    /// relevant context, including usage.\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, error::ErrorKind};\n    /// let mut cmd = Command::new(\"myprog\");\n    /// let err = cmd.error(ErrorKind::InvalidValue, \"Some failure case\");\n    /// ```\n    pub fn error(&mut self, kind: ErrorKind, message: impl fmt::Display) -> Error {\n        Error::raw(kind, message).format(self)\n    }\n\n    /// Parse [`env::args_os`], [exiting][Error::exit] on failure.\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let matches = Command::new(\"myprog\")\n    ///     // Args and options go here...\n    ///     .get_matches();\n    /// ```\n    /// [`env::args_os`]: std::env::args_os()\n    /// [`Command::try_get_matches_from_mut`]: Command::try_get_matches_from_mut()\n    #[inline]\n    pub fn get_matches(self) -> ArgMatches {\n        self.get_matches_from(env::args_os())\n    }\n\n    /// Parse [`env::args_os`], [exiting][Error::exit] on failure.\n    ///\n    /// Like [`Command::get_matches`] but doesn't consume the `Command`.\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let mut cmd = Command::new(\"myprog\")\n    ///     // Args and options go here...\n    ///     ;\n    /// let matches = cmd.get_matches_mut();\n    /// ```\n    /// [`env::args_os`]: std::env::args_os()\n    /// [`Command::get_matches`]: Command::get_matches()\n    pub fn get_matches_mut(&mut self) -> ArgMatches {\n        self.try_get_matches_from_mut(env::args_os())\n            .unwrap_or_else(|e| e.exit())\n    }\n\n    /// Parse [`env::args_os`], returning a [`clap::Result`] on failure.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are\n    /// used. It will return a [`clap::Error`], where the [`kind`] is a\n    /// [`ErrorKind::DisplayHelp`] or [`ErrorKind::DisplayVersion`] respectively. You must call\n    /// [`Error::exit`] or perform a [`std::process::exit`].\n    ///\n    /// </div>\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let matches = Command::new(\"myprog\")\n    ///     // Args and options go here...\n    ///     .try_get_matches()\n    ///     .unwrap_or_else(|e| e.exit());\n    /// ```\n    /// [`env::args_os`]: std::env::args_os()\n    /// [`Error::exit`]: crate::Error::exit()\n    /// [`std::process::exit`]: std::process::exit()\n    /// [`clap::Result`]: Result\n    /// [`clap::Error`]: crate::Error\n    /// [`kind`]: crate::Error\n    /// [`ErrorKind::DisplayHelp`]: crate::error::ErrorKind::DisplayHelp\n    /// [`ErrorKind::DisplayVersion`]: crate::error::ErrorKind::DisplayVersion\n    #[inline]\n    pub fn try_get_matches(self) -> ClapResult<ArgMatches> {\n        // Start the parsing\n        self.try_get_matches_from(env::args_os())\n    }\n\n    /// Parse the specified arguments, [exiting][Error::exit] on failure.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The first argument will be parsed as the binary name unless\n    /// [`Command::no_binary_name`] is used.\n    ///\n    /// </div>\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let arg_vec = vec![\"my_prog\", \"some\", \"args\", \"to\", \"parse\"];\n    ///\n    /// let matches = Command::new(\"myprog\")\n    ///     // Args and options go here...\n    ///     .get_matches_from(arg_vec);\n    /// ```\n    /// [`Command::get_matches`]: Command::get_matches()\n    /// [`clap::Result`]: Result\n    /// [`Vec`]: std::vec::Vec\n    pub fn get_matches_from<I, T>(mut self, itr: I) -> ArgMatches\n    where\n        I: IntoIterator<Item = T>,\n        T: Into<OsString> + Clone,\n    {\n        self.try_get_matches_from_mut(itr).unwrap_or_else(|e| {\n            drop(self);\n            e.exit()\n        })\n    }\n\n    /// Parse the specified arguments, returning a [`clap::Result`] on failure.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are\n    /// used. It will return a [`clap::Error`], where the [`kind`] is a [`ErrorKind::DisplayHelp`]\n    /// or [`ErrorKind::DisplayVersion`] respectively. You must call [`Error::exit`] or\n    /// perform a [`std::process::exit`] yourself.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The first argument will be parsed as the binary name unless\n    /// [`Command::no_binary_name`] is used.\n    ///\n    /// </div>\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let arg_vec = vec![\"my_prog\", \"some\", \"args\", \"to\", \"parse\"];\n    ///\n    /// let matches = Command::new(\"myprog\")\n    ///     // Args and options go here...\n    ///     .try_get_matches_from(arg_vec)\n    ///     .unwrap_or_else(|e| e.exit());\n    /// ```\n    /// [`Command::get_matches_from`]: Command::get_matches_from()\n    /// [`Command::try_get_matches`]: Command::try_get_matches()\n    /// [`Error::exit`]: crate::Error::exit()\n    /// [`std::process::exit`]: std::process::exit()\n    /// [`clap::Error`]: crate::Error\n    /// [`Error::exit`]: crate::Error::exit()\n    /// [`kind`]: crate::Error\n    /// [`ErrorKind::DisplayHelp`]: crate::error::ErrorKind::DisplayHelp\n    /// [`ErrorKind::DisplayVersion`]: crate::error::ErrorKind::DisplayVersion\n    /// [`clap::Result`]: Result\n    pub fn try_get_matches_from<I, T>(mut self, itr: I) -> ClapResult<ArgMatches>\n    where\n        I: IntoIterator<Item = T>,\n        T: Into<OsString> + Clone,\n    {\n        self.try_get_matches_from_mut(itr)\n    }\n\n    /// Parse the specified arguments, returning a [`clap::Result`] on failure.\n    ///\n    /// Like [`Command::try_get_matches_from`] but doesn't consume the `Command`.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are\n    /// used. It will return a [`clap::Error`], where the [`kind`] is a [`ErrorKind::DisplayHelp`]\n    /// or [`ErrorKind::DisplayVersion`] respectively. You must call [`Error::exit`] or\n    /// perform a [`std::process::exit`] yourself.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The first argument will be parsed as the binary name unless\n    /// [`Command::no_binary_name`] is used.\n    ///\n    /// </div>\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let arg_vec = vec![\"my_prog\", \"some\", \"args\", \"to\", \"parse\"];\n    ///\n    /// let mut cmd = Command::new(\"myprog\");\n    ///     // Args and options go here...\n    /// let matches = cmd.try_get_matches_from_mut(arg_vec)\n    ///     .unwrap_or_else(|e| e.exit());\n    /// ```\n    /// [`Command::try_get_matches_from`]: Command::try_get_matches_from()\n    /// [`clap::Result`]: Result\n    /// [`clap::Error`]: crate::Error\n    /// [`kind`]: crate::Error\n    pub fn try_get_matches_from_mut<I, T>(&mut self, itr: I) -> ClapResult<ArgMatches>\n    where\n        I: IntoIterator<Item = T>,\n        T: Into<OsString> + Clone,\n    {\n        let mut raw_args = clap_lex::RawArgs::new(itr);\n        let mut cursor = raw_args.cursor();\n\n        if self.settings.is_set(AppSettings::Multicall) {\n            if let Some(argv0) = raw_args.next_os(&mut cursor) {\n                let argv0 = Path::new(&argv0);\n                if let Some(command) = argv0.file_stem().and_then(|f| f.to_str()) {\n                    // Stop borrowing command so we can get another mut ref to it.\n                    let command = command.to_owned();\n                    debug!(\"Command::try_get_matches_from_mut: Parsed command {command} from argv\");\n\n                    debug!(\n                        \"Command::try_get_matches_from_mut: Reinserting command into arguments so subcommand parser matches it\"\n                    );\n                    raw_args.insert(&cursor, [&command]);\n                    debug!(\n                        \"Command::try_get_matches_from_mut: Clearing name and bin_name so that displayed command name starts with applet name\"\n                    );\n                    self.name = \"\".into();\n                    self.bin_name = None;\n                    return self._do_parse(&mut raw_args, cursor);\n                }\n            }\n        };\n\n        // Get the name of the program (argument 1 of env::args()) and determine the\n        // actual file\n        // that was used to execute the program. This is because a program called\n        // ./target/release/my_prog -a\n        // will have two arguments, './target/release/my_prog', '-a' but we don't want\n        // to display\n        // the full path when displaying help messages and such\n        if !self.settings.is_set(AppSettings::NoBinaryName) {\n            if let Some(name) = raw_args.next_os(&mut cursor) {\n                let p = Path::new(name);\n\n                if let Some(f) = p.file_name() {\n                    if let Some(s) = f.to_str() {\n                        if self.bin_name.is_none() {\n                            self.bin_name = Some(s.to_owned());\n                        }\n                    }\n                }\n            }\n        }\n\n        self._do_parse(&mut raw_args, cursor)\n    }\n\n    /// Prints the short help message (`-h`) to [`io::stdout()`].\n    ///\n    /// See also [`Command::print_long_help`].\n    ///\n    /// **Note:** this will ensure the `Command` has been sufficiently [built][Command::build].\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// let mut cmd = Command::new(\"myprog\");\n    /// cmd.print_help();\n    /// ```\n    /// [`io::stdout()`]: std::io::stdout()\n    pub fn print_help(&mut self) -> io::Result<()> {\n        self._build_self(false);\n        let color = self.color_help();\n\n        let mut styled = StyledStr::new();\n        let usage = Usage::new(self);\n        write_help(&mut styled, self, &usage, false);\n\n        let c = Colorizer::new(Stream::Stdout, color).with_content(styled);\n        c.print()\n    }\n\n    /// Prints the long help message (`--help`) to [`io::stdout()`].\n    ///\n    /// See also [`Command::print_help`].\n    ///\n    /// **Note:** this will ensure the `Command` has been sufficiently [built][Command::build].\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// let mut cmd = Command::new(\"myprog\");\n    /// cmd.print_long_help();\n    /// ```\n    /// [`io::stdout()`]: std::io::stdout()\n    /// [`BufWriter`]: std::io::BufWriter\n    /// [`-h` (short)]: Arg::help()\n    /// [`--help` (long)]: Arg::long_help()\n    pub fn print_long_help(&mut self) -> io::Result<()> {\n        self._build_self(false);\n        let color = self.color_help();\n\n        let mut styled = StyledStr::new();\n        let usage = Usage::new(self);\n        write_help(&mut styled, self, &usage, true);\n\n        let c = Colorizer::new(Stream::Stdout, color).with_content(styled);\n        c.print()\n    }\n\n    /// Render the short help message (`-h`) to a [`StyledStr`]\n    ///\n    /// See also [`Command::render_long_help`].\n    ///\n    /// **Note:** this will ensure the `Command` has been sufficiently [built][Command::build].\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// use std::io;\n    /// let mut cmd = Command::new(\"myprog\");\n    /// let mut out = io::stdout();\n    /// let help = cmd.render_help();\n    /// println!(\"{help}\");\n    /// ```\n    /// [`io::Write`]: std::io::Write\n    /// [`-h` (short)]: Arg::help()\n    /// [`--help` (long)]: Arg::long_help()\n    pub fn render_help(&mut self) -> StyledStr {\n        self._build_self(false);\n\n        let mut styled = StyledStr::new();\n        let usage = Usage::new(self);\n        write_help(&mut styled, self, &usage, false);\n        styled\n    }\n\n    /// Render the long help message (`--help`) to a [`StyledStr`].\n    ///\n    /// See also [`Command::render_help`].\n    ///\n    /// **Note:** this will ensure the `Command` has been sufficiently [built][Command::build].\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// use std::io;\n    /// let mut cmd = Command::new(\"myprog\");\n    /// let mut out = io::stdout();\n    /// let help = cmd.render_long_help();\n    /// println!(\"{help}\");\n    /// ```\n    /// [`io::Write`]: std::io::Write\n    /// [`-h` (short)]: Arg::help()\n    /// [`--help` (long)]: Arg::long_help()\n    pub fn render_long_help(&mut self) -> StyledStr {\n        self._build_self(false);\n\n        let mut styled = StyledStr::new();\n        let usage = Usage::new(self);\n        write_help(&mut styled, self, &usage, true);\n        styled\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Command::render_help`\")\n    )]\n    pub fn write_help<W: io::Write>(&mut self, w: &mut W) -> io::Result<()> {\n        self._build_self(false);\n\n        let mut styled = StyledStr::new();\n        let usage = Usage::new(self);\n        write_help(&mut styled, self, &usage, false);\n        ok!(write!(w, \"{styled}\"));\n        w.flush()\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Command::render_long_help`\")\n    )]\n    pub fn write_long_help<W: io::Write>(&mut self, w: &mut W) -> io::Result<()> {\n        self._build_self(false);\n\n        let mut styled = StyledStr::new();\n        let usage = Usage::new(self);\n        write_help(&mut styled, self, &usage, true);\n        ok!(write!(w, \"{styled}\"));\n        w.flush()\n    }\n\n    /// Version message rendered as if the user ran `-V`.\n    ///\n    /// See also [`Command::render_long_version`].\n    ///\n    /// ### Coloring\n    ///\n    /// This function does not try to color the message nor it inserts any [ANSI escape codes].\n    ///\n    /// ### Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// use std::io;\n    /// let cmd = Command::new(\"myprog\");\n    /// println!(\"{}\", cmd.render_version());\n    /// ```\n    /// [`io::Write`]: std::io::Write\n    /// [`-V` (short)]: Command::version()\n    /// [`--version` (long)]: Command::long_version()\n    /// [ANSI escape codes]: https://en.wikipedia.org/wiki/ANSI_escape_code\n    pub fn render_version(&self) -> String {\n        self._render_version(false)\n    }\n\n    /// Version message rendered as if the user ran `--version`.\n    ///\n    /// See also [`Command::render_version`].\n    ///\n    /// ### Coloring\n    ///\n    /// This function does not try to color the message nor it inserts any [ANSI escape codes].\n    ///\n    /// ### Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// use std::io;\n    /// let cmd = Command::new(\"myprog\");\n    /// println!(\"{}\", cmd.render_long_version());\n    /// ```\n    /// [`io::Write`]: std::io::Write\n    /// [`-V` (short)]: Command::version()\n    /// [`--version` (long)]: Command::long_version()\n    /// [ANSI escape codes]: https://en.wikipedia.org/wiki/ANSI_escape_code\n    pub fn render_long_version(&self) -> String {\n        self._render_version(true)\n    }\n\n    /// Usage statement\n    ///\n    /// **Note:** this will ensure the `Command` has been sufficiently [built][Command::build].\n    ///\n    /// # Panics\n    ///\n    /// If contradictory arguments or settings exist (debug builds).\n    ///\n    /// ### Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// use std::io;\n    /// let mut cmd = Command::new(\"myprog\");\n    /// println!(\"{}\", cmd.render_usage());\n    /// ```\n    pub fn render_usage(&mut self) -> StyledStr {\n        self.render_usage_().unwrap_or_default()\n    }\n\n    pub(crate) fn render_usage_(&mut self) -> Option<StyledStr> {\n        // If there are global arguments, or settings we need to propagate them down to subcommands\n        // before parsing incase we run into a subcommand\n        self._build_self(false);\n\n        Usage::new(self).create_usage_with_title(&[])\n    }\n\n    /// Extend [`Command`] with [`CommandExt`] data\n    #[cfg(feature = \"unstable-ext\")]\n    #[allow(clippy::should_implement_trait)]\n    pub fn add<T: CommandExt + Extension>(mut self, tagged: T) -> Self {\n        self.ext.set(tagged);\n        self\n    }\n}\n\n/// # Application-wide Settings\n///\n/// These settings will apply to the top-level command and all subcommands, by default.  Some\n/// settings can be overridden in subcommands.\nimpl Command {\n    /// Specifies that the parser should not assume the first argument passed is the binary name.\n    ///\n    /// This is normally the case when using a \"daemon\" style mode.  For shells / REPLs, see\n    /// [`Command::multicall`][Command::multicall].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg};\n    /// let m = Command::new(\"myprog\")\n    ///     .no_binary_name(true)\n    ///     .arg(arg!(<cmd> ... \"commands to run\"))\n    ///     .get_matches_from(vec![\"command\", \"set\"]);\n    ///\n    /// let cmds: Vec<_> = m.get_many::<String>(\"cmd\").unwrap().collect();\n    /// assert_eq!(cmds, [\"command\", \"set\"]);\n    /// ```\n    /// [`try_get_matches_from_mut`]: crate::Command::try_get_matches_from_mut()\n    #[inline]\n    pub fn no_binary_name(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::NoBinaryName)\n        } else {\n            self.unset_global_setting(AppSettings::NoBinaryName)\n        }\n    }\n\n    /// Try not to fail on parse errors, like missing option values.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg};\n    /// let cmd = Command::new(\"cmd\")\n    ///   .ignore_errors(true)\n    ///   .arg(arg!(-c --config <FILE> \"Sets a custom config file\"))\n    ///   .arg(arg!(-x --stuff <FILE> \"Sets a custom stuff file\"))\n    ///   .arg(arg!(f: -f \"Flag\"));\n    ///\n    /// let r = cmd.try_get_matches_from(vec![\"cmd\", \"-c\", \"file\", \"-f\", \"-x\"]);\n    ///\n    /// assert!(r.is_ok(), \"unexpected error: {r:?}\");\n    /// let m = r.unwrap();\n    /// assert_eq!(m.get_one::<String>(\"config\").unwrap(), \"file\");\n    /// assert!(m.get_flag(\"f\"));\n    /// assert_eq!(m.get_one::<String>(\"stuff\"), None);\n    /// ```\n    #[inline]\n    pub fn ignore_errors(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::IgnoreErrors)\n        } else {\n            self.unset_global_setting(AppSettings::IgnoreErrors)\n        }\n    }\n\n    /// Replace prior occurrences of arguments rather than error\n    ///\n    /// For any argument that would conflict with itself by default (e.g.\n    /// [`ArgAction::Set`], it will now override itself.\n    ///\n    /// This is the equivalent to saying the `foo` arg using [`Arg::overrides_with(\"foo\")`] for all\n    /// defined arguments.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// [`Arg::overrides_with(\"foo\")`]: crate::Arg::overrides_with()\n    #[inline]\n    pub fn args_override_self(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::AllArgsOverrideSelf)\n        } else {\n            self.unset_global_setting(AppSettings::AllArgsOverrideSelf)\n        }\n    }\n\n    /// Disables the automatic [delimiting of values][Arg::value_delimiter] after `--` or when [`Arg::trailing_var_arg`]\n    /// was used.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The same thing can be done manually by setting the final positional argument to\n    /// [`Arg::value_delimiter(None)`]. Using this setting is safer, because it's easier to locate\n    /// when making changes.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .dont_delimit_trailing_values(true)\n    ///     .get_matches();\n    /// ```\n    ///\n    /// [`Arg::value_delimiter(None)`]: crate::Arg::value_delimiter()\n    #[inline]\n    pub fn dont_delimit_trailing_values(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::DontDelimitTrailingValues)\n        } else {\n            self.unset_global_setting(AppSettings::DontDelimitTrailingValues)\n        }\n    }\n\n    /// Sets when to color output.\n    ///\n    /// To customize how the output is styled, see [`Command::styles`].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Default behaviour is [`ColorChoice::Auto`].\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, ColorChoice};\n    /// Command::new(\"myprog\")\n    ///     .color(ColorChoice::Never)\n    ///     .get_matches();\n    /// ```\n    /// [`ColorChoice::Auto`]: crate::ColorChoice::Auto\n    #[cfg(feature = \"color\")]\n    #[inline]\n    #[must_use]\n    pub fn color(self, color: ColorChoice) -> Self {\n        let cmd = self\n            .unset_global_setting(AppSettings::ColorAuto)\n            .unset_global_setting(AppSettings::ColorAlways)\n            .unset_global_setting(AppSettings::ColorNever);\n        match color {\n            ColorChoice::Auto => cmd.global_setting(AppSettings::ColorAuto),\n            ColorChoice::Always => cmd.global_setting(AppSettings::ColorAlways),\n            ColorChoice::Never => cmd.global_setting(AppSettings::ColorNever),\n        }\n    }\n\n    /// Sets the [`Styles`] for terminal output\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Default behaviour is [`Styles::default`].\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, ColorChoice, builder::styling};\n    /// const STYLES: styling::Styles = styling::Styles::styled()\n    ///     .header(styling::AnsiColor::Green.on_default().bold())\n    ///     .usage(styling::AnsiColor::Green.on_default().bold())\n    ///     .literal(styling::AnsiColor::Blue.on_default().bold())\n    ///     .placeholder(styling::AnsiColor::Cyan.on_default());\n    /// Command::new(\"myprog\")\n    ///     .styles(STYLES)\n    ///     .get_matches();\n    /// ```\n    #[cfg(feature = \"color\")]\n    #[inline]\n    #[must_use]\n    pub fn styles(mut self, styles: Styles) -> Self {\n        self.app_ext.set(styles);\n        self\n    }\n\n    /// Sets the terminal width at which to wrap help messages.\n    ///\n    /// Using `0` will ignore terminal widths and use source formatting.\n    ///\n    /// Defaults to current terminal width when `wrap_help` feature flag is enabled.  If current\n    /// width cannot be determined, the default is 100.\n    ///\n    /// **`unstable-v5` feature**: Defaults to unbound, being subject to\n    /// [`Command::max_term_width`].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This setting applies globally and *not* on a per-command basis.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This requires the `wrap_help` feature\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .term_width(80)\n    /// # ;\n    /// ```\n    #[inline]\n    #[must_use]\n    #[cfg(any(not(feature = \"unstable-v5\"), feature = \"wrap_help\"))]\n    pub fn term_width(mut self, width: usize) -> Self {\n        self.app_ext.set(TermWidth(width));\n        self\n    }\n\n    /// Limit the line length for wrapping help when using the current terminal's width.\n    ///\n    /// This only applies when [`term_width`][Command::term_width] is unset so that the current\n    /// terminal's width will be used.  See [`Command::term_width`] for more details.\n    ///\n    /// Using `0` will ignore this, always respecting [`Command::term_width`] (default).\n    ///\n    /// **`unstable-v5` feature**: Defaults to 100.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This setting applies globally and *not* on a per-command basis.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This requires the `wrap_help` feature\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .max_term_width(100)\n    /// # ;\n    /// ```\n    #[inline]\n    #[must_use]\n    #[cfg(any(not(feature = \"unstable-v5\"), feature = \"wrap_help\"))]\n    pub fn max_term_width(mut self, width: usize) -> Self {\n        self.app_ext.set(MaxTermWidth(width));\n        self\n    }\n\n    /// Disables `-V` and `--version` flag.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, error::ErrorKind};\n    /// let res = Command::new(\"myprog\")\n    ///     .version(\"1.0.0\")\n    ///     .disable_version_flag(true)\n    ///     .try_get_matches_from(vec![\n    ///         \"myprog\", \"--version\"\n    ///     ]);\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);\n    /// ```\n    ///\n    /// You can create a custom version flag with [`ArgAction::Version`]\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction, error::ErrorKind};\n    /// let mut cmd = Command::new(\"myprog\")\n    ///     .version(\"1.0.0\")\n    ///     // Remove the `-V` short flag\n    ///     .disable_version_flag(true)\n    ///     .arg(\n    ///         Arg::new(\"version\")\n    ///             .long(\"version\")\n    ///             .action(ArgAction::Version)\n    ///             .help(\"Print version\")\n    ///     );\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\n    ///         \"myprog\", \"-V\"\n    ///     ]);\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\n    ///         \"myprog\", \"--version\"\n    ///     ]);\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::DisplayVersion);\n    /// ```\n    #[inline]\n    pub fn disable_version_flag(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::DisableVersionFlag)\n        } else {\n            self.unset_global_setting(AppSettings::DisableVersionFlag)\n        }\n    }\n\n    /// Specifies to use the version of the current command for all [`subcommands`].\n    ///\n    /// Defaults to `false`; subcommands have independent version strings from their parents.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .version(\"v1.1\")\n    ///     .propagate_version(true)\n    ///     .subcommand(Command::new(\"test\"))\n    ///     .get_matches();\n    /// // running `$ myprog test --version` will display\n    /// // \"myprog-test v1.1\"\n    /// ```\n    ///\n    /// [`subcommands`]: crate::Command::subcommand()\n    #[inline]\n    pub fn propagate_version(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::PropagateVersion)\n        } else {\n            self.unset_global_setting(AppSettings::PropagateVersion)\n        }\n    }\n\n    /// Places the help string for all arguments and subcommands on the line after them.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .next_line_help(true)\n    ///     .get_matches();\n    /// ```\n    #[inline]\n    pub fn next_line_help(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::NextLineHelp)\n        } else {\n            self.unset_global_setting(AppSettings::NextLineHelp)\n        }\n    }\n\n    /// Disables `-h` and `--help` flag.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, error::ErrorKind};\n    /// let res = Command::new(\"myprog\")\n    ///     .disable_help_flag(true)\n    ///     .try_get_matches_from(vec![\n    ///         \"myprog\", \"-h\"\n    ///     ]);\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);\n    /// ```\n    ///\n    /// You can create a custom help flag with [`ArgAction::Help`], [`ArgAction::HelpShort`], or\n    /// [`ArgAction::HelpLong`]\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction, error::ErrorKind};\n    /// let mut cmd = Command::new(\"myprog\")\n    ///     // Change help short flag to `?`\n    ///     .disable_help_flag(true)\n    ///     .arg(\n    ///         Arg::new(\"help\")\n    ///             .short('?')\n    ///             .long(\"help\")\n    ///             .action(ArgAction::Help)\n    ///             .help(\"Print help\")\n    ///     );\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\n    ///         \"myprog\", \"-h\"\n    ///     ]);\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);\n    ///\n    /// let res = cmd.try_get_matches_from_mut(vec![\n    ///         \"myprog\", \"-?\"\n    ///     ]);\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::DisplayHelp);\n    /// ```\n    #[inline]\n    pub fn disable_help_flag(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::DisableHelpFlag)\n        } else {\n            self.unset_global_setting(AppSettings::DisableHelpFlag)\n        }\n    }\n\n    /// Disables the `help` [`subcommand`].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, error::ErrorKind};\n    /// let res = Command::new(\"myprog\")\n    ///     .disable_help_subcommand(true)\n    ///     // Normally, creating a subcommand causes a `help` subcommand to automatically\n    ///     // be generated as well\n    ///     .subcommand(Command::new(\"test\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"myprog\", \"help\"\n    ///     ]);\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::InvalidSubcommand);\n    /// ```\n    ///\n    /// [`subcommand`]: crate::Command::subcommand()\n    #[inline]\n    pub fn disable_help_subcommand(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::DisableHelpSubcommand)\n        } else {\n            self.unset_global_setting(AppSettings::DisableHelpSubcommand)\n        }\n    }\n\n    /// Disables colorized help messages.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .disable_colored_help(true)\n    ///     .get_matches();\n    /// ```\n    #[inline]\n    pub fn disable_colored_help(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::DisableColoredHelp)\n        } else {\n            self.unset_global_setting(AppSettings::DisableColoredHelp)\n        }\n    }\n\n    /// Panic if help descriptions are omitted.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** When deriving [`Parser`][crate::Parser], you could instead check this at\n    /// compile-time with `#![deny(missing_docs)]`\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .help_expected(true)\n    ///     .arg(\n    ///         Arg::new(\"foo\").help(\"It does foo stuff\")\n    ///         // As required via `help_expected`, a help message was supplied\n    ///      )\n    /// #    .get_matches();\n    /// ```\n    ///\n    /// # Panics\n    ///\n    /// On debug builds:\n    /// ```rust,no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myapp\")\n    ///     .help_expected(true)\n    ///     .arg(\n    ///         Arg::new(\"foo\")\n    ///         // Someone forgot to put .about(\"...\") here\n    ///         // Since the setting `help_expected` is activated, this will lead to\n    ///         // a panic (if you are in debug mode)\n    ///     )\n    /// #   .get_matches();\n    ///```\n    #[inline]\n    pub fn help_expected(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::HelpExpected)\n        } else {\n            self.unset_global_setting(AppSettings::HelpExpected)\n        }\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"This is now the default\")\n    )]\n    pub fn dont_collapse_args_in_usage(self, _yes: bool) -> Self {\n        self\n    }\n\n    /// Tells `clap` *not* to print possible values when displaying help information.\n    ///\n    /// This can be useful if there are many values, or they are explained elsewhere.\n    ///\n    /// To set this per argument, see\n    /// [`Arg::hide_possible_values`][crate::Arg::hide_possible_values].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    #[inline]\n    pub fn hide_possible_values(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::HidePossibleValues)\n        } else {\n            self.unset_global_setting(AppSettings::HidePossibleValues)\n        }\n    }\n\n    /// Allow partial matches of long arguments or their [aliases].\n    ///\n    /// For example, to match an argument named `--test`, one could use `--t`, `--te`, `--tes`, and\n    /// `--test`.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The match *must not* be ambiguous at all in order to succeed. i.e. to match\n    /// `--te` to `--test` there could not also be another argument or alias `--temp` because both\n    /// start with `--te`\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// [aliases]: crate::Command::aliases()\n    #[inline]\n    pub fn infer_long_args(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::InferLongArgs)\n        } else {\n            self.unset_global_setting(AppSettings::InferLongArgs)\n        }\n    }\n\n    /// Allow partial matches of [subcommand] names and their [aliases].\n    ///\n    /// For example, to match a subcommand named `test`, one could use `t`, `te`, `tes`, and\n    /// `test`.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The match *must not* be ambiguous at all in order to succeed. i.e. to match `te`\n    /// to `test` there could not also be a subcommand or alias `temp` because both start with `te`\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **WARNING:** This setting can interfere with [positional/free arguments], take care when\n    /// designing CLIs which allow inferred subcommands and have potential positional/free\n    /// arguments whose values could start with the same characters as subcommands. If this is the\n    /// case, it's recommended to use settings such as [`Command::args_conflicts_with_subcommands`] in\n    /// conjunction with this setting.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This choice is propagated to all child subcommands.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"prog\")\n    ///     .infer_subcommands(true)\n    ///     .subcommand(Command::new(\"test\"))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"te\"\n    ///     ]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    ///\n    /// [subcommand]: crate::Command::subcommand()\n    /// [positional/free arguments]: crate::Arg::index()\n    /// [aliases]: crate::Command::aliases()\n    #[inline]\n    pub fn infer_subcommands(self, yes: bool) -> Self {\n        if yes {\n            self.global_setting(AppSettings::InferSubcommands)\n        } else {\n            self.unset_global_setting(AppSettings::InferSubcommands)\n        }\n    }\n}\n\n/// # Command-specific Settings\n///\n/// These apply only to the current command and are not inherited by subcommands.\nimpl Command {\n    /// (Re)Sets the program's name.\n    ///\n    /// See [`Command::new`] for more details.\n    ///\n    /// # Examples\n    ///\n    /// ```ignore\n    /// let cmd = clap::command!()\n    ///     .name(\"foo\");\n    ///\n    /// // continued logic goes here, such as `cmd.get_matches()` etc.\n    /// ```\n    #[must_use]\n    pub fn name(mut self, name: impl Into<Str>) -> Self {\n        self.name = name.into();\n        self\n    }\n\n    /// Overrides the runtime-determined name of the binary for help and error messages.\n    ///\n    /// This should only be used when absolutely necessary, such as when the binary name for your\n    /// application is misleading, or perhaps *not* how the user should invoke your program.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **TIP:** When building things such as third party `cargo`\n    /// subcommands, this setting **should** be used!\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This *does not* change or set the name of the binary file on\n    /// disk. It only changes what clap thinks the name is for the purposes of\n    /// error or help messages.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"My Program\")\n    ///      .bin_name(\"my_binary\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn bin_name(mut self, name: impl IntoResettable<String>) -> Self {\n        self.bin_name = name.into_resettable().into_option();\n        self\n    }\n\n    /// Overrides the runtime-determined display name of the program for help and error messages.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"My Program\")\n    ///      .display_name(\"my_program\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn display_name(mut self, name: impl IntoResettable<String>) -> Self {\n        self.display_name = name.into_resettable().into_option();\n        self\n    }\n\n    /// Sets the author(s) for the help message.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **TIP:** Use `clap`s convenience macro [`crate_authors!`] to\n    /// automatically set your application's author(s) to the same thing as your\n    /// crate at compile time.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** A custom [`help_template`][Command::help_template] is needed for author to show\n    /// up.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///      .author(\"Me, me@mymain.com\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn author(mut self, author: impl IntoResettable<Str>) -> Self {\n        self.author = author.into_resettable().into_option();\n        self\n    }\n\n    /// Sets the program's description for the short help (`-h`).\n    ///\n    /// If [`Command::long_about`] is not specified, this message will be displayed for `--help`.\n    ///\n    /// See also [`crate_description!`](crate::crate_description!).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .about(\"Does really amazing things for great people\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn about(mut self, about: impl IntoResettable<StyledStr>) -> Self {\n        self.about = about.into_resettable().into_option();\n        self\n    }\n\n    /// Sets the program's description for the long help (`--help`).\n    ///\n    /// If not set, [`Command::about`] will be used for long help in addition to short help\n    /// (`-h`).\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Only [`Command::about`] (short format) is used in completion\n    /// script generation in order to be concise.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .long_about(\n    /// \"Does really amazing things to great people. Now let's talk a little\n    ///  more in depth about how this subcommand really works. It may take about\n    ///  a few lines of text, but that's ok!\")\n    /// # ;\n    /// ```\n    /// [`Command::about`]: Command::about()\n    #[must_use]\n    pub fn long_about(mut self, long_about: impl IntoResettable<StyledStr>) -> Self {\n        self.long_about = long_about.into_resettable().into_option();\n        self\n    }\n\n    /// Free-form help text for after auto-generated short help (`-h`).\n    ///\n    /// This is often used to describe how to use the arguments, caveats to be noted, or license\n    /// and contact information.\n    ///\n    /// If [`Command::after_long_help`] is not specified, this message will be displayed for `--help`.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .after_help(\"Does really amazing things for great people... but be careful with -R!\")\n    /// # ;\n    /// ```\n    ///\n    #[must_use]\n    pub fn after_help(mut self, help: impl IntoResettable<StyledStr>) -> Self {\n        self.after_help = help.into_resettable().into_option();\n        self\n    }\n\n    /// Free-form help text for after auto-generated long help (`--help`).\n    ///\n    /// This is often used to describe how to use the arguments, caveats to be noted, or license\n    /// and contact information.\n    ///\n    /// If not set, [`Command::after_help`] will be used for long help in addition to short help\n    /// (`-h`).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .after_long_help(\"Does really amazing things to great people... but be careful with -R, \\\n    ///                      like, for real, be careful with this!\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn after_long_help(mut self, help: impl IntoResettable<StyledStr>) -> Self {\n        self.after_long_help = help.into_resettable().into_option();\n        self\n    }\n\n    /// Free-form help text for before auto-generated short help (`-h`).\n    ///\n    /// This is often used for header, copyright, or license information.\n    ///\n    /// If [`Command::before_long_help`] is not specified, this message will be displayed for `--help`.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .before_help(\"Some info I'd like to appear before the help info\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn before_help(mut self, help: impl IntoResettable<StyledStr>) -> Self {\n        self.before_help = help.into_resettable().into_option();\n        self\n    }\n\n    /// Free-form help text for before auto-generated long help (`--help`).\n    ///\n    /// This is often used for header, copyright, or license information.\n    ///\n    /// If not set, [`Command::before_help`] will be used for long help in addition to short help\n    /// (`-h`).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .before_long_help(\"Some verbose and long info I'd like to appear before the help info\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn before_long_help(mut self, help: impl IntoResettable<StyledStr>) -> Self {\n        self.before_long_help = help.into_resettable().into_option();\n        self\n    }\n\n    /// Sets the version for the short version (`-V`) and help messages.\n    ///\n    /// If [`Command::long_version`] is not specified, this message will be displayed for `--version`.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **TIP:** Use `clap`s convenience macro [`crate_version!`] to\n    /// automatically set your application's version to the same thing as your\n    /// crate at compile time.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .version(\"v0.1.24\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn version(mut self, ver: impl IntoResettable<Str>) -> Self {\n        self.version = ver.into_resettable().into_option();\n        self\n    }\n\n    /// Sets the version for the long version (`--version`) and help messages.\n    ///\n    /// If [`Command::version`] is not specified, this message will be displayed for `-V`.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **TIP:** Use `clap`s convenience macro [`crate_version!`] to\n    /// automatically set your application's version to the same thing as your\n    /// crate at compile time.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .long_version(\n    /// \"v0.1.24\n    ///  commit: abcdef89726d\n    ///  revision: 123\n    ///  release: 2\n    ///  binary: myprog\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn long_version(mut self, ver: impl IntoResettable<Str>) -> Self {\n        self.long_version = ver.into_resettable().into_option();\n        self\n    }\n\n    /// Overrides the `clap` generated usage string for help and error messages.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Using this setting disables `clap`s \"context-aware\" usage\n    /// strings. After this setting is set, this will be *the only* usage string\n    /// displayed to the user!\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Multiple usage lines may be present in the usage argument, but\n    /// some rules need to be followed to ensure the usage lines are formatted\n    /// correctly by the default help formatter:\n    ///\n    /// - Do not indent the first usage line.\n    /// - Indent all subsequent usage lines with seven spaces.\n    /// - The last line must not end with a newline.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .override_usage(\"myapp [-clDas] <some_file>\")\n    /// # ;\n    /// ```\n    ///\n    /// Or for multiple usage lines:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .override_usage(\n    ///         \"myapp -X [-a] [-b] <file>\\n       \\\n    ///          myapp -Y [-c] <file1> <file2>\\n       \\\n    ///          myapp -Z [-d|-e]\"\n    ///     )\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn override_usage(mut self, usage: impl IntoResettable<StyledStr>) -> Self {\n        self.usage_str = usage.into_resettable().into_option();\n        self\n    }\n\n    /// Overrides the `clap` generated help message (both `-h` and `--help`).\n    ///\n    /// This should only be used when the auto-generated message does not suffice.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This **only** replaces the help message for the current\n    /// command, meaning if you are using subcommands, those help messages will\n    /// still be auto-generated unless you specify a [`Command::override_help`] for\n    /// them as well.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myapp\")\n    ///     .override_help(\"myapp v1.0\\n\\\n    ///            Does awesome things\\n\\\n    ///            (C) me@mail.com\\n\\n\\\n    ///\n    ///            Usage: myapp <opts> <command>\\n\\n\\\n    ///\n    ///            Options:\\n\\\n    ///            -h, --help       Display this message\\n\\\n    ///            -V, --version    Display version info\\n\\\n    ///            -s <stuff>       Do something with stuff\\n\\\n    ///            -v               Be verbose\\n\\n\\\n    ///\n    ///            Commands:\\n\\\n    ///            help             Print this message\\n\\\n    ///            work             Do some work\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn override_help(mut self, help: impl IntoResettable<StyledStr>) -> Self {\n        self.help_str = help.into_resettable().into_option();\n        self\n    }\n\n    /// Sets the help template to be used, overriding the default format.\n    ///\n    /// Tags are given inside curly brackets.\n    ///\n    /// Valid tags are:\n    ///\n    ///   * `{name}`                - Display name for the (sub-)command.\n    ///   * `{bin}`                 - Binary name.(deprecated)\n    ///   * `{version}`             - Version number.\n    ///   * `{author}`              - Author information.\n    ///   * `{author-with-newline}` - Author followed by `\\n`.\n    ///   * `{author-section}`      - Author preceded and followed by `\\n`.\n    ///   * `{about}`               - General description (from [`Command::about`] or\n    ///     [`Command::long_about`]).\n    ///   * `{about-with-newline}`  - About followed by `\\n`.\n    ///   * `{about-section}`       - About preceded and followed by '\\n'.\n    ///   * `{usage-heading}`       - Automatically generated usage heading.\n    ///   * `{usage}`               - Automatically generated or given usage string.\n    ///   * `{all-args}`            - Help for all arguments (options, flags, positional\n    ///     arguments, and subcommands) including titles.\n    ///   * `{options}`             - Help for options.\n    ///   * `{positionals}`         - Help for positional arguments.\n    ///   * `{subcommands}`         - Help for subcommands.\n    ///   * `{tab}`                 - Standard tab sized used within clap\n    ///   * `{after-help}`          - Help from [`Command::after_help`] or [`Command::after_long_help`].\n    ///   * `{before-help}`         - Help from [`Command::before_help`] or [`Command::before_long_help`].\n    ///\n    /// # Examples\n    ///\n    /// For a very brief help:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .version(\"1.0\")\n    ///     .help_template(\"{name} ({version}) - {usage}\")\n    /// # ;\n    /// ```\n    ///\n    /// For showing more application context:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .version(\"1.0\")\n    ///     .help_template(\"\\\n    /// {before-help}{name} {version}\n    /// {author-with-newline}{about-with-newline}\n    /// {usage-heading} {usage}\n    ///\n    /// {all-args}{after-help}\n    /// \")\n    /// # ;\n    /// ```\n    /// [`Command::about`]: Command::about()\n    /// [`Command::long_about`]: Command::long_about()\n    /// [`Command::after_help`]: Command::after_help()\n    /// [`Command::after_long_help`]: Command::after_long_help()\n    /// [`Command::before_help`]: Command::before_help()\n    /// [`Command::before_long_help`]: Command::before_long_help()\n    #[must_use]\n    #[cfg(feature = \"help\")]\n    pub fn help_template(mut self, s: impl IntoResettable<StyledStr>) -> Self {\n        self.template = s.into_resettable().into_option();\n        self\n    }\n\n    #[inline]\n    #[must_use]\n    pub(crate) fn setting(mut self, setting: AppSettings) -> Self {\n        self.settings.set(setting);\n        self\n    }\n\n    #[inline]\n    #[must_use]\n    pub(crate) fn unset_setting(mut self, setting: AppSettings) -> Self {\n        self.settings.unset(setting);\n        self\n    }\n\n    #[inline]\n    #[must_use]\n    pub(crate) fn global_setting(mut self, setting: AppSettings) -> Self {\n        self.settings.set(setting);\n        self.g_settings.set(setting);\n        self\n    }\n\n    #[inline]\n    #[must_use]\n    pub(crate) fn unset_global_setting(mut self, setting: AppSettings) -> Self {\n        self.settings.unset(setting);\n        self.g_settings.unset(setting);\n        self\n    }\n\n    /// Flatten subcommand help into the current command's help\n    ///\n    /// This shows a summary of subcommands within the usage and help for the current command, similar to\n    /// `git stash --help` showing information on `push`, `pop`, etc.\n    /// To see more information, a user can still pass `--help` to the individual subcommands.\n    #[inline]\n    #[must_use]\n    pub fn flatten_help(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::FlattenHelp)\n        } else {\n            self.unset_setting(AppSettings::FlattenHelp)\n        }\n    }\n\n    /// Set the default section heading for future args.\n    ///\n    /// This will be used for any arg that hasn't had [`Arg::help_heading`] called.\n    ///\n    /// This is useful if the default `Options` or `Arguments` headings are\n    /// not specific enough for one's use case.\n    ///\n    /// For subcommands, see [`Command::subcommand_help_heading`]\n    ///\n    /// [`Command::arg`]: Command::arg()\n    /// [`Arg::help_heading`]: crate::Arg::help_heading()\n    #[inline]\n    #[must_use]\n    pub fn next_help_heading(mut self, heading: impl IntoResettable<Str>) -> Self {\n        self.current_help_heading = heading.into_resettable().into_option();\n        self\n    }\n\n    /// Change the starting value for assigning future display orders for args.\n    ///\n    /// This will be used for any arg that hasn't had [`Arg::display_order`] called.\n    #[inline]\n    #[must_use]\n    pub fn next_display_order(mut self, disp_ord: impl IntoResettable<usize>) -> Self {\n        self.current_disp_ord = disp_ord.into_resettable().into_option();\n        self\n    }\n\n    /// Exit gracefully if no arguments are present (e.g. `$ myprog`).\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** [`subcommands`] count as arguments\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command};\n    /// Command::new(\"myprog\")\n    ///     .arg_required_else_help(true);\n    /// ```\n    ///\n    /// [`subcommands`]: crate::Command::subcommand()\n    /// [`Arg::default_value`]: crate::Arg::default_value()\n    #[inline]\n    pub fn arg_required_else_help(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::ArgRequiredElseHelp)\n        } else {\n            self.unset_setting(AppSettings::ArgRequiredElseHelp)\n        }\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::allow_hyphen_values`\")\n    )]\n    pub fn allow_hyphen_values(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::AllowHyphenValues)\n        } else {\n            self.unset_setting(AppSettings::AllowHyphenValues)\n        }\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::allow_negative_numbers`\")\n    )]\n    pub fn allow_negative_numbers(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::AllowNegativeNumbers)\n        } else {\n            self.unset_setting(AppSettings::AllowNegativeNumbers)\n        }\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::trailing_var_arg`\")\n    )]\n    pub fn trailing_var_arg(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::TrailingVarArg)\n        } else {\n            self.unset_setting(AppSettings::TrailingVarArg)\n        }\n    }\n\n    /// Allows one to implement two styles of CLIs where positionals can be used out of order.\n    ///\n    /// The first example is a CLI where the second to last positional argument is optional, but\n    /// the final positional argument is required. Such as `$ prog [optional] <required>` where one\n    /// of the two following usages is allowed:\n    ///\n    /// * `$ prog [optional] <required>`\n    /// * `$ prog <required>`\n    ///\n    /// This would otherwise not be allowed. This is useful when `[optional]` has a default value.\n    ///\n    /// **Note:** when using this style of \"missing positionals\" the final positional *must* be\n    /// [required] if `--` will not be used to skip to the final positional argument.\n    ///\n    /// **Note:** This style also only allows a single positional argument to be \"skipped\" without\n    /// the use of `--`. To skip more than one, see the second example.\n    ///\n    /// The second example is when one wants to skip multiple optional positional arguments, and use\n    /// of the `--` operator is OK (but not required if all arguments will be specified anyways).\n    ///\n    /// For example, imagine a CLI which has three positional arguments `[foo] [bar] [baz]...` where\n    /// `baz` accepts multiple values (similar to man `ARGS...` style training arguments).\n    ///\n    /// With this setting the following invocations are possible:\n    ///\n    /// * `$ prog foo bar baz1 baz2 baz3`\n    /// * `$ prog foo -- baz1 baz2 baz3`\n    /// * `$ prog -- baz1 baz2 baz3`\n    ///\n    /// # Examples\n    ///\n    /// Style number one from above:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// // Assume there is an external subcommand named \"subcmd\"\n    /// let m = Command::new(\"myprog\")\n    ///     .allow_missing_positional(true)\n    ///     .arg(Arg::new(\"arg1\"))\n    ///     .arg(Arg::new(\"arg2\")\n    ///         .required(true))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"other\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"arg1\"), None);\n    /// assert_eq!(m.get_one::<String>(\"arg2\").unwrap(), \"other\");\n    /// ```\n    ///\n    /// Now the same example, but using a default value for the first optional positional argument\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// // Assume there is an external subcommand named \"subcmd\"\n    /// let m = Command::new(\"myprog\")\n    ///     .allow_missing_positional(true)\n    ///     .arg(Arg::new(\"arg1\")\n    ///         .default_value(\"something\"))\n    ///     .arg(Arg::new(\"arg2\")\n    ///         .required(true))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"other\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"arg1\").unwrap(), \"something\");\n    /// assert_eq!(m.get_one::<String>(\"arg2\").unwrap(), \"other\");\n    /// ```\n    ///\n    /// Style number two from above:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// // Assume there is an external subcommand named \"subcmd\"\n    /// let m = Command::new(\"myprog\")\n    ///     .allow_missing_positional(true)\n    ///     .arg(Arg::new(\"foo\"))\n    ///     .arg(Arg::new(\"bar\"))\n    ///     .arg(Arg::new(\"baz\").action(ArgAction::Set).num_args(1..))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"foo\", \"bar\", \"baz1\", \"baz2\", \"baz3\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"foo\").unwrap(), \"foo\");\n    /// assert_eq!(m.get_one::<String>(\"bar\").unwrap(), \"bar\");\n    /// assert_eq!(m.get_many::<String>(\"baz\").unwrap().collect::<Vec<_>>(), &[\"baz1\", \"baz2\", \"baz3\"]);\n    /// ```\n    ///\n    /// Now nofice if we don't specify `foo` or `baz` but use the `--` operator.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// // Assume there is an external subcommand named \"subcmd\"\n    /// let m = Command::new(\"myprog\")\n    ///     .allow_missing_positional(true)\n    ///     .arg(Arg::new(\"foo\"))\n    ///     .arg(Arg::new(\"bar\"))\n    ///     .arg(Arg::new(\"baz\").action(ArgAction::Set).num_args(1..))\n    ///     .get_matches_from(vec![\n    ///         \"prog\", \"--\", \"baz1\", \"baz2\", \"baz3\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.get_one::<String>(\"foo\"), None);\n    /// assert_eq!(m.get_one::<String>(\"bar\"), None);\n    /// assert_eq!(m.get_many::<String>(\"baz\").unwrap().collect::<Vec<_>>(), &[\"baz1\", \"baz2\", \"baz3\"]);\n    /// ```\n    ///\n    /// [required]: crate::Arg::required()\n    #[inline]\n    pub fn allow_missing_positional(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::AllowMissingPositional)\n        } else {\n            self.unset_setting(AppSettings::AllowMissingPositional)\n        }\n    }\n}\n\n/// # Subcommand-specific Settings\nimpl Command {\n    /// Sets the short version of the subcommand flag without the preceding `-`.\n    ///\n    /// Allows the subcommand to be used as if it were an [`Arg::short`].\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let matches = Command::new(\"pacman\")\n    ///     .subcommand(\n    ///         Command::new(\"sync\").short_flag('S').arg(\n    ///             Arg::new(\"search\")\n    ///                 .short('s')\n    ///                 .long(\"search\")\n    ///                 .action(ArgAction::SetTrue)\n    ///                 .help(\"search remote repositories for matching strings\"),\n    ///         ),\n    ///     )\n    ///     .get_matches_from(vec![\"pacman\", \"-Ss\"]);\n    ///\n    /// assert_eq!(matches.subcommand_name().unwrap(), \"sync\");\n    /// let sync_matches = matches.subcommand_matches(\"sync\").unwrap();\n    /// assert!(sync_matches.get_flag(\"search\"));\n    /// ```\n    /// [`Arg::short`]: Arg::short()\n    #[must_use]\n    pub fn short_flag(mut self, short: impl IntoResettable<char>) -> Self {\n        self.short_flag = short.into_resettable().into_option();\n        self\n    }\n\n    /// Sets the long version of the subcommand flag without the preceding `--`.\n    ///\n    /// Allows the subcommand to be used as if it were an [`Arg::long`].\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Any leading `-` characters will be stripped.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// To set `long_flag` use a word containing valid UTF-8 codepoints. If you supply a double leading\n    /// `--` such as `--sync` they will be stripped. Hyphens in the middle of the word; however,\n    /// will *not* be stripped (i.e. `sync-file` is allowed).\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let matches = Command::new(\"pacman\")\n    ///     .subcommand(\n    ///         Command::new(\"sync\").long_flag(\"sync\").arg(\n    ///             Arg::new(\"search\")\n    ///                 .short('s')\n    ///                 .long(\"search\")\n    ///                 .action(ArgAction::SetTrue)\n    ///                 .help(\"search remote repositories for matching strings\"),\n    ///         ),\n    ///     )\n    ///     .get_matches_from(vec![\"pacman\", \"--sync\", \"--search\"]);\n    ///\n    /// assert_eq!(matches.subcommand_name().unwrap(), \"sync\");\n    /// let sync_matches = matches.subcommand_matches(\"sync\").unwrap();\n    /// assert!(sync_matches.get_flag(\"search\"));\n    /// ```\n    ///\n    /// [`Arg::long`]: Arg::long()\n    #[must_use]\n    pub fn long_flag(mut self, long: impl Into<Str>) -> Self {\n        self.long_flag = Some(long.into());\n        self\n    }\n\n    /// Sets a hidden alias to this subcommand.\n    ///\n    /// This allows the subcommand to be accessed via *either* the original name, or this given\n    /// alias. This is more efficient and easier than creating multiple hidden subcommands as one\n    /// only needs to check for the existence of this command, and not all aliased variants.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Aliases defined with this method are *hidden* from the help\n    /// message. If you're looking for aliases that will be displayed in the help\n    /// message, see [`Command::visible_alias`].\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** When using aliases and checking for the existence of a\n    /// particular subcommand within an [`ArgMatches`] struct, one only needs to\n    /// search for the original name and not all aliases.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"test\")\n    ///         .alias(\"do-stuff\"))\n    ///     .get_matches_from(vec![\"myprog\", \"do-stuff\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    /// [`Command::visible_alias`]: Command::visible_alias()\n    #[must_use]\n    pub fn alias(mut self, name: impl IntoResettable<Str>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            self.aliases.push((name, false));\n        } else {\n            self.aliases.clear();\n        }\n        self\n    }\n\n    /// Add an alias, which functions as  \"hidden\" short flag subcommand\n    ///\n    /// This will automatically dispatch as if this subcommand was used. This is more efficient,\n    /// and easier than creating multiple hidden subcommands as one only needs to check for the\n    /// existence of this command, and not all variants.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///             .subcommand(Command::new(\"test\").short_flag('t')\n    ///                 .short_flag_alias('d'))\n    ///             .get_matches_from(vec![\"myprog\", \"-d\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    #[must_use]\n    pub fn short_flag_alias(mut self, name: impl IntoResettable<char>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            debug_assert!(name != '-', \"short alias name cannot be `-`\");\n            self.short_flag_aliases.push((name, false));\n        } else {\n            self.short_flag_aliases.clear();\n        }\n        self\n    }\n\n    /// Add an alias, which functions as a \"hidden\" long flag subcommand.\n    ///\n    /// This will automatically dispatch as if this subcommand was used. This is more efficient,\n    /// and easier than creating multiple hidden subcommands as one only needs to check for the\n    /// existence of this command, and not all variants.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///             .subcommand(Command::new(\"test\").long_flag(\"test\")\n    ///                 .long_flag_alias(\"testing\"))\n    ///             .get_matches_from(vec![\"myprog\", \"--testing\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    #[must_use]\n    pub fn long_flag_alias(mut self, name: impl IntoResettable<Str>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            self.long_flag_aliases.push((name, false));\n        } else {\n            self.long_flag_aliases.clear();\n        }\n        self\n    }\n\n    /// Sets multiple hidden aliases to this subcommand.\n    ///\n    /// This allows the subcommand to be accessed via *either* the original name or any of the\n    /// given aliases. This is more efficient, and easier than creating multiple hidden subcommands\n    /// as one only needs to check for the existence of this command and not all aliased variants.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Aliases defined with this method are *hidden* from the help\n    /// message. If looking for aliases that will be displayed in the help\n    /// message, see [`Command::visible_aliases`].\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** When using aliases and checking for the existence of a\n    /// particular subcommand within an [`ArgMatches`] struct, one only needs to\n    /// search for the original name and not all aliases.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"test\")\n    ///         .aliases([\"do-stuff\", \"do-tests\", \"tests\"]))\n    ///         .arg(Arg::new(\"input\")\n    ///             .help(\"the file to add\")\n    ///             .required(false))\n    ///     .get_matches_from(vec![\"myprog\", \"do-tests\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    /// [`Command::visible_aliases`]: Command::visible_aliases()\n    #[must_use]\n    pub fn aliases(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {\n        self.aliases\n            .extend(names.into_iter().map(|n| (n.into(), false)));\n        self\n    }\n\n    /// Add aliases, which function as \"hidden\" short flag subcommands.\n    ///\n    /// These will automatically dispatch as if this subcommand was used. This is more efficient,\n    /// and easier than creating multiple hidden subcommands as one only needs to check for the\n    /// existence of this command, and not all variants.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"test\").short_flag('t')\n    ///         .short_flag_aliases(['a', 'b', 'c']))\n    ///         .arg(Arg::new(\"input\")\n    ///             .help(\"the file to add\")\n    ///             .required(false))\n    ///     .get_matches_from(vec![\"myprog\", \"-a\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    #[must_use]\n    pub fn short_flag_aliases(mut self, names: impl IntoIterator<Item = char>) -> Self {\n        for s in names {\n            debug_assert!(s != '-', \"short alias name cannot be `-`\");\n            self.short_flag_aliases.push((s, false));\n        }\n        self\n    }\n\n    /// Add aliases, which function as \"hidden\" long flag subcommands.\n    ///\n    /// These will automatically dispatch as if this subcommand was used. This is more efficient,\n    /// and easier than creating multiple hidden subcommands as one only needs to check for the\n    /// existence of this command, and not all variants.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///             .subcommand(Command::new(\"test\").long_flag(\"test\")\n    ///                 .long_flag_aliases([\"testing\", \"testall\", \"test_all\"]))\n    ///                 .arg(Arg::new(\"input\")\n    ///                             .help(\"the file to add\")\n    ///                             .required(false))\n    ///             .get_matches_from(vec![\"myprog\", \"--testing\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    #[must_use]\n    pub fn long_flag_aliases(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {\n        for s in names {\n            self = self.long_flag_alias(s);\n        }\n        self\n    }\n\n    /// Sets a visible alias to this subcommand.\n    ///\n    /// This allows the subcommand to be accessed via *either* the\n    /// original name or the given alias. This is more efficient and easier\n    /// than creating hidden subcommands as one only needs to check for\n    /// the existence of this command and not all aliased variants.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The alias defined with this method is *visible* from the help\n    /// message and displayed as if it were just another regular subcommand. If\n    /// looking for an alias that will not be displayed in the help message, see\n    /// [`Command::alias`].\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** When using aliases and checking for the existence of a\n    /// particular subcommand within an [`ArgMatches`] struct, one only needs to\n    /// search for the original name and not all aliases.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"test\")\n    ///         .visible_alias(\"do-stuff\"))\n    ///     .get_matches_from(vec![\"myprog\", \"do-stuff\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    /// [`Command::alias`]: Command::alias()\n    #[must_use]\n    pub fn visible_alias(mut self, name: impl IntoResettable<Str>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            self.aliases.push((name, true));\n        } else {\n            self.aliases.clear();\n        }\n        self\n    }\n\n    /// Add an alias, which functions as  \"visible\" short flag subcommand\n    ///\n    /// This will automatically dispatch as if this subcommand was used. This is more efficient,\n    /// and easier than creating multiple hidden subcommands as one only needs to check for the\n    /// existence of this command, and not all variants.\n    ///\n    /// See also [`Command::short_flag_alias`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///             .subcommand(Command::new(\"test\").short_flag('t')\n    ///                 .visible_short_flag_alias('d'))\n    ///             .get_matches_from(vec![\"myprog\", \"-d\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    /// [`Command::short_flag_alias`]: Command::short_flag_alias()\n    #[must_use]\n    pub fn visible_short_flag_alias(mut self, name: impl IntoResettable<char>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            debug_assert!(name != '-', \"short alias name cannot be `-`\");\n            self.short_flag_aliases.push((name, true));\n        } else {\n            self.short_flag_aliases.clear();\n        }\n        self\n    }\n\n    /// Add an alias, which functions as a \"visible\" long flag subcommand.\n    ///\n    /// This will automatically dispatch as if this subcommand was used. This is more efficient,\n    /// and easier than creating multiple hidden subcommands as one only needs to check for the\n    /// existence of this command, and not all variants.\n    ///\n    /// See also [`Command::long_flag_alias`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///             .subcommand(Command::new(\"test\").long_flag(\"test\")\n    ///                 .visible_long_flag_alias(\"testing\"))\n    ///             .get_matches_from(vec![\"myprog\", \"--testing\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    /// [`Command::long_flag_alias`]: Command::long_flag_alias()\n    #[must_use]\n    pub fn visible_long_flag_alias(mut self, name: impl IntoResettable<Str>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            self.long_flag_aliases.push((name, true));\n        } else {\n            self.long_flag_aliases.clear();\n        }\n        self\n    }\n\n    /// Sets multiple visible aliases to this subcommand.\n    ///\n    /// This allows the subcommand to be accessed via *either* the\n    /// original name or any of the given aliases. This is more efficient and easier\n    /// than creating multiple hidden subcommands as one only needs to check for\n    /// the existence of this command and not all aliased variants.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The alias defined with this method is *visible* from the help\n    /// message and displayed as if it were just another regular subcommand. If\n    /// looking for an alias that will not be displayed in the help message, see\n    /// [`Command::alias`].\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** When using aliases, and checking for the existence of a\n    /// particular subcommand within an [`ArgMatches`] struct, one only needs to\n    /// search for the original name and not all aliases.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"test\")\n    ///         .visible_aliases([\"do-stuff\", \"tests\"]))\n    ///     .get_matches_from(vec![\"myprog\", \"do-stuff\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    /// [`Command::alias`]: Command::alias()\n    #[must_use]\n    pub fn visible_aliases(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {\n        self.aliases\n            .extend(names.into_iter().map(|n| (n.into(), true)));\n        self\n    }\n\n    /// Add aliases, which function as *visible* short flag subcommands.\n    ///\n    /// See [`Command::short_flag_aliases`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///             .subcommand(Command::new(\"test\").short_flag('b')\n    ///                 .visible_short_flag_aliases(['t']))\n    ///             .get_matches_from(vec![\"myprog\", \"-t\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    /// [`Command::short_flag_aliases`]: Command::short_flag_aliases()\n    #[must_use]\n    pub fn visible_short_flag_aliases(mut self, names: impl IntoIterator<Item = char>) -> Self {\n        for s in names {\n            debug_assert!(s != '-', \"short alias name cannot be `-`\");\n            self.short_flag_aliases.push((s, true));\n        }\n        self\n    }\n\n    /// Add aliases, which function as *visible* long flag subcommands.\n    ///\n    /// See [`Command::long_flag_aliases`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    /// let m = Command::new(\"myprog\")\n    ///             .subcommand(Command::new(\"test\").long_flag(\"test\")\n    ///                 .visible_long_flag_aliases([\"testing\", \"testall\", \"test_all\"]))\n    ///             .get_matches_from(vec![\"myprog\", \"--testing\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"test\"));\n    /// ```\n    /// [`Command::long_flag_aliases`]: Command::long_flag_aliases()\n    #[must_use]\n    pub fn visible_long_flag_aliases(\n        mut self,\n        names: impl IntoIterator<Item = impl Into<Str>>,\n    ) -> Self {\n        for s in names {\n            self = self.visible_long_flag_alias(s);\n        }\n        self\n    }\n\n    /// Set the placement of this subcommand within the help.\n    ///\n    /// Subcommands with a lower value will be displayed first in the help message.\n    /// Those with the same display order will be sorted.\n    ///\n    /// `Command`s are automatically assigned a display order based on the order they are added to\n    /// their parent [`Command`].\n    /// Overriding this is helpful when the order commands are added in isn't the same as the\n    /// display order, whether in one-off cases or to automatically sort commands.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, };\n    /// let m = Command::new(\"cust-ord\")\n    ///     .subcommand(Command::new(\"beta\")\n    ///         .display_order(0)  // Sort\n    ///         .about(\"Some help and text\"))\n    ///     .subcommand(Command::new(\"alpha\")\n    ///         .display_order(0)  // Sort\n    ///         .about(\"I should be first!\"))\n    ///     .get_matches_from(vec![\n    ///         \"cust-ord\", \"--help\"\n    ///     ]);\n    /// # }\n    /// ```\n    ///\n    /// The above example displays the following help message\n    ///\n    /// ```text\n    /// cust-ord\n    ///\n    /// Usage: cust-ord [OPTIONS]\n    ///\n    /// Commands:\n    ///     alpha    I should be first!\n    ///     beta     Some help and text\n    ///     help     Print help for the subcommand(s)\n    ///\n    /// Options:\n    ///     -h, --help       Print help\n    ///     -V, --version    Print version\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn display_order(mut self, ord: impl IntoResettable<usize>) -> Self {\n        self.disp_ord = ord.into_resettable().into_option();\n        self\n    }\n\n    /// Specifies that this [`subcommand`] should be hidden from help messages\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .subcommand(\n    ///         Command::new(\"test\").hide(true)\n    ///     )\n    /// # ;\n    /// ```\n    ///\n    /// [`subcommand`]: crate::Command::subcommand()\n    #[inline]\n    pub fn hide(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::Hidden)\n        } else {\n            self.unset_setting(AppSettings::Hidden)\n        }\n    }\n\n    /// If no [`subcommand`] is present at runtime, error and exit gracefully.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, error::ErrorKind};\n    /// let err = Command::new(\"myprog\")\n    ///     .subcommand_required(true)\n    ///     .subcommand(Command::new(\"test\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"myprog\",\n    ///     ]);\n    /// assert!(err.is_err());\n    /// assert_eq!(err.unwrap_err().kind(), ErrorKind::MissingSubcommand);\n    /// # ;\n    /// ```\n    ///\n    /// [`subcommand`]: crate::Command::subcommand()\n    pub fn subcommand_required(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::SubcommandRequired)\n        } else {\n            self.unset_setting(AppSettings::SubcommandRequired)\n        }\n    }\n\n    /// Assume unexpected positional arguments are a [`subcommand`].\n    ///\n    /// Arguments will be stored in the `\"\"` argument in the [`ArgMatches`]\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Use this setting with caution,\n    /// as a truly unexpected argument (i.e. one that is *NOT* an external subcommand)\n    /// will **not** cause an error and instead be treated as a potential subcommand.\n    /// One should check for such cases manually and inform the user appropriately.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** A built-in subcommand will be parsed as an external subcommand when escaped with\n    /// `--`.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::ffi::OsString;\n    /// # use clap::Command;\n    /// // Assume there is an external subcommand named \"subcmd\"\n    /// let m = Command::new(\"myprog\")\n    ///     .allow_external_subcommands(true)\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"subcmd\", \"--option\", \"value\", \"-fff\", \"--flag\"\n    ///     ]);\n    ///\n    /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty\n    /// // string argument name\n    /// match m.subcommand() {\n    ///     Some((external, ext_m)) => {\n    ///          let ext_args: Vec<_> = ext_m.get_many::<OsString>(\"\").unwrap().collect();\n    ///          assert_eq!(external, \"subcmd\");\n    ///          assert_eq!(ext_args, [\"--option\", \"value\", \"-fff\", \"--flag\"]);\n    ///     },\n    ///     _ => {},\n    /// }\n    /// ```\n    ///\n    /// [`subcommand`]: crate::Command::subcommand()\n    /// [`ArgMatches`]: crate::ArgMatches\n    /// [`ErrorKind::UnknownArgument`]: crate::error::ErrorKind::UnknownArgument\n    pub fn allow_external_subcommands(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::AllowExternalSubcommands)\n        } else {\n            self.unset_setting(AppSettings::AllowExternalSubcommands)\n        }\n    }\n\n    /// Specifies how to parse external subcommand arguments.\n    ///\n    /// The default parser is for `OsString`.  This can be used to switch it to `String` or another\n    /// type.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Setting this requires [`Command::allow_external_subcommands`]\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(unix)] {\n    /// # use clap_builder as clap;\n    /// # use std::ffi::OsString;\n    /// # use clap::Command;\n    /// # use clap::value_parser;\n    /// // Assume there is an external subcommand named \"subcmd\"\n    /// let m = Command::new(\"myprog\")\n    ///     .allow_external_subcommands(true)\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"subcmd\", \"--option\", \"value\", \"-fff\", \"--flag\"\n    ///     ]);\n    ///\n    /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty\n    /// // string argument name\n    /// match m.subcommand() {\n    ///     Some((external, ext_m)) => {\n    ///          let ext_args: Vec<_> = ext_m.get_many::<OsString>(\"\").unwrap().collect();\n    ///          assert_eq!(external, \"subcmd\");\n    ///          assert_eq!(ext_args, [\"--option\", \"value\", \"-fff\", \"--flag\"]);\n    ///     },\n    ///     _ => {},\n    /// }\n    /// # }\n    /// ```\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::value_parser;\n    /// // Assume there is an external subcommand named \"subcmd\"\n    /// let m = Command::new(\"myprog\")\n    ///     .external_subcommand_value_parser(value_parser!(String))\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"subcmd\", \"--option\", \"value\", \"-fff\", \"--flag\"\n    ///     ]);\n    ///\n    /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty\n    /// // string argument name\n    /// match m.subcommand() {\n    ///     Some((external, ext_m)) => {\n    ///          let ext_args: Vec<_> = ext_m.get_many::<String>(\"\").unwrap().collect();\n    ///          assert_eq!(external, \"subcmd\");\n    ///          assert_eq!(ext_args, [\"--option\", \"value\", \"-fff\", \"--flag\"]);\n    ///     },\n    ///     _ => {},\n    /// }\n    /// ```\n    ///\n    /// [`subcommands`]: crate::Command::subcommand()\n    pub fn external_subcommand_value_parser(\n        mut self,\n        parser: impl IntoResettable<super::ValueParser>,\n    ) -> Self {\n        self.external_value_parser = parser.into_resettable().into_option();\n        self\n    }\n\n    /// Specifies that use of an argument prevents the use of [`subcommands`].\n    ///\n    /// By default `clap` allows arguments between subcommands such\n    /// as `<cmd> [cmd_args] <subcmd> [subcmd_args] <subsubcmd> [subsubcmd_args]`.\n    ///\n    /// This setting disables that functionality and says that arguments can\n    /// only follow the *final* subcommand. For instance using this setting\n    /// makes only the following invocations possible:\n    ///\n    /// * `<cmd> <subcmd> <subsubcmd> [subsubcmd_args]`\n    /// * `<cmd> <subcmd> [subcmd_args]`\n    /// * `<cmd> [cmd_args]`\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// Command::new(\"myprog\")\n    ///     .args_conflicts_with_subcommands(true);\n    /// ```\n    ///\n    /// [`subcommands`]: crate::Command::subcommand()\n    pub fn args_conflicts_with_subcommands(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::ArgsNegateSubcommands)\n        } else {\n            self.unset_setting(AppSettings::ArgsNegateSubcommands)\n        }\n    }\n\n    /// Prevent subcommands from being consumed as an arguments value.\n    ///\n    /// By default, if an option taking multiple values is followed by a subcommand, the\n    /// subcommand will be parsed as another value.\n    ///\n    /// ```text\n    /// cmd --foo val1 val2 subcommand\n    ///           --------- ----------\n    ///             values   another value\n    /// ```\n    ///\n    /// This setting instructs the parser to stop when encountering a subcommand instead of\n    /// greedily consuming arguments.\n    ///\n    /// ```text\n    /// cmd --foo val1 val2 subcommand\n    ///           --------- ----------\n    ///             values   subcommand\n    /// ```\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let cmd = Command::new(\"cmd\").subcommand(Command::new(\"sub\")).arg(\n    ///     Arg::new(\"arg\")\n    ///         .long(\"arg\")\n    ///         .num_args(1..)\n    ///         .action(ArgAction::Set),\n    /// );\n    ///\n    /// let matches = cmd\n    ///     .clone()\n    ///     .try_get_matches_from(&[\"cmd\", \"--arg\", \"1\", \"2\", \"3\", \"sub\"])\n    ///     .unwrap();\n    /// assert_eq!(\n    ///     matches.get_many::<String>(\"arg\").unwrap().collect::<Vec<_>>(),\n    ///     &[\"1\", \"2\", \"3\", \"sub\"]\n    /// );\n    /// assert!(matches.subcommand_matches(\"sub\").is_none());\n    ///\n    /// let matches = cmd\n    ///     .subcommand_precedence_over_arg(true)\n    ///     .try_get_matches_from(&[\"cmd\", \"--arg\", \"1\", \"2\", \"3\", \"sub\"])\n    ///     .unwrap();\n    /// assert_eq!(\n    ///     matches.get_many::<String>(\"arg\").unwrap().collect::<Vec<_>>(),\n    ///     &[\"1\", \"2\", \"3\"]\n    /// );\n    /// assert!(matches.subcommand_matches(\"sub\").is_some());\n    /// ```\n    pub fn subcommand_precedence_over_arg(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::SubcommandPrecedenceOverArg)\n        } else {\n            self.unset_setting(AppSettings::SubcommandPrecedenceOverArg)\n        }\n    }\n\n    /// Allows [`subcommands`] to override all requirements of the parent command.\n    ///\n    /// For example, if you had a subcommand or top level application with a required argument\n    /// that is only required as long as there is no subcommand present,\n    /// using this setting would allow you to set those arguments to [`Arg::required(true)`]\n    /// and yet receive no error so long as the user uses a valid subcommand instead.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This defaults to false (using subcommand does *not* negate requirements)\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// This first example shows that it is an error to not use a required argument\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind};\n    /// let err = Command::new(\"myprog\")\n    ///     .subcommand_negates_reqs(true)\n    ///     .arg(Arg::new(\"opt\").required(true))\n    ///     .subcommand(Command::new(\"test\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"myprog\"\n    ///     ]);\n    /// assert!(err.is_err());\n    /// assert_eq!(err.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// # ;\n    /// ```\n    ///\n    /// This next example shows that it is no longer error to not use a required argument if a\n    /// valid subcommand is used.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind};\n    /// let noerr = Command::new(\"myprog\")\n    ///     .subcommand_negates_reqs(true)\n    ///     .arg(Arg::new(\"opt\").required(true))\n    ///     .subcommand(Command::new(\"test\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"myprog\", \"test\"\n    ///     ]);\n    /// assert!(noerr.is_ok());\n    /// # ;\n    /// ```\n    ///\n    /// [`Arg::required(true)`]: crate::Arg::required()\n    /// [`subcommands`]: crate::Command::subcommand()\n    pub fn subcommand_negates_reqs(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::SubcommandsNegateReqs)\n        } else {\n            self.unset_setting(AppSettings::SubcommandsNegateReqs)\n        }\n    }\n\n    /// Multiple-personality program dispatched on the binary name (`argv[0]`)\n    ///\n    /// A \"multicall\" executable is a single executable\n    /// that contains a variety of applets,\n    /// and decides which applet to run based on the name of the file.\n    /// The executable can be called from different names by creating hard links\n    /// or symbolic links to it.\n    ///\n    /// This is desirable for:\n    /// - Easy distribution, a single binary that can install hardlinks to access the different\n    ///   personalities.\n    /// - Minimal binary size by sharing common code (e.g. standard library, clap)\n    /// - Custom shells or REPLs where there isn't a single top-level command\n    ///\n    /// Setting `multicall` will cause\n    /// - `argv[0]` to be stripped to the base name and parsed as the first argument, as if\n    ///   [`Command::no_binary_name`][Command::no_binary_name] was set.\n    /// - Help and errors to report subcommands as if they were the top-level command\n    ///\n    /// When the subcommand is not present, there are several strategies you may employ, depending\n    /// on your needs:\n    /// - Let the error percolate up normally\n    /// - Print a specialized error message using the\n    ///   [`Error::context`][crate::Error::context]\n    /// - Print the [help][Command::write_help] but this might be ambiguous\n    /// - Disable `multicall` and re-parse it\n    /// - Disable `multicall` and re-parse it with a specific subcommand\n    ///\n    /// When detecting the error condition, the [`ErrorKind`] isn't sufficient as a sub-subcommand\n    /// might report the same error.  Enable\n    /// [`allow_external_subcommands`][Command::allow_external_subcommands] if you want to specifically\n    /// get the unrecognized binary name.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Multicall can't be used with [`no_binary_name`] since they interpret\n    /// the command name in incompatible ways.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The multicall command cannot have arguments.\n    ///\n    /// </div>\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** Applets are slightly semantically different from subcommands,\n    /// so it's recommended to use [`Command::subcommand_help_heading`] and\n    /// [`Command::subcommand_value_name`] to change the descriptive text as above.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// `hostname` is an example of a multicall executable.\n    /// Both `hostname` and `dnsdomainname` are provided by the same executable\n    /// and which behaviour to use is based on the executable file name.\n    ///\n    /// This is desirable when the executable has a primary purpose\n    /// but there is related functionality that would be convenient to provide\n    /// and implement it to be in the same executable.\n    ///\n    /// The name of the cmd is essentially unused\n    /// and may be the same as the name of a subcommand.\n    ///\n    /// The names of the immediate subcommands of the Command\n    /// are matched against the basename of the first argument,\n    /// which is conventionally the path of the executable.\n    ///\n    /// This does not allow the subcommand to be passed as the first non-path argument.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, error::ErrorKind};\n    /// let mut cmd = Command::new(\"hostname\")\n    ///     .multicall(true)\n    ///     .subcommand(Command::new(\"hostname\"))\n    ///     .subcommand(Command::new(\"dnsdomainname\"));\n    /// let m = cmd.try_get_matches_from_mut(&[\"/usr/bin/hostname\", \"dnsdomainname\"]);\n    /// assert!(m.is_err());\n    /// assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);\n    /// let m = cmd.get_matches_from(&[\"/usr/bin/dnsdomainname\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"dnsdomainname\"));\n    /// ```\n    ///\n    /// Busybox is another common example of a multicall executable\n    /// with a subcommmand for each applet that can be run directly,\n    /// e.g. with the `cat` applet being run by running `busybox cat`,\n    /// or with `cat` as a link to the `busybox` binary.\n    ///\n    /// This is desirable when the launcher program has additional options\n    /// or it is useful to run the applet without installing a symlink\n    /// e.g. to test the applet without installing it\n    /// or there may already be a command of that name installed.\n    ///\n    /// To make an applet usable as both a multicall link and a subcommand\n    /// the subcommands must be defined both in the top-level Command\n    /// and as subcommands of the \"main\" applet.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// fn applet_commands() -> [Command; 2] {\n    ///     [Command::new(\"true\"), Command::new(\"false\")]\n    /// }\n    /// let mut cmd = Command::new(\"busybox\")\n    ///     .multicall(true)\n    ///     .subcommand(\n    ///         Command::new(\"busybox\")\n    ///             .subcommand_value_name(\"APPLET\")\n    ///             .subcommand_help_heading(\"APPLETS\")\n    ///             .subcommands(applet_commands()),\n    ///     )\n    ///     .subcommands(applet_commands());\n    /// // When called from the executable's canonical name\n    /// // its applets can be matched as subcommands.\n    /// let m = cmd.try_get_matches_from_mut(&[\"/usr/bin/busybox\", \"true\"]).unwrap();\n    /// assert_eq!(m.subcommand_name(), Some(\"busybox\"));\n    /// assert_eq!(m.subcommand().unwrap().1.subcommand_name(), Some(\"true\"));\n    /// // When called from a link named after an applet that applet is matched.\n    /// let m = cmd.get_matches_from(&[\"/usr/bin/true\"]);\n    /// assert_eq!(m.subcommand_name(), Some(\"true\"));\n    /// ```\n    ///\n    /// [`no_binary_name`]: crate::Command::no_binary_name\n    /// [`Command::subcommand_value_name`]: crate::Command::subcommand_value_name\n    /// [`Command::subcommand_help_heading`]: crate::Command::subcommand_help_heading\n    #[inline]\n    pub fn multicall(self, yes: bool) -> Self {\n        if yes {\n            self.setting(AppSettings::Multicall)\n        } else {\n            self.unset_setting(AppSettings::Multicall)\n        }\n    }\n\n    /// Sets the value name used for subcommands when printing usage and help.\n    ///\n    /// By default, this is \"COMMAND\".\n    ///\n    /// See also [`Command::subcommand_help_heading`]\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"sub1\"))\n    ///     .print_help()\n    /// # ;\n    /// ```\n    ///\n    /// will produce\n    ///\n    /// ```text\n    /// myprog\n    ///\n    /// Usage: myprog [COMMAND]\n    ///\n    /// Commands:\n    ///     help    Print this message or the help of the given subcommand(s)\n    ///     sub1\n    ///\n    /// Options:\n    ///     -h, --help       Print help\n    ///     -V, --version    Print version\n    /// ```\n    ///\n    /// but usage of `subcommand_value_name`\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"sub1\"))\n    ///     .subcommand_value_name(\"THING\")\n    ///     .print_help()\n    /// # ;\n    /// ```\n    ///\n    /// will produce\n    ///\n    /// ```text\n    /// myprog\n    ///\n    /// Usage: myprog [THING]\n    ///\n    /// Commands:\n    ///     help    Print this message or the help of the given subcommand(s)\n    ///     sub1\n    ///\n    /// Options:\n    ///     -h, --help       Print help\n    ///     -V, --version    Print version\n    /// ```\n    #[must_use]\n    pub fn subcommand_value_name(mut self, value_name: impl IntoResettable<Str>) -> Self {\n        self.subcommand_value_name = value_name.into_resettable().into_option();\n        self\n    }\n\n    /// Sets the help heading used for subcommands when printing usage and help.\n    ///\n    /// By default, this is \"Commands\".\n    ///\n    /// See also [`Command::subcommand_value_name`]\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"sub1\"))\n    ///     .print_help()\n    /// # ;\n    /// ```\n    ///\n    /// will produce\n    ///\n    /// ```text\n    /// myprog\n    ///\n    /// Usage: myprog [COMMAND]\n    ///\n    /// Commands:\n    ///     help    Print this message or the help of the given subcommand(s)\n    ///     sub1\n    ///\n    /// Options:\n    ///     -h, --help       Print help\n    ///     -V, --version    Print version\n    /// ```\n    ///\n    /// but usage of `subcommand_help_heading`\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// Command::new(\"myprog\")\n    ///     .subcommand(Command::new(\"sub1\"))\n    ///     .subcommand_help_heading(\"Things\")\n    ///     .print_help()\n    /// # ;\n    /// ```\n    ///\n    /// will produce\n    ///\n    /// ```text\n    /// myprog\n    ///\n    /// Usage: myprog [COMMAND]\n    ///\n    /// Things:\n    ///     help    Print this message or the help of the given subcommand(s)\n    ///     sub1\n    ///\n    /// Options:\n    ///     -h, --help       Print help\n    ///     -V, --version    Print version\n    /// ```\n    #[must_use]\n    pub fn subcommand_help_heading(mut self, heading: impl IntoResettable<Str>) -> Self {\n        self.subcommand_heading = heading.into_resettable().into_option();\n        self\n    }\n}\n\n/// # Reflection\nimpl Command {\n    #[inline]\n    #[cfg(feature = \"usage\")]\n    pub(crate) fn get_usage_name(&self) -> Option<&str> {\n        self.usage_name.as_deref()\n    }\n\n    #[inline]\n    #[cfg(feature = \"usage\")]\n    pub(crate) fn get_usage_name_fallback(&self) -> &str {\n        self.get_usage_name()\n            .unwrap_or_else(|| self.get_bin_name_fallback())\n    }\n\n    #[inline]\n    #[cfg(not(feature = \"usage\"))]\n    #[allow(dead_code)]\n    pub(crate) fn get_usage_name_fallback(&self) -> &str {\n        self.get_bin_name_fallback()\n    }\n\n    /// Get the name of the binary.\n    #[inline]\n    pub fn get_display_name(&self) -> Option<&str> {\n        self.display_name.as_deref()\n    }\n\n    /// Get the name of the binary.\n    #[inline]\n    pub fn get_bin_name(&self) -> Option<&str> {\n        self.bin_name.as_deref()\n    }\n\n    /// Get the name of the binary.\n    #[inline]\n    pub(crate) fn get_bin_name_fallback(&self) -> &str {\n        self.bin_name.as_deref().unwrap_or_else(|| self.get_name())\n    }\n\n    /// Set binary name. Uses `&mut self` instead of `self`.\n    pub fn set_bin_name(&mut self, name: impl Into<String>) {\n        self.bin_name = Some(name.into());\n    }\n\n    /// Get the name of the cmd.\n    #[inline]\n    pub fn get_name(&self) -> &str {\n        self.name.as_str()\n    }\n\n    #[inline]\n    #[cfg(debug_assertions)]\n    pub(crate) fn get_name_str(&self) -> &Str {\n        &self.name\n    }\n\n    /// Get all known names of the cmd (i.e. primary name and visible aliases).\n    pub fn get_name_and_visible_aliases(&self) -> Vec<&str> {\n        let mut names = vec![self.name.as_str()];\n        names.extend(self.get_visible_aliases());\n        names\n    }\n\n    /// Get the version of the cmd.\n    #[inline]\n    pub fn get_version(&self) -> Option<&str> {\n        self.version.as_deref()\n    }\n\n    /// Get the long version of the cmd.\n    #[inline]\n    pub fn get_long_version(&self) -> Option<&str> {\n        self.long_version.as_deref()\n    }\n\n    /// Get the placement within help\n    #[inline]\n    pub fn get_display_order(&self) -> usize {\n        self.disp_ord.unwrap_or(999)\n    }\n\n    /// Get the authors of the cmd.\n    #[inline]\n    pub fn get_author(&self) -> Option<&str> {\n        self.author.as_deref()\n    }\n\n    /// Get the short flag of the subcommand.\n    #[inline]\n    pub fn get_short_flag(&self) -> Option<char> {\n        self.short_flag\n    }\n\n    /// Get the long flag of the subcommand.\n    #[inline]\n    pub fn get_long_flag(&self) -> Option<&str> {\n        self.long_flag.as_deref()\n    }\n\n    /// Get the help message specified via [`Command::about`].\n    ///\n    /// [`Command::about`]: Command::about()\n    #[inline]\n    pub fn get_about(&self) -> Option<&StyledStr> {\n        self.about.as_ref()\n    }\n\n    /// Get the help message specified via [`Command::long_about`].\n    ///\n    /// [`Command::long_about`]: Command::long_about()\n    #[inline]\n    pub fn get_long_about(&self) -> Option<&StyledStr> {\n        self.long_about.as_ref()\n    }\n\n    /// Get the custom section heading specified via [`Command::flatten_help`].\n    #[inline]\n    pub fn is_flatten_help_set(&self) -> bool {\n        self.is_set(AppSettings::FlattenHelp)\n    }\n\n    /// Get the custom section heading specified via [`Command::next_help_heading`].\n    #[inline]\n    pub fn get_next_help_heading(&self) -> Option<&str> {\n        self.current_help_heading.as_deref()\n    }\n\n    /// Iterate through the *visible* aliases for this subcommand.\n    #[inline]\n    pub fn get_visible_aliases(&self) -> impl Iterator<Item = &str> + '_ {\n        self.aliases\n            .iter()\n            .filter(|(_, vis)| *vis)\n            .map(|a| a.0.as_str())\n    }\n\n    /// Iterate through the *visible* short aliases for this subcommand.\n    #[inline]\n    pub fn get_visible_short_flag_aliases(&self) -> impl Iterator<Item = char> + '_ {\n        self.short_flag_aliases\n            .iter()\n            .filter(|(_, vis)| *vis)\n            .map(|a| a.0)\n    }\n\n    /// Iterate through the *visible* long aliases for this subcommand.\n    #[inline]\n    pub fn get_visible_long_flag_aliases(&self) -> impl Iterator<Item = &str> + '_ {\n        self.long_flag_aliases\n            .iter()\n            .filter(|(_, vis)| *vis)\n            .map(|a| a.0.as_str())\n    }\n\n    /// Iterate through the set of *all* the aliases for this subcommand, both visible and hidden.\n    #[inline]\n    pub fn get_all_aliases(&self) -> impl Iterator<Item = &str> + '_ {\n        self.aliases.iter().map(|a| a.0.as_str())\n    }\n\n    /// Iterate through the set of *all* the short aliases for this subcommand, both visible and hidden.\n    #[inline]\n    pub fn get_all_short_flag_aliases(&self) -> impl Iterator<Item = char> + '_ {\n        self.short_flag_aliases.iter().map(|a| a.0)\n    }\n\n    /// Iterate through the set of *all* the long aliases for this subcommand, both visible and hidden.\n    #[inline]\n    pub fn get_all_long_flag_aliases(&self) -> impl Iterator<Item = &str> + '_ {\n        self.long_flag_aliases.iter().map(|a| a.0.as_str())\n    }\n\n    /// Iterate through the *hidden* aliases for this subcommand.\n    #[inline]\n    pub fn get_aliases(&self) -> impl Iterator<Item = &str> + '_ {\n        self.aliases\n            .iter()\n            .filter(|(_, vis)| !*vis)\n            .map(|a| a.0.as_str())\n    }\n\n    #[inline]\n    pub(crate) fn is_set(&self, s: AppSettings) -> bool {\n        self.settings.is_set(s) || self.g_settings.is_set(s)\n    }\n\n    /// Should we color the output?\n    pub fn get_color(&self) -> ColorChoice {\n        debug!(\"Command::color: Color setting...\");\n\n        if cfg!(feature = \"color\") {\n            if self.is_set(AppSettings::ColorNever) {\n                debug!(\"Never\");\n                ColorChoice::Never\n            } else if self.is_set(AppSettings::ColorAlways) {\n                debug!(\"Always\");\n                ColorChoice::Always\n            } else {\n                debug!(\"Auto\");\n                ColorChoice::Auto\n            }\n        } else {\n            ColorChoice::Never\n        }\n    }\n\n    /// Return the current `Styles` for the `Command`\n    #[inline]\n    pub fn get_styles(&self) -> &Styles {\n        self.app_ext.get().unwrap_or_default()\n    }\n\n    /// Iterate through the set of subcommands, getting a reference to each.\n    #[inline]\n    pub fn get_subcommands(&self) -> impl Iterator<Item = &Command> {\n        self.subcommands.iter()\n    }\n\n    /// Iterate through the set of subcommands, getting a mutable reference to each.\n    #[inline]\n    pub fn get_subcommands_mut(&mut self) -> impl Iterator<Item = &mut Command> {\n        self.subcommands.iter_mut()\n    }\n\n    /// Returns `true` if this `Command` has subcommands.\n    #[inline]\n    pub fn has_subcommands(&self) -> bool {\n        !self.subcommands.is_empty()\n    }\n\n    /// Returns the help heading for listing subcommands.\n    #[inline]\n    pub fn get_subcommand_help_heading(&self) -> Option<&str> {\n        self.subcommand_heading.as_deref()\n    }\n\n    /// Returns the subcommand value name.\n    #[inline]\n    pub fn get_subcommand_value_name(&self) -> Option<&str> {\n        self.subcommand_value_name.as_deref()\n    }\n\n    /// Returns the help heading for listing subcommands.\n    #[inline]\n    pub fn get_before_help(&self) -> Option<&StyledStr> {\n        self.before_help.as_ref()\n    }\n\n    /// Returns the help heading for listing subcommands.\n    #[inline]\n    pub fn get_before_long_help(&self) -> Option<&StyledStr> {\n        self.before_long_help.as_ref()\n    }\n\n    /// Returns the help heading for listing subcommands.\n    #[inline]\n    pub fn get_after_help(&self) -> Option<&StyledStr> {\n        self.after_help.as_ref()\n    }\n\n    /// Returns the help heading for listing subcommands.\n    #[inline]\n    pub fn get_after_long_help(&self) -> Option<&StyledStr> {\n        self.after_long_help.as_ref()\n    }\n\n    /// Find subcommand such that its name or one of aliases equals `name`.\n    ///\n    /// This does not recurse through subcommands of subcommands.\n    #[inline]\n    pub fn find_subcommand(&self, name: impl AsRef<std::ffi::OsStr>) -> Option<&Command> {\n        let name = name.as_ref();\n        self.get_subcommands().find(|s| s.aliases_to(name))\n    }\n\n    /// Find subcommand such that its name or one of aliases equals `name`, returning\n    /// a mutable reference to the subcommand.\n    ///\n    /// This does not recurse through subcommands of subcommands.\n    #[inline]\n    pub fn find_subcommand_mut(\n        &mut self,\n        name: impl AsRef<std::ffi::OsStr>,\n    ) -> Option<&mut Command> {\n        let name = name.as_ref();\n        self.get_subcommands_mut().find(|s| s.aliases_to(name))\n    }\n\n    /// Iterate through the set of groups.\n    #[inline]\n    pub fn get_groups(&self) -> impl Iterator<Item = &ArgGroup> {\n        self.groups.iter()\n    }\n\n    /// Iterate through the set of arguments.\n    #[inline]\n    pub fn get_arguments(&self) -> impl Iterator<Item = &Arg> {\n        self.args.args()\n    }\n\n    /// Iterate through the *positionals* arguments.\n    #[inline]\n    pub fn get_positionals(&self) -> impl Iterator<Item = &Arg> {\n        self.get_arguments().filter(|a| a.is_positional())\n    }\n\n    /// Iterate through the *options*.\n    pub fn get_opts(&self) -> impl Iterator<Item = &Arg> {\n        self.get_arguments()\n            .filter(|a| a.is_takes_value_set() && !a.is_positional())\n    }\n\n    /// Get a list of all arguments the given argument conflicts with.\n    ///\n    /// If the provided argument is declared as global, the conflicts will be determined\n    /// based on the propagation rules of global arguments.\n    ///\n    /// ### Panics\n    ///\n    /// If the given arg contains a conflict with an argument that is unknown to\n    /// this `Command`.\n    pub fn get_arg_conflicts_with(&self, arg: &Arg) -> Vec<&Arg> // FIXME: This could probably have been an iterator\n    {\n        if arg.is_global_set() {\n            self.get_global_arg_conflicts_with(arg)\n        } else {\n            let mut result = Vec::new();\n            for id in arg.blacklist.iter() {\n                if let Some(arg) = self.find(id) {\n                    result.push(arg);\n                } else if let Some(group) = self.find_group(id) {\n                    result.extend(\n                        self.unroll_args_in_group(&group.id)\n                            .iter()\n                            .map(|id| self.find(id).expect(INTERNAL_ERROR_MSG)),\n                    );\n                } else {\n                    panic!(\n                        \"Command::get_arg_conflicts_with: The passed arg conflicts with an arg unknown to the cmd\"\n                    );\n                }\n            }\n            result\n        }\n    }\n\n    /// Get a unique list of all arguments of all commands and continuous subcommands the given argument conflicts with.\n    ///\n    /// This behavior follows the propagation rules of global arguments.\n    /// It is useful for finding conflicts for arguments declared as global.\n    ///\n    /// ### Panics\n    ///\n    /// If the given arg contains a conflict with an argument that is unknown to\n    /// this `Command`.\n    fn get_global_arg_conflicts_with(&self, arg: &Arg) -> Vec<&Arg> // FIXME: This could probably have been an iterator\n    {\n        arg.blacklist\n            .iter()\n            .map(|id| {\n                self.args\n                    .args()\n                    .chain(\n                        self.get_subcommands_containing(arg)\n                            .iter()\n                            .flat_map(|x| x.args.args()),\n                    )\n                    .find(|arg| arg.get_id() == id)\n                    .expect(\n                        \"Command::get_arg_conflicts_with: \\\n                    The passed arg conflicts with an arg unknown to the cmd\",\n                    )\n            })\n            .collect()\n    }\n\n    /// Get a list of subcommands which contain the provided Argument\n    ///\n    /// This command will only include subcommands in its list for which the subcommands\n    /// parent also contains the Argument.\n    ///\n    /// This search follows the propagation rules of global arguments.\n    /// It is useful to finding subcommands, that have inherited a global argument.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** In this case only `Sucommand_1` will be included\n    /// ```text\n    ///   Subcommand_1 (contains Arg)\n    ///     Subcommand_1.1 (doesn't contain Arg)\n    ///       Subcommand_1.1.1 (contains Arg)\n    /// ```\n    ///\n    /// </div>\n    fn get_subcommands_containing(&self, arg: &Arg) -> Vec<&Self> {\n        let mut vec = Vec::new();\n        for idx in 0..self.subcommands.len() {\n            if self.subcommands[idx]\n                .args\n                .args()\n                .any(|ar| ar.get_id() == arg.get_id())\n            {\n                vec.push(&self.subcommands[idx]);\n                vec.append(&mut self.subcommands[idx].get_subcommands_containing(arg));\n            }\n        }\n        vec\n    }\n\n    /// Report whether [`Command::no_binary_name`] is set\n    pub fn is_no_binary_name_set(&self) -> bool {\n        self.is_set(AppSettings::NoBinaryName)\n    }\n\n    /// Report whether [`Command::ignore_errors`] is set\n    pub(crate) fn is_ignore_errors_set(&self) -> bool {\n        self.is_set(AppSettings::IgnoreErrors)\n    }\n\n    /// Report whether [`Command::dont_delimit_trailing_values`] is set\n    pub fn is_dont_delimit_trailing_values_set(&self) -> bool {\n        self.is_set(AppSettings::DontDelimitTrailingValues)\n    }\n\n    /// Report whether [`Command::disable_version_flag`] is set\n    pub fn is_disable_version_flag_set(&self) -> bool {\n        self.is_set(AppSettings::DisableVersionFlag)\n            || (self.version.is_none() && self.long_version.is_none())\n    }\n\n    /// Report whether [`Command::propagate_version`] is set\n    pub fn is_propagate_version_set(&self) -> bool {\n        self.is_set(AppSettings::PropagateVersion)\n    }\n\n    /// Report whether [`Command::next_line_help`] is set\n    pub fn is_next_line_help_set(&self) -> bool {\n        self.is_set(AppSettings::NextLineHelp)\n    }\n\n    /// Report whether [`Command::disable_help_flag`] is set\n    pub fn is_disable_help_flag_set(&self) -> bool {\n        self.is_set(AppSettings::DisableHelpFlag)\n    }\n\n    /// Report whether [`Command::disable_help_subcommand`] is set\n    pub fn is_disable_help_subcommand_set(&self) -> bool {\n        self.is_set(AppSettings::DisableHelpSubcommand)\n    }\n\n    /// Report whether [`Command::disable_colored_help`] is set\n    pub fn is_disable_colored_help_set(&self) -> bool {\n        self.is_set(AppSettings::DisableColoredHelp)\n    }\n\n    /// Report whether [`Command::help_expected`] is set\n    #[cfg(debug_assertions)]\n    pub(crate) fn is_help_expected_set(&self) -> bool {\n        self.is_set(AppSettings::HelpExpected)\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"This is now the default\")\n    )]\n    pub fn is_dont_collapse_args_in_usage_set(&self) -> bool {\n        true\n    }\n\n    /// Report whether [`Command::infer_long_args`] is set\n    pub(crate) fn is_infer_long_args_set(&self) -> bool {\n        self.is_set(AppSettings::InferLongArgs)\n    }\n\n    /// Report whether [`Command::infer_subcommands`] is set\n    pub(crate) fn is_infer_subcommands_set(&self) -> bool {\n        self.is_set(AppSettings::InferSubcommands)\n    }\n\n    /// Report whether [`Command::arg_required_else_help`] is set\n    pub fn is_arg_required_else_help_set(&self) -> bool {\n        self.is_set(AppSettings::ArgRequiredElseHelp)\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(\n            since = \"4.0.0\",\n            note = \"Replaced with `Arg::is_allow_hyphen_values_set`\"\n        )\n    )]\n    pub(crate) fn is_allow_hyphen_values_set(&self) -> bool {\n        self.is_set(AppSettings::AllowHyphenValues)\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(\n            since = \"4.0.0\",\n            note = \"Replaced with `Arg::is_allow_negative_numbers_set`\"\n        )\n    )]\n    pub fn is_allow_negative_numbers_set(&self) -> bool {\n        self.is_set(AppSettings::AllowNegativeNumbers)\n    }\n\n    #[doc(hidden)]\n    #[cfg_attr(\n        feature = \"deprecated\",\n        deprecated(since = \"4.0.0\", note = \"Replaced with `Arg::is_trailing_var_arg_set`\")\n    )]\n    pub fn is_trailing_var_arg_set(&self) -> bool {\n        self.is_set(AppSettings::TrailingVarArg)\n    }\n\n    /// Report whether [`Command::allow_missing_positional`] is set\n    pub fn is_allow_missing_positional_set(&self) -> bool {\n        self.is_set(AppSettings::AllowMissingPositional)\n    }\n\n    /// Report whether [`Command::hide`] is set\n    pub fn is_hide_set(&self) -> bool {\n        self.is_set(AppSettings::Hidden)\n    }\n\n    /// Report whether [`Command::subcommand_required`] is set\n    pub fn is_subcommand_required_set(&self) -> bool {\n        self.is_set(AppSettings::SubcommandRequired)\n    }\n\n    /// Report whether [`Command::allow_external_subcommands`] is set\n    pub fn is_allow_external_subcommands_set(&self) -> bool {\n        self.is_set(AppSettings::AllowExternalSubcommands)\n    }\n\n    /// Configured parser for values passed to an external subcommand\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// let cmd = clap::Command::new(\"raw\")\n    ///     .external_subcommand_value_parser(clap::value_parser!(String));\n    /// let value_parser = cmd.get_external_subcommand_value_parser();\n    /// println!(\"{value_parser:?}\");\n    /// ```\n    pub fn get_external_subcommand_value_parser(&self) -> Option<&super::ValueParser> {\n        if !self.is_allow_external_subcommands_set() {\n            None\n        } else {\n            static DEFAULT: super::ValueParser = super::ValueParser::os_string();\n            Some(self.external_value_parser.as_ref().unwrap_or(&DEFAULT))\n        }\n    }\n\n    /// Report whether [`Command::args_conflicts_with_subcommands`] is set\n    pub fn is_args_conflicts_with_subcommands_set(&self) -> bool {\n        self.is_set(AppSettings::ArgsNegateSubcommands)\n    }\n\n    #[doc(hidden)]\n    pub fn is_args_override_self(&self) -> bool {\n        self.is_set(AppSettings::AllArgsOverrideSelf)\n    }\n\n    /// Report whether [`Command::subcommand_precedence_over_arg`] is set\n    pub fn is_subcommand_precedence_over_arg_set(&self) -> bool {\n        self.is_set(AppSettings::SubcommandPrecedenceOverArg)\n    }\n\n    /// Report whether [`Command::subcommand_negates_reqs`] is set\n    pub fn is_subcommand_negates_reqs_set(&self) -> bool {\n        self.is_set(AppSettings::SubcommandsNegateReqs)\n    }\n\n    /// Report whether [`Command::multicall`] is set\n    pub fn is_multicall_set(&self) -> bool {\n        self.is_set(AppSettings::Multicall)\n    }\n\n    /// Access an [`CommandExt`]\n    #[cfg(feature = \"unstable-ext\")]\n    pub fn get<T: CommandExt + Extension>(&self) -> Option<&T> {\n        self.ext.get::<T>()\n    }\n\n    /// Remove an [`CommandExt`]\n    #[cfg(feature = \"unstable-ext\")]\n    pub fn remove<T: CommandExt + Extension>(mut self) -> Option<T> {\n        self.ext.remove::<T>()\n    }\n}\n\n// Internally used only\nimpl Command {\n    pub(crate) fn get_override_usage(&self) -> Option<&StyledStr> {\n        self.usage_str.as_ref()\n    }\n\n    pub(crate) fn get_override_help(&self) -> Option<&StyledStr> {\n        self.help_str.as_ref()\n    }\n\n    #[cfg(feature = \"help\")]\n    pub(crate) fn get_help_template(&self) -> Option<&StyledStr> {\n        self.template.as_ref()\n    }\n\n    #[cfg(feature = \"help\")]\n    pub(crate) fn get_term_width(&self) -> Option<usize> {\n        self.app_ext.get::<TermWidth>().map(|e| e.0)\n    }\n\n    #[cfg(feature = \"help\")]\n    pub(crate) fn get_max_term_width(&self) -> Option<usize> {\n        self.app_ext.get::<MaxTermWidth>().map(|e| e.0)\n    }\n\n    pub(crate) fn get_keymap(&self) -> &MKeyMap {\n        &self.args\n    }\n\n    fn get_used_global_args(&self, matches: &ArgMatches, global_arg_vec: &mut Vec<Id>) {\n        global_arg_vec.extend(\n            self.args\n                .args()\n                .filter(|a| a.is_global_set())\n                .map(|ga| ga.id.clone()),\n        );\n        if let Some((id, matches)) = matches.subcommand() {\n            if let Some(used_sub) = self.find_subcommand(id) {\n                used_sub.get_used_global_args(matches, global_arg_vec);\n            }\n        }\n    }\n\n    fn _do_parse(\n        &mut self,\n        raw_args: &mut clap_lex::RawArgs,\n        args_cursor: clap_lex::ArgCursor,\n    ) -> ClapResult<ArgMatches> {\n        debug!(\"Command::_do_parse\");\n\n        // If there are global arguments, or settings we need to propagate them down to subcommands\n        // before parsing in case we run into a subcommand\n        self._build_self(false);\n\n        let mut matcher = ArgMatcher::new(self);\n\n        // do the real parsing\n        let mut parser = Parser::new(self);\n        if let Err(error) = parser.get_matches_with(&mut matcher, raw_args, args_cursor) {\n            if self.is_set(AppSettings::IgnoreErrors) && error.use_stderr() {\n                debug!(\"Command::_do_parse: ignoring error: {error}\");\n            } else {\n                return Err(error);\n            }\n        }\n\n        let mut global_arg_vec = Default::default();\n        self.get_used_global_args(&matcher, &mut global_arg_vec);\n\n        matcher.propagate_globals(&global_arg_vec);\n\n        Ok(matcher.into_inner())\n    }\n\n    /// Prepare for introspecting on all included [`Command`]s\n    ///\n    /// Call this on the top-level [`Command`] when done building and before reading state for\n    /// cases like completions, custom help output, etc.\n    pub fn build(&mut self) {\n        self._build_recursive(true);\n        self._build_bin_names_internal();\n    }\n\n    pub(crate) fn _build_recursive(&mut self, expand_help_tree: bool) {\n        self._build_self(expand_help_tree);\n        for subcmd in self.get_subcommands_mut() {\n            subcmd._build_recursive(expand_help_tree);\n        }\n    }\n\n    pub(crate) fn _build_self(&mut self, expand_help_tree: bool) {\n        debug!(\"Command::_build: name={:?}\", self.get_name());\n        if !self.settings.is_set(AppSettings::Built) {\n            if let Some(deferred) = self.deferred.take() {\n                *self = (deferred)(std::mem::take(self));\n            }\n\n            // Make sure all the globally set flags apply to us as well\n            self.settings = self.settings | self.g_settings;\n\n            if self.is_multicall_set() {\n                self.settings.set(AppSettings::SubcommandRequired);\n                self.settings.set(AppSettings::DisableHelpFlag);\n                self.settings.set(AppSettings::DisableVersionFlag);\n            }\n            if !cfg!(feature = \"help\") && self.get_override_help().is_none() {\n                self.settings.set(AppSettings::DisableHelpFlag);\n                self.settings.set(AppSettings::DisableHelpSubcommand);\n            }\n            if self.is_set(AppSettings::ArgsNegateSubcommands) {\n                self.settings.set(AppSettings::SubcommandsNegateReqs);\n            }\n            if self.external_value_parser.is_some() {\n                self.settings.set(AppSettings::AllowExternalSubcommands);\n            }\n            if !self.has_subcommands() {\n                self.settings.set(AppSettings::DisableHelpSubcommand);\n            }\n\n            self._propagate();\n            self._check_help_and_version(expand_help_tree);\n            self._propagate_global_args();\n\n            let mut pos_counter = 1;\n            let hide_pv = self.is_set(AppSettings::HidePossibleValues);\n            for a in self.args.args_mut() {\n                // Fill in the groups\n                for g in &a.groups {\n                    if let Some(ag) = self.groups.iter_mut().find(|grp| grp.id == *g) {\n                        ag.args.push(a.get_id().clone());\n                    } else {\n                        let mut ag = ArgGroup::new(g);\n                        ag.args.push(a.get_id().clone());\n                        self.groups.push(ag);\n                    }\n                }\n\n                // Figure out implied settings\n                a._build();\n                if hide_pv && a.is_takes_value_set() {\n                    a.settings.set(ArgSettings::HidePossibleValues);\n                }\n                if a.is_positional() && a.index.is_none() {\n                    a.index = Some(pos_counter);\n                    pos_counter += 1;\n                }\n            }\n\n            self.args._build();\n\n            #[allow(deprecated)]\n            {\n                let highest_idx = self\n                    .get_keymap()\n                    .keys()\n                    .filter_map(|x| {\n                        if let crate::mkeymap::KeyType::Position(n) = x {\n                            Some(*n)\n                        } else {\n                            None\n                        }\n                    })\n                    .max()\n                    .unwrap_or(0);\n                let is_trailing_var_arg_set = self.is_trailing_var_arg_set();\n                let is_allow_hyphen_values_set = self.is_allow_hyphen_values_set();\n                let is_allow_negative_numbers_set = self.is_allow_negative_numbers_set();\n                for arg in self.args.args_mut() {\n                    if is_allow_hyphen_values_set && arg.is_takes_value_set() {\n                        arg.settings.set(ArgSettings::AllowHyphenValues);\n                    }\n                    if is_allow_negative_numbers_set && arg.is_takes_value_set() {\n                        arg.settings.set(ArgSettings::AllowNegativeNumbers);\n                    }\n                    if is_trailing_var_arg_set && arg.get_index() == Some(highest_idx) {\n                        arg.settings.set(ArgSettings::TrailingVarArg);\n                    }\n                }\n            }\n\n            #[cfg(debug_assertions)]\n            assert_app(self);\n            self.settings.set(AppSettings::Built);\n        } else {\n            debug!(\"Command::_build: already built\");\n        }\n    }\n\n    pub(crate) fn _build_subcommand(&mut self, name: &str) -> Option<&mut Self> {\n        use std::fmt::Write;\n\n        let mut mid_string = String::from(\" \");\n        #[cfg(feature = \"usage\")]\n        if !self.is_subcommand_negates_reqs_set() && !self.is_args_conflicts_with_subcommands_set()\n        {\n            let reqs = Usage::new(self).get_required_usage_from(&[], None, true); // maybe Some(m)\n\n            for s in &reqs {\n                mid_string.push_str(&s.to_string());\n                mid_string.push(' ');\n            }\n        }\n        let is_multicall_set = self.is_multicall_set();\n\n        let sc = some!(self.subcommands.iter_mut().find(|s| s.name == name));\n\n        // Display subcommand name, short and long in usage\n        let mut sc_names = String::new();\n        sc_names.push_str(sc.name.as_str());\n        let mut flag_subcmd = false;\n        if let Some(l) = sc.get_long_flag() {\n            write!(sc_names, \"|--{l}\").unwrap();\n            flag_subcmd = true;\n        }\n        if let Some(s) = sc.get_short_flag() {\n            write!(sc_names, \"|-{s}\").unwrap();\n            flag_subcmd = true;\n        }\n\n        if flag_subcmd {\n            sc_names = format!(\"{{{sc_names}}}\");\n        }\n\n        let usage_name = self\n            .bin_name\n            .as_ref()\n            .map(|bin_name| format!(\"{bin_name}{mid_string}{sc_names}\"))\n            .unwrap_or(sc_names);\n        sc.usage_name = Some(usage_name);\n\n        // bin_name should be parent's bin_name + [<reqs>] + the sc's name separated by\n        // a space\n        let bin_name = format!(\n            \"{}{}{}\",\n            self.bin_name.as_deref().unwrap_or_default(),\n            if self.bin_name.is_some() { \" \" } else { \"\" },\n            &*sc.name\n        );\n        debug!(\n            \"Command::_build_subcommand Setting bin_name of {} to {:?}\",\n            sc.name, bin_name\n        );\n        sc.bin_name = Some(bin_name);\n\n        if sc.display_name.is_none() {\n            let self_display_name = if is_multicall_set {\n                self.display_name.as_deref().unwrap_or(\"\")\n            } else {\n                self.display_name.as_deref().unwrap_or(&self.name)\n            };\n            let display_name = format!(\n                \"{}{}{}\",\n                self_display_name,\n                if !self_display_name.is_empty() {\n                    \"-\"\n                } else {\n                    \"\"\n                },\n                &*sc.name\n            );\n            debug!(\n                \"Command::_build_subcommand Setting display_name of {} to {:?}\",\n                sc.name, display_name\n            );\n            sc.display_name = Some(display_name);\n        }\n\n        // Ensure all args are built and ready to parse\n        sc._build_self(false);\n\n        Some(sc)\n    }\n\n    fn _build_bin_names_internal(&mut self) {\n        debug!(\"Command::_build_bin_names\");\n\n        if !self.is_set(AppSettings::BinNameBuilt) {\n            let mut mid_string = String::from(\" \");\n            #[cfg(feature = \"usage\")]\n            if !self.is_subcommand_negates_reqs_set()\n                && !self.is_args_conflicts_with_subcommands_set()\n            {\n                let reqs = Usage::new(self).get_required_usage_from(&[], None, true); // maybe Some(m)\n\n                for s in &reqs {\n                    mid_string.push_str(&s.to_string());\n                    mid_string.push(' ');\n                }\n            }\n            let is_multicall_set = self.is_multicall_set();\n\n            let self_bin_name = if is_multicall_set {\n                self.bin_name.as_deref().unwrap_or(\"\")\n            } else {\n                self.bin_name.as_deref().unwrap_or(&self.name)\n            }\n            .to_owned();\n\n            for sc in &mut self.subcommands {\n                debug!(\"Command::_build_bin_names:iter: bin_name set...\");\n\n                if sc.usage_name.is_none() {\n                    use std::fmt::Write;\n                    // Display subcommand name, short and long in usage\n                    let mut sc_names = String::new();\n                    sc_names.push_str(sc.name.as_str());\n                    let mut flag_subcmd = false;\n                    if let Some(l) = sc.get_long_flag() {\n                        write!(sc_names, \"|--{l}\").unwrap();\n                        flag_subcmd = true;\n                    }\n                    if let Some(s) = sc.get_short_flag() {\n                        write!(sc_names, \"|-{s}\").unwrap();\n                        flag_subcmd = true;\n                    }\n\n                    if flag_subcmd {\n                        sc_names = format!(\"{{{sc_names}}}\");\n                    }\n\n                    let usage_name = format!(\"{self_bin_name}{mid_string}{sc_names}\");\n                    debug!(\n                        \"Command::_build_bin_names:iter: Setting usage_name of {} to {:?}\",\n                        sc.name, usage_name\n                    );\n                    sc.usage_name = Some(usage_name);\n                } else {\n                    debug!(\n                        \"Command::_build_bin_names::iter: Using existing usage_name of {} ({:?})\",\n                        sc.name, sc.usage_name\n                    );\n                }\n\n                if sc.bin_name.is_none() {\n                    let bin_name = format!(\n                        \"{}{}{}\",\n                        self_bin_name,\n                        if !self_bin_name.is_empty() { \" \" } else { \"\" },\n                        &*sc.name\n                    );\n                    debug!(\n                        \"Command::_build_bin_names:iter: Setting bin_name of {} to {:?}\",\n                        sc.name, bin_name\n                    );\n                    sc.bin_name = Some(bin_name);\n                } else {\n                    debug!(\n                        \"Command::_build_bin_names::iter: Using existing bin_name of {} ({:?})\",\n                        sc.name, sc.bin_name\n                    );\n                }\n\n                if sc.display_name.is_none() {\n                    let self_display_name = if is_multicall_set {\n                        self.display_name.as_deref().unwrap_or(\"\")\n                    } else {\n                        self.display_name.as_deref().unwrap_or(&self.name)\n                    };\n                    let display_name = format!(\n                        \"{}{}{}\",\n                        self_display_name,\n                        if !self_display_name.is_empty() {\n                            \"-\"\n                        } else {\n                            \"\"\n                        },\n                        &*sc.name\n                    );\n                    debug!(\n                        \"Command::_build_bin_names:iter: Setting display_name of {} to {:?}\",\n                        sc.name, display_name\n                    );\n                    sc.display_name = Some(display_name);\n                } else {\n                    debug!(\n                        \"Command::_build_bin_names::iter: Using existing display_name of {} ({:?})\",\n                        sc.name, sc.display_name\n                    );\n                }\n\n                sc._build_bin_names_internal();\n            }\n            self.set(AppSettings::BinNameBuilt);\n        } else {\n            debug!(\"Command::_build_bin_names: already built\");\n        }\n    }\n\n    pub(crate) fn _panic_on_missing_help(&self, help_required_globally: bool) {\n        if self.is_set(AppSettings::HelpExpected) || help_required_globally {\n            let args_missing_help: Vec<Id> = self\n                .args\n                .args()\n                .filter(|arg| arg.get_help().is_none() && arg.get_long_help().is_none())\n                .map(|arg| arg.get_id().clone())\n                .collect();\n\n            debug_assert!(\n                args_missing_help.is_empty(),\n                \"Command::help_expected is enabled for the Command {}, but at least one of its arguments does not have either `help` or `long_help` set. List of such arguments: {}\",\n                self.name,\n                args_missing_help.join(\", \")\n            );\n        }\n\n        for sub_app in &self.subcommands {\n            sub_app._panic_on_missing_help(help_required_globally);\n        }\n    }\n\n    /// Returns the first two arguments that match the condition.\n    ///\n    /// If fewer than two arguments that match the condition, `None` is returned.\n    #[cfg(debug_assertions)]\n    pub(crate) fn two_args_of<F>(&self, condition: F) -> Option<(&Arg, &Arg)>\n    where\n        F: Fn(&Arg) -> bool,\n    {\n        two_elements_of(self.args.args().filter(|a: &&Arg| condition(a)))\n    }\n\n    /// Returns the first two groups that match the condition.\n    ///\n    /// If fewer than two groups that match the condition, `None` is returned.\n    #[allow(unused)]\n    fn two_groups_of<F>(&self, condition: F) -> Option<(&ArgGroup, &ArgGroup)>\n    where\n        F: Fn(&ArgGroup) -> bool,\n    {\n        two_elements_of(self.groups.iter().filter(|a| condition(a)))\n    }\n\n    /// Propagate global args\n    pub(crate) fn _propagate_global_args(&mut self) {\n        debug!(\"Command::_propagate_global_args:{}\", self.name);\n\n        let autogenerated_help_subcommand = !self.is_disable_help_subcommand_set();\n\n        for sc in &mut self.subcommands {\n            if sc.get_name() == \"help\" && autogenerated_help_subcommand {\n                // Avoid propagating args to the autogenerated help subtrees used in completion.\n                // This prevents args from showing up during help completions like\n                // `myapp help subcmd <TAB>`, which should only suggest subcommands and not args,\n                // while still allowing args to show up properly on the generated help message.\n                continue;\n            }\n\n            for a in self.args.args().filter(|a| a.is_global_set()) {\n                if sc.find(&a.id).is_some() {\n                    debug!(\n                        \"Command::_propagate skipping {:?} to {}, already exists\",\n                        a.id,\n                        sc.get_name(),\n                    );\n                    continue;\n                }\n\n                debug!(\n                    \"Command::_propagate pushing {:?} to {}\",\n                    a.id,\n                    sc.get_name(),\n                );\n                sc.args.push(a.clone());\n            }\n        }\n    }\n\n    /// Propagate settings\n    pub(crate) fn _propagate(&mut self) {\n        debug!(\"Command::_propagate:{}\", self.name);\n        let mut subcommands = std::mem::take(&mut self.subcommands);\n        for sc in &mut subcommands {\n            self._propagate_subcommand(sc);\n        }\n        self.subcommands = subcommands;\n    }\n\n    fn _propagate_subcommand(&self, sc: &mut Self) {\n        // We have to create a new scope in order to tell rustc the borrow of `sc` is\n        // done and to recursively call this method\n        {\n            if self.settings.is_set(AppSettings::PropagateVersion) {\n                if let Some(version) = self.version.as_ref() {\n                    sc.version.get_or_insert_with(|| version.clone());\n                }\n                if let Some(long_version) = self.long_version.as_ref() {\n                    sc.long_version.get_or_insert_with(|| long_version.clone());\n                }\n            }\n\n            sc.settings = sc.settings | self.g_settings;\n            sc.g_settings = sc.g_settings | self.g_settings;\n            sc.app_ext.update(&self.app_ext);\n        }\n    }\n\n    pub(crate) fn _check_help_and_version(&mut self, expand_help_tree: bool) {\n        debug!(\n            \"Command::_check_help_and_version:{} expand_help_tree={}\",\n            self.name, expand_help_tree\n        );\n\n        self.long_help_exists = self.long_help_exists_();\n\n        if !self.is_disable_help_flag_set() {\n            debug!(\"Command::_check_help_and_version: Building default --help\");\n            let mut arg = Arg::new(Id::HELP)\n                .short('h')\n                .long(\"help\")\n                .action(ArgAction::Help);\n            if self.long_help_exists {\n                arg = arg\n                    .help(\"Print help (see more with '--help')\")\n                    .long_help(\"Print help (see a summary with '-h')\");\n            } else {\n                arg = arg.help(\"Print help\");\n            }\n            // Avoiding `arg_internal` to not be sensitive to `next_help_heading` /\n            // `next_display_order`\n            self.args.push(arg);\n        }\n        if !self.is_disable_version_flag_set() {\n            debug!(\"Command::_check_help_and_version: Building default --version\");\n            let arg = Arg::new(Id::VERSION)\n                .short('V')\n                .long(\"version\")\n                .action(ArgAction::Version)\n                .help(\"Print version\");\n            // Avoiding `arg_internal` to not be sensitive to `next_help_heading` /\n            // `next_display_order`\n            self.args.push(arg);\n        }\n\n        if !self.is_set(AppSettings::DisableHelpSubcommand) {\n            debug!(\"Command::_check_help_and_version: Building help subcommand\");\n            let help_about = \"Print this message or the help of the given subcommand(s)\";\n\n            let mut help_subcmd = if expand_help_tree {\n                // Slow code path to recursively clone all other subcommand subtrees under help\n                let help_subcmd = Command::new(\"help\")\n                    .about(help_about)\n                    .global_setting(AppSettings::DisableHelpSubcommand)\n                    .subcommands(self.get_subcommands().map(Command::_copy_subtree_for_help));\n\n                let mut help_help_subcmd = Command::new(\"help\").about(help_about);\n                help_help_subcmd.version = None;\n                help_help_subcmd.long_version = None;\n                help_help_subcmd = help_help_subcmd\n                    .setting(AppSettings::DisableHelpFlag)\n                    .setting(AppSettings::DisableVersionFlag);\n\n                help_subcmd.subcommand(help_help_subcmd)\n            } else {\n                Command::new(\"help\").about(help_about).arg(\n                    Arg::new(\"subcommand\")\n                        .action(ArgAction::Append)\n                        .num_args(..)\n                        .value_name(\"COMMAND\")\n                        .help(\"Print help for the subcommand(s)\"),\n                )\n            };\n            self._propagate_subcommand(&mut help_subcmd);\n\n            // The parser acts like this is set, so let's set it so we don't falsely\n            // advertise it to the user\n            help_subcmd.version = None;\n            help_subcmd.long_version = None;\n            help_subcmd = help_subcmd\n                .setting(AppSettings::DisableHelpFlag)\n                .setting(AppSettings::DisableVersionFlag)\n                .unset_global_setting(AppSettings::PropagateVersion);\n\n            self.subcommands.push(help_subcmd);\n        }\n    }\n\n    fn _copy_subtree_for_help(&self) -> Command {\n        let mut cmd = Command::new(self.name.clone())\n            .hide(self.is_hide_set())\n            .global_setting(AppSettings::DisableHelpFlag)\n            .global_setting(AppSettings::DisableVersionFlag)\n            .subcommands(self.get_subcommands().map(Command::_copy_subtree_for_help));\n        if self.get_about().is_some() {\n            cmd = cmd.about(self.get_about().unwrap().clone());\n        }\n        cmd\n    }\n\n    pub(crate) fn _render_version(&self, use_long: bool) -> String {\n        debug!(\"Command::_render_version\");\n\n        let ver = if use_long {\n            self.long_version\n                .as_deref()\n                .or(self.version.as_deref())\n                .unwrap_or_default()\n        } else {\n            self.version\n                .as_deref()\n                .or(self.long_version.as_deref())\n                .unwrap_or_default()\n        };\n        let display_name = self.get_display_name().unwrap_or_else(|| self.get_name());\n        format!(\"{display_name} {ver}\\n\")\n    }\n\n    pub(crate) fn format_group(&self, g: &Id) -> StyledStr {\n        use std::fmt::Write as _;\n\n        let g_string = self\n            .unroll_args_in_group(g)\n            .iter()\n            .filter_map(|x| self.find(x))\n            .map(|x| {\n                if x.is_positional() {\n                    // Print val_name for positional arguments. e.g. <file_name>\n                    x.name_no_brackets()\n                } else {\n                    // Print usage string for flags arguments, e.g. <--help>\n                    x.to_string()\n                }\n            })\n            .collect::<Vec<_>>()\n            .join(\"|\");\n        let placeholder = self.get_styles().get_placeholder();\n        let mut styled = StyledStr::new();\n        write!(&mut styled, \"{placeholder}<{g_string}>{placeholder:#}\").unwrap();\n        styled\n    }\n}\n\n/// A workaround:\n/// <https://github.com/rust-lang/rust/issues/34511#issuecomment-373423999>\npub(crate) trait Captures<'a> {}\nimpl<T> Captures<'_> for T {}\n\n// Internal Query Methods\nimpl Command {\n    /// Iterate through the *flags* & *options* arguments.\n    #[cfg(any(feature = \"usage\", feature = \"help\"))]\n    pub(crate) fn get_non_positionals(&self) -> impl Iterator<Item = &Arg> {\n        self.get_arguments().filter(|a| !a.is_positional())\n    }\n\n    pub(crate) fn find(&self, arg_id: &Id) -> Option<&Arg> {\n        self.args.args().find(|a| a.get_id() == arg_id)\n    }\n\n    #[inline]\n    pub(crate) fn contains_short(&self, s: char) -> bool {\n        debug_assert!(\n            self.is_set(AppSettings::Built),\n            \"If Command::_build hasn't been called, manually search through Arg shorts\"\n        );\n\n        self.args.contains(s)\n    }\n\n    #[inline]\n    pub(crate) fn set(&mut self, s: AppSettings) {\n        self.settings.set(s);\n    }\n\n    #[inline]\n    pub(crate) fn has_positionals(&self) -> bool {\n        self.get_positionals().next().is_some()\n    }\n\n    #[cfg(any(feature = \"usage\", feature = \"help\"))]\n    pub(crate) fn has_visible_subcommands(&self) -> bool {\n        self.subcommands\n            .iter()\n            .any(|sc| sc.name != \"help\" && !sc.is_set(AppSettings::Hidden))\n    }\n\n    /// Check if this subcommand can be referred to as `name`. In other words,\n    /// check if `name` is the name of this subcommand or is one of its aliases.\n    #[inline]\n    pub(crate) fn aliases_to(&self, name: impl AsRef<std::ffi::OsStr>) -> bool {\n        let name = name.as_ref();\n        self.get_name() == name || self.get_all_aliases().any(|alias| alias == name)\n    }\n\n    /// Check if this subcommand can be referred to as `name`. In other words,\n    /// check if `name` is the name of this short flag subcommand or is one of its short flag aliases.\n    #[inline]\n    pub(crate) fn short_flag_aliases_to(&self, flag: char) -> bool {\n        Some(flag) == self.short_flag\n            || self.get_all_short_flag_aliases().any(|alias| flag == alias)\n    }\n\n    /// Check if this subcommand can be referred to as `name`. In other words,\n    /// check if `name` is the name of this long flag subcommand or is one of its long flag aliases.\n    #[inline]\n    pub(crate) fn long_flag_aliases_to(&self, flag: &str) -> bool {\n        match self.long_flag.as_ref() {\n            Some(long_flag) => {\n                long_flag == flag || self.get_all_long_flag_aliases().any(|alias| alias == flag)\n            }\n            None => self.get_all_long_flag_aliases().any(|alias| alias == flag),\n        }\n    }\n\n    /// Checks if there is an argument or group with the given id.\n    #[cfg(debug_assertions)]\n    pub(crate) fn id_exists(&self, id: &Id) -> bool {\n        self.args.args().any(|x| x.get_id() == id) || self.groups.iter().any(|x| x.id == *id)\n    }\n\n    /// Iterate through the groups this arg is member of.\n    pub(crate) fn groups_for_arg<'a>(&'a self, arg: &Id) -> impl Iterator<Item = Id> + 'a {\n        debug!(\"Command::groups_for_arg: id={arg:?}\");\n        let arg = arg.clone();\n        self.groups\n            .iter()\n            .filter(move |grp| grp.args.iter().any(|a| a == &arg))\n            .map(|grp| grp.id.clone())\n    }\n\n    pub(crate) fn find_group(&self, group_id: &Id) -> Option<&ArgGroup> {\n        self.groups.iter().find(|g| g.id == *group_id)\n    }\n\n    /// Iterate through all the names of all subcommands (not recursively), including aliases.\n    /// Used for suggestions.\n    pub(crate) fn all_subcommand_names(&self) -> impl Iterator<Item = &str> + Captures<'_> {\n        self.get_subcommands().flat_map(|sc| {\n            let name = sc.get_name();\n            let aliases = sc.get_all_aliases();\n            std::iter::once(name).chain(aliases)\n        })\n    }\n\n    pub(crate) fn required_graph(&self) -> ChildGraph<Id> {\n        let mut reqs = ChildGraph::with_capacity(5);\n        for a in self.args.args().filter(|a| a.is_required_set()) {\n            reqs.insert(a.get_id().clone());\n        }\n        for group in &self.groups {\n            if group.required {\n                let idx = reqs.insert(group.id.clone());\n                for a in &group.requires {\n                    reqs.insert_child(idx, a.clone());\n                }\n            }\n        }\n\n        reqs\n    }\n\n    pub(crate) fn unroll_args_in_group(&self, group: &Id) -> Vec<Id> {\n        debug!(\"Command::unroll_args_in_group: group={group:?}\");\n        let mut g_vec = vec![group];\n        let mut args = vec![];\n\n        while let Some(g) = g_vec.pop() {\n            for n in self\n                .groups\n                .iter()\n                .find(|grp| grp.id == *g)\n                .expect(INTERNAL_ERROR_MSG)\n                .args\n                .iter()\n            {\n                debug!(\"Command::unroll_args_in_group:iter: entity={n:?}\");\n                if !args.contains(n) {\n                    if self.find(n).is_some() {\n                        debug!(\"Command::unroll_args_in_group:iter: this is an arg\");\n                        args.push(n.clone());\n                    } else {\n                        debug!(\"Command::unroll_args_in_group:iter: this is a group\");\n                        g_vec.push(n);\n                    }\n                }\n            }\n        }\n\n        args\n    }\n\n    pub(crate) fn unroll_arg_requires<F>(&self, func: F, arg: &Id) -> Vec<Id>\n    where\n        F: Fn(&(ArgPredicate, Id)) -> Option<Id>,\n    {\n        let mut processed = vec![];\n        let mut r_vec = vec![arg];\n        let mut args = vec![];\n\n        while let Some(a) = r_vec.pop() {\n            if processed.contains(&a) {\n                continue;\n            }\n\n            processed.push(a);\n\n            if let Some(arg) = self.find(a) {\n                for r in arg.requires.iter().filter_map(&func) {\n                    if let Some(req) = self.find(&r) {\n                        if !req.requires.is_empty() {\n                            r_vec.push(req.get_id());\n                        }\n                    }\n                    args.push(r);\n                }\n            }\n        }\n\n        args\n    }\n\n    /// Find a flag subcommand name by short flag or an alias\n    pub(crate) fn find_short_subcmd(&self, c: char) -> Option<&str> {\n        self.get_subcommands()\n            .find(|sc| sc.short_flag_aliases_to(c))\n            .map(|sc| sc.get_name())\n    }\n\n    /// Find a flag subcommand name by long flag or an alias\n    pub(crate) fn find_long_subcmd(&self, long: &str) -> Option<&str> {\n        self.get_subcommands()\n            .find(|sc| sc.long_flag_aliases_to(long))\n            .map(|sc| sc.get_name())\n    }\n\n    pub(crate) fn write_help_err(&self, mut use_long: bool) -> StyledStr {\n        debug!(\n            \"Command::write_help_err: {}, use_long={:?}\",\n            self.get_display_name().unwrap_or_else(|| self.get_name()),\n            use_long && self.long_help_exists(),\n        );\n\n        use_long = use_long && self.long_help_exists();\n        let usage = Usage::new(self);\n\n        let mut styled = StyledStr::new();\n        write_help(&mut styled, self, &usage, use_long);\n\n        styled\n    }\n\n    pub(crate) fn write_version_err(&self, use_long: bool) -> StyledStr {\n        let msg = self._render_version(use_long);\n        StyledStr::from(msg)\n    }\n\n    pub(crate) fn long_help_exists(&self) -> bool {\n        debug!(\"Command::long_help_exists: {}\", self.long_help_exists);\n        self.long_help_exists\n    }\n\n    fn long_help_exists_(&self) -> bool {\n        debug!(\"Command::long_help_exists\");\n        // In this case, both must be checked. This allows the retention of\n        // original formatting, but also ensures that the actual -h or --help\n        // specified by the user is sent through. If hide_short_help is not included,\n        // then items specified with hidden_short_help will also be hidden.\n        let should_long = |v: &Arg| {\n            !v.is_hide_set()\n                && (v.get_long_help().is_some()\n                    || v.is_hide_long_help_set()\n                    || v.is_hide_short_help_set()\n                    || (!v.is_hide_possible_values_set()\n                        && v.get_possible_values()\n                            .iter()\n                            .any(PossibleValue::should_show_help)))\n        };\n\n        // Subcommands aren't checked because we prefer short help for them, deferring to\n        // `cmd subcmd --help` for more.\n        self.get_long_about().is_some()\n            || self.get_before_long_help().is_some()\n            || self.get_after_long_help().is_some()\n            || self.get_arguments().any(should_long)\n    }\n\n    // Should we color the help?\n    pub(crate) fn color_help(&self) -> ColorChoice {\n        #[cfg(feature = \"color\")]\n        if self.is_disable_colored_help_set() {\n            return ColorChoice::Never;\n        }\n\n        self.get_color()\n    }\n}\n\nimpl Default for Command {\n    fn default() -> Self {\n        Self {\n            name: Default::default(),\n            long_flag: Default::default(),\n            short_flag: Default::default(),\n            display_name: Default::default(),\n            bin_name: Default::default(),\n            author: Default::default(),\n            version: Default::default(),\n            long_version: Default::default(),\n            about: Default::default(),\n            long_about: Default::default(),\n            before_help: Default::default(),\n            before_long_help: Default::default(),\n            after_help: Default::default(),\n            after_long_help: Default::default(),\n            aliases: Default::default(),\n            short_flag_aliases: Default::default(),\n            long_flag_aliases: Default::default(),\n            usage_str: Default::default(),\n            usage_name: Default::default(),\n            help_str: Default::default(),\n            disp_ord: Default::default(),\n            #[cfg(feature = \"help\")]\n            template: Default::default(),\n            settings: Default::default(),\n            g_settings: Default::default(),\n            args: Default::default(),\n            subcommands: Default::default(),\n            groups: Default::default(),\n            current_help_heading: Default::default(),\n            current_disp_ord: Some(0),\n            subcommand_value_name: Default::default(),\n            subcommand_heading: Default::default(),\n            external_value_parser: Default::default(),\n            long_help_exists: false,\n            deferred: None,\n            #[cfg(feature = \"unstable-ext\")]\n            ext: Default::default(),\n            app_ext: Default::default(),\n        }\n    }\n}\n\nimpl Index<&'_ Id> for Command {\n    type Output = Arg;\n\n    fn index(&self, key: &Id) -> &Self::Output {\n        self.find(key).expect(INTERNAL_ERROR_MSG)\n    }\n}\n\nimpl From<&'_ Command> for Command {\n    fn from(cmd: &'_ Command) -> Self {\n        cmd.clone()\n    }\n}\n\nimpl fmt::Display for Command {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.name)\n    }\n}\n\n/// User-provided data that can be attached to an [`Arg`]\n#[cfg(feature = \"unstable-ext\")]\npub trait CommandExt: Extension {}\n\n#[allow(dead_code)] // atm dependent on features enabled\npub(crate) trait AppExt: Extension {}\n\n#[allow(dead_code)] // atm dependent on features enabled\n#[derive(Default, Copy, Clone, Debug)]\nstruct TermWidth(usize);\n\nimpl AppExt for TermWidth {}\n\n#[allow(dead_code)] // atm dependent on features enabled\n#[derive(Default, Copy, Clone, Debug)]\nstruct MaxTermWidth(usize);\n\nimpl AppExt for MaxTermWidth {}\n\n/// Returns the first two elements of an iterator as an `Option<(T, T)>`.\n///\n/// If the iterator has fewer than two elements, it returns `None`.\nfn two_elements_of<I, T>(mut iter: I) -> Option<(T, T)>\nwhere\n    I: Iterator<Item = T>,\n{\n    let first = iter.next();\n    let second = iter.next();\n\n    match (first, second) {\n        (Some(first), Some(second)) => Some((first, second)),\n        _ => None,\n    }\n}\n\n#[test]\nfn check_auto_traits() {\n    static_assertions::assert_impl_all!(Command: Send, Sync, Unpin);\n}\n"
  },
  {
    "path": "clap_builder/src/builder/debug_asserts.rs",
    "content": "use std::cmp::Ordering;\n\nuse crate::ArgAction;\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::builder::ValueRange;\nuse crate::mkeymap::KeyType;\nuse crate::util::FlatSet;\nuse crate::util::Id;\nuse crate::{Arg, Command, ValueHint};\n\npub(crate) fn assert_app(cmd: &Command) {\n    debug!(\"Command::_debug_asserts\");\n\n    let mut short_flags = vec![];\n    let mut long_flags = vec![];\n\n    // Invalid version flag settings\n    if cmd.get_version().is_none() && cmd.get_long_version().is_none() {\n        // PropagateVersion is meaningless if there is no version\n        assert!(\n            !cmd.is_propagate_version_set(),\n            \"Command {}: No version information via Command::version or Command::long_version to propagate\",\n            cmd.get_name(),\n        );\n\n        // Used `Command::mut_arg(\"version\", ..) but did not provide any version information to display\n        let version_needed = cmd\n            .get_arguments()\n            .filter(|x| matches!(x.get_action(), ArgAction::Version))\n            .map(|x| x.get_id())\n            .collect::<Vec<_>>();\n\n        assert_eq!(\n            version_needed,\n            Vec::<&str>::new(),\n            \"Command {}: `ArgAction::Version` used without providing Command::version or Command::long_version\",\n            cmd.get_name()\n        );\n    }\n\n    for sc in cmd.get_subcommands() {\n        if let Some(s) = sc.get_short_flag().as_ref() {\n            short_flags.push(Flag::Command(format!(\"-{s}\"), sc.get_name()));\n        }\n\n        for short_alias in sc.get_all_short_flag_aliases() {\n            short_flags.push(Flag::Command(format!(\"-{short_alias}\"), sc.get_name()));\n        }\n\n        if let Some(l) = sc.get_long_flag().as_ref() {\n            assert!(\n                !l.starts_with('-'),\n                \"Command {}: long_flag {:?} must not start with a `-`, that will be handled by the parser\",\n                sc.get_name(),\n                l\n            );\n            long_flags.push(Flag::Command(format!(\"--{l}\"), sc.get_name()));\n        }\n\n        for long_alias in sc.get_all_long_flag_aliases() {\n            long_flags.push(Flag::Command(format!(\"--{long_alias}\"), sc.get_name()));\n        }\n    }\n\n    for arg in cmd.get_arguments() {\n        assert_arg(arg);\n\n        assert!(\n            !cmd.is_multicall_set(),\n            \"Command {}: Arguments like {} cannot be set on a multicall command\",\n            cmd.get_name(),\n            arg.get_id()\n        );\n\n        if let Some(s) = arg.get_short() {\n            short_flags.push(Flag::Arg(format!(\"-{s}\"), arg.get_id().as_str()));\n        }\n\n        for (short_alias, _) in &arg.short_aliases {\n            short_flags.push(Flag::Arg(format!(\"-{short_alias}\"), arg.get_id().as_str()));\n        }\n\n        if let Some(l) = arg.get_long() {\n            assert!(\n                !l.starts_with('-'),\n                \"Argument {}: long {:?} must not start with a `-`, that will be handled by the parser\",\n                arg.get_id(),\n                l\n            );\n            long_flags.push(Flag::Arg(format!(\"--{l}\"), arg.get_id().as_str()));\n        }\n\n        for (long_alias, _) in &arg.aliases {\n            long_flags.push(Flag::Arg(format!(\"--{long_alias}\"), arg.get_id().as_str()));\n        }\n\n        // Name conflicts\n        if let Some((first, second)) = cmd.two_args_of(|x| x.get_id() == arg.get_id()) {\n            panic!(\n                \"Command {}: Argument names must be unique, but '{}' is in use by more than one argument or group{}\",\n                cmd.get_name(),\n                arg.get_id(),\n                duplicate_tip(cmd, first, second),\n            );\n        }\n\n        // Long conflicts\n        if let Some(l) = arg.get_long() {\n            if let Some((first, second)) = cmd.two_args_of(|x| x.get_long() == Some(l)) {\n                panic!(\n                    \"Command {}: Long option names must be unique for each argument, \\\n                            but '--{}' is in use by both '{}' and '{}'{}\",\n                    cmd.get_name(),\n                    l,\n                    first.get_id(),\n                    second.get_id(),\n                    duplicate_tip(cmd, first, second)\n                )\n            }\n        }\n\n        // Short conflicts\n        if let Some(s) = arg.get_short() {\n            if let Some((first, second)) = cmd.two_args_of(|x| x.get_short() == Some(s)) {\n                panic!(\n                    \"Command {}: Short option names must be unique for each argument, \\\n                            but '-{}' is in use by both '{}' and '{}'{}\",\n                    cmd.get_name(),\n                    s,\n                    first.get_id(),\n                    second.get_id(),\n                    duplicate_tip(cmd, first, second),\n                )\n            }\n        }\n\n        // Index conflicts\n        if let Some(idx) = arg.index {\n            if let Some((first, second)) =\n                cmd.two_args_of(|x| x.is_positional() && x.get_index() == Some(idx))\n            {\n                panic!(\n                    \"Command {}: Argument '{}' has the same index as '{}' \\\n                    and they are both positional arguments\\n\\n\\t \\\n                    Use `Arg::num_args(1..)` to allow one \\\n                    positional argument to take multiple values\",\n                    cmd.get_name(),\n                    first.get_id(),\n                    second.get_id()\n                )\n            }\n        }\n\n        // requires, r_if, r_unless\n        for (_predicate, req_id) in &arg.requires {\n            assert!(\n                &arg.id != req_id,\n                \"Argument {} cannot require itself\",\n                arg.get_id()\n            );\n\n            assert!(\n                cmd.id_exists(req_id),\n                \"Command {}: Argument or group '{}' specified in 'requires*' for '{}' does not exist\",\n                cmd.get_name(),\n                req_id,\n                arg.get_id(),\n            );\n        }\n\n        for req in &arg.r_ifs {\n            assert!(\n                !arg.is_required_set(),\n                \"Argument {}: `required` conflicts with `required_if_eq*`\",\n                arg.get_id()\n            );\n            assert!(\n                cmd.id_exists(&req.0),\n                \"Command {}: Argument or group '{}' specified in 'required_if_eq*' for '{}' does not exist\",\n                cmd.get_name(),\n                req.0,\n                arg.get_id()\n            );\n        }\n\n        for req in &arg.r_ifs_all {\n            assert!(\n                !arg.is_required_set(),\n                \"Argument {}: `required` conflicts with `required_if_eq_all`\",\n                arg.get_id()\n            );\n            assert!(\n                cmd.id_exists(&req.0),\n                \"Command {}: Argument or group '{}' specified in 'required_if_eq_all' for '{}' does not exist\",\n                cmd.get_name(),\n                req.0,\n                arg.get_id()\n            );\n        }\n\n        for req in &arg.r_unless {\n            assert!(\n                !arg.is_required_set(),\n                \"Argument {}: `required` conflicts with `required_unless*`\",\n                arg.get_id()\n            );\n            assert!(\n                cmd.id_exists(req),\n                \"Command {}: Argument or group '{}' specified in 'required_unless*' for '{}' does not exist\",\n                cmd.get_name(),\n                req,\n                arg.get_id(),\n            );\n        }\n\n        for req in &arg.r_unless_all {\n            assert!(\n                !arg.is_required_set(),\n                \"Argument {}: `required` conflicts with `required_unless*`\",\n                arg.get_id()\n            );\n            assert!(\n                cmd.id_exists(req),\n                \"Command {}: Argument or group '{}' specified in 'required_unless*' for '{}' does not exist\",\n                cmd.get_name(),\n                req,\n                arg.get_id(),\n            );\n        }\n\n        // blacklist\n        for req in &arg.blacklist {\n            assert!(\n                cmd.id_exists(req),\n                \"Command {}: Argument or group '{}' specified in 'conflicts_with*' for '{}' does not exist\",\n                cmd.get_name(),\n                req,\n                arg.get_id(),\n            );\n        }\n\n        // overrides\n        for req in &arg.overrides {\n            assert!(\n                cmd.id_exists(req),\n                \"Command {}: Argument or group '{}' specified in 'overrides_with*' for '{}' does not exist\",\n                cmd.get_name(),\n                req,\n                arg.get_id(),\n            );\n        }\n\n        if arg.is_last_set() {\n            assert!(\n                arg.get_long().is_none(),\n                \"Command {}: Flags or Options cannot have last(true) set. '{}' has both a long and last(true) set.\",\n                cmd.get_name(),\n                arg.get_id()\n            );\n            assert!(\n                arg.get_short().is_none(),\n                \"Command {}: Flags or Options cannot have last(true) set. '{}' has both a short and last(true) set.\",\n                cmd.get_name(),\n                arg.get_id()\n            );\n        }\n\n        assert!(\n            !(arg.is_required_set() && arg.is_global_set()),\n            \"Command {}: Global arguments cannot be required.\\n\\n\\t'{}' is marked as both global and required\",\n            cmd.get_name(),\n            arg.get_id()\n        );\n\n        if arg.get_value_hint() == ValueHint::CommandWithArguments {\n            assert!(\n                arg.is_positional(),\n                \"Command {}: Argument '{}' has hint CommandWithArguments and must be positional.\",\n                cmd.get_name(),\n                arg.get_id()\n            );\n\n            assert!(\n                arg.is_trailing_var_arg_set() || arg.is_last_set(),\n                \"Command {}: Positional argument '{}' has hint CommandWithArguments, so Command must have `trailing_var_arg(true)` or `last(true)` set.\",\n                cmd.get_name(),\n                arg.get_id()\n            );\n        }\n    }\n\n    for group in cmd.get_groups() {\n        // Name conflicts\n        assert!(\n            cmd.get_groups().filter(|x| x.id == group.id).count() < 2,\n            \"Command {}: Argument group name must be unique\\n\\n\\t'{}' is already in use\",\n            cmd.get_name(),\n            group.get_id(),\n        );\n\n        // Groups should not have naming conflicts with Args\n        assert!(\n            !cmd.get_arguments().any(|x| x.get_id() == group.get_id()),\n            \"Command {}: Argument group name '{}' must not conflict with argument name\",\n            cmd.get_name(),\n            group.get_id(),\n        );\n\n        for arg in &group.args {\n            // Args listed inside groups should exist\n            assert!(\n                cmd.get_arguments().any(|x| x.get_id() == arg),\n                \"Command {}: Argument group '{}' contains non-existent argument '{}'\",\n                cmd.get_name(),\n                group.get_id(),\n                arg\n            );\n        }\n\n        for arg in &group.requires {\n            // Args listed inside groups should exist\n            assert!(\n                cmd.id_exists(arg),\n                \"Command {}: Argument group '{}' requires non-existent '{}' id\",\n                cmd.get_name(),\n                group.get_id(),\n                arg\n            );\n        }\n\n        for arg in &group.conflicts {\n            // Args listed inside groups should exist\n            assert!(\n                cmd.id_exists(arg),\n                \"Command {}: Argument group '{}' conflicts with non-existent '{}' id\",\n                cmd.get_name(),\n                group.get_id(),\n                arg\n            );\n        }\n    }\n\n    // Conflicts between flags and subcommands\n\n    long_flags.sort_unstable();\n    short_flags.sort_unstable();\n\n    detect_duplicate_flags(&long_flags, \"long\");\n    detect_duplicate_flags(&short_flags, \"short\");\n\n    let mut subs = FlatSet::new();\n    for sc in cmd.get_subcommands() {\n        assert!(\n            subs.insert(sc.get_name()),\n            \"Command {}: command name `{}` is duplicated\",\n            cmd.get_name(),\n            sc.get_name()\n        );\n        for alias in sc.get_all_aliases() {\n            assert!(\n                subs.insert(alias),\n                \"Command {}: command `{}` alias `{}` is duplicated\",\n                cmd.get_name(),\n                sc.get_name(),\n                alias\n            );\n        }\n    }\n\n    _verify_positionals(cmd);\n\n    #[cfg(feature = \"help\")]\n    if let Some(help_template) = cmd.get_help_template() {\n        assert!(\n            !help_template.to_string().contains(\"{flags}\"),\n            \"Command {}: {}\",\n            cmd.get_name(),\n            \"`{flags}` template variable was removed in clap3, they are now included in `{options}`\",\n        );\n        assert!(\n            !help_template.to_string().contains(\"{unified}\"),\n            \"Command {}: {}\",\n            cmd.get_name(),\n            \"`{unified}` template variable was removed in clap3, use `{options}` instead\"\n        );\n        #[cfg(feature = \"unstable-v5\")]\n        assert!(\n            !help_template.to_string().contains(\"{bin}\"),\n            \"Command {}: {}\",\n            cmd.get_name(),\n            \"`{bin}` template variable was removed in clap5, use `{name}` instead\"\n        );\n    }\n\n    cmd._panic_on_missing_help(cmd.is_help_expected_set());\n    assert_app_flags(cmd);\n}\n\nfn duplicate_tip(cmd: &Command, first: &Arg, second: &Arg) -> &'static str {\n    if !cmd.is_disable_help_flag_set()\n        && (first.get_id() == Id::HELP || second.get_id() == Id::HELP)\n    {\n        \" (call `cmd.disable_help_flag(true)` to remove the auto-generated `--help`)\"\n    } else if !cmd.is_disable_version_flag_set()\n        && (first.get_id() == Id::VERSION || second.get_id() == Id::VERSION)\n    {\n        \" (call `cmd.disable_version_flag(true)` to remove the auto-generated `--version`)\"\n    } else {\n        \"\"\n    }\n}\n\n#[derive(Eq)]\nenum Flag<'a> {\n    Command(String, &'a str),\n    Arg(String, &'a str),\n}\n\nimpl PartialEq for Flag<'_> {\n    fn eq(&self, other: &Flag<'_>) -> bool {\n        self.cmp(other) == Ordering::Equal\n    }\n}\n\nimpl PartialOrd for Flag<'_> {\n    fn partial_cmp(&self, other: &Flag<'_>) -> Option<Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nimpl Ord for Flag<'_> {\n    fn cmp(&self, other: &Self) -> Ordering {\n        match (self, other) {\n            (Flag::Command(s1, _), Flag::Command(s2, _))\n            | (Flag::Arg(s1, _), Flag::Arg(s2, _))\n            | (Flag::Command(s1, _), Flag::Arg(s2, _))\n            | (Flag::Arg(s1, _), Flag::Command(s2, _)) => {\n                if s1 == s2 {\n                    Ordering::Equal\n                } else {\n                    s1.cmp(s2)\n                }\n            }\n        }\n    }\n}\n\nfn detect_duplicate_flags(flags: &[Flag<'_>], short_or_long: &str) {\n    for (one, two) in find_duplicates(flags) {\n        match (one, two) {\n            (Flag::Command(flag, one), Flag::Command(_, another)) if one != another => panic!(\n                \"the '{flag}' {short_or_long} flag is specified for both '{one}' and '{another}' subcommands\"\n            ),\n\n            (Flag::Arg(flag, one), Flag::Arg(_, another)) if one != another => panic!(\n                \"{short_or_long} option names must be unique, but '{flag}' is in use by both '{one}' and '{another}'\"\n            ),\n\n            (Flag::Arg(flag, arg), Flag::Command(_, sub))\n            | (Flag::Command(flag, sub), Flag::Arg(_, arg)) => panic!(\n                \"the '{flag}' {short_or_long} flag for the '{arg}' argument conflicts with the short flag \\\n                     for '{sub}' subcommand\"\n            ),\n\n            _ => {}\n        }\n    }\n}\n\n/// Find duplicates in a sorted array.\n///\n/// The algorithm is simple: the array is sorted, duplicates\n/// must be placed next to each other, we can check only adjacent elements.\nfn find_duplicates<T: PartialEq>(slice: &[T]) -> impl Iterator<Item = (&T, &T)> {\n    slice.windows(2).filter_map(|w| {\n        if w[0] == w[1] {\n            Some((&w[0], &w[1]))\n        } else {\n            None\n        }\n    })\n}\n\nfn assert_app_flags(cmd: &Command) {\n    macro_rules! checker {\n        ($a:ident conflicts $($b:ident)|+) => {\n            if cmd.$a() {\n                let mut s = String::new();\n\n                $(\n                    if cmd.$b() {\n                        use std::fmt::Write;\n                        write!(&mut s, \"  AppSettings::{} conflicts with AppSettings::{}.\\n\", std::stringify!($b), std::stringify!($a)).unwrap();\n                    }\n                )+\n\n                if !s.is_empty() {\n                    panic!(\"{}\\n{}\", cmd.get_name(), s)\n                }\n            }\n        };\n    }\n\n    checker!(is_multicall_set conflicts is_no_binary_name_set);\n}\n\n#[cfg(debug_assertions)]\nfn _verify_positionals(cmd: &Command) -> bool {\n    debug!(\"Command::_verify_positionals\");\n    // Because you must wait until all arguments have been supplied, this is the first chance\n    // to make assertions on positional argument indexes\n    //\n    // First we verify that the index highest supplied index, is equal to the number of\n    // positional arguments to verify there are no gaps (i.e. supplying an index of 1 and 3\n    // but no 2)\n\n    let highest_idx = cmd\n        .get_keymap()\n        .keys()\n        .filter_map(|x| {\n            if let KeyType::Position(n) = x {\n                Some(*n)\n            } else {\n                None\n            }\n        })\n        .max()\n        .unwrap_or(0);\n\n    let num_p = cmd.get_keymap().keys().filter(|x| x.is_position()).count();\n\n    assert!(\n        highest_idx == num_p,\n        \"Found positional argument whose index is {highest_idx} but there \\\n             are only {num_p} positional arguments defined\",\n    );\n\n    for arg in cmd.get_arguments() {\n        if arg.index.unwrap_or(0) == highest_idx {\n            assert!(\n                !arg.is_trailing_var_arg_set() || !arg.is_last_set(),\n                \"{}:{}: `Arg::trailing_var_arg` and `Arg::last` cannot be used together\",\n                cmd.get_name(),\n                arg.get_id()\n            );\n\n            if arg.is_trailing_var_arg_set() {\n                assert!(\n                    arg.is_multiple(),\n                    \"{}:{}: `Arg::trailing_var_arg` must accept multiple values\",\n                    cmd.get_name(),\n                    arg.get_id()\n                );\n            }\n        } else {\n            assert!(\n                !arg.is_trailing_var_arg_set(),\n                \"{}:{}: `Arg::trailing_var_arg` can only apply to last positional\",\n                cmd.get_name(),\n                arg.get_id()\n            );\n        }\n    }\n\n    // Next we verify that only the highest index has takes multiple arguments (if any)\n    let only_highest = |a: &Arg| a.is_multiple() && (a.get_index().unwrap_or(0) != highest_idx);\n    if cmd.get_positionals().any(only_highest) {\n        // First we make sure if there is a positional that allows multiple values\n        // the one before it (second to last) has one of these:\n        //  * a value terminator\n        //  * ArgSettings::Last\n        //  * The last arg is Required\n\n        // We can't pass the closure (it.next()) to the macro directly because each call to\n        // find() (iterator, not macro) gets called repeatedly.\n        let last = &cmd.get_keymap()[&KeyType::Position(highest_idx)];\n        let second_to_last = &cmd.get_keymap()[&KeyType::Position(highest_idx - 1)];\n\n        // Either the final positional is required\n        // Or the second to last has a terminator or .last(true) set\n        let ok = last.is_required_set()\n            || (second_to_last.terminator.is_some() || second_to_last.is_last_set())\n            || last.is_last_set();\n        assert!(\n            ok,\n            \"Positional argument `{last}` *must* have `required(true)` or `last(true)` set \\\n            because a prior positional argument (`{second_to_last}`) has `num_args(1..)`\"\n        );\n\n        // We make sure if the second to last is Multiple the last is ArgSettings::Last\n        let ok = second_to_last.is_multiple() || last.is_last_set();\n        assert!(\n            ok,\n            \"Only the last positional argument, or second to last positional \\\n                 argument may be set to `.num_args(1..)`\"\n        );\n\n        // Next we check how many have both Multiple and not a specific number of values set\n        let count = cmd\n            .get_positionals()\n            .filter(|p| {\n                p.is_multiple_values_set()\n                    && p.get_value_terminator().is_none()\n                    && !p.get_num_args().expect(INTERNAL_ERROR_MSG).is_fixed()\n            })\n            .count();\n        let ok = count <= 1\n            || (last.is_last_set()\n                && last.is_multiple()\n                && second_to_last.is_multiple()\n                && count == 2);\n        assert!(\n            ok,\n            \"Only one positional argument with `.num_args(1..)` set is allowed per \\\n                 command, unless the second one also has .last(true) set\"\n        );\n    }\n\n    let mut found = false;\n\n    if cmd.is_allow_missing_positional_set() {\n        // Check that if a required positional argument is found, all positions with a lower\n        // index are also required.\n        let mut foundx2 = false;\n\n        for p in cmd.get_positionals() {\n            if foundx2 && !p.is_required_set() {\n                assert!(\n                    p.is_required_set(),\n                    \"Found non-required positional argument with a lower \\\n                         index than a required positional argument by two or more: {:?} \\\n                         index {:?}\",\n                    p.get_id(),\n                    p.get_index()\n                );\n            } else if p.is_required_set() && !p.is_last_set() {\n                // Args that .last(true) don't count since they can be required and have\n                // positionals with a lower index that aren't required\n                // Imagine: prog <req1> [opt1] -- <req2>\n                // Both of these are valid invocations:\n                //      $ prog r1 -- r2\n                //      $ prog r1 o1 -- r2\n                if found {\n                    foundx2 = true;\n                    continue;\n                }\n                found = true;\n            } else {\n                found = false;\n            }\n        }\n    } else {\n        // Check that if a required positional argument is found, all positions with a lower\n        // index are also required\n        for p in (1..=num_p).rev().filter_map(|n| cmd.get_keymap().get(&n)) {\n            if found {\n                assert!(\n                    p.is_required_set(),\n                    \"Found non-required positional argument with a lower \\\n                         index than a required positional argument: {:?} index {:?}\",\n                    p.get_id(),\n                    p.get_index()\n                );\n            } else if p.is_required_set() && !p.is_last_set() {\n                // Args that .last(true) don't count since they can be required and have\n                // positionals with a lower index that aren't required\n                // Imagine: prog <req1> [opt1] -- <req2>\n                // Both of these are valid invocations:\n                //      $ prog r1 -- r2\n                //      $ prog r1 o1 -- r2\n                found = true;\n            }\n        }\n    }\n    assert!(\n        cmd.get_positionals().filter(|p| p.is_last_set()).count() < 2,\n        \"Only one positional argument may have last(true) set. Found two.\"\n    );\n    if cmd\n        .get_positionals()\n        .any(|p| p.is_last_set() && p.is_required_set())\n        && cmd.has_subcommands()\n        && !cmd.is_subcommand_negates_reqs_set()\n    {\n        panic!(\n            \"Having a required positional argument with .last(true) set *and* child \\\n                 subcommands without setting SubcommandsNegateReqs isn't compatible.\"\n        );\n    }\n\n    true\n}\n\nfn assert_arg(arg: &Arg) {\n    debug!(\"Arg::_debug_asserts:{}\", arg.get_id());\n\n    // Self conflict\n    // TODO: this check should be recursive\n    assert!(\n        !arg.blacklist.iter().any(|x| x == arg.get_id()),\n        \"Argument '{}' cannot conflict with itself\",\n        arg.get_id(),\n    );\n\n    assert!(\n        arg.get_num_args().unwrap_or(1.into()).max_values()\n            <= arg.get_action().max_num_args().max_values(),\n        \"Argument `{}`'s action {:?} is incompatible with `num_args({:?})`\",\n        arg.get_id(),\n        arg.get_action(),\n        arg.get_num_args().unwrap_or(1.into())\n    );\n    if let Some(action_type_id) = arg.get_action().value_type_id() {\n        assert_eq!(\n            action_type_id,\n            arg.get_value_parser().type_id(),\n            \"Argument `{}`'s selected action {:?} contradicts `value_parser` ({:?})\",\n            arg.get_id(),\n            arg.get_action(),\n            arg.get_value_parser()\n        );\n    }\n\n    if arg.get_value_hint() != ValueHint::Unknown {\n        assert!(\n            arg.is_takes_value_set(),\n            \"Argument '{}' has value hint but takes no value\",\n            arg.get_id()\n        );\n\n        if arg.get_value_hint() == ValueHint::CommandWithArguments {\n            assert!(\n                arg.is_multiple_values_set(),\n                \"Argument '{}' uses hint CommandWithArguments and must accept multiple values\",\n                arg.get_id()\n            );\n        }\n    }\n\n    if arg.index.is_some() {\n        assert!(\n            arg.is_positional(),\n            \"Argument '{}' is a positional argument and can't have short or long name versions\",\n            arg.get_id()\n        );\n        assert!(\n            arg.is_takes_value_set(),\n            \"Argument '{}' is positional and it must take a value but action is {:?}{}\",\n            arg.get_id(),\n            arg.get_action(),\n            if arg.get_id() == Id::HELP {\n                \" (`mut_arg` no longer works with implicit `--help`)\"\n            } else if arg.get_id() == Id::VERSION {\n                \" (`mut_arg` no longer works with implicit `--version`)\"\n            } else {\n                \"\"\n            }\n        );\n    }\n\n    let num_vals = arg.get_num_args().expect(INTERNAL_ERROR_MSG);\n    // This can be the cause of later asserts, so put this first\n    if num_vals != ValueRange::EMPTY {\n        // HACK: Don't check for flags to make the derive easier\n        let num_val_names = arg.get_value_names().unwrap_or(&[]).len();\n        if num_vals.max_values() < num_val_names {\n            panic!(\n                \"Argument {}: Too many value names ({}) compared to `num_args` ({})\",\n                arg.get_id(),\n                num_val_names,\n                num_vals\n            );\n        }\n    }\n\n    assert_eq!(\n        num_vals.is_multiple(),\n        arg.is_multiple_values_set(),\n        \"Argument {}: mismatch between `num_args` ({}) and `multiple_values`\",\n        arg.get_id(),\n        num_vals,\n    );\n\n    if 1 < num_vals.min_values() {\n        assert!(\n            !arg.is_require_equals_set(),\n            \"Argument {}: cannot accept more than 1 arg (num_args={}) with require_equals\",\n            arg.get_id(),\n            num_vals\n        );\n    }\n\n    if num_vals == ValueRange::SINGLE {\n        assert!(\n            !arg.is_multiple_values_set(),\n            \"Argument {}: mismatch between `num_args` and `multiple_values`\",\n            arg.get_id()\n        );\n    }\n\n    assert_arg_flags(arg);\n}\n\nfn assert_arg_flags(arg: &Arg) {\n    macro_rules! checker {\n        ($a:ident requires $($b:ident)|+) => {\n            if arg.$a() {\n                let mut s = String::new();\n\n                $(\n                    if !arg.$b() {\n                        use std::fmt::Write;\n                        write!(&mut s, \"  Arg::{} is required when Arg::{} is set.\\n\", std::stringify!($b), std::stringify!($a)).unwrap();\n                    }\n                )+\n\n                if !s.is_empty() {\n                    panic!(\"Argument {:?}\\n{}\", arg.get_id(), s)\n                }\n            }\n        }\n    }\n\n    checker!(is_hide_possible_values_set requires is_takes_value_set);\n    checker!(is_allow_hyphen_values_set requires is_takes_value_set);\n    checker!(is_allow_negative_numbers_set requires is_takes_value_set);\n    checker!(is_require_equals_set requires is_takes_value_set);\n    checker!(is_last_set requires is_takes_value_set);\n    checker!(is_hide_default_value_set requires is_takes_value_set);\n    checker!(is_multiple_values_set requires is_takes_value_set);\n    checker!(is_ignore_case_set requires is_takes_value_set);\n}\n"
  },
  {
    "path": "clap_builder/src/builder/ext.rs",
    "content": "use crate::util::AnyValue;\nuse crate::util::AnyValueId;\nuse crate::util::FlatMap;\n\n#[derive(Default, Clone, Debug)]\npub(crate) struct Extensions {\n    extensions: FlatMap<AnyValueId, AnyValue>,\n}\n\nimpl Extensions {\n    #[allow(dead_code)]\n    pub(crate) fn get<T: Extension>(&self) -> Option<&T> {\n        let id = AnyValueId::of::<T>();\n        self.extensions.get(&id).map(|e| {\n            e.downcast_ref::<T>()\n                .expect(\"`Extensions` tracks values by type\")\n        })\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn set<T: Extension>(&mut self, tagged: T) -> bool {\n        let value = AnyValue::new(tagged);\n        let id = value.type_id();\n        self.extensions.insert(id, value).is_some()\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn remove<T: Extension>(&mut self) -> Option<T> {\n        let id = AnyValueId::of::<T>();\n        self.extensions.remove(&id).map(|e| {\n            e.downcast_into::<T>()\n                .expect(\"`Extensions` tracks values by type\")\n        })\n    }\n\n    pub(crate) fn update(&mut self, other: &Self) {\n        for (key, value) in other.extensions.iter() {\n            self.extensions.insert(*key, value.clone());\n        }\n    }\n}\n\n#[allow(unreachable_pub)]\npub trait Extension: std::fmt::Debug + Clone + std::any::Any + Send + Sync + 'static {}\n\nimpl<T> Extension for T where T: std::fmt::Debug + Clone + std::any::Any + Send + Sync + 'static {}\n"
  },
  {
    "path": "clap_builder/src/builder/mod.rs",
    "content": "//! Define [`Command`] line [arguments][`Arg`]\n\nmod action;\nmod app_settings;\nmod arg;\nmod arg_group;\nmod arg_predicate;\nmod arg_settings;\nmod command;\nmod ext;\nmod os_str;\nmod possible_value;\nmod range;\nmod resettable;\nmod str;\nmod styled_str;\nmod value_hint;\nmod value_parser;\n\n#[cfg(debug_assertions)]\nmod debug_asserts;\n\n#[cfg(test)]\nmod tests;\n\npub mod styling;\n\npub use self::str::Str;\npub use action::ArgAction;\npub use arg::Arg;\n#[cfg(feature = \"unstable-ext\")]\npub use arg::ArgExt;\npub use arg_group::ArgGroup;\npub use arg_predicate::ArgPredicate;\npub use command::Command;\n#[cfg(feature = \"unstable-ext\")]\npub use command::CommandExt;\npub use os_str::OsStr;\npub use possible_value::PossibleValue;\npub use range::ValueRange;\npub use resettable::IntoResettable;\npub use resettable::Resettable;\npub use styled_str::StyledStr;\npub use styling::Styles;\npub use value_hint::ValueHint;\npub use value_parser::_AnonymousValueParser;\npub use value_parser::_infer_ValueParser_for;\npub use value_parser::BoolValueParser;\npub use value_parser::BoolishValueParser;\npub use value_parser::EnumValueParser;\npub use value_parser::FalseyValueParser;\npub use value_parser::MapValueParser;\npub use value_parser::NonEmptyStringValueParser;\npub use value_parser::OsStringValueParser;\npub use value_parser::PathBufValueParser;\npub use value_parser::PossibleValuesParser;\npub use value_parser::RangedI64ValueParser;\npub use value_parser::RangedU64ValueParser;\npub use value_parser::StringValueParser;\npub use value_parser::TryMapValueParser;\npub use value_parser::TypedValueParser;\npub use value_parser::UnknownArgumentValueParser;\npub use value_parser::ValueParser;\npub use value_parser::ValueParserFactory;\npub use value_parser::impl_prelude;\n\n#[allow(unused_imports)]\npub(crate) use self::str::Inner as StrInner;\npub(crate) use action::CountType;\npub(crate) use arg_settings::{ArgFlags, ArgSettings};\npub(crate) use command::AppExt;\n"
  },
  {
    "path": "clap_builder/src/builder/os_str.rs",
    "content": "use crate::builder::Str;\n#[cfg(feature = \"string\")]\nuse std::borrow::Cow;\n\n/// A UTF-8-encoded fixed string\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** To support dynamic values (i.e. `OsString`), enable the `string`\n/// feature\n///\n/// </div>\n#[derive(Default, Clone, Eq, PartialEq, PartialOrd, Ord, Hash)]\npub struct OsStr {\n    name: Inner,\n}\n\nimpl OsStr {\n    #[cfg(feature = \"string\")]\n    pub(crate) fn from_string(name: std::ffi::OsString) -> Self {\n        Self {\n            name: Inner::from_string(name),\n        }\n    }\n\n    #[cfg(feature = \"string\")]\n    pub(crate) fn from_ref(name: &std::ffi::OsStr) -> Self {\n        Self {\n            name: Inner::from_ref(name),\n        }\n    }\n\n    pub(crate) fn from_static_ref(name: &'static std::ffi::OsStr) -> Self {\n        Self {\n            name: Inner::from_static_ref(name),\n        }\n    }\n\n    /// Get the raw string as an `std::ffi::OsStr`\n    pub fn as_os_str(&self) -> &std::ffi::OsStr {\n        self.name.as_os_str()\n    }\n\n    /// Get the raw string as an `OsString`\n    pub fn to_os_string(&self) -> std::ffi::OsString {\n        self.as_os_str().to_owned()\n    }\n}\n\nimpl From<&'_ OsStr> for OsStr {\n    fn from(id: &'_ OsStr) -> Self {\n        id.clone()\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<Str> for OsStr {\n    fn from(id: Str) -> Self {\n        match id.into_inner() {\n            crate::builder::StrInner::Static(s) => Self::from_static_ref(std::ffi::OsStr::new(s)),\n            crate::builder::StrInner::Owned(s) => Self::from_ref(std::ffi::OsStr::new(s.as_ref())),\n        }\n    }\n}\n\n#[cfg(not(feature = \"string\"))]\nimpl From<Str> for OsStr {\n    fn from(id: Str) -> Self {\n        Self::from_static_ref(std::ffi::OsStr::new(id.into_inner().0))\n    }\n}\n\nimpl From<&'_ Str> for OsStr {\n    fn from(id: &'_ Str) -> Self {\n        id.clone().into()\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<std::ffi::OsString> for OsStr {\n    fn from(name: std::ffi::OsString) -> Self {\n        Self::from_string(name)\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<&'_ std::ffi::OsString> for OsStr {\n    fn from(name: &'_ std::ffi::OsString) -> Self {\n        Self::from_ref(name.as_os_str())\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<String> for OsStr {\n    fn from(name: String) -> Self {\n        Self::from_string(name.into())\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<&'_ String> for OsStr {\n    fn from(name: &'_ String) -> Self {\n        Self::from_ref(name.as_str().as_ref())\n    }\n}\n\nimpl From<&'static std::ffi::OsStr> for OsStr {\n    fn from(name: &'static std::ffi::OsStr) -> Self {\n        Self::from_static_ref(name)\n    }\n}\n\nimpl From<&'_ &'static std::ffi::OsStr> for OsStr {\n    fn from(name: &'_ &'static std::ffi::OsStr) -> Self {\n        Self::from_static_ref(name)\n    }\n}\n\nimpl From<&'static str> for OsStr {\n    fn from(name: &'static str) -> Self {\n        Self::from_static_ref(name.as_ref())\n    }\n}\n\nimpl From<&'_ &'static str> for OsStr {\n    fn from(name: &'_ &'static str) -> Self {\n        Self::from_static_ref((*name).as_ref())\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<Cow<'static, str>> for OsStr {\n    fn from(cow: Cow<'static, str>) -> Self {\n        match cow {\n            Cow::Borrowed(s) => Self::from(s),\n            Cow::Owned(s) => Self::from(s),\n        }\n    }\n}\n\nimpl From<OsStr> for std::ffi::OsString {\n    fn from(name: OsStr) -> Self {\n        name.name.into_os_string()\n    }\n}\n\nimpl From<OsStr> for std::path::PathBuf {\n    fn from(name: OsStr) -> Self {\n        std::ffi::OsString::from(name).into()\n    }\n}\n\nimpl std::fmt::Debug for OsStr {\n    #[inline]\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        std::fmt::Debug::fmt(self.as_os_str(), f)\n    }\n}\n\nimpl std::ops::Deref for OsStr {\n    type Target = std::ffi::OsStr;\n\n    #[inline]\n    fn deref(&self) -> &std::ffi::OsStr {\n        self.as_os_str()\n    }\n}\n\nimpl AsRef<std::ffi::OsStr> for OsStr {\n    #[inline]\n    fn as_ref(&self) -> &std::ffi::OsStr {\n        self.as_os_str()\n    }\n}\n\nimpl AsRef<std::path::Path> for OsStr {\n    #[inline]\n    fn as_ref(&self) -> &std::path::Path {\n        std::path::Path::new(self)\n    }\n}\n\nimpl std::borrow::Borrow<std::ffi::OsStr> for OsStr {\n    #[inline]\n    fn borrow(&self) -> &std::ffi::OsStr {\n        self.as_os_str()\n    }\n}\n\nimpl PartialEq<str> for OsStr {\n    #[inline]\n    fn eq(&self, other: &str) -> bool {\n        PartialEq::eq(self.as_os_str(), other)\n    }\n}\nimpl PartialEq<OsStr> for str {\n    #[inline]\n    fn eq(&self, other: &OsStr) -> bool {\n        PartialEq::eq(self, other.as_os_str())\n    }\n}\n\nimpl PartialEq<&'_ str> for OsStr {\n    #[inline]\n    fn eq(&self, other: &&str) -> bool {\n        PartialEq::eq(self.as_os_str(), *other)\n    }\n}\nimpl PartialEq<OsStr> for &'_ str {\n    #[inline]\n    fn eq(&self, other: &OsStr) -> bool {\n        PartialEq::eq(*self, other.as_os_str())\n    }\n}\n\nimpl PartialEq<&'_ std::ffi::OsStr> for OsStr {\n    #[inline]\n    fn eq(&self, other: &&std::ffi::OsStr) -> bool {\n        PartialEq::eq(self.as_os_str(), *other)\n    }\n}\nimpl PartialEq<OsStr> for &'_ std::ffi::OsStr {\n    #[inline]\n    fn eq(&self, other: &OsStr) -> bool {\n        PartialEq::eq(*self, other.as_os_str())\n    }\n}\n\nimpl PartialEq<String> for OsStr {\n    #[inline]\n    fn eq(&self, other: &String) -> bool {\n        PartialEq::eq(self.as_os_str(), other.as_str())\n    }\n}\nimpl PartialEq<OsStr> for String {\n    #[inline]\n    fn eq(&self, other: &OsStr) -> bool {\n        PartialEq::eq(self.as_str(), other.as_os_str())\n    }\n}\n\nimpl PartialEq<std::ffi::OsString> for OsStr {\n    #[inline]\n    fn eq(&self, other: &std::ffi::OsString) -> bool {\n        PartialEq::eq(self.as_os_str(), other.as_os_str())\n    }\n}\nimpl PartialEq<OsStr> for std::ffi::OsString {\n    #[inline]\n    fn eq(&self, other: &OsStr) -> bool {\n        PartialEq::eq(self.as_os_str(), other.as_os_str())\n    }\n}\n\n#[cfg(feature = \"string\")]\npub(crate) mod inner {\n    #[derive(Clone)]\n    pub(crate) enum Inner {\n        Static(&'static std::ffi::OsStr),\n        Owned(Box<std::ffi::OsStr>),\n    }\n\n    impl Inner {\n        pub(crate) fn from_string(name: std::ffi::OsString) -> Self {\n            Self::Owned(name.into_boxed_os_str())\n        }\n\n        pub(crate) fn from_ref(name: &std::ffi::OsStr) -> Self {\n            Self::Owned(Box::from(name))\n        }\n\n        pub(crate) fn from_static_ref(name: &'static std::ffi::OsStr) -> Self {\n            Self::Static(name)\n        }\n\n        pub(crate) fn as_os_str(&self) -> &std::ffi::OsStr {\n            match self {\n                Self::Static(s) => s,\n                Self::Owned(s) => s.as_ref(),\n            }\n        }\n\n        pub(crate) fn into_os_string(self) -> std::ffi::OsString {\n            self.as_os_str().to_owned()\n        }\n    }\n}\n\n#[cfg(not(feature = \"string\"))]\npub(crate) mod inner {\n    #[derive(Clone)]\n    pub(crate) struct Inner(&'static std::ffi::OsStr);\n\n    impl Inner {\n        pub(crate) fn from_static_ref(name: &'static std::ffi::OsStr) -> Self {\n            Self(name)\n        }\n\n        pub(crate) fn as_os_str(&self) -> &std::ffi::OsStr {\n            self.0\n        }\n\n        pub(crate) fn into_os_string(self) -> std::ffi::OsString {\n            self.as_os_str().to_owned()\n        }\n    }\n}\n\npub(crate) use inner::Inner;\n\nimpl Default for Inner {\n    fn default() -> Self {\n        Self::from_static_ref(std::ffi::OsStr::new(\"\"))\n    }\n}\n\nimpl PartialEq for Inner {\n    fn eq(&self, other: &Inner) -> bool {\n        self.as_os_str() == other.as_os_str()\n    }\n}\n\nimpl PartialOrd for Inner {\n    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nimpl Ord for Inner {\n    fn cmp(&self, other: &Inner) -> std::cmp::Ordering {\n        self.as_os_str().cmp(other.as_os_str())\n    }\n}\n\nimpl Eq for Inner {}\n\nimpl std::hash::Hash for Inner {\n    #[inline]\n    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {\n        self.as_os_str().hash(state);\n    }\n}\n\n#[cfg(test)]\n#[cfg(feature = \"string\")]\nmod tests {\n    use super::*;\n\n    #[test]\n    #[cfg(feature = \"string\")]\n    fn from_cow_borrowed() {\n        let cow = Cow::Borrowed(\"hello\");\n        let osstr = OsStr::from(cow);\n        assert_eq!(osstr, OsStr::from(\"hello\"));\n    }\n\n    #[test]\n    #[cfg(feature = \"string\")]\n    fn from_cow_owned() {\n        let cow = Cow::Owned(\"world\".to_string());\n        let osstr = OsStr::from(cow);\n        assert_eq!(osstr, OsStr::from(\"world\"));\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/possible_value.rs",
    "content": "use crate::builder::IntoResettable;\nuse crate::builder::Str;\nuse crate::builder::StyledStr;\n#[cfg(feature = \"help\")]\nuse crate::util::Escape;\nuse crate::util::eq_ignore_case;\n\n/// A possible value of an argument.\n///\n/// This is used for specifying [possible values] of [Args].\n///\n/// See also [`PossibleValuesParser`][crate::builder::PossibleValuesParser]\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** Most likely you can use strings, rather than `PossibleValue` as it is only required\n/// to [hide] single values from help messages and shell completions or to attach [help] to\n/// possible values.\n///\n/// </div>\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::{Arg, builder::PossibleValue, ArgAction};\n/// let cfg = Arg::new(\"config\")\n///     .action(ArgAction::Set)\n///     .value_name(\"FILE\")\n///     .value_parser([\n///         PossibleValue::new(\"fast\"),\n///         PossibleValue::new(\"slow\").help(\"slower than fast\"),\n///         PossibleValue::new(\"secret speed\").hide(true)\n///     ]);\n/// ```\n///\n/// [Args]: crate::Arg\n/// [possible values]: crate::builder::ValueParser::possible_values\n/// [hide]: PossibleValue::hide()\n/// [help]: PossibleValue::help()\n#[derive(Debug, Default, Clone, PartialEq, Eq)]\npub struct PossibleValue {\n    name: Str,\n    help: Option<StyledStr>,\n    aliases: Vec<Str>, // (name, visible)\n    hide: bool,\n}\n\nimpl PossibleValue {\n    /// Create a [`PossibleValue`] with its name.\n    ///\n    /// The name will be used to decide whether this value was provided by the user to an argument.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** In case it is not [hidden] it will also be shown in help messages for arguments\n    /// that use it as a [possible value] and have not hidden them through [`Arg::hide_possible_values(true)`].\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::builder::PossibleValue;\n    /// PossibleValue::new(\"fast\")\n    /// # ;\n    /// ```\n    /// [hidden]: PossibleValue::hide\n    /// [possible value]: crate::builder::PossibleValuesParser\n    /// [`Arg::hide_possible_values(true)`]: crate::Arg::hide_possible_values()\n    pub fn new(name: impl Into<Str>) -> Self {\n        PossibleValue {\n            name: name.into(),\n            ..Default::default()\n        }\n    }\n\n    /// Sets the help description of the value.\n    ///\n    /// This is typically displayed in completions (where supported) and should be a short, one-line\n    /// description.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::builder::PossibleValue;\n    /// PossibleValue::new(\"slow\")\n    ///     .help(\"not fast\")\n    /// # ;\n    /// ```\n    #[inline]\n    #[must_use]\n    pub fn help(mut self, help: impl IntoResettable<StyledStr>) -> Self {\n        self.help = help.into_resettable().into_option();\n        self\n    }\n\n    /// Hides this value from help and shell completions.\n    ///\n    /// This is an alternative to hiding through [`Arg::hide_possible_values(true)`], if you only\n    /// want to hide some values.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::builder::PossibleValue;\n    /// PossibleValue::new(\"secret\")\n    ///     .hide(true)\n    /// # ;\n    /// ```\n    /// [`Arg::hide_possible_values(true)`]: crate::Arg::hide_possible_values()\n    #[inline]\n    #[must_use]\n    pub fn hide(mut self, yes: bool) -> Self {\n        self.hide = yes;\n        self\n    }\n\n    /// Sets a *hidden* alias for this argument value.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::builder::PossibleValue;\n    /// PossibleValue::new(\"slow\")\n    ///     .alias(\"not-fast\")\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn alias(mut self, name: impl IntoResettable<Str>) -> Self {\n        if let Some(name) = name.into_resettable().into_option() {\n            self.aliases.push(name);\n        } else {\n            self.aliases.clear();\n        }\n        self\n    }\n\n    /// Sets multiple *hidden* aliases for this argument value.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::builder::PossibleValue;\n    /// PossibleValue::new(\"slow\")\n    ///     .aliases([\"not-fast\", \"snake-like\"])\n    /// # ;\n    /// ```\n    #[must_use]\n    pub fn aliases(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {\n        self.aliases.extend(names.into_iter().map(|a| a.into()));\n        self\n    }\n}\n\n/// Reflection\nimpl PossibleValue {\n    /// Get the name of the argument value\n    #[inline]\n    pub fn get_name(&self) -> &str {\n        self.name.as_str()\n    }\n\n    /// Get the help specified for this argument, if any\n    #[inline]\n    pub fn get_help(&self) -> Option<&StyledStr> {\n        self.help.as_ref()\n    }\n\n    /// Report if [`PossibleValue::hide`] is set\n    #[inline]\n    pub fn is_hide_set(&self) -> bool {\n        self.hide\n    }\n\n    /// Report if `PossibleValue` is not hidden and has a help message\n    pub(crate) fn should_show_help(&self) -> bool {\n        !self.hide && self.help.is_some()\n    }\n\n    /// Get the name if argument value is not hidden, `None` otherwise,\n    /// but wrapped in quotes if it contains whitespace\n    #[cfg(feature = \"help\")]\n    pub(crate) fn get_visible_quoted_name(&self) -> Option<std::borrow::Cow<'_, str>> {\n        if !self.hide {\n            Some(Escape(self.name.as_str()).to_cow())\n        } else {\n            None\n        }\n    }\n\n    /// Returns all valid values of the argument value.\n    ///\n    /// Namely the name and all aliases.\n    pub fn get_name_and_aliases(&self) -> impl Iterator<Item = &str> + '_ {\n        std::iter::once(self.get_name()).chain(self.aliases.iter().map(|s| s.as_str()))\n    }\n\n    /// Tests if the value is valid for this argument value\n    ///\n    /// The value is valid if it is either the name or one of the aliases.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::builder::PossibleValue;\n    /// let arg_value = PossibleValue::new(\"fast\").alias(\"not-slow\");\n    ///\n    /// assert!(arg_value.matches(\"fast\", false));\n    /// assert!(arg_value.matches(\"not-slow\", false));\n    ///\n    /// assert!(arg_value.matches(\"FAST\", true));\n    /// assert!(!arg_value.matches(\"FAST\", false));\n    /// ```\n    pub fn matches(&self, value: &str, ignore_case: bool) -> bool {\n        if ignore_case {\n            self.get_name_and_aliases()\n                .any(|name| eq_ignore_case(name, value))\n        } else {\n            self.get_name_and_aliases().any(|name| name == value)\n        }\n    }\n}\n\nimpl<S: Into<Str>> From<S> for PossibleValue {\n    fn from(s: S) -> Self {\n        Self::new(s)\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/range.rs",
    "content": "/// Values per occurrence for an argument\n#[derive(Copy, Clone, PartialEq, Eq, Hash)]\npub struct ValueRange {\n    start_inclusive: usize,\n    end_inclusive: usize,\n}\n\nimpl ValueRange {\n    /// Nor argument values, or a flag\n    pub const EMPTY: Self = Self {\n        start_inclusive: 0,\n        end_inclusive: 0,\n    };\n\n    /// A single argument value, the most common case for options\n    pub const SINGLE: Self = Self {\n        start_inclusive: 1,\n        end_inclusive: 1,\n    };\n\n    #[cfg(debug_assertions)]\n    pub(crate) const OPTIONAL: Self = Self {\n        start_inclusive: 0,\n        end_inclusive: 1,\n    };\n\n    pub(crate) const FULL: Self = Self {\n        start_inclusive: 0,\n        end_inclusive: usize::MAX,\n    };\n\n    /// Create a range\n    ///\n    /// # Panics\n    ///\n    /// If the end is less than the start (debug builds)\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::builder::ValueRange;\n    /// let range = ValueRange::new(5);\n    /// let range = ValueRange::new(5..10);\n    /// let range = ValueRange::new(5..=10);\n    /// let range = ValueRange::new(5..);\n    /// let range = ValueRange::new(..10);\n    /// let range = ValueRange::new(..=10);\n    /// ```\n    ///\n    /// While this will panic:\n    /// ```should_panic\n    /// # use clap_builder as clap;\n    /// # use clap::builder::ValueRange;\n    /// let range = ValueRange::new(10..5);  // Panics!\n    /// ```\n    pub fn new(range: impl Into<Self>) -> Self {\n        range.into()\n    }\n\n    pub(crate) fn raw(start_inclusive: usize, end_inclusive: usize) -> Self {\n        debug_assert!(start_inclusive <= end_inclusive);\n        Self {\n            start_inclusive,\n            end_inclusive,\n        }\n    }\n\n    /// Fewest number of values the argument accepts\n    pub fn min_values(&self) -> usize {\n        self.start_inclusive\n    }\n\n    /// Most number of values the argument accepts\n    pub fn max_values(&self) -> usize {\n        self.end_inclusive\n    }\n\n    /// Report whether the argument takes any values (ie is a flag)\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::builder::ValueRange;\n    /// let range = ValueRange::new(5);\n    /// assert!(range.takes_values());\n    ///\n    /// let range = ValueRange::new(0);\n    /// assert!(!range.takes_values());\n    /// ```\n    pub fn takes_values(&self) -> bool {\n        self.end_inclusive != 0\n    }\n\n    pub(crate) fn is_unbounded(&self) -> bool {\n        self.end_inclusive == usize::MAX\n    }\n\n    pub(crate) fn is_fixed(&self) -> bool {\n        self.start_inclusive == self.end_inclusive\n    }\n\n    pub(crate) fn is_multiple(&self) -> bool {\n        self.start_inclusive != self.end_inclusive || 1 < self.start_inclusive\n    }\n\n    pub(crate) fn num_values(&self) -> Option<usize> {\n        self.is_fixed().then_some(self.start_inclusive)\n    }\n\n    pub(crate) fn accepts_more(&self, current: usize) -> bool {\n        current < self.end_inclusive\n    }\n}\n\nimpl std::ops::RangeBounds<usize> for ValueRange {\n    fn start_bound(&self) -> std::ops::Bound<&usize> {\n        std::ops::Bound::Included(&self.start_inclusive)\n    }\n\n    fn end_bound(&self) -> std::ops::Bound<&usize> {\n        std::ops::Bound::Included(&self.end_inclusive)\n    }\n}\n\nimpl Default for ValueRange {\n    fn default() -> Self {\n        Self::SINGLE\n    }\n}\n\nimpl From<usize> for ValueRange {\n    fn from(fixed: usize) -> Self {\n        (fixed..=fixed).into()\n    }\n}\n\nimpl From<std::ops::Range<usize>> for ValueRange {\n    fn from(range: std::ops::Range<usize>) -> Self {\n        let start_inclusive = range.start;\n        let end_inclusive = range.end.saturating_sub(1);\n        Self::raw(start_inclusive, end_inclusive)\n    }\n}\n\nimpl From<std::ops::RangeFull> for ValueRange {\n    fn from(_: std::ops::RangeFull) -> Self {\n        Self::FULL\n    }\n}\n\nimpl From<std::ops::RangeFrom<usize>> for ValueRange {\n    fn from(range: std::ops::RangeFrom<usize>) -> Self {\n        let start_inclusive = range.start;\n        let end_inclusive = usize::MAX;\n        Self::raw(start_inclusive, end_inclusive)\n    }\n}\n\nimpl From<std::ops::RangeTo<usize>> for ValueRange {\n    fn from(range: std::ops::RangeTo<usize>) -> Self {\n        let start_inclusive = 0;\n        let end_inclusive = range.end.saturating_sub(1);\n        Self::raw(start_inclusive, end_inclusive)\n    }\n}\n\nimpl From<std::ops::RangeInclusive<usize>> for ValueRange {\n    fn from(range: std::ops::RangeInclusive<usize>) -> Self {\n        let start_inclusive = *range.start();\n        let end_inclusive = *range.end();\n        Self::raw(start_inclusive, end_inclusive)\n    }\n}\n\nimpl From<std::ops::RangeToInclusive<usize>> for ValueRange {\n    fn from(range: std::ops::RangeToInclusive<usize>) -> Self {\n        let start_inclusive = 0;\n        let end_inclusive = range.end;\n        Self::raw(start_inclusive, end_inclusive)\n    }\n}\n\nimpl std::fmt::Display for ValueRange {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        ok!(self.start_inclusive.fmt(f));\n        if self.is_fixed() {\n        } else if self.end_inclusive == usize::MAX {\n            ok!(\"..\".fmt(f));\n        } else {\n            ok!(\"..=\".fmt(f));\n            ok!(self.end_inclusive.fmt(f));\n        }\n        Ok(())\n    }\n}\n\nimpl std::fmt::Debug for ValueRange {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{self}\")\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    use std::ops::RangeBounds;\n\n    #[test]\n    fn from_fixed() {\n        let range: ValueRange = 5.into();\n        assert_eq!(range.start_bound(), std::ops::Bound::Included(&5));\n        assert_eq!(range.end_bound(), std::ops::Bound::Included(&5));\n        assert!(range.is_fixed());\n        assert!(range.is_multiple());\n        assert_eq!(range.num_values(), Some(5));\n        assert!(range.takes_values());\n    }\n\n    #[test]\n    fn from_fixed_empty() {\n        let range: ValueRange = 0.into();\n        assert_eq!(range.start_bound(), std::ops::Bound::Included(&0));\n        assert_eq!(range.end_bound(), std::ops::Bound::Included(&0));\n        assert!(range.is_fixed());\n        assert!(!range.is_multiple());\n        assert_eq!(range.num_values(), Some(0));\n        assert!(!range.takes_values());\n    }\n\n    #[test]\n    fn from_range() {\n        let range: ValueRange = (5..10).into();\n        assert_eq!(range.start_bound(), std::ops::Bound::Included(&5));\n        assert_eq!(range.end_bound(), std::ops::Bound::Included(&9));\n        assert!(!range.is_fixed());\n        assert!(range.is_multiple());\n        assert_eq!(range.num_values(), None);\n        assert!(range.takes_values());\n    }\n\n    #[test]\n    fn from_range_inclusive() {\n        let range: ValueRange = (5..=10).into();\n        assert_eq!(range.start_bound(), std::ops::Bound::Included(&5));\n        assert_eq!(range.end_bound(), std::ops::Bound::Included(&10));\n        assert!(!range.is_fixed());\n        assert!(range.is_multiple());\n        assert_eq!(range.num_values(), None);\n        assert!(range.takes_values());\n    }\n\n    #[test]\n    fn from_range_full() {\n        let range: ValueRange = (..).into();\n        assert_eq!(range.start_bound(), std::ops::Bound::Included(&0));\n        assert_eq!(range.end_bound(), std::ops::Bound::Included(&usize::MAX));\n        assert!(!range.is_fixed());\n        assert!(range.is_multiple());\n        assert_eq!(range.num_values(), None);\n        assert!(range.takes_values());\n    }\n\n    #[test]\n    fn from_range_from() {\n        let range: ValueRange = (5..).into();\n        assert_eq!(range.start_bound(), std::ops::Bound::Included(&5));\n        assert_eq!(range.end_bound(), std::ops::Bound::Included(&usize::MAX));\n        assert!(!range.is_fixed());\n        assert!(range.is_multiple());\n        assert_eq!(range.num_values(), None);\n        assert!(range.takes_values());\n    }\n\n    #[test]\n    fn from_range_to() {\n        let range: ValueRange = (..10).into();\n        assert_eq!(range.start_bound(), std::ops::Bound::Included(&0));\n        assert_eq!(range.end_bound(), std::ops::Bound::Included(&9));\n        assert!(!range.is_fixed());\n        assert!(range.is_multiple());\n        assert_eq!(range.num_values(), None);\n        assert!(range.takes_values());\n    }\n\n    #[test]\n    fn from_range_to_inclusive() {\n        let range: ValueRange = (..=10).into();\n        assert_eq!(range.start_bound(), std::ops::Bound::Included(&0));\n        assert_eq!(range.end_bound(), std::ops::Bound::Included(&10));\n        assert!(!range.is_fixed());\n        assert!(range.is_multiple());\n        assert_eq!(range.num_values(), None);\n        assert!(range.takes_values());\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/resettable.rs",
    "content": "// Unlike `impl Into<Option<T>>` or `Option<impl Into<T>>`, this isn't ambiguous for the `None`\n// case.\n\nuse crate::builder::ArgAction;\nuse crate::builder::OsStr;\nuse crate::builder::Str;\nuse crate::builder::StyledStr;\nuse crate::builder::ValueHint;\nuse crate::builder::ValueParser;\nuse crate::builder::ValueRange;\n\n/// Clearable builder value\n///\n/// This allows a builder function to both accept any value that can [`Into::into`] `T` (like\n/// `&str` into `OsStr`) as well as `None` to reset it to the default.  This is needed to\n/// workaround a limitation where you can't have a function argument that is `impl Into<Option<T>>`\n/// where `T` is `impl Into<S>` accept `None` as its type is ambiguous.\n///\n/// # Example\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::Command;\n/// # use clap::Arg;\n/// fn common() -> Command {\n///     Command::new(\"cli\")\n///         .arg(Arg::new(\"input\").short('i').long(\"input\"))\n/// }\n/// let mut command = common();\n/// command.mut_arg(\"input\", |arg| arg.short(None));\n/// ```\n#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub enum Resettable<T> {\n    /// Overwrite builder value\n    Value(T),\n    /// Reset builder value\n    Reset,\n}\n\nimpl<T> Resettable<T> {\n    pub(crate) fn into_option(self) -> Option<T> {\n        match self {\n            Self::Value(t) => Some(t),\n            Self::Reset => None,\n        }\n    }\n}\n\nimpl<T> From<T> for Resettable<T> {\n    fn from(other: T) -> Self {\n        Self::Value(other)\n    }\n}\n\nimpl<T> From<Option<T>> for Resettable<T> {\n    fn from(other: Option<T>) -> Self {\n        match other {\n            Some(inner) => Self::Value(inner),\n            None => Self::Reset,\n        }\n    }\n}\n\n/// Convert to the intended resettable type\npub trait IntoResettable<T> {\n    /// Convert to the intended resettable type\n    fn into_resettable(self) -> Resettable<T>;\n}\n\nimpl IntoResettable<char> for Option<char> {\n    fn into_resettable(self) -> Resettable<char> {\n        match self {\n            Some(s) => Resettable::Value(s),\n            None => Resettable::Reset,\n        }\n    }\n}\n\nimpl IntoResettable<usize> for Option<usize> {\n    fn into_resettable(self) -> Resettable<usize> {\n        match self {\n            Some(s) => Resettable::Value(s),\n            None => Resettable::Reset,\n        }\n    }\n}\n\nimpl IntoResettable<ArgAction> for Option<ArgAction> {\n    fn into_resettable(self) -> Resettable<ArgAction> {\n        match self {\n            Some(s) => Resettable::Value(s),\n            None => Resettable::Reset,\n        }\n    }\n}\n\nimpl IntoResettable<ValueHint> for Option<ValueHint> {\n    fn into_resettable(self) -> Resettable<ValueHint> {\n        match self {\n            Some(s) => Resettable::Value(s),\n            None => Resettable::Reset,\n        }\n    }\n}\n\nimpl IntoResettable<ValueParser> for Option<ValueParser> {\n    fn into_resettable(self) -> Resettable<ValueParser> {\n        match self {\n            Some(s) => Resettable::Value(s),\n            None => Resettable::Reset,\n        }\n    }\n}\n\nimpl IntoResettable<StyledStr> for Option<&'static str> {\n    fn into_resettable(self) -> Resettable<StyledStr> {\n        match self {\n            Some(s) => Resettable::Value(s.into()),\n            None => Resettable::Reset,\n        }\n    }\n}\n\nimpl IntoResettable<OsStr> for Option<&'static str> {\n    fn into_resettable(self) -> Resettable<OsStr> {\n        match self {\n            Some(s) => Resettable::Value(s.into()),\n            None => Resettable::Reset,\n        }\n    }\n}\n\nimpl IntoResettable<Str> for Option<&'static str> {\n    fn into_resettable(self) -> Resettable<Str> {\n        match self {\n            Some(s) => Resettable::Value(s.into()),\n            None => Resettable::Reset,\n        }\n    }\n}\n\nimpl<T> IntoResettable<T> for Resettable<T> {\n    fn into_resettable(self) -> Resettable<T> {\n        self\n    }\n}\n\nimpl IntoResettable<char> for char {\n    fn into_resettable(self) -> Resettable<char> {\n        Resettable::Value(self)\n    }\n}\n\nimpl IntoResettable<usize> for usize {\n    fn into_resettable(self) -> Resettable<usize> {\n        Resettable::Value(self)\n    }\n}\n\nimpl IntoResettable<ArgAction> for ArgAction {\n    fn into_resettable(self) -> Resettable<ArgAction> {\n        Resettable::Value(self)\n    }\n}\n\nimpl IntoResettable<ValueHint> for ValueHint {\n    fn into_resettable(self) -> Resettable<ValueHint> {\n        Resettable::Value(self)\n    }\n}\n\nimpl<I: Into<ValueRange>> IntoResettable<ValueRange> for I {\n    fn into_resettable(self) -> Resettable<ValueRange> {\n        Resettable::Value(self.into())\n    }\n}\n\nimpl<I: Into<ValueParser>> IntoResettable<ValueParser> for I {\n    fn into_resettable(self) -> Resettable<ValueParser> {\n        Resettable::Value(self.into())\n    }\n}\n\nimpl<I: Into<String>> IntoResettable<String> for I {\n    fn into_resettable(self) -> Resettable<String> {\n        Resettable::Value(self.into())\n    }\n}\n\nimpl<I: Into<StyledStr>> IntoResettable<StyledStr> for I {\n    fn into_resettable(self) -> Resettable<StyledStr> {\n        Resettable::Value(self.into())\n    }\n}\n\nimpl<I: Into<OsStr>> IntoResettable<OsStr> for I {\n    fn into_resettable(self) -> Resettable<OsStr> {\n        Resettable::Value(self.into())\n    }\n}\n\nimpl<I: Into<Str>> IntoResettable<Str> for I {\n    fn into_resettable(self) -> Resettable<Str> {\n        Resettable::Value(self.into())\n    }\n}\n\nimpl<I: Into<crate::Id>> IntoResettable<crate::Id> for I {\n    fn into_resettable(self) -> Resettable<crate::Id> {\n        Resettable::Value(self.into())\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/str.rs",
    "content": "#[cfg(feature = \"string\")]\nuse std::borrow::Cow;\n\n/// A UTF-8-encoded fixed string\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** To support dynamic values (i.e. `String`), enable the `string`\n/// feature\n///\n/// </div>\n#[derive(Default, Clone, Eq, PartialEq, PartialOrd, Ord, Hash)]\npub struct Str {\n    name: Inner,\n}\n\nimpl Str {\n    #[cfg(feature = \"string\")]\n    pub(crate) fn from_string(name: String) -> Self {\n        Self {\n            name: Inner::from_string(name),\n        }\n    }\n\n    #[cfg(feature = \"string\")]\n    pub(crate) fn from_ref(name: &str) -> Self {\n        Self {\n            name: Inner::from_ref(name),\n        }\n    }\n\n    pub(crate) fn from_static_ref(name: &'static str) -> Self {\n        Self {\n            name: Inner::from_static_ref(name),\n        }\n    }\n\n    pub(crate) fn into_inner(self) -> Inner {\n        self.name\n    }\n\n    /// Get the raw string of the `Str`\n    pub fn as_str(&self) -> &str {\n        self.name.as_str()\n    }\n}\n\nimpl From<&'_ Str> for Str {\n    fn from(id: &'_ Str) -> Self {\n        id.clone()\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<String> for Str {\n    fn from(name: String) -> Self {\n        Self::from_string(name)\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<&'_ String> for Str {\n    fn from(name: &'_ String) -> Self {\n        Self::from_ref(name.as_str())\n    }\n}\n\nimpl From<&'static str> for Str {\n    fn from(name: &'static str) -> Self {\n        Self::from_static_ref(name)\n    }\n}\n\nimpl From<&'_ &'static str> for Str {\n    fn from(name: &'_ &'static str) -> Self {\n        Self::from_static_ref(name)\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<Cow<'static, str>> for Str {\n    fn from(cow: Cow<'static, str>) -> Self {\n        match cow {\n            Cow::Borrowed(s) => Self::from(s),\n            Cow::Owned(s) => Self::from(s),\n        }\n    }\n}\n\nimpl From<Str> for String {\n    fn from(name: Str) -> Self {\n        name.name.into_string()\n    }\n}\n\nimpl From<Str> for Vec<u8> {\n    fn from(name: Str) -> Self {\n        String::from(name).into()\n    }\n}\n\nimpl From<Str> for std::ffi::OsString {\n    fn from(name: Str) -> Self {\n        String::from(name).into()\n    }\n}\n\nimpl From<Str> for std::path::PathBuf {\n    fn from(name: Str) -> Self {\n        String::from(name).into()\n    }\n}\n\nimpl std::fmt::Display for Str {\n    #[inline]\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        std::fmt::Display::fmt(self.as_str(), f)\n    }\n}\n\nimpl std::fmt::Debug for Str {\n    #[inline]\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        std::fmt::Debug::fmt(self.as_str(), f)\n    }\n}\n\nimpl std::ops::Deref for Str {\n    type Target = str;\n\n    #[inline]\n    fn deref(&self) -> &str {\n        self.as_str()\n    }\n}\n\nimpl AsRef<str> for Str {\n    #[inline]\n    fn as_ref(&self) -> &str {\n        self.as_str()\n    }\n}\n\nimpl AsRef<[u8]> for Str {\n    #[inline]\n    fn as_ref(&self) -> &[u8] {\n        self.as_bytes()\n    }\n}\n\nimpl AsRef<std::ffi::OsStr> for Str {\n    #[inline]\n    fn as_ref(&self) -> &std::ffi::OsStr {\n        (**self).as_ref()\n    }\n}\n\nimpl AsRef<std::path::Path> for Str {\n    #[inline]\n    fn as_ref(&self) -> &std::path::Path {\n        std::path::Path::new(self)\n    }\n}\n\nimpl std::borrow::Borrow<str> for Str {\n    #[inline]\n    fn borrow(&self) -> &str {\n        self.as_str()\n    }\n}\n\nimpl PartialEq<str> for Str {\n    #[inline]\n    fn eq(&self, other: &str) -> bool {\n        PartialEq::eq(self.as_str(), other)\n    }\n}\nimpl PartialEq<Str> for str {\n    #[inline]\n    fn eq(&self, other: &Str) -> bool {\n        PartialEq::eq(self, other.as_str())\n    }\n}\n\nimpl PartialEq<&'_ str> for Str {\n    #[inline]\n    fn eq(&self, other: &&str) -> bool {\n        PartialEq::eq(self.as_str(), *other)\n    }\n}\nimpl PartialEq<Str> for &'_ str {\n    #[inline]\n    fn eq(&self, other: &Str) -> bool {\n        PartialEq::eq(*self, other.as_str())\n    }\n}\n\nimpl PartialEq<std::ffi::OsStr> for Str {\n    #[inline]\n    fn eq(&self, other: &std::ffi::OsStr) -> bool {\n        PartialEq::eq(self.as_str(), other)\n    }\n}\nimpl PartialEq<Str> for std::ffi::OsStr {\n    #[inline]\n    fn eq(&self, other: &Str) -> bool {\n        PartialEq::eq(self, other.as_str())\n    }\n}\n\nimpl PartialEq<&'_ std::ffi::OsStr> for Str {\n    #[inline]\n    fn eq(&self, other: &&std::ffi::OsStr) -> bool {\n        PartialEq::eq(self.as_str(), *other)\n    }\n}\nimpl PartialEq<Str> for &'_ std::ffi::OsStr {\n    #[inline]\n    fn eq(&self, other: &Str) -> bool {\n        PartialEq::eq(*self, other.as_str())\n    }\n}\n\nimpl PartialEq<String> for Str {\n    #[inline]\n    fn eq(&self, other: &String) -> bool {\n        PartialEq::eq(self.as_str(), other.as_str())\n    }\n}\nimpl PartialEq<Str> for String {\n    #[inline]\n    fn eq(&self, other: &Str) -> bool {\n        PartialEq::eq(self.as_str(), other.as_str())\n    }\n}\n\n#[cfg(feature = \"string\")]\npub(crate) mod inner {\n    #[derive(Clone)]\n    pub(crate) enum Inner {\n        Static(&'static str),\n        Owned(Box<str>),\n    }\n\n    impl Inner {\n        pub(crate) fn from_string(name: String) -> Self {\n            Self::Owned(name.into_boxed_str())\n        }\n\n        pub(crate) fn from_ref(name: &str) -> Self {\n            Self::Owned(Box::from(name))\n        }\n\n        pub(crate) fn from_static_ref(name: &'static str) -> Self {\n            Self::Static(name)\n        }\n\n        pub(crate) fn as_str(&self) -> &str {\n            match self {\n                Self::Static(s) => s,\n                Self::Owned(s) => s.as_ref(),\n            }\n        }\n\n        pub(crate) fn into_string(self) -> String {\n            match self {\n                Self::Static(s) => s.to_owned(),\n                Self::Owned(s) => s.into(),\n            }\n        }\n    }\n}\n\n#[cfg(not(feature = \"string\"))]\npub(crate) mod inner {\n    #[derive(Clone)]\n    pub(crate) struct Inner(pub(crate) &'static str);\n\n    impl Inner {\n        pub(crate) fn from_static_ref(name: &'static str) -> Self {\n            Self(name)\n        }\n\n        pub(crate) fn as_str(&self) -> &str {\n            self.0\n        }\n\n        pub(crate) fn into_string(self) -> String {\n            self.as_str().to_owned()\n        }\n    }\n}\n\npub(crate) use inner::Inner;\n\nimpl Default for Inner {\n    fn default() -> Self {\n        Self::from_static_ref(\"\")\n    }\n}\n\nimpl PartialEq for Inner {\n    fn eq(&self, other: &Inner) -> bool {\n        self.as_str() == other.as_str()\n    }\n}\n\nimpl PartialOrd for Inner {\n    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nimpl Ord for Inner {\n    fn cmp(&self, other: &Inner) -> std::cmp::Ordering {\n        self.as_str().cmp(other.as_str())\n    }\n}\n\nimpl Eq for Inner {}\n\nimpl std::hash::Hash for Inner {\n    #[inline]\n    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {\n        self.as_str().hash(state);\n    }\n}\n\n#[cfg(test)]\n#[cfg(feature = \"string\")]\nmod tests {\n    use super::*;\n\n    #[test]\n    #[cfg(feature = \"string\")]\n    fn from_cow_borrowed() {\n        let cow = Cow::Borrowed(\"hello\");\n        let str = Str::from(cow);\n        assert_eq!(str, Str::from(\"hello\"));\n    }\n\n    #[test]\n    #[cfg(feature = \"string\")]\n    fn from_cow_owned() {\n        let cow = Cow::Owned(\"world\".to_string());\n        let str = Str::from(cow);\n        assert_eq!(str, Str::from(\"world\"));\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/styled_str.rs",
    "content": "#![cfg_attr(not(feature = \"usage\"), allow(dead_code))]\nuse std::borrow::Cow;\n\n/// Terminal-styling container\n///\n/// Styling may be encoded as [ANSI Escape Code](https://en.wikipedia.org/wiki/ANSI_escape_code)\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// // `cstr!` converts tags to ANSI codes\n/// let after_help: &'static str = color_print::cstr!(\n/// r#\"<bold><underline>Examples</underline></bold>\n///\n///   <dim>$</dim> <bold>mybin --input file.toml</bold>\n/// \"#);\n///\n/// let cmd = clap::Command::new(\"mybin\")\n///     .after_help(after_help)  // The `&str` gets converted into a `StyledStr`\n///     // ...\n/// #   ;\n/// ```\n#[derive(Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord)]\npub struct StyledStr(String);\n\nimpl StyledStr {\n    /// Create an empty buffer\n    pub const fn new() -> Self {\n        Self(String::new())\n    }\n\n    /// Display using [ANSI Escape Code](https://en.wikipedia.org/wiki/ANSI_escape_code) styling\n    #[cfg(feature = \"color\")]\n    pub fn ansi(&self) -> impl std::fmt::Display + '_ {\n        self.0.as_str()\n    }\n\n    /// May allow the compiler to consolidate the `Drop`s for `msg`, reducing code size compared to\n    /// `styled.push_str(&msg)`\n    pub(crate) fn push_string(&mut self, msg: String) {\n        self.0.push_str(&msg);\n    }\n\n    /// Appends a given string slice onto the end of this `StyledStr`.\n    pub fn push_str(&mut self, msg: &str) {\n        self.0.push_str(msg);\n    }\n\n    pub(crate) fn trim_start_lines(&mut self) {\n        if let Some(pos) = self.0.find('\\n') {\n            let (leading, help) = self.0.split_at(pos + 1);\n            if leading.trim().is_empty() {\n                self.0 = help.to_owned();\n            }\n        }\n    }\n\n    pub(crate) fn trim_end(&mut self) {\n        self.0 = self.0.trim_end().to_owned();\n    }\n\n    #[cfg(feature = \"help\")]\n    pub(crate) fn replace_newline_var(&mut self) {\n        self.0 = self.0.replace(\"{n}\", \"\\n\");\n    }\n\n    #[cfg(feature = \"help\")]\n    pub(crate) fn indent(&mut self, initial: &str, trailing: &str) {\n        self.0.insert_str(0, initial);\n\n        let mut line_sep = \"\\n\".to_owned();\n        line_sep.push_str(trailing);\n        self.0 = self.0.replace('\\n', &line_sep);\n    }\n\n    #[cfg(all(not(feature = \"wrap_help\"), feature = \"help\"))]\n    pub(crate) fn wrap(&mut self, _hard_width: usize) {}\n\n    #[cfg(feature = \"wrap_help\")]\n    pub(crate) fn wrap(&mut self, hard_width: usize) {\n        let mut new = String::with_capacity(self.0.len());\n\n        let mut last = 0;\n        let mut wrapper = crate::output::textwrap::wrap_algorithms::LineWrapper::new(hard_width);\n        for content in self.iter_text() {\n            // Preserve styling\n            let current = content.as_ptr() as usize - self.0.as_str().as_ptr() as usize;\n            if last != current {\n                new.push_str(&self.0.as_str()[last..current]);\n            }\n            last = current + content.len();\n\n            for (i, line) in content.split_inclusive('\\n').enumerate() {\n                if 0 < i {\n                    // reset char count on newline, skipping the start as we might have carried\n                    // over from a prior block of styled text\n                    wrapper.reset();\n                }\n                let line = crate::output::textwrap::word_separators::find_words_ascii_space(line)\n                    .collect::<Vec<_>>();\n                new.extend(wrapper.wrap(line));\n            }\n        }\n        if last != self.0.len() {\n            new.push_str(&self.0.as_str()[last..]);\n        }\n        new = new.trim_end().to_owned();\n\n        self.0 = new;\n    }\n\n    #[inline(never)]\n    #[cfg(feature = \"help\")]\n    pub(crate) fn display_width(&self) -> usize {\n        let mut width = 0;\n        for c in self.iter_text() {\n            width += crate::output::display_width(c);\n        }\n        width\n    }\n\n    #[cfg(feature = \"help\")]\n    pub(crate) fn is_empty(&self) -> bool {\n        self.0.is_empty()\n    }\n\n    #[cfg(feature = \"help\")]\n    pub(crate) fn as_styled_str(&self) -> &str {\n        &self.0\n    }\n\n    #[cfg(feature = \"color\")]\n    pub(crate) fn iter_text(&self) -> impl Iterator<Item = &str> {\n        anstream::adapter::strip_str(&self.0)\n    }\n\n    #[cfg(not(feature = \"color\"))]\n    pub(crate) fn iter_text(&self) -> impl Iterator<Item = &str> {\n        [self.0.as_str()].into_iter()\n    }\n\n    pub(crate) fn push_styled(&mut self, other: &Self) {\n        self.0.push_str(&other.0);\n    }\n\n    pub(crate) fn write_to(&self, buffer: &mut dyn std::io::Write) -> std::io::Result<()> {\n        ok!(buffer.write_all(self.0.as_bytes()));\n\n        Ok(())\n    }\n}\n\nimpl Default for &'_ StyledStr {\n    fn default() -> Self {\n        static DEFAULT: StyledStr = StyledStr::new();\n        &DEFAULT\n    }\n}\n\nimpl From<String> for StyledStr {\n    fn from(name: String) -> Self {\n        StyledStr(name)\n    }\n}\n\nimpl From<&'_ String> for StyledStr {\n    fn from(name: &'_ String) -> Self {\n        let mut styled = StyledStr::new();\n        styled.push_str(name);\n        styled\n    }\n}\n\nimpl From<&'static str> for StyledStr {\n    fn from(name: &'static str) -> Self {\n        let mut styled = StyledStr::new();\n        styled.push_str(name);\n        styled\n    }\n}\n\nimpl From<&'_ &'static str> for StyledStr {\n    fn from(name: &'_ &'static str) -> Self {\n        StyledStr::from(*name)\n    }\n}\n\nimpl From<Cow<'static, str>> for StyledStr {\n    fn from(cow: Cow<'static, str>) -> Self {\n        match cow {\n            Cow::Borrowed(s) => StyledStr::from(s),\n            Cow::Owned(s) => StyledStr::from(s),\n        }\n    }\n}\n\nimpl std::fmt::Write for StyledStr {\n    #[inline]\n    fn write_str(&mut self, s: &str) -> Result<(), std::fmt::Error> {\n        self.0.push_str(s);\n        Ok(())\n    }\n\n    #[inline]\n    fn write_char(&mut self, c: char) -> Result<(), std::fmt::Error> {\n        self.0.push(c);\n        Ok(())\n    }\n}\n\n/// Color-unaware printing. Never uses coloring.\nimpl std::fmt::Display for StyledStr {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        for part in self.iter_text() {\n            part.fmt(f)?;\n        }\n\n        Ok(())\n    }\n}\n\n#[cfg(test)]\n#[cfg(feature = \"wrap_help\")]\nmod wrap_tests {\n    use super::*;\n\n    use snapbox::assert_data_eq;\n    use snapbox::str;\n\n    #[test]\n    #[cfg(feature = \"wrap_help\")]\n    fn wrap_unstyled() {\n        let style = anstyle::Style::new();\n        let input = format!(\n            \"{style}12345{style:#} {style}12345{style:#} {style}12345{style:#} {style}12345{style:#}\"\n        );\n        let mut actual = StyledStr::new();\n        actual.push_string(input);\n        actual.wrap(20);\n        assert_data_eq!(\n            actual.ansi().to_string(),\n            str![[r#\"\n12345 12345 12345\n12345\n\"#]]\n        );\n    }\n\n    #[test]\n    #[cfg(feature = \"wrap_help\")]\n    fn wrap_styled() {\n        let style = anstyle::Style::new().bold();\n        let input = format!(\n            \"{style}12345{style:#} {style}12345{style:#} {style}12345{style:#} {style}12345{style:#}\"\n        );\n        let mut actual = StyledStr::new();\n        actual.push_string(input);\n        actual.wrap(20);\n        assert_data_eq!(\n            actual.ansi().to_string(),\n            str![[r#\"\n\u001b[1m12345\u001b[0m \u001b[1m12345\u001b[0m \u001b[1m12345\u001b[0m \u001b[1m\n12345\u001b[0m\n\"#]]\n        );\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn from_cow_borrowed() {\n        let cow = Cow::Borrowed(\"hello\");\n        let styled = StyledStr::from(cow);\n        assert_eq!(styled, StyledStr::from(\"hello\"));\n    }\n\n    #[test]\n    fn from_cow_owned() {\n        let cow = Cow::Owned(\"world\".to_string());\n        let styled = StyledStr::from(cow);\n        assert_eq!(styled, StyledStr::from(\"world\"));\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/styling.rs",
    "content": "//! Terminal [`Styles`] for help and error output\n\npub use anstyle::*;\n\n/// Terminal styling definitions\n///\n/// See also [`Command::styles`][crate::Command::styles].\n///\n/// # Example\n///\n/// clap v3 styling\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::builder::styling::*;\n/// let styles = Styles::styled()\n///     .header(AnsiColor::Yellow.on_default())\n///     .usage(AnsiColor::Green.on_default())\n///     .literal(AnsiColor::Green.on_default())\n///     .placeholder(AnsiColor::Green.on_default());\n/// ```\n#[derive(Clone, Debug)]\n#[allow(missing_copy_implementations)] // Large enough type that I want an explicit `clone()` for now\npub struct Styles {\n    header: Style,\n    error: Style,\n    usage: Style,\n    literal: Style,\n    placeholder: Style,\n    valid: Style,\n    invalid: Style,\n    context: Style,\n    context_value: Option<Style>,\n}\n\nimpl Styles {\n    /// No terminal styling\n    pub const fn plain() -> Self {\n        Self {\n            header: Style::new(),\n            error: Style::new(),\n            usage: Style::new(),\n            literal: Style::new(),\n            placeholder: Style::new(),\n            valid: Style::new(),\n            invalid: Style::new(),\n            context: Style::new(),\n            context_value: None,\n        }\n    }\n\n    /// Default terminal styling\n    pub const fn styled() -> Self {\n        #[cfg(feature = \"color\")]\n        {\n            Self {\n                header: Style::new().bold().underline(),\n                error: Style::new()\n                    .fg_color(Some(Color::Ansi(AnsiColor::Red)))\n                    .bold(),\n                usage: Style::new().bold().underline(),\n                literal: Style::new().bold(),\n                placeholder: Style::new(),\n                valid: Style::new().fg_color(Some(Color::Ansi(AnsiColor::Green))),\n                invalid: Style::new().fg_color(Some(Color::Ansi(AnsiColor::Yellow))),\n                context: Style::new(),\n                context_value: None,\n            }\n        }\n        #[cfg(not(feature = \"color\"))]\n        {\n            Self::plain()\n        }\n    }\n\n    /// General Heading style, e.g. [`help_heading`][crate::Arg::help_heading]\n    #[inline]\n    pub const fn header(mut self, style: Style) -> Self {\n        self.header = style;\n        self\n    }\n\n    /// Error heading\n    #[inline]\n    pub const fn error(mut self, style: Style) -> Self {\n        self.error = style;\n        self\n    }\n\n    /// Usage heading\n    #[inline]\n    pub const fn usage(mut self, style: Style) -> Self {\n        self.usage = style;\n        self\n    }\n\n    /// Literal command-line syntax, e.g. `--help`\n    #[inline]\n    pub const fn literal(mut self, style: Style) -> Self {\n        self.literal = style;\n        self\n    }\n\n    /// Descriptions within command-line syntax, e.g. [`value_name`][crate::Arg::value_name]\n    #[inline]\n    pub const fn placeholder(mut self, style: Style) -> Self {\n        self.placeholder = style;\n        self\n    }\n\n    /// Highlight suggested usage\n    #[inline]\n    pub const fn valid(mut self, style: Style) -> Self {\n        self.valid = style;\n        self\n    }\n\n    /// Highlight invalid usage\n    #[inline]\n    pub const fn invalid(mut self, style: Style) -> Self {\n        self.invalid = style;\n        self\n    }\n\n    /// Highlight all specified contexts, e.g. `[default: false]`\n    ///\n    /// To specialize the style of the value within the context, see [`Styles::context_value`]\n    #[inline]\n    pub const fn context(mut self, style: Style) -> Self {\n        self.context = style;\n        self\n    }\n\n    /// Highlight values within all of the context, e.g. the `false` in `[default: false]`\n    ///\n    /// If not explicitly set, falls back to `context`'s style.\n    #[inline]\n    pub const fn context_value(mut self, style: Style) -> Self {\n        self.context_value = Some(style);\n        self\n    }\n}\n\n/// Reflection\nimpl Styles {\n    /// General Heading style, e.g. [`help_heading`][crate::Arg::help_heading]\n    #[inline(always)]\n    pub const fn get_header(&self) -> &Style {\n        &self.header\n    }\n\n    /// Error heading\n    #[inline(always)]\n    pub const fn get_error(&self) -> &Style {\n        &self.error\n    }\n\n    /// Usage heading\n    #[inline(always)]\n    pub const fn get_usage(&self) -> &Style {\n        &self.usage\n    }\n\n    /// Literal command-line syntax, e.g. `--help`\n    #[inline(always)]\n    pub const fn get_literal(&self) -> &Style {\n        &self.literal\n    }\n\n    /// Descriptions within command-line syntax, e.g. [`value_name`][crate::Arg::value_name]\n    #[inline(always)]\n    pub const fn get_placeholder(&self) -> &Style {\n        &self.placeholder\n    }\n\n    /// Highlight suggested usage\n    #[inline(always)]\n    pub const fn get_valid(&self) -> &Style {\n        &self.valid\n    }\n\n    /// Highlight invalid usage\n    #[inline(always)]\n    pub const fn get_invalid(&self) -> &Style {\n        &self.invalid\n    }\n\n    /// Highlight all specified contexts, e.g. `[default: false]`\n    ///\n    /// To specialize the style of the value within the context, see [`Styles::context_value`]\n    #[inline(always)]\n    pub const fn get_context(&self) -> &Style {\n        &self.context\n    }\n\n    /// Highlight values within all of the context, e.g. the `false` in `[default: false]`\n    ///\n    /// If not explicitly set, falls back to `context`'s style.\n    #[inline(always)]\n    pub const fn get_context_value(&self) -> &Style {\n        match &self.context_value {\n            Some(s) => s,\n            None => &self.context,\n        }\n    }\n}\n\nimpl super::AppExt for Styles {}\n\nimpl Default for Styles {\n    fn default() -> Self {\n        Self::styled()\n    }\n}\n\nimpl Default for &'_ Styles {\n    fn default() -> Self {\n        const STYLES: Styles = Styles::styled();\n        &STYLES\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/tests.rs",
    "content": "use crate::Arg;\nuse crate::Command;\n\n#[test]\nfn propagate_version() {\n    let mut cmd = Command::new(\"test\")\n        .propagate_version(true)\n        .version(\"1.1\")\n        .subcommand(Command::new(\"sub1\"));\n    cmd._propagate();\n    assert_eq!(\n        cmd.get_subcommands().next().unwrap().get_version(),\n        Some(\"1.1\")\n    );\n}\n\n#[test]\nfn global_setting() {\n    let mut cmd = Command::new(\"test\")\n        .disable_version_flag(true)\n        .subcommand(Command::new(\"subcmd\"));\n    cmd._propagate();\n    assert!(\n        cmd.get_subcommands()\n            .find(|s| s.get_name() == \"subcmd\")\n            .unwrap()\n            .is_disable_version_flag_set()\n    );\n}\n\n// This test will *fail to compile* if Command is not Send + Sync\n#[test]\nfn app_send_sync() {\n    fn foo<T: Send + Sync>(_: T) {}\n    foo(Command::new(\"test\"));\n}\n\n#[test]\nfn issue_2090() {\n    let mut cmd = Command::new(\"cmd\")\n        .disable_version_flag(true)\n        .subcommand(Command::new(\"sub\"));\n    cmd._build_self(false);\n\n    assert!(\n        cmd.get_subcommands()\n            .next()\n            .unwrap()\n            .is_disable_version_flag_set()\n    );\n}\n\n// This test will *fail to compile* if Arg is not Send + Sync\n#[test]\nfn arg_send_sync() {\n    fn foo<T: Send + Sync>(_: T) {}\n    foo(Arg::new(\"test\"));\n}\n"
  },
  {
    "path": "clap_builder/src/builder/value_hint.rs",
    "content": "use std::str::FromStr;\n\n/// Provide shell with hint on how to complete an argument.\n///\n/// See [`Arg::value_hint`][crate::Arg::value_hint] to set this on an argument.\n///\n/// See the `clap_complete` crate for completion script generation.\n///\n/// Overview of which hints are supported by which shell:\n///\n/// | Hint                   | zsh | fish[^1] | dynamic |\n/// | ---------------------- | --- | ---------|---------|\n/// | `AnyPath`              | Yes | Yes      | Yes     |\n/// | `FilePath`             | Yes | Yes      | Yes     |\n/// | `DirPath`              | Yes | Yes      | Yes     |\n/// | `ExecutablePath`       | Yes | Partial  | Yes     |\n/// | `CommandName`          | Yes | Yes      | No      |\n/// | `CommandString`        | Yes | Partial  | No      |\n/// | `CommandWithArguments` | Yes |          | No      |\n/// | `Username`             | Yes | Yes      | No      |\n/// | `Hostname`             | Yes | Yes      | No      |\n/// | `Url`                  | Yes |          | No      |\n/// | `EmailAddress`         | Yes |          | No      |\n///\n/// [^1]: fish completions currently only support named arguments (e.g. -o or --opt), not\n///       positional arguments.\n#[derive(Debug, Default, PartialEq, Eq, Hash, Copy, Clone)]\n#[non_exhaustive]\npub enum ValueHint {\n    /// Default value if hint is not specified. Follows shell default behavior, which is usually\n    /// auto-completing filenames.\n    #[default]\n    Unknown,\n    /// None of the hints below apply. Disables shell completion for this argument.\n    Other,\n    /// Any existing path.\n    AnyPath,\n    /// Path to a file.\n    FilePath,\n    /// Path to a directory.\n    DirPath,\n    /// Path to an executable file.\n    ExecutablePath,\n    /// Name of a command, without arguments. May be relative to PATH, or full path to executable.\n    CommandName,\n    /// A single string containing a command and its arguments.\n    CommandString,\n    /// Capture the remaining arguments as a command name and arguments for that command. This is\n    /// common when writing shell wrappers that execute another command, for example `sudo` or `env`.\n    ///\n    /// This hint is special, the argument must be a positional argument and have\n    /// [`.num_args(1..)`] and Command must use [`Command::trailing_var_arg(true)`]. The result is that the\n    /// command line `my_app ls -la /` will be parsed as `[\"ls\", \"-la\", \"/\"]` and clap won't try to\n    /// parse the `-la` argument itself.\n    ///\n    /// [`Command::trailing_var_arg(true)`]: crate::Command::trailing_var_arg\n    /// [`.num_args(1..)`]: crate::Arg::num_args()\n    CommandWithArguments,\n    /// Name of a local operating system user.\n    Username,\n    /// Host name of a computer.\n    /// Shells usually parse `/etc/hosts` and `.ssh/known_hosts` to complete hostnames.\n    Hostname,\n    /// Complete web address.\n    Url,\n    /// Email address.\n    EmailAddress,\n}\n\n#[cfg(feature = \"unstable-ext\")]\nimpl crate::builder::ArgExt for ValueHint {}\n\nimpl FromStr for ValueHint {\n    type Err = String;\n    fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {\n        Ok(match &*s.to_ascii_lowercase() {\n            \"unknown\" => ValueHint::Unknown,\n            \"other\" => ValueHint::Other,\n            \"anypath\" => ValueHint::AnyPath,\n            \"filepath\" => ValueHint::FilePath,\n            \"dirpath\" => ValueHint::DirPath,\n            \"executablepath\" => ValueHint::ExecutablePath,\n            \"commandname\" => ValueHint::CommandName,\n            \"commandstring\" => ValueHint::CommandString,\n            \"commandwitharguments\" => ValueHint::CommandWithArguments,\n            \"username\" => ValueHint::Username,\n            \"hostname\" => ValueHint::Hostname,\n            \"url\" => ValueHint::Url,\n            \"emailaddress\" => ValueHint::EmailAddress,\n            _ => return Err(format!(\"unknown ValueHint: `{s}`\")),\n        })\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/builder/value_parser.rs",
    "content": "use std::convert::TryInto;\nuse std::ops::RangeBounds;\n\nuse crate::builder::Str;\nuse crate::builder::StyledStr;\nuse crate::parser::ValueSource;\nuse crate::util::AnyValue;\nuse crate::util::AnyValueId;\n\n/// Parse/validate argument values\n///\n/// Specified with [`Arg::value_parser`][crate::Arg::value_parser].\n///\n/// `ValueParser` defines how to convert a raw argument value into a validated and typed value for\n/// use within an application.\n///\n/// See\n/// - [`value_parser!`][crate::value_parser] for automatically selecting an implementation for a given type\n/// - [`ValueParser::new`] for additional [`TypedValueParser`] that can be used\n///\n/// # Example\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"color\")\n///             .long(\"color\")\n///             .value_parser([\"always\", \"auto\", \"never\"])\n///             .default_value(\"auto\")\n///     )\n///     .arg(\n///         clap::Arg::new(\"hostname\")\n///             .long(\"hostname\")\n///             .value_parser(clap::builder::NonEmptyStringValueParser::new())\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     )\n///     .arg(\n///         clap::Arg::new(\"port\")\n///             .long(\"port\")\n///             .value_parser(clap::value_parser!(u16).range(3000..))\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut(\n///     [\"cmd\", \"--hostname\", \"rust-lang.org\", \"--port\", \"3001\"]\n/// ).unwrap();\n///\n/// let color: &String = m.get_one(\"color\")\n///     .expect(\"default\");\n/// assert_eq!(color, \"auto\");\n///\n/// let hostname: &String = m.get_one(\"hostname\")\n///     .expect(\"required\");\n/// assert_eq!(hostname, \"rust-lang.org\");\n///\n/// let port: u16 = *m.get_one(\"port\")\n///     .expect(\"required\");\n/// assert_eq!(port, 3001);\n/// ```\npub struct ValueParser(ValueParserInner);\n\nenum ValueParserInner {\n    // Common enough to optimize and for possible values\n    Bool,\n    // Common enough to optimize\n    String,\n    // Common enough to optimize\n    OsString,\n    // Common enough to optimize\n    PathBuf,\n    Other(Box<dyn AnyValueParser>),\n}\n\nimpl ValueParser {\n    /// Custom parser for argument values\n    ///\n    /// Pre-existing [`TypedValueParser`] implementations include:\n    /// - `Fn(&str) -> Result<T, E>`\n    /// - [`EnumValueParser`] and  [`PossibleValuesParser`] for static enumerated values\n    /// - [`BoolishValueParser`] and [`FalseyValueParser`] for alternative `bool` implementations\n    /// - [`RangedI64ValueParser`] and [`RangedU64ValueParser`]\n    /// - [`NonEmptyStringValueParser`]\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// type EnvVar = (String, Option<String>);\n    /// fn parse_env_var(env: &str) -> Result<EnvVar, std::io::Error> {\n    ///     if let Some((var, value)) = env.split_once('=') {\n    ///         Ok((var.to_owned(), Some(value.to_owned())))\n    ///     } else {\n    ///         Ok((env.to_owned(), None))\n    ///     }\n    /// }\n    ///\n    /// let mut cmd = clap::Command::new(\"raw\")\n    ///     .arg(\n    ///         clap::Arg::new(\"env\")\n    ///             .value_parser(clap::builder::ValueParser::new(parse_env_var))\n    ///             .required(true)\n    ///     );\n    ///\n    /// let m = cmd.try_get_matches_from_mut([\"cmd\", \"key=value\"]).unwrap();\n    /// let port: &EnvVar = m.get_one(\"env\")\n    ///     .expect(\"required\");\n    /// assert_eq!(*port, (\"key\".into(), Some(\"value\".into())));\n    /// ```\n    pub fn new<P>(other: P) -> Self\n    where\n        P: TypedValueParser,\n    {\n        Self(ValueParserInner::Other(Box::new(other)))\n    }\n\n    /// [`bool`] parser for argument values\n    ///\n    /// See also:\n    /// - [`BoolishValueParser`] for different human readable bool representations\n    /// - [`FalseyValueParser`] for assuming non-false is true\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// let mut cmd = clap::Command::new(\"raw\")\n    ///     .arg(\n    ///         clap::Arg::new(\"download\")\n    ///             .value_parser(clap::value_parser!(bool))\n    ///             .required(true)\n    ///     );\n    ///\n    /// let m = cmd.try_get_matches_from_mut([\"cmd\", \"true\"]).unwrap();\n    /// let port: bool = *m.get_one(\"download\")\n    ///     .expect(\"required\");\n    /// assert_eq!(port, true);\n    ///\n    /// assert!(cmd.try_get_matches_from_mut([\"cmd\", \"forever\"]).is_err());\n    /// ```\n    pub const fn bool() -> Self {\n        Self(ValueParserInner::Bool)\n    }\n\n    /// [`String`] parser for argument values\n    ///\n    /// See also:\n    /// - [`NonEmptyStringValueParser`]\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// let mut cmd = clap::Command::new(\"raw\")\n    ///     .arg(\n    ///         clap::Arg::new(\"port\")\n    ///             .value_parser(clap::value_parser!(String))\n    ///             .required(true)\n    ///     );\n    ///\n    /// let m = cmd.try_get_matches_from_mut([\"cmd\", \"80\"]).unwrap();\n    /// let port: &String = m.get_one(\"port\")\n    ///     .expect(\"required\");\n    /// assert_eq!(port, \"80\");\n    /// ```\n    pub const fn string() -> Self {\n        Self(ValueParserInner::String)\n    }\n\n    /// [`OsString`][std::ffi::OsString] parser for argument values\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # #[cfg(unix)] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, builder::ValueParser};\n    /// use std::ffi::OsString;\n    /// use std::os::unix::ffi::{OsStrExt,OsStringExt};\n    /// let r = Command::new(\"myprog\")\n    ///     .arg(\n    ///         Arg::new(\"arg\")\n    ///         .required(true)\n    ///         .value_parser(ValueParser::os_string())\n    ///     )\n    ///     .try_get_matches_from(vec![\n    ///         OsString::from(\"myprog\"),\n    ///         OsString::from_vec(vec![0xe9])\n    ///     ]);\n    ///\n    /// assert!(r.is_ok());\n    /// let m = r.unwrap();\n    /// let arg: &OsString = m.get_one(\"arg\")\n    ///     .expect(\"required\");\n    /// assert_eq!(arg.as_bytes(), &[0xe9]);\n    /// # }\n    /// ```\n    pub const fn os_string() -> Self {\n        Self(ValueParserInner::OsString)\n    }\n\n    /// [`PathBuf`][std::path::PathBuf] parser for argument values\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::path::PathBuf;\n    /// # use std::path::Path;\n    /// let mut cmd = clap::Command::new(\"raw\")\n    ///     .arg(\n    ///         clap::Arg::new(\"output\")\n    ///             .value_parser(clap::value_parser!(PathBuf))\n    ///             .required(true)\n    ///     );\n    ///\n    /// let m = cmd.try_get_matches_from_mut([\"cmd\", \"hello.txt\"]).unwrap();\n    /// let port: &PathBuf = m.get_one(\"output\")\n    ///     .expect(\"required\");\n    /// assert_eq!(port, Path::new(\"hello.txt\"));\n    ///\n    /// assert!(cmd.try_get_matches_from_mut([\"cmd\", \"\"]).is_err());\n    /// ```\n    pub const fn path_buf() -> Self {\n        Self(ValueParserInner::PathBuf)\n    }\n}\n\nimpl ValueParser {\n    /// Parse into a `AnyValue`\n    ///\n    /// When `arg` is `None`, an external subcommand value is being parsed.\n    pub(crate) fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n        source: ValueSource,\n    ) -> Result<AnyValue, crate::Error> {\n        self.any_value_parser().parse_ref_(cmd, arg, value, source)\n    }\n\n    /// Describes the content of `AnyValue`\n    pub fn type_id(&self) -> AnyValueId {\n        self.any_value_parser().type_id()\n    }\n\n    /// Reflect on enumerated value properties\n    ///\n    /// Error checking should not be done with this; it is mostly targeted at user-facing\n    /// applications like errors and completion.\n    pub fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        self.any_value_parser().possible_values()\n    }\n\n    fn any_value_parser(&self) -> &dyn AnyValueParser {\n        match &self.0 {\n            ValueParserInner::Bool => &BoolValueParser {},\n            ValueParserInner::String => &StringValueParser {},\n            ValueParserInner::OsString => &OsStringValueParser {},\n            ValueParserInner::PathBuf => &PathBufValueParser {},\n            ValueParserInner::Other(o) => o.as_ref(),\n        }\n    }\n}\n\n/// Convert a [`TypedValueParser`] to [`ValueParser`]\n///\n/// # Example\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"hostname\")\n///             .long(\"hostname\")\n///             .value_parser(clap::builder::NonEmptyStringValueParser::new())\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut(\n///     [\"cmd\", \"--hostname\", \"rust-lang.org\"]\n/// ).unwrap();\n///\n/// let hostname: &String = m.get_one(\"hostname\")\n///     .expect(\"required\");\n/// assert_eq!(hostname, \"rust-lang.org\");\n/// ```\nimpl<P> From<P> for ValueParser\nwhere\n    P: TypedValueParser + Send + Sync + 'static,\n{\n    fn from(p: P) -> Self {\n        Self::new(p)\n    }\n}\n\nimpl From<_AnonymousValueParser> for ValueParser {\n    fn from(p: _AnonymousValueParser) -> Self {\n        p.0\n    }\n}\n\n/// Create an `i64` [`ValueParser`] from a `N..M` range\n///\n/// See [`RangedI64ValueParser`] for more control over the output type.\n///\n/// See also [`RangedU64ValueParser`]\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"port\")\n///             .long(\"port\")\n///             .value_parser(3000..4000)\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"--port\", \"3001\"]).unwrap();\n/// let port: i64 = *m.get_one(\"port\")\n///     .expect(\"required\");\n/// assert_eq!(port, 3001);\n/// ```\nimpl From<std::ops::Range<i64>> for ValueParser {\n    fn from(value: std::ops::Range<i64>) -> Self {\n        let inner = RangedI64ValueParser::<i64>::new().range(value.start..value.end);\n        Self::from(inner)\n    }\n}\n\n/// Create an `i64` [`ValueParser`] from a `N..=M` range\n///\n/// See [`RangedI64ValueParser`] for more control over the output type.\n///\n/// See also [`RangedU64ValueParser`]\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"port\")\n///             .long(\"port\")\n///             .value_parser(3000..=4000)\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"--port\", \"3001\"]).unwrap();\n/// let port: i64 = *m.get_one(\"port\")\n///     .expect(\"required\");\n/// assert_eq!(port, 3001);\n/// ```\nimpl From<std::ops::RangeInclusive<i64>> for ValueParser {\n    fn from(value: std::ops::RangeInclusive<i64>) -> Self {\n        let inner = RangedI64ValueParser::<i64>::new().range(value.start()..=value.end());\n        Self::from(inner)\n    }\n}\n\n/// Create an `i64` [`ValueParser`] from a `N..` range\n///\n/// See [`RangedI64ValueParser`] for more control over the output type.\n///\n/// See also [`RangedU64ValueParser`]\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"port\")\n///             .long(\"port\")\n///             .value_parser(3000..)\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"--port\", \"3001\"]).unwrap();\n/// let port: i64 = *m.get_one(\"port\")\n///     .expect(\"required\");\n/// assert_eq!(port, 3001);\n/// ```\nimpl From<std::ops::RangeFrom<i64>> for ValueParser {\n    fn from(value: std::ops::RangeFrom<i64>) -> Self {\n        let inner = RangedI64ValueParser::<i64>::new().range(value.start..);\n        Self::from(inner)\n    }\n}\n\n/// Create an `i64` [`ValueParser`] from a `..M` range\n///\n/// See [`RangedI64ValueParser`] for more control over the output type.\n///\n/// See also [`RangedU64ValueParser`]\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"port\")\n///             .long(\"port\")\n///             .value_parser(..3000)\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"--port\", \"80\"]).unwrap();\n/// let port: i64 = *m.get_one(\"port\")\n///     .expect(\"required\");\n/// assert_eq!(port, 80);\n/// ```\nimpl From<std::ops::RangeTo<i64>> for ValueParser {\n    fn from(value: std::ops::RangeTo<i64>) -> Self {\n        let inner = RangedI64ValueParser::<i64>::new().range(..value.end);\n        Self::from(inner)\n    }\n}\n\n/// Create an `i64` [`ValueParser`] from a `..=M` range\n///\n/// See [`RangedI64ValueParser`] for more control over the output type.\n///\n/// See also [`RangedU64ValueParser`]\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"port\")\n///             .long(\"port\")\n///             .value_parser(..=3000)\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"--port\", \"80\"]).unwrap();\n/// let port: i64 = *m.get_one(\"port\")\n///     .expect(\"required\");\n/// assert_eq!(port, 80);\n/// ```\nimpl From<std::ops::RangeToInclusive<i64>> for ValueParser {\n    fn from(value: std::ops::RangeToInclusive<i64>) -> Self {\n        let inner = RangedI64ValueParser::<i64>::new().range(..=value.end);\n        Self::from(inner)\n    }\n}\n\n/// Create an `i64` [`ValueParser`] from a `..` range\n///\n/// See [`RangedI64ValueParser`] for more control over the output type.\n///\n/// See also [`RangedU64ValueParser`]\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"port\")\n///             .long(\"port\")\n///             .value_parser(..)\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"--port\", \"3001\"]).unwrap();\n/// let port: i64 = *m.get_one(\"port\")\n///     .expect(\"required\");\n/// assert_eq!(port, 3001);\n/// ```\nimpl From<std::ops::RangeFull> for ValueParser {\n    fn from(value: std::ops::RangeFull) -> Self {\n        let inner = RangedI64ValueParser::<i64>::new().range(value);\n        Self::from(inner)\n    }\n}\n\n/// Create a [`ValueParser`] with [`PossibleValuesParser`]\n///\n/// See [`PossibleValuesParser`] for more flexibility in creating the\n/// [`PossibleValue`][crate::builder::PossibleValue]s.\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"color\")\n///             .long(\"color\")\n///             .value_parser([\"always\", \"auto\", \"never\"])\n///             .default_value(\"auto\")\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut(\n///     [\"cmd\", \"--color\", \"never\"]\n/// ).unwrap();\n///\n/// let color: &String = m.get_one(\"color\")\n///     .expect(\"default\");\n/// assert_eq!(color, \"never\");\n/// ```\nimpl<P, const C: usize> From<[P; C]> for ValueParser\nwhere\n    P: Into<super::PossibleValue>,\n{\n    fn from(values: [P; C]) -> Self {\n        let inner = PossibleValuesParser::from(values);\n        Self::from(inner)\n    }\n}\n\n/// Create a [`ValueParser`] with [`PossibleValuesParser`]\n///\n/// See [`PossibleValuesParser`] for more flexibility in creating the\n/// [`PossibleValue`][crate::builder::PossibleValue]s.\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// let possible = vec![\"always\", \"auto\", \"never\"];\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"color\")\n///             .long(\"color\")\n///             .value_parser(possible)\n///             .default_value(\"auto\")\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut(\n///     [\"cmd\", \"--color\", \"never\"]\n/// ).unwrap();\n///\n/// let color: &String = m.get_one(\"color\")\n///     .expect(\"default\");\n/// assert_eq!(color, \"never\");\n/// ```\nimpl<P> From<Vec<P>> for ValueParser\nwhere\n    P: Into<super::PossibleValue>,\n{\n    fn from(values: Vec<P>) -> Self {\n        let inner = PossibleValuesParser::from(values);\n        Self::from(inner)\n    }\n}\n\nimpl std::fmt::Debug for ValueParser {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {\n        match &self.0 {\n            ValueParserInner::Bool => f.debug_struct(\"ValueParser::bool\").finish(),\n            ValueParserInner::String => f.debug_struct(\"ValueParser::string\").finish(),\n            ValueParserInner::OsString => f.debug_struct(\"ValueParser::os_string\").finish(),\n            ValueParserInner::PathBuf => f.debug_struct(\"ValueParser::path_buf\").finish(),\n            ValueParserInner::Other(o) => write!(f, \"ValueParser::other({:?})\", o.type_id()),\n        }\n    }\n}\n\nimpl Clone for ValueParser {\n    fn clone(&self) -> Self {\n        Self(match &self.0 {\n            ValueParserInner::Bool => ValueParserInner::Bool,\n            ValueParserInner::String => ValueParserInner::String,\n            ValueParserInner::OsString => ValueParserInner::OsString,\n            ValueParserInner::PathBuf => ValueParserInner::PathBuf,\n            ValueParserInner::Other(o) => ValueParserInner::Other(o.clone_any()),\n        })\n    }\n}\n\n/// A type-erased wrapper for [`TypedValueParser`].\ntrait AnyValueParser: Send + Sync + 'static {\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<AnyValue, crate::Error>;\n\n    fn parse_ref_(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n        _source: ValueSource,\n    ) -> Result<AnyValue, crate::Error> {\n        self.parse_ref(cmd, arg, value)\n    }\n\n    /// Describes the content of `AnyValue`\n    fn type_id(&self) -> AnyValueId;\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>>;\n\n    fn clone_any(&self) -> Box<dyn AnyValueParser>;\n}\n\nimpl<T, P> AnyValueParser for P\nwhere\n    T: std::any::Any + Clone + Send + Sync + 'static,\n    P: TypedValueParser<Value = T>,\n{\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<AnyValue, crate::Error> {\n        let value = ok!(TypedValueParser::parse_ref(self, cmd, arg, value));\n        Ok(AnyValue::new(value))\n    }\n\n    fn parse_ref_(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n        source: ValueSource,\n    ) -> Result<AnyValue, crate::Error> {\n        let value = ok!(TypedValueParser::parse_ref_(self, cmd, arg, value, source));\n        Ok(AnyValue::new(value))\n    }\n\n    fn type_id(&self) -> AnyValueId {\n        AnyValueId::of::<T>()\n    }\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        P::possible_values(self)\n    }\n\n    fn clone_any(&self) -> Box<dyn AnyValueParser> {\n        Box::new(self.clone())\n    }\n}\n\n/// Parse/validate argument values\n///\n/// As alternatives to implementing `TypedValueParser`,\n/// - Use `Fn(&str) -> Result<T, E>` which implements `TypedValueParser`\n/// - [`TypedValueParser::map`] or [`TypedValueParser::try_map`] to adapt an existing `TypedValueParser`\n///\n/// See `ValueParserFactory` to register `TypedValueParser::Value` with\n/// [`value_parser!`][crate::value_parser].\n///\n/// # Example\n///\n/// ```rust\n/// # #[cfg(feature = \"error-context\")] {\n/// # use clap_builder as clap;\n/// # use clap::error::ErrorKind;\n/// # use clap::error::ContextKind;\n/// # use clap::error::ContextValue;\n/// #[derive(Clone)]\n/// struct Custom(u32);\n///\n/// #[derive(Clone)]\n/// struct CustomValueParser;\n///\n/// impl clap::builder::TypedValueParser for CustomValueParser {\n///     type Value = Custom;\n///\n///     fn parse_ref(\n///         &self,\n///         cmd: &clap::Command,\n///         arg: Option<&clap::Arg>,\n///         value: &std::ffi::OsStr,\n///     ) -> Result<Self::Value, clap::Error> {\n///         let inner = clap::value_parser!(u32);\n///         let val = inner.parse_ref(cmd, arg, value)?;\n///\n///         const INVALID_VALUE: u32 = 10;\n///         if val == INVALID_VALUE {\n///             let mut err = clap::Error::new(ErrorKind::ValueValidation)\n///                 .with_cmd(cmd);\n///             if let Some(arg) = arg {\n///                 err.insert(ContextKind::InvalidArg, ContextValue::String(arg.to_string()));\n///             }\n///             err.insert(ContextKind::InvalidValue, ContextValue::String(INVALID_VALUE.to_string()));\n///             return Err(err);\n///         }\n///\n///         Ok(Custom(val))\n///     }\n/// }\n/// # }\n/// ```\npub trait TypedValueParser: Clone + Send + Sync + 'static {\n    /// Argument's value type\n    type Value: Send + Sync + Clone;\n\n    /// Parse the argument value\n    ///\n    /// When `arg` is `None`, an external subcommand value is being parsed.\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error>;\n\n    /// Parse the argument value\n    ///\n    /// When `arg` is `None`, an external subcommand value is being parsed.\n    fn parse_ref_(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n        _source: ValueSource,\n    ) -> Result<Self::Value, crate::Error> {\n        self.parse_ref(cmd, arg, value)\n    }\n\n    /// Parse the argument value\n    ///\n    /// When `arg` is `None`, an external subcommand value is being parsed.\n    fn parse(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: std::ffi::OsString,\n    ) -> Result<Self::Value, crate::Error> {\n        self.parse_ref(cmd, arg, &value)\n    }\n\n    /// Parse the argument value\n    ///\n    /// When `arg` is `None`, an external subcommand value is being parsed.\n    fn parse_(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: std::ffi::OsString,\n        _source: ValueSource,\n    ) -> Result<Self::Value, crate::Error> {\n        self.parse(cmd, arg, value)\n    }\n\n    /// Reflect on enumerated value properties\n    ///\n    /// Error checking should not be done with this; it is mostly targeted at user-facing\n    /// applications like errors and completion.\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        None\n    }\n\n    /// Adapt a `TypedValueParser` from one value to another\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// # use clap::builder::TypedValueParser as _;\n    /// # use clap::builder::BoolishValueParser;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::SetTrue)\n    ///             .value_parser(\n    ///                 BoolishValueParser::new()\n    ///                 .map(|b| -> usize {\n    ///                     if b { 10 } else { 5 }\n    ///                 })\n    ///             )\n    ///     );\n    ///\n    /// let matches = cmd.clone().try_get_matches_from([\"mycmd\", \"--flag\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_one::<usize>(\"flag\").copied(),\n    ///     Some(10)\n    /// );\n    ///\n    /// let matches = cmd.try_get_matches_from([\"mycmd\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_one::<usize>(\"flag\").copied(),\n    ///     Some(5)\n    /// );\n    /// ```\n    fn map<T, F>(self, func: F) -> MapValueParser<Self, F>\n    where\n        T: Send + Sync + Clone,\n        F: Fn(Self::Value) -> T + Clone,\n    {\n        MapValueParser::new(self, func)\n    }\n\n    /// Adapt a `TypedValueParser` from one value to another\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::ffi::OsString;\n    /// # use std::ffi::OsStr;\n    /// # use std::path::PathBuf;\n    /// # use std::path::Path;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// # use clap::builder::TypedValueParser as _;\n    /// # use clap::builder::OsStringValueParser;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .value_parser(\n    ///                 OsStringValueParser::new()\n    ///                 .try_map(verify_ext)\n    ///             )\n    ///     );\n    ///\n    /// fn verify_ext(os: OsString) -> Result<PathBuf, &'static str> {\n    ///     let path = PathBuf::from(os);\n    ///     if path.extension() != Some(OsStr::new(\"rs\")) {\n    ///         return Err(\"only Rust files are supported\");\n    ///     }\n    ///     Ok(path)\n    /// }\n    ///\n    /// let error = cmd.clone().try_get_matches_from([\"mycmd\", \"--flag\", \"foo.txt\"]).unwrap_err();\n    /// error.print();\n    ///\n    /// let matches = cmd.try_get_matches_from([\"mycmd\", \"--flag\", \"foo.rs\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_one::<PathBuf>(\"flag\").map(|s| s.as_path()),\n    ///     Some(Path::new(\"foo.rs\"))\n    /// );\n    /// ```\n    fn try_map<T, E, F>(self, func: F) -> TryMapValueParser<Self, F>\n    where\n        F: Fn(Self::Value) -> Result<T, E> + Clone + Send + Sync + 'static,\n        T: Send + Sync + Clone,\n        E: Into<Box<dyn std::error::Error + Send + Sync + 'static>>,\n    {\n        TryMapValueParser::new(self, func)\n    }\n}\n\nimpl<F, T, E> TypedValueParser for F\nwhere\n    F: Fn(&str) -> Result<T, E> + Clone + Send + Sync + 'static,\n    E: Into<Box<dyn std::error::Error + Send + Sync + 'static>>,\n    T: Send + Sync + Clone,\n{\n    type Value = T;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        let value = ok!(value.to_str().ok_or_else(|| {\n            crate::Error::invalid_utf8(\n                cmd,\n                crate::output::Usage::new(cmd).create_usage_with_title(&[]),\n            )\n        }));\n        let value = ok!((self)(value).map_err(|e| {\n            let arg = arg\n                .map(|a| a.to_string())\n                .unwrap_or_else(|| \"...\".to_owned());\n            crate::Error::value_validation(arg, value.to_owned(), e.into()).with_cmd(cmd)\n        }));\n        Ok(value)\n    }\n}\n\n/// Implementation for [`ValueParser::string`]\n///\n/// Useful for composing new [`TypedValueParser`]s\n#[derive(Copy, Clone, Debug)]\n#[non_exhaustive]\npub struct StringValueParser {}\n\nimpl StringValueParser {\n    /// Implementation for [`ValueParser::string`]\n    pub fn new() -> Self {\n        Self {}\n    }\n}\n\nimpl TypedValueParser for StringValueParser {\n    type Value = String;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        TypedValueParser::parse(self, cmd, arg, value.to_owned())\n    }\n\n    fn parse(\n        &self,\n        cmd: &crate::Command,\n        _arg: Option<&crate::Arg>,\n        value: std::ffi::OsString,\n    ) -> Result<Self::Value, crate::Error> {\n        let value = ok!(value.into_string().map_err(|_| {\n            crate::Error::invalid_utf8(\n                cmd,\n                crate::output::Usage::new(cmd).create_usage_with_title(&[]),\n            )\n        }));\n        Ok(value)\n    }\n}\n\nimpl Default for StringValueParser {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Implementation for [`ValueParser::os_string`]\n///\n/// Useful for composing new [`TypedValueParser`]s\n#[derive(Copy, Clone, Debug)]\n#[non_exhaustive]\npub struct OsStringValueParser {}\n\nimpl OsStringValueParser {\n    /// Implementation for [`ValueParser::os_string`]\n    pub fn new() -> Self {\n        Self {}\n    }\n}\n\nimpl TypedValueParser for OsStringValueParser {\n    type Value = std::ffi::OsString;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        TypedValueParser::parse(self, cmd, arg, value.to_owned())\n    }\n\n    fn parse(\n        &self,\n        _cmd: &crate::Command,\n        _arg: Option<&crate::Arg>,\n        value: std::ffi::OsString,\n    ) -> Result<Self::Value, crate::Error> {\n        Ok(value)\n    }\n}\n\nimpl Default for OsStringValueParser {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Implementation for [`ValueParser::path_buf`]\n///\n/// Useful for composing new [`TypedValueParser`]s\n#[derive(Copy, Clone, Debug)]\n#[non_exhaustive]\npub struct PathBufValueParser {}\n\nimpl PathBufValueParser {\n    /// Implementation for [`ValueParser::path_buf`]\n    pub fn new() -> Self {\n        Self {}\n    }\n}\n\nimpl TypedValueParser for PathBufValueParser {\n    type Value = std::path::PathBuf;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        TypedValueParser::parse(self, cmd, arg, value.to_owned())\n    }\n\n    fn parse(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: std::ffi::OsString,\n    ) -> Result<Self::Value, crate::Error> {\n        if value.is_empty() {\n            return Err(crate::Error::empty_value(\n                cmd,\n                &[],\n                arg.map(ToString::to_string)\n                    .unwrap_or_else(|| \"...\".to_owned()),\n            ));\n        }\n        Ok(Self::Value::from(value))\n    }\n}\n\nimpl Default for PathBufValueParser {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Parse an [`ValueEnum`][crate::ValueEnum] value.\n///\n/// See also:\n/// - [`PossibleValuesParser`]\n///\n/// # Example\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use std::ffi::OsStr;\n/// # use clap::ColorChoice;\n/// # use clap::builder::TypedValueParser;\n/// # let cmd = clap::Command::new(\"test\");\n/// # let arg = None;\n///\n/// // Usage\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"color\")\n///             .value_parser(clap::builder::EnumValueParser::<ColorChoice>::new())\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"always\"]).unwrap();\n/// let port: ColorChoice = *m.get_one(\"color\")\n///     .expect(\"required\");\n/// assert_eq!(port, ColorChoice::Always);\n///\n/// // Semantics\n/// let value_parser = clap::builder::EnumValueParser::<ColorChoice>::new();\n/// // or\n/// let value_parser = clap::value_parser!(ColorChoice);\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"random\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"\")).is_err());\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"always\")).unwrap(), ColorChoice::Always);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"auto\")).unwrap(), ColorChoice::Auto);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"never\")).unwrap(), ColorChoice::Never);\n/// ```\n#[derive(Clone, Debug)]\npub struct EnumValueParser<E: crate::ValueEnum + Clone + Send + Sync + 'static>(\n    std::marker::PhantomData<E>,\n);\n\nimpl<E: crate::ValueEnum + Clone + Send + Sync + 'static> EnumValueParser<E> {\n    /// Parse an [`ValueEnum`][crate::ValueEnum]\n    pub fn new() -> Self {\n        let phantom: std::marker::PhantomData<E> = Default::default();\n        Self(phantom)\n    }\n}\n\nimpl<E: crate::ValueEnum + Clone + Send + Sync + 'static> TypedValueParser for EnumValueParser<E> {\n    type Value = E;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        let ignore_case = arg.map(|a| a.is_ignore_case_set()).unwrap_or(false);\n        let possible_vals = || {\n            E::value_variants()\n                .iter()\n                .filter_map(|v| v.to_possible_value())\n                .filter(|v| !v.is_hide_set())\n                .map(|v| v.get_name().to_owned())\n                .collect::<Vec<_>>()\n        };\n\n        let value = ok!(value.to_str().ok_or_else(|| {\n            crate::Error::invalid_value(\n                cmd,\n                value.to_string_lossy().into_owned(),\n                &possible_vals(),\n                arg.map(ToString::to_string)\n                    .unwrap_or_else(|| \"...\".to_owned()),\n            )\n        }));\n        let value = ok!(E::value_variants()\n            .iter()\n            .find(|v| {\n                v.to_possible_value()\n                    .expect(\"ValueEnum::value_variants contains only values with a corresponding ValueEnum::to_possible_value\")\n                    .matches(value, ignore_case)\n            })\n            .ok_or_else(|| {\n            crate::Error::invalid_value(\n                cmd,\n                value.to_owned(),\n                &possible_vals(),\n                arg.map(ToString::to_string)\n                    .unwrap_or_else(|| \"...\".to_owned()),\n            )\n            }))\n            .clone();\n        Ok(value)\n    }\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        Some(Box::new(\n            E::value_variants()\n                .iter()\n                .filter_map(|v| v.to_possible_value()),\n        ))\n    }\n}\n\nimpl<E: crate::ValueEnum + Clone + Send + Sync + 'static> Default for EnumValueParser<E> {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Verify the value is from an enumerated set of [`PossibleValue`][crate::builder::PossibleValue].\n///\n/// See also:\n/// - [`EnumValueParser`] for directly supporting [`ValueEnum`][crate::ValueEnum] types\n/// - [`TypedValueParser::map`] for adapting values to a more specialized type, like an external\n///   enums that can't implement [`ValueEnum`][crate::ValueEnum]\n///\n/// # Example\n///\n/// Usage:\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"color\")\n///             .value_parser(clap::builder::PossibleValuesParser::new([\"always\", \"auto\", \"never\"]))\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"always\"]).unwrap();\n/// let port: &String = m.get_one(\"color\")\n///     .expect(\"required\");\n/// assert_eq!(port, \"always\");\n/// ```\n///\n/// Semantics:\n/// ```rust\n/// # use clap_builder as clap;\n/// # use std::ffi::OsStr;\n/// # use clap::builder::TypedValueParser;\n/// # let cmd = clap::Command::new(\"test\");\n/// # let arg = None;\n/// let value_parser = clap::builder::PossibleValuesParser::new([\"always\", \"auto\", \"never\"]);\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"random\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"\")).is_err());\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"always\")).unwrap(), \"always\");\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"auto\")).unwrap(), \"auto\");\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"never\")).unwrap(), \"never\");\n/// ```\n#[derive(Clone, Debug)]\npub struct PossibleValuesParser(Vec<super::PossibleValue>);\n\nimpl PossibleValuesParser {\n    /// Verify the value is from an enumerated set of [`PossibleValue`][crate::builder::PossibleValue].\n    pub fn new(values: impl Into<PossibleValuesParser>) -> Self {\n        values.into()\n    }\n}\n\nimpl TypedValueParser for PossibleValuesParser {\n    type Value = String;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        TypedValueParser::parse(self, cmd, arg, value.to_owned())\n    }\n\n    fn parse(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: std::ffi::OsString,\n    ) -> Result<String, crate::Error> {\n        let value = ok!(value.into_string().map_err(|_| {\n            crate::Error::invalid_utf8(\n                cmd,\n                crate::output::Usage::new(cmd).create_usage_with_title(&[]),\n            )\n        }));\n\n        let ignore_case = arg.map(|a| a.is_ignore_case_set()).unwrap_or(false);\n        if self.0.iter().any(|v| v.matches(&value, ignore_case)) {\n            Ok(value)\n        } else {\n            let possible_vals = self\n                .0\n                .iter()\n                .filter(|v| !v.is_hide_set())\n                .map(|v| v.get_name().to_owned())\n                .collect::<Vec<_>>();\n\n            Err(crate::Error::invalid_value(\n                cmd,\n                value,\n                &possible_vals,\n                arg.map(ToString::to_string)\n                    .unwrap_or_else(|| \"...\".to_owned()),\n            ))\n        }\n    }\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        Some(Box::new(self.0.iter().cloned()))\n    }\n}\n\nimpl<I, T> From<I> for PossibleValuesParser\nwhere\n    I: IntoIterator<Item = T>,\n    T: Into<super::PossibleValue>,\n{\n    fn from(values: I) -> Self {\n        Self(values.into_iter().map(|t| t.into()).collect())\n    }\n}\n\n/// Parse number that fall within a range of values\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** To capture negative values, you will also need to set\n/// [`Arg::allow_negative_numbers`][crate::Arg::allow_negative_numbers] or\n/// [`Arg::allow_hyphen_values`][crate::Arg::allow_hyphen_values].\n///\n/// </div>\n///\n/// # Example\n///\n/// Usage:\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"port\")\n///             .long(\"port\")\n///             .value_parser(clap::value_parser!(u16).range(3000..))\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"--port\", \"3001\"]).unwrap();\n/// let port: u16 = *m.get_one(\"port\")\n///     .expect(\"required\");\n/// assert_eq!(port, 3001);\n/// ```\n///\n/// Semantics:\n/// ```rust\n/// # use clap_builder as clap;\n/// # use std::ffi::OsStr;\n/// # use clap::builder::TypedValueParser;\n/// # let cmd = clap::Command::new(\"test\");\n/// # let arg = None;\n/// let value_parser = clap::builder::RangedI64ValueParser::<i32>::new().range(-1..200);\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"random\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"-200\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"300\")).is_err());\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"-1\")).unwrap(), -1);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"0\")).unwrap(), 0);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"50\")).unwrap(), 50);\n/// ```\n#[derive(Copy, Clone, Debug)]\npub struct RangedI64ValueParser<T: TryFrom<i64> + Clone + Send + Sync = i64> {\n    bounds: (std::ops::Bound<i64>, std::ops::Bound<i64>),\n    target: std::marker::PhantomData<T>,\n}\n\nimpl<T: TryFrom<i64> + Clone + Send + Sync> RangedI64ValueParser<T> {\n    /// Select full range of `i64`\n    pub fn new() -> Self {\n        Self::from(..)\n    }\n\n    /// Narrow the supported range\n    pub fn range<B: RangeBounds<i64>>(mut self, range: B) -> Self {\n        // Consideration: when the user does `value_parser!(u8).range()`\n        // - Avoid programming mistakes by accidentally expanding the range\n        // - Make it convenient to limit the range like with `..10`\n        let start = match range.start_bound() {\n            l @ std::ops::Bound::Included(i) => {\n                debug_assert!(\n                    self.bounds.contains(i),\n                    \"{} must be in {:?}\",\n                    i,\n                    self.bounds\n                );\n                l.cloned()\n            }\n            l @ std::ops::Bound::Excluded(i) => {\n                debug_assert!(\n                    self.bounds.contains(&i.saturating_add(1)),\n                    \"{} must be in {:?}\",\n                    i,\n                    self.bounds\n                );\n                l.cloned()\n            }\n            std::ops::Bound::Unbounded => self.bounds.start_bound().cloned(),\n        };\n        let end = match range.end_bound() {\n            l @ std::ops::Bound::Included(i) => {\n                debug_assert!(\n                    self.bounds.contains(i),\n                    \"{} must be in {:?}\",\n                    i,\n                    self.bounds\n                );\n                l.cloned()\n            }\n            l @ std::ops::Bound::Excluded(i) => {\n                debug_assert!(\n                    self.bounds.contains(&i.saturating_sub(1)),\n                    \"{} must be in {:?}\",\n                    i,\n                    self.bounds\n                );\n                l.cloned()\n            }\n            std::ops::Bound::Unbounded => self.bounds.end_bound().cloned(),\n        };\n        self.bounds = (start, end);\n        self\n    }\n\n    fn format_bounds(&self) -> String {\n        let mut result = match self.bounds.0 {\n            std::ops::Bound::Included(i) => i.to_string(),\n            std::ops::Bound::Excluded(i) => i.saturating_add(1).to_string(),\n            std::ops::Bound::Unbounded => i64::MIN.to_string(),\n        };\n        result.push_str(\"..\");\n        match self.bounds.1 {\n            std::ops::Bound::Included(i) => {\n                result.push('=');\n                result.push_str(&i.to_string());\n            }\n            std::ops::Bound::Excluded(i) => {\n                result.push_str(&i.to_string());\n            }\n            std::ops::Bound::Unbounded => {\n                result.push_str(&i64::MAX.to_string());\n            }\n        }\n        result\n    }\n}\n\nimpl<T: TryFrom<i64> + Clone + Send + Sync + 'static> TypedValueParser for RangedI64ValueParser<T>\nwhere\n    <T as TryFrom<i64>>::Error: Send + Sync + 'static + std::error::Error + ToString,\n{\n    type Value = T;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        raw_value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        let value = ok!(raw_value.to_str().ok_or_else(|| {\n            crate::Error::invalid_utf8(\n                cmd,\n                crate::output::Usage::new(cmd).create_usage_with_title(&[]),\n            )\n        }));\n        let value = ok!(value.parse::<i64>().map_err(|err| {\n            let arg = arg\n                .map(|a| a.to_string())\n                .unwrap_or_else(|| \"...\".to_owned());\n            crate::Error::value_validation(\n                arg,\n                raw_value.to_string_lossy().into_owned(),\n                err.into(),\n            )\n            .with_cmd(cmd)\n        }));\n        if !self.bounds.contains(&value) {\n            let arg = arg\n                .map(|a| a.to_string())\n                .unwrap_or_else(|| \"...\".to_owned());\n            return Err(crate::Error::value_validation(\n                arg,\n                raw_value.to_string_lossy().into_owned(),\n                format!(\"{} is not in {}\", value, self.format_bounds()).into(),\n            )\n            .with_cmd(cmd));\n        }\n\n        let value: Result<Self::Value, _> = value.try_into();\n        let value = ok!(value.map_err(|err| {\n            let arg = arg\n                .map(|a| a.to_string())\n                .unwrap_or_else(|| \"...\".to_owned());\n            crate::Error::value_validation(\n                arg,\n                raw_value.to_string_lossy().into_owned(),\n                err.into(),\n            )\n            .with_cmd(cmd)\n        }));\n\n        Ok(value)\n    }\n}\n\nimpl<T: TryFrom<i64> + Clone + Send + Sync, B: RangeBounds<i64>> From<B>\n    for RangedI64ValueParser<T>\n{\n    fn from(range: B) -> Self {\n        Self {\n            bounds: (range.start_bound().cloned(), range.end_bound().cloned()),\n            target: Default::default(),\n        }\n    }\n}\n\nimpl<T: TryFrom<i64> + Clone + Send + Sync> Default for RangedI64ValueParser<T> {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Parse number that fall within a range of values\n///\n/// # Example\n///\n/// Usage:\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"port\")\n///             .long(\"port\")\n///             .value_parser(clap::value_parser!(u64).range(3000..))\n///             .action(clap::ArgAction::Set)\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"--port\", \"3001\"]).unwrap();\n/// let port: u64 = *m.get_one(\"port\")\n///     .expect(\"required\");\n/// assert_eq!(port, 3001);\n/// ```\n///\n/// Semantics:\n/// ```rust\n/// # use clap_builder as clap;\n/// # use std::ffi::OsStr;\n/// # use clap::builder::TypedValueParser;\n/// # let cmd = clap::Command::new(\"test\");\n/// # let arg = None;\n/// let value_parser = clap::builder::RangedU64ValueParser::<u32>::new().range(0..200);\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"random\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"-200\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"300\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"-1\")).is_err());\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"0\")).unwrap(), 0);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"50\")).unwrap(), 50);\n/// ```\n#[derive(Copy, Clone, Debug)]\npub struct RangedU64ValueParser<T: TryFrom<u64> = u64> {\n    bounds: (std::ops::Bound<u64>, std::ops::Bound<u64>),\n    target: std::marker::PhantomData<T>,\n}\n\nimpl<T: TryFrom<u64>> RangedU64ValueParser<T> {\n    /// Select full range of `u64`\n    pub fn new() -> Self {\n        Self::from(..)\n    }\n\n    /// Narrow the supported range\n    pub fn range<B: RangeBounds<u64>>(mut self, range: B) -> Self {\n        // Consideration: when the user does `value_parser!(u8).range()`\n        // - Avoid programming mistakes by accidentally expanding the range\n        // - Make it convenient to limit the range like with `..10`\n        let start = match range.start_bound() {\n            l @ std::ops::Bound::Included(i) => {\n                debug_assert!(\n                    self.bounds.contains(i),\n                    \"{} must be in {:?}\",\n                    i,\n                    self.bounds\n                );\n                l.cloned()\n            }\n            l @ std::ops::Bound::Excluded(i) => {\n                debug_assert!(\n                    self.bounds.contains(&i.saturating_add(1)),\n                    \"{} must be in {:?}\",\n                    i,\n                    self.bounds\n                );\n                l.cloned()\n            }\n            std::ops::Bound::Unbounded => self.bounds.start_bound().cloned(),\n        };\n        let end = match range.end_bound() {\n            l @ std::ops::Bound::Included(i) => {\n                debug_assert!(\n                    self.bounds.contains(i),\n                    \"{} must be in {:?}\",\n                    i,\n                    self.bounds\n                );\n                l.cloned()\n            }\n            l @ std::ops::Bound::Excluded(i) => {\n                debug_assert!(\n                    self.bounds.contains(&i.saturating_sub(1)),\n                    \"{} must be in {:?}\",\n                    i,\n                    self.bounds\n                );\n                l.cloned()\n            }\n            std::ops::Bound::Unbounded => self.bounds.end_bound().cloned(),\n        };\n        self.bounds = (start, end);\n        self\n    }\n\n    fn format_bounds(&self) -> String {\n        let mut result = match self.bounds.0 {\n            std::ops::Bound::Included(i) => i.to_string(),\n            std::ops::Bound::Excluded(i) => i.saturating_add(1).to_string(),\n            std::ops::Bound::Unbounded => u64::MIN.to_string(),\n        };\n        result.push_str(\"..\");\n        match self.bounds.1 {\n            std::ops::Bound::Included(i) => {\n                result.push('=');\n                result.push_str(&i.to_string());\n            }\n            std::ops::Bound::Excluded(i) => {\n                result.push_str(&i.to_string());\n            }\n            std::ops::Bound::Unbounded => {\n                result.push_str(&u64::MAX.to_string());\n            }\n        }\n        result\n    }\n}\n\nimpl<T: TryFrom<u64> + Clone + Send + Sync + 'static> TypedValueParser for RangedU64ValueParser<T>\nwhere\n    <T as TryFrom<u64>>::Error: Send + Sync + 'static + std::error::Error + ToString,\n{\n    type Value = T;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        raw_value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        let value = ok!(raw_value.to_str().ok_or_else(|| {\n            crate::Error::invalid_utf8(\n                cmd,\n                crate::output::Usage::new(cmd).create_usage_with_title(&[]),\n            )\n        }));\n        let value = ok!(value.parse::<u64>().map_err(|err| {\n            let arg = arg\n                .map(|a| a.to_string())\n                .unwrap_or_else(|| \"...\".to_owned());\n            crate::Error::value_validation(\n                arg,\n                raw_value.to_string_lossy().into_owned(),\n                err.into(),\n            )\n            .with_cmd(cmd)\n        }));\n        if !self.bounds.contains(&value) {\n            let arg = arg\n                .map(|a| a.to_string())\n                .unwrap_or_else(|| \"...\".to_owned());\n            return Err(crate::Error::value_validation(\n                arg,\n                raw_value.to_string_lossy().into_owned(),\n                format!(\"{} is not in {}\", value, self.format_bounds()).into(),\n            )\n            .with_cmd(cmd));\n        }\n\n        let value: Result<Self::Value, _> = value.try_into();\n        let value = ok!(value.map_err(|err| {\n            let arg = arg\n                .map(|a| a.to_string())\n                .unwrap_or_else(|| \"...\".to_owned());\n            crate::Error::value_validation(\n                arg,\n                raw_value.to_string_lossy().into_owned(),\n                err.into(),\n            )\n            .with_cmd(cmd)\n        }));\n\n        Ok(value)\n    }\n}\n\nimpl<T: TryFrom<u64>, B: RangeBounds<u64>> From<B> for RangedU64ValueParser<T> {\n    fn from(range: B) -> Self {\n        Self {\n            bounds: (range.start_bound().cloned(), range.end_bound().cloned()),\n            target: Default::default(),\n        }\n    }\n}\n\nimpl<T: TryFrom<u64>> Default for RangedU64ValueParser<T> {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Implementation for [`ValueParser::bool`]\n///\n/// Useful for composing new [`TypedValueParser`]s\n#[derive(Copy, Clone, Debug)]\n#[non_exhaustive]\npub struct BoolValueParser {}\n\nimpl BoolValueParser {\n    /// Implementation for [`ValueParser::bool`]\n    pub fn new() -> Self {\n        Self {}\n    }\n\n    fn possible_values() -> impl Iterator<Item = crate::builder::PossibleValue> {\n        [\"true\", \"false\"]\n            .iter()\n            .copied()\n            .map(crate::builder::PossibleValue::new)\n    }\n}\n\nimpl TypedValueParser for BoolValueParser {\n    type Value = bool;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        let value = if value == std::ffi::OsStr::new(\"true\") {\n            true\n        } else if value == std::ffi::OsStr::new(\"false\") {\n            false\n        } else {\n            // Intentionally showing hidden as we hide all of them\n            let possible_vals = Self::possible_values()\n                .map(|v| v.get_name().to_owned())\n                .collect::<Vec<_>>();\n\n            return Err(crate::Error::invalid_value(\n                cmd,\n                value.to_string_lossy().into_owned(),\n                &possible_vals,\n                arg.map(ToString::to_string)\n                    .unwrap_or_else(|| \"...\".to_owned()),\n            ));\n        };\n        Ok(value)\n    }\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        Some(Box::new(Self::possible_values()))\n    }\n}\n\nimpl Default for BoolValueParser {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Parse false-like string values, everything else is `true`\n///\n/// See also:\n/// - [`ValueParser::bool`] for assuming non-false is true\n/// - [`BoolishValueParser`] for different human readable bool representations\n///\n/// # Example\n///\n/// Usage:\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"append\")\n///             .value_parser(clap::builder::FalseyValueParser::new())\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"true\"]).unwrap();\n/// let port: bool = *m.get_one(\"append\")\n///     .expect(\"required\");\n/// assert_eq!(port, true);\n/// ```\n///\n/// Semantics:\n/// ```rust\n/// # use clap_builder as clap;\n/// # use std::ffi::OsStr;\n/// # use clap::builder::TypedValueParser;\n/// # let cmd = clap::Command::new(\"test\");\n/// # let arg = None;\n/// let value_parser = clap::builder::FalseyValueParser::new();\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"random\")).unwrap(), true);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"100\")).unwrap(), true);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"\")).unwrap(), false);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"false\")).unwrap(), false);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"No\")).unwrap(), false);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"oFF\")).unwrap(), false);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"0\")).unwrap(), false);\n/// ```\n#[derive(Copy, Clone, Debug)]\n#[non_exhaustive]\npub struct FalseyValueParser {}\n\nimpl FalseyValueParser {\n    /// Parse false-like string values, everything else is `true`\n    pub fn new() -> Self {\n        Self {}\n    }\n\n    fn possible_values() -> impl Iterator<Item = crate::builder::PossibleValue> {\n        crate::util::TRUE_LITERALS\n            .iter()\n            .chain(crate::util::FALSE_LITERALS.iter())\n            .copied()\n            .map(|l| crate::builder::PossibleValue::new(l).hide(l != \"true\" && l != \"false\"))\n    }\n}\n\nimpl TypedValueParser for FalseyValueParser {\n    type Value = bool;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        _arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        let value = ok!(value.to_str().ok_or_else(|| {\n            crate::Error::invalid_utf8(\n                cmd,\n                crate::output::Usage::new(cmd).create_usage_with_title(&[]),\n            )\n        }));\n        let value = if value.is_empty() {\n            false\n        } else {\n            crate::util::str_to_bool(value).unwrap_or(true)\n        };\n        Ok(value)\n    }\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        Some(Box::new(Self::possible_values()))\n    }\n}\n\nimpl Default for FalseyValueParser {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Parse bool-like string values\n///\n/// See also:\n/// - [`ValueParser::bool`] for different human readable bool representations\n/// - [`FalseyValueParser`] for assuming non-false is true\n///\n/// # Example\n///\n/// Usage:\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"append\")\n///             .value_parser(clap::builder::BoolishValueParser::new())\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"true\"]).unwrap();\n/// let port: bool = *m.get_one(\"append\")\n///     .expect(\"required\");\n/// assert_eq!(port, true);\n/// ```\n///\n/// Semantics:\n/// ```rust\n/// # use clap_builder as clap;\n/// # use std::ffi::OsStr;\n/// # use clap::builder::TypedValueParser;\n/// # let cmd = clap::Command::new(\"test\");\n/// # let arg = None;\n/// let value_parser = clap::builder::BoolishValueParser::new();\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"random\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"\")).is_err());\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"100\")).is_err());\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"true\")).unwrap(), true);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"Yes\")).unwrap(), true);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"oN\")).unwrap(), true);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"1\")).unwrap(), true);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"false\")).unwrap(), false);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"No\")).unwrap(), false);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"oFF\")).unwrap(), false);\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"0\")).unwrap(), false);\n/// ```\n#[derive(Copy, Clone, Debug)]\n#[non_exhaustive]\npub struct BoolishValueParser {}\n\nimpl BoolishValueParser {\n    /// Parse bool-like string values\n    pub fn new() -> Self {\n        Self {}\n    }\n\n    fn possible_values() -> impl Iterator<Item = crate::builder::PossibleValue> {\n        crate::util::TRUE_LITERALS\n            .iter()\n            .chain(crate::util::FALSE_LITERALS.iter())\n            .copied()\n            .map(|l| crate::builder::PossibleValue::new(l).hide(l != \"true\" && l != \"false\"))\n    }\n}\n\nimpl TypedValueParser for BoolishValueParser {\n    type Value = bool;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        let value = ok!(value.to_str().ok_or_else(|| {\n            crate::Error::invalid_utf8(\n                cmd,\n                crate::output::Usage::new(cmd).create_usage_with_title(&[]),\n            )\n        }));\n        let value = ok!(crate::util::str_to_bool(value).ok_or_else(|| {\n            let arg = arg\n                .map(|a| a.to_string())\n                .unwrap_or_else(|| \"...\".to_owned());\n            crate::Error::value_validation(arg, value.to_owned(), \"value was not a boolean\".into())\n                .with_cmd(cmd)\n        }));\n        Ok(value)\n    }\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        Some(Box::new(Self::possible_values()))\n    }\n}\n\nimpl Default for BoolishValueParser {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Parse non-empty string values\n///\n/// See also:\n/// - [`ValueParser::string`]\n///\n/// # Example\n///\n/// Usage:\n/// ```rust\n/// # use clap_builder as clap;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"append\")\n///             .value_parser(clap::builder::NonEmptyStringValueParser::new())\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"true\"]).unwrap();\n/// let port: &String = m.get_one(\"append\")\n///     .expect(\"required\");\n/// assert_eq!(port, \"true\");\n/// ```\n///\n/// Semantics:\n/// ```rust\n/// # use clap_builder as clap;\n/// # use std::ffi::OsStr;\n/// # use clap::builder::TypedValueParser;\n/// # let cmd = clap::Command::new(\"test\");\n/// # let arg = None;\n/// let value_parser = clap::builder::NonEmptyStringValueParser::new();\n/// assert_eq!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"random\")).unwrap(), \"random\");\n/// assert!(value_parser.parse_ref(&cmd, arg, OsStr::new(\"\")).is_err());\n/// ```\n#[derive(Copy, Clone, Debug)]\n#[non_exhaustive]\npub struct NonEmptyStringValueParser {}\n\nimpl NonEmptyStringValueParser {\n    /// Parse non-empty string values\n    pub fn new() -> Self {\n        Self {}\n    }\n}\n\nimpl TypedValueParser for NonEmptyStringValueParser {\n    type Value = String;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        if value.is_empty() {\n            return Err(crate::Error::empty_value(\n                cmd,\n                &[],\n                arg.map(ToString::to_string)\n                    .unwrap_or_else(|| \"...\".to_owned()),\n            ));\n        }\n        let value = ok!(value.to_str().ok_or_else(|| {\n            crate::Error::invalid_utf8(\n                cmd,\n                crate::output::Usage::new(cmd).create_usage_with_title(&[]),\n            )\n        }));\n        Ok(value.to_owned())\n    }\n}\n\nimpl Default for NonEmptyStringValueParser {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// Adapt a `TypedValueParser` from one value to another\n///\n/// See [`TypedValueParser::map`]\n#[derive(Clone, Debug)]\npub struct MapValueParser<P, F> {\n    parser: P,\n    func: F,\n}\n\nimpl<P, F, T> MapValueParser<P, F>\nwhere\n    P: TypedValueParser,\n    P::Value: Send + Sync + Clone,\n    F: Fn(P::Value) -> T + Clone,\n    T: Send + Sync + Clone,\n{\n    fn new(parser: P, func: F) -> Self {\n        Self { parser, func }\n    }\n}\n\nimpl<P, F, T> TypedValueParser for MapValueParser<P, F>\nwhere\n    P: TypedValueParser,\n    P::Value: Send + Sync + Clone,\n    F: Fn(P::Value) -> T + Clone + Send + Sync + 'static,\n    T: Send + Sync + Clone,\n{\n    type Value = T;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        let value = ok!(self.parser.parse_ref(cmd, arg, value));\n        let value = (self.func)(value);\n        Ok(value)\n    }\n\n    fn parse(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: std::ffi::OsString,\n    ) -> Result<Self::Value, crate::Error> {\n        let value = ok!(self.parser.parse(cmd, arg, value));\n        let value = (self.func)(value);\n        Ok(value)\n    }\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        self.parser.possible_values()\n    }\n}\n\n/// Adapt a `TypedValueParser` from one value to another\n///\n/// See [`TypedValueParser::try_map`]\n#[derive(Clone, Debug)]\npub struct TryMapValueParser<P, F> {\n    parser: P,\n    func: F,\n}\n\nimpl<P, F, T, E> TryMapValueParser<P, F>\nwhere\n    P: TypedValueParser,\n    P::Value: Send + Sync + Clone,\n    F: Fn(P::Value) -> Result<T, E> + Clone + Send + Sync + 'static,\n    T: Send + Sync + Clone,\n    E: Into<Box<dyn std::error::Error + Send + Sync + 'static>>,\n{\n    fn new(parser: P, func: F) -> Self {\n        Self { parser, func }\n    }\n}\n\nimpl<P, F, T, E> TypedValueParser for TryMapValueParser<P, F>\nwhere\n    P: TypedValueParser,\n    P::Value: Send + Sync + Clone,\n    F: Fn(P::Value) -> Result<T, E> + Clone + Send + Sync + 'static,\n    T: Send + Sync + Clone,\n    E: Into<Box<dyn std::error::Error + Send + Sync + 'static>>,\n{\n    type Value = T;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        let mid_value = ok!(self.parser.parse_ref(cmd, arg, value));\n        let value = ok!((self.func)(mid_value).map_err(|e| {\n            let arg = arg\n                .map(|a| a.to_string())\n                .unwrap_or_else(|| \"...\".to_owned());\n            crate::Error::value_validation(arg, value.to_string_lossy().into_owned(), e.into())\n                .with_cmd(cmd)\n        }));\n        Ok(value)\n    }\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = crate::builder::PossibleValue> + '_>> {\n        self.parser.possible_values()\n    }\n}\n\n/// When encountered, report [`ErrorKind::UnknownArgument`][crate::error::ErrorKind::UnknownArgument]\n///\n/// Useful to help users migrate, either from old versions or similar tools.\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::Command;\n/// # use clap::Arg;\n/// let cmd = Command::new(\"mycmd\")\n///     .args([\n///         Arg::new(\"current-dir\")\n///             .short('C'),\n///         Arg::new(\"current-dir-unknown\")\n///             .long(\"cwd\")\n///             .aliases([\"current-dir\", \"directory\", \"working-directory\", \"root\"])\n///             .value_parser(clap::builder::UnknownArgumentValueParser::suggest_arg(\"-C\"))\n///             .hide(true),\n///     ]);\n///\n/// // Use a supported version of the argument\n/// let matches = cmd.clone().try_get_matches_from([\"mycmd\", \"-C\", \"..\"]).unwrap();\n/// assert!(matches.contains_id(\"current-dir\"));\n/// assert_eq!(\n///     matches.get_many::<String>(\"current-dir\").unwrap_or_default().map(|v| v.as_str()).collect::<Vec<_>>(),\n///     vec![\"..\"]\n/// );\n///\n/// // Use one of the invalid versions\n/// let err = cmd.try_get_matches_from([\"mycmd\", \"--cwd\", \"..\"]).unwrap_err();\n/// assert_eq!(err.kind(), clap::error::ErrorKind::UnknownArgument);\n/// ```\n#[derive(Clone, Debug)]\npub struct UnknownArgumentValueParser {\n    arg: Option<Str>,\n    suggestions: Vec<StyledStr>,\n}\n\nimpl UnknownArgumentValueParser {\n    /// Suggest an alternative argument\n    pub fn suggest_arg(arg: impl Into<Str>) -> Self {\n        Self {\n            arg: Some(arg.into()),\n            suggestions: Default::default(),\n        }\n    }\n\n    /// Provide a general suggestion\n    pub fn suggest(text: impl Into<StyledStr>) -> Self {\n        Self {\n            arg: Default::default(),\n            suggestions: vec![text.into()],\n        }\n    }\n\n    /// Extend the suggestions\n    pub fn and_suggest(mut self, text: impl Into<StyledStr>) -> Self {\n        self.suggestions.push(text.into());\n        self\n    }\n}\n\nimpl TypedValueParser for UnknownArgumentValueParser {\n    type Value = String;\n\n    fn parse_ref(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, crate::Error> {\n        TypedValueParser::parse_ref_(self, cmd, arg, value, ValueSource::CommandLine)\n    }\n\n    fn parse_ref_(\n        &self,\n        cmd: &crate::Command,\n        arg: Option<&crate::Arg>,\n        _value: &std::ffi::OsStr,\n        source: ValueSource,\n    ) -> Result<Self::Value, crate::Error> {\n        match source {\n            ValueSource::DefaultValue => {\n                TypedValueParser::parse_ref_(&StringValueParser::new(), cmd, arg, _value, source)\n            }\n            ValueSource::EnvVariable | ValueSource::CommandLine => {\n                let arg = match arg {\n                    Some(arg) => arg.to_string(),\n                    None => \"..\".to_owned(),\n                };\n                let err = crate::Error::unknown_argument(\n                    cmd,\n                    arg,\n                    self.arg.as_ref().map(|s| (s.as_str().to_owned(), None)),\n                    false,\n                    crate::output::Usage::new(cmd).create_usage_with_title(&[]),\n                );\n                #[cfg(feature = \"error-context\")]\n                let err = {\n                    debug_assert_eq!(\n                        err.get(crate::error::ContextKind::Suggested),\n                        None,\n                        \"Assuming `Error::unknown_argument` doesn't apply any `Suggested` so we can without caution\"\n                    );\n                    err.insert_context_unchecked(\n                        crate::error::ContextKind::Suggested,\n                        crate::error::ContextValue::StyledStrs(self.suggestions.clone()),\n                    )\n                };\n                Err(err)\n            }\n        }\n    }\n}\n\n/// Register a type with [`value_parser!`][crate::value_parser!]\n///\n/// # Example\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// #[derive(Copy, Clone, Debug)]\n/// pub struct Custom(u32);\n///\n/// impl clap::builder::ValueParserFactory for Custom {\n///     type Parser = CustomValueParser;\n///     fn value_parser() -> Self::Parser {\n///         CustomValueParser\n///     }\n/// }\n///\n/// #[derive(Clone, Debug)]\n/// pub struct CustomValueParser;\n/// impl clap::builder::TypedValueParser for CustomValueParser {\n///     type Value = Custom;\n///\n///     fn parse_ref(\n///         &self,\n///         cmd: &clap::Command,\n///         arg: Option<&clap::Arg>,\n///         value: &std::ffi::OsStr,\n///     ) -> Result<Self::Value, clap::Error> {\n///         let inner = clap::value_parser!(u32);\n///         let val = inner.parse_ref(cmd, arg, value)?;\n///         Ok(Custom(val))\n///     }\n/// }\n///\n/// let parser: CustomValueParser = clap::value_parser!(Custom);\n/// ```\npub trait ValueParserFactory {\n    /// Generated parser, usually [`ValueParser`].\n    ///\n    /// It should at least be a type that supports `Into<ValueParser>`.  A non-`ValueParser` type\n    /// allows the caller to do further initialization on the parser.\n    type Parser;\n\n    /// Create the specified [`Self::Parser`]\n    fn value_parser() -> Self::Parser;\n}\nimpl ValueParserFactory for String {\n    type Parser = ValueParser;\n    fn value_parser() -> Self::Parser {\n        ValueParser::string() // Default `clap_derive` to optimized implementation\n    }\n}\nimpl ValueParserFactory for Box<str> {\n    type Parser = MapValueParser<StringValueParser, fn(String) -> Box<str>>;\n    fn value_parser() -> Self::Parser {\n        StringValueParser::new().map(String::into_boxed_str)\n    }\n}\nimpl ValueParserFactory for std::ffi::OsString {\n    type Parser = ValueParser;\n    fn value_parser() -> Self::Parser {\n        ValueParser::os_string() // Default `clap_derive` to optimized implementation\n    }\n}\nimpl ValueParserFactory for Box<std::ffi::OsStr> {\n    type Parser =\n        MapValueParser<OsStringValueParser, fn(std::ffi::OsString) -> Box<std::ffi::OsStr>>;\n    fn value_parser() -> Self::Parser {\n        OsStringValueParser::new().map(std::ffi::OsString::into_boxed_os_str)\n    }\n}\nimpl ValueParserFactory for std::path::PathBuf {\n    type Parser = ValueParser;\n    fn value_parser() -> Self::Parser {\n        ValueParser::path_buf() // Default `clap_derive` to optimized implementation\n    }\n}\nimpl ValueParserFactory for Box<std::path::Path> {\n    type Parser =\n        MapValueParser<PathBufValueParser, fn(std::path::PathBuf) -> Box<std::path::Path>>;\n    fn value_parser() -> Self::Parser {\n        PathBufValueParser::new().map(std::path::PathBuf::into_boxed_path)\n    }\n}\nimpl ValueParserFactory for bool {\n    type Parser = ValueParser;\n    fn value_parser() -> Self::Parser {\n        ValueParser::bool() // Default `clap_derive` to optimized implementation\n    }\n}\nimpl ValueParserFactory for u8 {\n    type Parser = RangedI64ValueParser<u8>;\n    fn value_parser() -> Self::Parser {\n        let start: i64 = u8::MIN.into();\n        let end: i64 = u8::MAX.into();\n        RangedI64ValueParser::new().range(start..=end)\n    }\n}\nimpl ValueParserFactory for i8 {\n    type Parser = RangedI64ValueParser<i8>;\n    fn value_parser() -> Self::Parser {\n        let start: i64 = i8::MIN.into();\n        let end: i64 = i8::MAX.into();\n        RangedI64ValueParser::new().range(start..=end)\n    }\n}\nimpl ValueParserFactory for u16 {\n    type Parser = RangedI64ValueParser<u16>;\n    fn value_parser() -> Self::Parser {\n        let start: i64 = u16::MIN.into();\n        let end: i64 = u16::MAX.into();\n        RangedI64ValueParser::new().range(start..=end)\n    }\n}\nimpl ValueParserFactory for i16 {\n    type Parser = RangedI64ValueParser<i16>;\n    fn value_parser() -> Self::Parser {\n        let start: i64 = i16::MIN.into();\n        let end: i64 = i16::MAX.into();\n        RangedI64ValueParser::new().range(start..=end)\n    }\n}\nimpl ValueParserFactory for u32 {\n    type Parser = RangedI64ValueParser<u32>;\n    fn value_parser() -> Self::Parser {\n        let start: i64 = u32::MIN.into();\n        let end: i64 = u32::MAX.into();\n        RangedI64ValueParser::new().range(start..=end)\n    }\n}\nimpl ValueParserFactory for i32 {\n    type Parser = RangedI64ValueParser<i32>;\n    fn value_parser() -> Self::Parser {\n        let start: i64 = i32::MIN.into();\n        let end: i64 = i32::MAX.into();\n        RangedI64ValueParser::new().range(start..=end)\n    }\n}\nimpl ValueParserFactory for u64 {\n    type Parser = RangedU64ValueParser<u64>;\n    fn value_parser() -> Self::Parser {\n        RangedU64ValueParser::new()\n    }\n}\nimpl ValueParserFactory for i64 {\n    type Parser = RangedI64ValueParser<i64>;\n    fn value_parser() -> Self::Parser {\n        RangedI64ValueParser::new()\n    }\n}\nimpl<T> ValueParserFactory for std::num::Saturating<T>\nwhere\n    T: ValueParserFactory,\n    <T as ValueParserFactory>::Parser: TypedValueParser<Value = T>,\n    T: Send + Sync + Clone,\n{\n    type Parser =\n        MapValueParser<<T as ValueParserFactory>::Parser, fn(T) -> std::num::Saturating<T>>;\n    fn value_parser() -> Self::Parser {\n        T::value_parser().map(std::num::Saturating)\n    }\n}\nimpl<T> ValueParserFactory for std::num::Wrapping<T>\nwhere\n    T: ValueParserFactory,\n    <T as ValueParserFactory>::Parser: TypedValueParser<Value = T>,\n    T: Send + Sync + Clone,\n{\n    type Parser = MapValueParser<<T as ValueParserFactory>::Parser, fn(T) -> std::num::Wrapping<T>>;\n    fn value_parser() -> Self::Parser {\n        T::value_parser().map(std::num::Wrapping)\n    }\n}\nimpl<T> ValueParserFactory for Box<T>\nwhere\n    T: ValueParserFactory,\n    <T as ValueParserFactory>::Parser: TypedValueParser<Value = T>,\n    T: Send + Sync + Clone,\n{\n    type Parser = MapValueParser<<T as ValueParserFactory>::Parser, fn(T) -> Box<T>>;\n    fn value_parser() -> Self::Parser {\n        T::value_parser().map(Box::new)\n    }\n}\nimpl<T> ValueParserFactory for std::sync::Arc<T>\nwhere\n    T: ValueParserFactory,\n    <T as ValueParserFactory>::Parser: TypedValueParser<Value = T>,\n    T: Send + Sync + Clone,\n{\n    type Parser = MapValueParser<<T as ValueParserFactory>::Parser, fn(T) -> std::sync::Arc<T>>;\n    fn value_parser() -> Self::Parser {\n        T::value_parser().map(std::sync::Arc::new)\n    }\n}\n\n#[doc(hidden)]\n#[derive(Debug)]\n#[allow(non_camel_case_types)]\npub struct _infer_ValueParser_for<T>(std::marker::PhantomData<T>);\n\nimpl<T> _infer_ValueParser_for<T> {\n    #[doc(hidden)]\n    #[allow(clippy::new_without_default)]\n    pub fn new() -> Self {\n        Self(Default::default())\n    }\n}\n\n/// Unstable [`ValueParser`]\n///\n/// Implementation may change to more specific instance in the future\n#[doc(hidden)]\n#[derive(Debug)]\npub struct _AnonymousValueParser(ValueParser);\n\n#[doc(hidden)]\npub mod impl_prelude {\n    use super::*;\n\n    #[doc(hidden)]\n    #[allow(non_camel_case_types)]\n    pub trait _impls_ValueParserFactory: private::_impls_ValueParserFactorySealed {\n        type Parser;\n        fn value_parser(&self) -> Self::Parser;\n    }\n    impl<P: ValueParserFactory> _impls_ValueParserFactory for &&&&&&_infer_ValueParser_for<P> {\n        type Parser = P::Parser;\n        fn value_parser(&self) -> Self::Parser {\n            P::value_parser()\n        }\n    }\n\n    #[doc(hidden)]\n    #[allow(non_camel_case_types)]\n    pub trait _impls_ValueEnum: private::_impls_ValueEnumSealed {\n        type Output;\n\n        fn value_parser(&self) -> Self::Output;\n    }\n    impl<E: crate::ValueEnum + Clone + Send + Sync + 'static> _impls_ValueEnum\n        for &&&&&_infer_ValueParser_for<E>\n    {\n        type Output = EnumValueParser<E>;\n\n        fn value_parser(&self) -> Self::Output {\n            EnumValueParser::<E>::new()\n        }\n    }\n\n    #[doc(hidden)]\n    #[allow(non_camel_case_types)]\n    pub trait _impls_From_OsString: private::_impls_From_OsStringSealed {\n        fn value_parser(&self) -> _AnonymousValueParser;\n    }\n    impl<FromOsString> _impls_From_OsString for &&&&_infer_ValueParser_for<FromOsString>\n    where\n        FromOsString: From<std::ffi::OsString> + std::any::Any + Clone + Send + Sync + 'static,\n    {\n        fn value_parser(&self) -> _AnonymousValueParser {\n            _AnonymousValueParser(\n                OsStringValueParser::new()\n                    .map(|s| FromOsString::from(s))\n                    .into(),\n            )\n        }\n    }\n\n    #[doc(hidden)]\n    #[allow(non_camel_case_types)]\n    pub trait _impls_From_OsStr: private::_impls_From_OsStrSealed {\n        fn value_parser(&self) -> _AnonymousValueParser;\n    }\n    impl<FromOsStr> _impls_From_OsStr for &&&_infer_ValueParser_for<FromOsStr>\n    where\n        FromOsStr:\n            for<'s> From<&'s std::ffi::OsStr> + std::any::Any + Clone + Send + Sync + 'static,\n    {\n        fn value_parser(&self) -> _AnonymousValueParser {\n            _AnonymousValueParser(\n                OsStringValueParser::new()\n                    .map(|s| FromOsStr::from(&s))\n                    .into(),\n            )\n        }\n    }\n\n    #[doc(hidden)]\n    #[allow(non_camel_case_types)]\n    pub trait _impls_From_String: private::_impls_From_StringSealed {\n        fn value_parser(&self) -> _AnonymousValueParser;\n    }\n    impl<FromString> _impls_From_String for &&_infer_ValueParser_for<FromString>\n    where\n        FromString: From<String> + std::any::Any + Clone + Send + Sync + 'static,\n    {\n        fn value_parser(&self) -> _AnonymousValueParser {\n            _AnonymousValueParser(StringValueParser::new().map(|s| FromString::from(s)).into())\n        }\n    }\n\n    #[doc(hidden)]\n    #[allow(non_camel_case_types)]\n    pub trait _impls_From_str: private::_impls_From_strSealed {\n        fn value_parser(&self) -> _AnonymousValueParser;\n    }\n    impl<FromStr> _impls_From_str for &_infer_ValueParser_for<FromStr>\n    where\n        FromStr: for<'s> From<&'s str> + std::any::Any + Clone + Send + Sync + 'static,\n    {\n        fn value_parser(&self) -> _AnonymousValueParser {\n            _AnonymousValueParser(StringValueParser::new().map(|s| FromStr::from(&s)).into())\n        }\n    }\n\n    #[doc(hidden)]\n    #[allow(non_camel_case_types)]\n    pub trait _impls_FromStr: private::_impls_FromStrSealed {\n        fn value_parser(&self) -> _AnonymousValueParser;\n    }\n    impl<Parse> _impls_FromStr for _infer_ValueParser_for<Parse>\n    where\n        Parse: std::str::FromStr + std::any::Any + Clone + Send + Sync + 'static,\n        <Parse as std::str::FromStr>::Err: Into<Box<dyn std::error::Error + Send + Sync + 'static>>,\n    {\n        fn value_parser(&self) -> _AnonymousValueParser {\n            let func: fn(&str) -> Result<Parse, <Parse as std::str::FromStr>::Err> =\n                Parse::from_str;\n            _AnonymousValueParser(ValueParser::new(func))\n        }\n    }\n}\n\n/// Select a [`ValueParser`] implementation from the intended type\n///\n/// Supported types\n/// - [`ValueParserFactory` types][ValueParserFactory], including\n///   - [Native types][ValueParser]: `bool`, `String`, `OsString`, `PathBuf`\n///   - [Ranged numeric types][RangedI64ValueParser]: `u8`, `i8`, `u16`, `i16`, `u32`, `i32`, `u64`, `i64`\n/// - [`ValueEnum` types][crate::ValueEnum]\n/// - [`From<OsString>` types][std::convert::From] and [`From<&OsStr>` types][std::convert::From]\n/// - [`From<String>` types][std::convert::From] and [`From<&str>` types][std::convert::From]\n/// - [`FromStr` types][std::str::FromStr], including usize, isize\n///\n/// # Example\n///\n/// Usage:\n/// ```rust\n/// # use clap_builder as clap;\n/// # use std::path::PathBuf;\n/// # use std::path::Path;\n/// let mut cmd = clap::Command::new(\"raw\")\n///     .arg(\n///         clap::Arg::new(\"output\")\n///             .value_parser(clap::value_parser!(PathBuf))\n///             .required(true)\n///     );\n///\n/// let m = cmd.try_get_matches_from_mut([\"cmd\", \"file.txt\"]).unwrap();\n/// let port: &PathBuf = m.get_one(\"output\")\n///     .expect(\"required\");\n/// assert_eq!(port, Path::new(\"file.txt\"));\n/// ```\n///\n/// Example mappings:\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::ColorChoice;\n/// // Built-in types\n/// let parser = clap::value_parser!(String);\n/// assert_eq!(format!(\"{parser:?}\"), \"ValueParser::string\");\n/// let parser = clap::value_parser!(std::ffi::OsString);\n/// assert_eq!(format!(\"{parser:?}\"), \"ValueParser::os_string\");\n/// let parser = clap::value_parser!(std::path::PathBuf);\n/// assert_eq!(format!(\"{parser:?}\"), \"ValueParser::path_buf\");\n/// clap::value_parser!(u16).range(3000..);\n/// clap::value_parser!(u64).range(3000..);\n///\n/// // FromStr types\n/// let parser = clap::value_parser!(usize);\n/// assert_eq!(format!(\"{parser:?}\"), \"_AnonymousValueParser(ValueParser::other(usize))\");\n///\n/// // ValueEnum types\n/// clap::value_parser!(ColorChoice);\n/// ```\n#[macro_export]\nmacro_rules! value_parser {\n    ($name:ty) => {{\n        use $crate::builder::impl_prelude::*;\n        let auto = $crate::builder::_infer_ValueParser_for::<$name>::new();\n        (&&&&&&auto).value_parser()\n    }};\n}\n\nmod private {\n    use super::*;\n\n    #[allow(non_camel_case_types)]\n    pub trait _impls_ValueParserFactorySealed {}\n    impl<P: ValueParserFactory> _impls_ValueParserFactorySealed for &&&&&&_infer_ValueParser_for<P> {}\n\n    #[allow(non_camel_case_types)]\n    pub trait _impls_ValueEnumSealed {}\n    impl<E: crate::ValueEnum> _impls_ValueEnumSealed for &&&&&_infer_ValueParser_for<E> {}\n\n    #[allow(non_camel_case_types)]\n    pub trait _impls_From_OsStringSealed {}\n    impl<FromOsString> _impls_From_OsStringSealed for &&&&_infer_ValueParser_for<FromOsString> where\n        FromOsString: From<std::ffi::OsString> + std::any::Any + Send + Sync + 'static\n    {\n    }\n\n    #[allow(non_camel_case_types)]\n    pub trait _impls_From_OsStrSealed {}\n    impl<FromOsStr> _impls_From_OsStrSealed for &&&_infer_ValueParser_for<FromOsStr> where\n        FromOsStr: for<'s> From<&'s std::ffi::OsStr> + std::any::Any + Send + Sync + 'static\n    {\n    }\n\n    #[allow(non_camel_case_types)]\n    pub trait _impls_From_StringSealed {}\n    impl<FromString> _impls_From_StringSealed for &&_infer_ValueParser_for<FromString> where\n        FromString: From<String> + std::any::Any + Send + Sync + 'static\n    {\n    }\n\n    #[allow(non_camel_case_types)]\n    pub trait _impls_From_strSealed {}\n    impl<FromStr> _impls_From_strSealed for &_infer_ValueParser_for<FromStr> where\n        FromStr: for<'s> From<&'s str> + std::any::Any + Send + Sync + 'static\n    {\n    }\n\n    #[allow(non_camel_case_types)]\n    pub trait _impls_FromStrSealed {}\n    impl<Parse> _impls_FromStrSealed for _infer_ValueParser_for<Parse>\n    where\n        Parse: std::str::FromStr + std::any::Any + Send + Sync + 'static,\n        <Parse as std::str::FromStr>::Err: Into<Box<dyn std::error::Error + Send + Sync + 'static>>,\n    {\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    #[test]\n    fn ensure_typed_applies_to_parse() {\n        fn parse(_: &str) -> Result<usize, std::io::Error> {\n            Ok(10)\n        }\n        let cmd = crate::Command::new(\"cmd\");\n        let arg = None;\n        assert_eq!(\n            TypedValueParser::parse_ref(&parse, &cmd, arg, std::ffi::OsStr::new(\"foo\")).unwrap(),\n            10\n        );\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/derive.rs",
    "content": "//! This module contains traits that are usable with the `#[derive(...)]`\n//! macros in `clap_derive`.\n\nuse crate::builder::PossibleValue;\nuse crate::{ArgMatches, Command, Error};\nuse std::convert::Infallible;\n\nuse std::ffi::OsString;\n\n/// Parse command-line arguments into `Self`.\n///\n/// The primary one-stop-shop trait used to create an instance of a `clap`\n/// [`Command`], conduct the parsing, and turn the resulting [`ArgMatches`] back\n/// into concrete instance of the user struct.\n///\n/// This trait is primarily a convenience on top of [`FromArgMatches`] +\n/// [`CommandFactory`] which uses those two underlying traits to build the two\n/// fundamental functions `parse` which uses the `std::env::args_os` iterator,\n/// and `parse_from` which allows the consumer to supply the iterator (along\n/// with fallible options for each).\n///\n/// See also [`Subcommand`] and [`Args`].\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** Deriving requires the `derive` feature flag\n///\n/// </div>\npub trait Parser: FromArgMatches + CommandFactory + Sized {\n    /// Parse from `std::env::args_os()`, [exit][Error::exit] on error.\n    fn parse() -> Self {\n        let mut matches = <Self as CommandFactory>::command().get_matches();\n        let res = <Self as FromArgMatches>::from_arg_matches_mut(&mut matches)\n            .map_err(format_error::<Self>);\n        match res {\n            Ok(s) => s,\n            Err(e) => {\n                // Since this is more of a development-time error, we aren't doing as fancy of a quit\n                // as `get_matches`\n                e.exit()\n            }\n        }\n    }\n\n    /// Parse from `std::env::args_os()`, return Err on error.\n    fn try_parse() -> Result<Self, Error> {\n        let mut matches = ok!(<Self as CommandFactory>::command().try_get_matches());\n        <Self as FromArgMatches>::from_arg_matches_mut(&mut matches).map_err(format_error::<Self>)\n    }\n\n    /// Parse from iterator, [exit][Error::exit] on error.\n    fn parse_from<I, T>(itr: I) -> Self\n    where\n        I: IntoIterator<Item = T>,\n        T: Into<OsString> + Clone,\n    {\n        let mut matches = <Self as CommandFactory>::command().get_matches_from(itr);\n        let res = <Self as FromArgMatches>::from_arg_matches_mut(&mut matches)\n            .map_err(format_error::<Self>);\n        match res {\n            Ok(s) => s,\n            Err(e) => {\n                // Since this is more of a development-time error, we aren't doing as fancy of a quit\n                // as `get_matches_from`\n                e.exit()\n            }\n        }\n    }\n\n    /// Parse from iterator, return Err on error.\n    fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>\n    where\n        I: IntoIterator<Item = T>,\n        T: Into<OsString> + Clone,\n    {\n        let mut matches = ok!(<Self as CommandFactory>::command().try_get_matches_from(itr));\n        <Self as FromArgMatches>::from_arg_matches_mut(&mut matches).map_err(format_error::<Self>)\n    }\n\n    /// Update from iterator, [exit][Error::exit] on error.\n    ///\n    /// Unlike [`Parser::parse`], this works with an existing instance of `self`.\n    /// The assumption is that all required fields are already provided and any [`Args`] or\n    /// [`Subcommand`]s provided by the user will modify only what is specified.\n    fn update_from<I, T>(&mut self, itr: I)\n    where\n        I: IntoIterator<Item = T>,\n        T: Into<OsString> + Clone,\n    {\n        let mut matches = <Self as CommandFactory>::command_for_update().get_matches_from(itr);\n        let res = <Self as FromArgMatches>::update_from_arg_matches_mut(self, &mut matches)\n            .map_err(format_error::<Self>);\n        if let Err(e) = res {\n            // Since this is more of a development-time error, we aren't doing as fancy of a quit\n            // as `get_matches_from`\n            e.exit()\n        }\n    }\n\n    /// Update from iterator, return Err on error.\n    fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>\n    where\n        I: IntoIterator<Item = T>,\n        T: Into<OsString> + Clone,\n    {\n        let mut matches =\n            ok!(<Self as CommandFactory>::command_for_update().try_get_matches_from(itr));\n        <Self as FromArgMatches>::update_from_arg_matches_mut(self, &mut matches)\n            .map_err(format_error::<Self>)\n    }\n}\n\n/// Create a [`Command`] relevant for a user-defined container.\n///\n/// Derived as part of [`Parser`].\npub trait CommandFactory: Sized {\n    /// Build a [`Command`] that can instantiate `Self`.\n    ///\n    /// See [`FromArgMatches::from_arg_matches_mut`] for instantiating `Self`.\n    fn command() -> Command;\n    /// Build a [`Command`] that can update `self`.\n    ///\n    /// See [`FromArgMatches::update_from_arg_matches_mut`] for updating `self`.\n    fn command_for_update() -> Command;\n}\n\n/// Converts an instance of [`ArgMatches`] to a user-defined container.\n///\n/// Derived as part of [`Parser`], [`Args`], and [`Subcommand`].\npub trait FromArgMatches: Sized {\n    /// Instantiate `Self` from [`ArgMatches`], parsing the arguments as needed.\n    ///\n    /// Motivation: If our application had two CLI options, `--name\n    /// <STRING>` and the flag `--debug`, we may create a struct as follows:\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"derive\")] {\n    /// struct Context {\n    ///     name: String,\n    ///     debug: bool\n    /// }\n    /// # }\n    /// ```\n    ///\n    /// We then need to convert the `ArgMatches` that `clap` generated into our struct.\n    /// `from_arg_matches` serves as the equivalent of:\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"derive\")] {\n    /// # use clap::ArgMatches;\n    /// # struct Context {\n    /// #   name: String,\n    /// #   debug: bool\n    /// # }\n    /// impl From<ArgMatches> for Context {\n    ///    fn from(m: ArgMatches) -> Self {\n    ///        Context {\n    ///            name: m.get_one::<String>(\"name\").unwrap().clone(),\n    ///            debug: m.get_flag(\"debug\"),\n    ///        }\n    ///    }\n    /// }\n    /// # }\n    /// ```\n    fn from_arg_matches(matches: &ArgMatches) -> Result<Self, Error>;\n\n    /// Instantiate `Self` from [`ArgMatches`], parsing the arguments as needed.\n    ///\n    /// Motivation: If our application had two CLI options, `--name\n    /// <STRING>` and the flag `--debug`, we may create a struct as follows:\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"derive\")] {\n    /// struct Context {\n    ///     name: String,\n    ///     debug: bool\n    /// }\n    /// # }\n    /// ```\n    ///\n    /// We then need to convert the `ArgMatches` that `clap` generated into our struct.\n    /// `from_arg_matches_mut` serves as the equivalent of:\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"derive\")] {\n    /// # use clap::ArgMatches;\n    /// # struct Context {\n    /// #   name: String,\n    /// #   debug: bool\n    /// # }\n    /// impl From<ArgMatches> for Context {\n    ///    fn from(m: ArgMatches) -> Self {\n    ///        Context {\n    ///            name: m.get_one::<String>(\"name\").unwrap().to_string(),\n    ///            debug: m.get_flag(\"debug\"),\n    ///        }\n    ///    }\n    /// }\n    /// # }\n    /// ```\n    fn from_arg_matches_mut(matches: &mut ArgMatches) -> Result<Self, Error> {\n        Self::from_arg_matches(matches)\n    }\n\n    /// Assign values from `ArgMatches` to `self`.\n    fn update_from_arg_matches(&mut self, matches: &ArgMatches) -> Result<(), Error>;\n\n    /// Assign values from `ArgMatches` to `self`.\n    fn update_from_arg_matches_mut(&mut self, matches: &mut ArgMatches) -> Result<(), Error> {\n        self.update_from_arg_matches(matches)\n    }\n}\n\n/// Parse a set of arguments into a user-defined container.\n///\n/// Implementing this trait lets a parent container delegate argument parsing behavior to `Self`.\n/// with:\n/// - `#[command(flatten)] args: ChildArgs`: Attribute can only be used with struct fields that impl\n///   `Args`.\n/// - `Variant(ChildArgs)`: No attribute is used with enum variants that impl `Args`.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** Deriving requires the `derive` feature flag\n///\n/// </div>\npub trait Args: FromArgMatches + Sized {\n    /// Report the [`ArgGroup::id`][crate::ArgGroup::id] for this set of arguments\n    fn group_id() -> Option<crate::Id> {\n        None\n    }\n    /// Append to [`Command`] so it can instantiate `Self` via\n    /// [`FromArgMatches::from_arg_matches_mut`]\n    ///\n    /// This is used to implement `#[command(flatten)]`\n    ///\n    /// See also [`CommandFactory::command`].\n    fn augment_args(cmd: Command) -> Command;\n    /// Append to [`Command`] so it can instantiate `self` via\n    /// [`FromArgMatches::update_from_arg_matches_mut`]\n    ///\n    /// This is used to implement `#[command(flatten)]`\n    ///\n    /// See also [`CommandFactory::command_for_update`].\n    fn augment_args_for_update(cmd: Command) -> Command;\n}\n\n/// Parse a sub-command into a user-defined enum.\n///\n/// Implementing this trait lets a parent container delegate subcommand behavior to `Self`.\n/// with:\n/// - `#[command(subcommand)] field: SubCmd`: Attribute can be used with either struct fields or enum\n///   variants that impl `Subcommand`.\n/// - `#[command(flatten)] Variant(SubCmd)`: Attribute can only be used with enum variants that impl\n///   `Subcommand`.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** Deriving requires the `derive` feature flag\n///\n/// </div>\npub trait Subcommand: FromArgMatches + Sized {\n    /// Append to [`Command`] so it can instantiate `Self` via\n    /// [`FromArgMatches::from_arg_matches_mut`]\n    ///\n    /// This is used to implement `#[command(flatten)]`\n    ///\n    /// See also [`CommandFactory::command`].\n    fn augment_subcommands(cmd: Command) -> Command;\n    /// Append to [`Command`] so it can instantiate `self` via\n    /// [`FromArgMatches::update_from_arg_matches_mut`]\n    ///\n    /// This is used to implement `#[command(flatten)]`\n    ///\n    /// See also [`CommandFactory::command_for_update`].\n    fn augment_subcommands_for_update(cmd: Command) -> Command;\n    /// Test whether `Self` can parse a specific subcommand\n    fn has_subcommand(name: &str) -> bool;\n}\n\n/// Parse arguments into enums.\n///\n/// When deriving [`Parser`], a field whose type implements `ValueEnum` can have the attribute\n/// `#[arg(value_enum)]` which will\n/// - Call [`EnumValueParser`][crate::builder::EnumValueParser]\n/// - Allowing using the `#[arg(default_value_t)]` attribute without implementing `Display`.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** Deriving requires the `derive` feature flag\n///\n/// </div>\npub trait ValueEnum: Sized + Clone {\n    /// All possible argument values, in display order.\n    fn value_variants<'a>() -> &'a [Self];\n\n    /// Parse an argument into `Self`.\n    fn from_str(input: &str, ignore_case: bool) -> Result<Self, String> {\n        Self::value_variants()\n            .iter()\n            .find(|v| {\n                v.to_possible_value()\n                    .expect(\"ValueEnum::value_variants contains only values with a corresponding ValueEnum::to_possible_value\")\n                    .matches(input, ignore_case)\n            })\n            .cloned()\n            .ok_or_else(|| format!(\"invalid variant: {input}\"))\n    }\n\n    /// The canonical argument value.\n    ///\n    /// The value is `None` for skipped variants.\n    fn to_possible_value(&self) -> Option<PossibleValue>;\n}\n\nimpl<T: Parser> Parser for Box<T> {\n    fn parse() -> Self {\n        Box::new(<T as Parser>::parse())\n    }\n\n    fn try_parse() -> Result<Self, Error> {\n        <T as Parser>::try_parse().map(Box::new)\n    }\n\n    fn parse_from<I, It>(itr: I) -> Self\n    where\n        I: IntoIterator<Item = It>,\n        It: Into<OsString> + Clone,\n    {\n        Box::new(<T as Parser>::parse_from(itr))\n    }\n\n    fn try_parse_from<I, It>(itr: I) -> Result<Self, Error>\n    where\n        I: IntoIterator<Item = It>,\n        It: Into<OsString> + Clone,\n    {\n        <T as Parser>::try_parse_from(itr).map(Box::new)\n    }\n}\n\nimpl<T: CommandFactory> CommandFactory for Box<T> {\n    fn command() -> Command {\n        <T as CommandFactory>::command()\n    }\n    fn command_for_update() -> Command {\n        <T as CommandFactory>::command_for_update()\n    }\n}\n\nimpl<T: FromArgMatches> FromArgMatches for Box<T> {\n    fn from_arg_matches(matches: &ArgMatches) -> Result<Self, Error> {\n        <T as FromArgMatches>::from_arg_matches(matches).map(Box::new)\n    }\n    fn from_arg_matches_mut(matches: &mut ArgMatches) -> Result<Self, Error> {\n        <T as FromArgMatches>::from_arg_matches_mut(matches).map(Box::new)\n    }\n    fn update_from_arg_matches(&mut self, matches: &ArgMatches) -> Result<(), Error> {\n        <T as FromArgMatches>::update_from_arg_matches(self, matches)\n    }\n    fn update_from_arg_matches_mut(&mut self, matches: &mut ArgMatches) -> Result<(), Error> {\n        <T as FromArgMatches>::update_from_arg_matches_mut(self, matches)\n    }\n}\n\nimpl<T: Args> Args for Box<T> {\n    fn augment_args(cmd: Command) -> Command {\n        <T as Args>::augment_args(cmd)\n    }\n    fn augment_args_for_update(cmd: Command) -> Command {\n        <T as Args>::augment_args_for_update(cmd)\n    }\n}\n\nimpl<T: Subcommand> Subcommand for Box<T> {\n    fn augment_subcommands(cmd: Command) -> Command {\n        <T as Subcommand>::augment_subcommands(cmd)\n    }\n    fn augment_subcommands_for_update(cmd: Command) -> Command {\n        <T as Subcommand>::augment_subcommands_for_update(cmd)\n    }\n    fn has_subcommand(name: &str) -> bool {\n        <T as Subcommand>::has_subcommand(name)\n    }\n}\n\nfn format_error<I: CommandFactory>(err: Error) -> Error {\n    let mut cmd = I::command();\n    err.format(&mut cmd)\n}\n\nimpl FromArgMatches for () {\n    fn from_arg_matches(_matches: &ArgMatches) -> Result<Self, Error> {\n        Ok(())\n    }\n\n    fn update_from_arg_matches(&mut self, _matches: &ArgMatches) -> Result<(), Error> {\n        Ok(())\n    }\n}\n\nimpl Args for () {\n    fn augment_args(cmd: Command) -> Command {\n        cmd\n    }\n\n    fn augment_args_for_update(cmd: Command) -> Command {\n        cmd\n    }\n}\n\nimpl Subcommand for () {\n    fn augment_subcommands(cmd: Command) -> Command {\n        cmd\n    }\n\n    fn augment_subcommands_for_update(cmd: Command) -> Command {\n        cmd\n    }\n\n    fn has_subcommand(_name: &str) -> bool {\n        false\n    }\n}\n\nimpl FromArgMatches for Infallible {\n    fn from_arg_matches(_matches: &ArgMatches) -> Result<Self, Error> {\n        Err(Error::raw(\n            crate::error::ErrorKind::MissingSubcommand,\n            \"a subcommand is required but one was not provided\",\n        ))\n    }\n\n    fn update_from_arg_matches(&mut self, _matches: &ArgMatches) -> Result<(), Error> {\n        unreachable!(\n            \"there will never be an instance of Infallible and thus &mut self can never be called\"\n        );\n    }\n}\n\nimpl Subcommand for Infallible {\n    fn augment_subcommands(cmd: Command) -> Command {\n        cmd\n    }\n\n    fn augment_subcommands_for_update(cmd: Command) -> Command {\n        cmd\n    }\n\n    fn has_subcommand(_name: &str) -> bool {\n        false\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/error/context.rs",
    "content": "/// Semantics for a piece of error information\n#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]\n#[non_exhaustive]\n#[cfg(feature = \"error-context\")]\npub enum ContextKind {\n    /// The cause of the error\n    InvalidSubcommand,\n    /// The cause of the error\n    InvalidArg,\n    /// Existing arguments\n    PriorArg,\n    /// Accepted subcommands\n    ValidSubcommand,\n    /// Accepted values\n    ValidValue,\n    /// Rejected values\n    InvalidValue,\n    /// Number of values present\n    ActualNumValues,\n    /// Number of allowed values\n    ExpectedNumValues,\n    /// Minimum number of allowed values\n    MinValues,\n    /// Potential fix for the user\n    SuggestedCommand,\n    /// Potential fix for the user\n    SuggestedSubcommand,\n    /// Potential fix for the user\n    SuggestedArg,\n    /// Potential fix for the user\n    SuggestedValue,\n    /// Trailing argument\n    TrailingArg,\n    /// Potential fix for the user\n    Suggested,\n    /// A usage string\n    Usage,\n    /// An opaque message to the user\n    Custom,\n}\n\nimpl ContextKind {\n    /// End-user description of the error case, where relevant\n    pub fn as_str(self) -> Option<&'static str> {\n        match self {\n            Self::InvalidSubcommand => Some(\"Invalid Subcommand\"),\n            Self::InvalidArg => Some(\"Invalid Argument\"),\n            Self::PriorArg => Some(\"Prior Argument\"),\n            Self::ValidSubcommand => Some(\"Valid Subcommand\"),\n            Self::ValidValue => Some(\"Valid Value\"),\n            Self::InvalidValue => Some(\"Invalid Value\"),\n            Self::ActualNumValues => Some(\"Actual Number of Values\"),\n            Self::ExpectedNumValues => Some(\"Expected Number of Values\"),\n            Self::MinValues => Some(\"Minimum Number of Values\"),\n            Self::SuggestedCommand => Some(\"Suggested Command\"),\n            Self::SuggestedSubcommand => Some(\"Suggested Subcommand\"),\n            Self::SuggestedArg => Some(\"Suggested Argument\"),\n            Self::SuggestedValue => Some(\"Suggested Value\"),\n            Self::TrailingArg => Some(\"Trailing Argument\"),\n            Self::Suggested => Some(\"Suggested\"),\n            Self::Usage => None,\n            Self::Custom => None,\n        }\n    }\n}\n\nimpl std::fmt::Display for ContextKind {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.as_str().unwrap_or_default().fmt(f)\n    }\n}\n\n/// A piece of error information\n#[derive(Clone, Debug, PartialEq, Eq)]\n#[non_exhaustive]\n#[cfg(feature = \"error-context\")]\npub enum ContextValue {\n    /// [`ContextKind`] is self-sufficient, no additional information needed\n    None,\n    /// A single value\n    Bool(bool),\n    /// A single value\n    String(String),\n    /// Many values\n    Strings(Vec<String>),\n    /// A single value\n    StyledStr(crate::builder::StyledStr),\n    /// many value\n    StyledStrs(Vec<crate::builder::StyledStr>),\n    /// A single value\n    Number(isize),\n}\n\nimpl std::fmt::Display for ContextValue {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        match self {\n            Self::None => \"\".fmt(f),\n            Self::Bool(v) => v.fmt(f),\n            Self::String(v) => v.fmt(f),\n            Self::Strings(v) => v.join(\", \").fmt(f),\n            Self::StyledStr(v) => v.fmt(f),\n            Self::StyledStrs(v) => {\n                for (i, v) in v.iter().enumerate() {\n                    if i != 0 {\n                        \", \".fmt(f)?;\n                    }\n                    v.fmt(f)?;\n                }\n                Ok(())\n            }\n            Self::Number(v) => v.fmt(f),\n        }\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/error/format.rs",
    "content": "#![allow(missing_copy_implementations)]\n#![allow(missing_debug_implementations)]\n#![cfg_attr(not(feature = \"error-context\"), allow(dead_code))]\n#![cfg_attr(not(feature = \"error-context\"), allow(unused_imports))]\n\nuse std::borrow::Cow;\n\nuse crate::ArgAction;\nuse crate::builder::Command;\nuse crate::builder::StyledStr;\nuse crate::builder::Styles;\n#[cfg(feature = \"error-context\")]\nuse crate::error::ContextKind;\n#[cfg(feature = \"error-context\")]\nuse crate::error::ContextValue;\nuse crate::error::ErrorKind;\nuse crate::output::TAB;\nuse crate::util::Escape;\n\n/// Defines how to format an error for displaying to the user\npub trait ErrorFormatter: Sized {\n    /// Stylize the error for the terminal\n    fn format_error(error: &crate::error::Error<Self>) -> StyledStr;\n}\n\n/// Report [`ErrorKind`]\n///\n/// No context is included.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** Consider removing the `error-context` default feature if using this to remove all\n/// overhead for [`RichFormatter`].\n///\n/// </div>\n#[non_exhaustive]\npub struct KindFormatter;\n\nimpl ErrorFormatter for KindFormatter {\n    fn format_error(error: &crate::error::Error<Self>) -> StyledStr {\n        use std::fmt::Write as _;\n        let styles = &error.inner.styles;\n\n        let mut styled = StyledStr::new();\n        start_error(&mut styled, styles);\n        if let Some(msg) = error.kind().as_str() {\n            styled.push_str(msg);\n        } else if let Some(source) = error.inner.source.as_ref() {\n            let _ = write!(styled, \"{source}\");\n        } else {\n            styled.push_str(\"unknown cause\");\n        }\n        styled.push_str(\"\\n\");\n        styled\n    }\n}\n\n/// Richly formatted error context\n///\n/// This follows the [rustc diagnostic style guide](https://rustc-dev-guide.rust-lang.org/diagnostics.html#suggestion-style-guide).\n#[non_exhaustive]\n#[cfg(feature = \"error-context\")]\npub struct RichFormatter;\n\n#[cfg(feature = \"error-context\")]\nimpl ErrorFormatter for RichFormatter {\n    fn format_error(error: &crate::error::Error<Self>) -> StyledStr {\n        use std::fmt::Write as _;\n        let styles = &error.inner.styles;\n        let valid = &styles.get_valid();\n\n        let mut styled = StyledStr::new();\n        start_error(&mut styled, styles);\n\n        if !write_dynamic_context(error, &mut styled, styles) {\n            if let Some(msg) = error.kind().as_str() {\n                styled.push_str(msg);\n            } else if let Some(source) = error.inner.source.as_ref() {\n                let _ = write!(styled, \"{source}\");\n            } else {\n                styled.push_str(\"unknown cause\");\n            }\n        }\n\n        let mut suggested = false;\n        if let Some(valid) = error.get(ContextKind::SuggestedSubcommand) {\n            styled.push_str(\"\\n\");\n            if !suggested {\n                styled.push_str(\"\\n\");\n                suggested = true;\n            }\n            did_you_mean(&mut styled, styles, \"subcommand\", valid);\n        }\n        if let Some(valid) = error.get(ContextKind::SuggestedArg) {\n            styled.push_str(\"\\n\");\n            if !suggested {\n                styled.push_str(\"\\n\");\n                suggested = true;\n            }\n            did_you_mean(&mut styled, styles, \"argument\", valid);\n        }\n        if let Some(valid) = error.get(ContextKind::SuggestedValue) {\n            styled.push_str(\"\\n\");\n            if !suggested {\n                styled.push_str(\"\\n\");\n                suggested = true;\n            }\n            did_you_mean(&mut styled, styles, \"value\", valid);\n        }\n        let suggestions = error.get(ContextKind::Suggested);\n        if let Some(ContextValue::StyledStrs(suggestions)) = suggestions {\n            if !suggested {\n                styled.push_str(\"\\n\");\n            }\n            for suggestion in suggestions {\n                let _ = write!(styled, \"\\n{TAB}{valid}tip:{valid:#} \",);\n                styled.push_styled(suggestion);\n            }\n        }\n\n        let usage = error.get(ContextKind::Usage);\n        if let Some(ContextValue::StyledStr(usage)) = usage {\n            put_usage(&mut styled, usage);\n        }\n\n        try_help(&mut styled, styles, error.inner.help_flag.as_deref());\n\n        styled\n    }\n}\n\nfn start_error(styled: &mut StyledStr, styles: &Styles) {\n    use std::fmt::Write as _;\n    let error = &styles.get_error();\n    let _ = write!(styled, \"{error}error:{error:#} \");\n}\n\n#[must_use]\n#[cfg(feature = \"error-context\")]\nfn write_dynamic_context(\n    error: &crate::error::Error,\n    styled: &mut StyledStr,\n    styles: &Styles,\n) -> bool {\n    use std::fmt::Write as _;\n    let valid = styles.get_valid();\n    let invalid = styles.get_invalid();\n    let literal = styles.get_literal();\n\n    match error.kind() {\n        ErrorKind::ArgumentConflict => {\n            let mut prior_arg = error.get(ContextKind::PriorArg);\n            if let Some(ContextValue::String(invalid_arg)) = error.get(ContextKind::InvalidArg) {\n                if Some(&ContextValue::String(invalid_arg.clone())) == prior_arg {\n                    prior_arg = None;\n                    let _ = write!(\n                        styled,\n                        \"the argument '{invalid}{invalid_arg}{invalid:#}' cannot be used multiple times\",\n                    );\n                } else {\n                    let _ = write!(\n                        styled,\n                        \"the argument '{invalid}{invalid_arg}{invalid:#}' cannot be used with\",\n                    );\n                }\n            } else if let Some(ContextValue::String(invalid_arg)) =\n                error.get(ContextKind::InvalidSubcommand)\n            {\n                let _ = write!(\n                    styled,\n                    \"the subcommand '{invalid}{invalid_arg}{invalid:#}' cannot be used with\",\n                );\n            } else {\n                styled.push_str(error.kind().as_str().unwrap());\n            }\n\n            if let Some(prior_arg) = prior_arg {\n                match prior_arg {\n                    ContextValue::Strings(values) => {\n                        styled.push_str(\":\");\n                        for v in values {\n                            let _ = write!(styled, \"\\n{TAB}{invalid}{v}{invalid:#}\",);\n                        }\n                    }\n                    ContextValue::String(value) => {\n                        let _ = write!(styled, \" '{invalid}{value}{invalid:#}'\",);\n                    }\n                    _ => {\n                        styled.push_str(\" one or more of the other specified arguments\");\n                    }\n                }\n            }\n\n            true\n        }\n        ErrorKind::NoEquals => {\n            let invalid_arg = error.get(ContextKind::InvalidArg);\n            if let Some(ContextValue::String(invalid_arg)) = invalid_arg {\n                let _ = write!(\n                    styled,\n                    \"equal sign is needed when assigning values to '{invalid}{invalid_arg}{invalid:#}'\",\n                );\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::InvalidValue => {\n            let invalid_arg = error.get(ContextKind::InvalidArg);\n            let invalid_value = error.get(ContextKind::InvalidValue);\n            if let (\n                Some(ContextValue::String(invalid_arg)),\n                Some(ContextValue::String(invalid_value)),\n            ) = (invalid_arg, invalid_value)\n            {\n                if invalid_value.is_empty() {\n                    let _ = write!(\n                        styled,\n                        \"a value is required for '{invalid}{invalid_arg}{invalid:#}' but none was supplied\",\n                    );\n                } else {\n                    let _ = write!(\n                        styled,\n                        \"invalid value '{invalid}{invalid_value}{invalid:#}' for '{literal}{invalid_arg}{literal:#}'\",\n                    );\n                }\n\n                let values = error.get(ContextKind::ValidValue);\n                write_values_list(\"possible values\", styled, valid, values);\n\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::InvalidSubcommand => {\n            let invalid_sub = error.get(ContextKind::InvalidSubcommand);\n            if let Some(ContextValue::String(invalid_sub)) = invalid_sub {\n                let _ = write!(\n                    styled,\n                    \"unrecognized subcommand '{invalid}{invalid_sub}{invalid:#}'\",\n                );\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::MissingRequiredArgument => {\n            let invalid_arg = error.get(ContextKind::InvalidArg);\n            if let Some(ContextValue::Strings(invalid_arg)) = invalid_arg {\n                styled.push_str(\"the following required arguments were not provided:\");\n                for v in invalid_arg {\n                    let _ = write!(styled, \"\\n{TAB}{valid}{v}{valid:#}\",);\n                }\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::MissingSubcommand => {\n            let invalid_sub = error.get(ContextKind::InvalidSubcommand);\n            if let Some(ContextValue::String(invalid_sub)) = invalid_sub {\n                let _ = write!(\n                    styled,\n                    \"'{invalid}{invalid_sub}{invalid:#}' requires a subcommand but one was not provided\",\n                );\n                let values = error.get(ContextKind::ValidSubcommand);\n                write_values_list(\"subcommands\", styled, valid, values);\n\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::InvalidUtf8 => false,\n        ErrorKind::TooManyValues => {\n            let invalid_arg = error.get(ContextKind::InvalidArg);\n            let invalid_value = error.get(ContextKind::InvalidValue);\n            if let (\n                Some(ContextValue::String(invalid_arg)),\n                Some(ContextValue::String(invalid_value)),\n            ) = (invalid_arg, invalid_value)\n            {\n                let _ = write!(\n                    styled,\n                    \"unexpected value '{invalid}{invalid_value}{invalid:#}' for '{literal}{invalid_arg}{literal:#}' found; no more were expected\",\n                );\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::TooFewValues => {\n            let invalid_arg = error.get(ContextKind::InvalidArg);\n            let actual_num_values = error.get(ContextKind::ActualNumValues);\n            let min_values = error.get(ContextKind::MinValues);\n            if let (\n                Some(ContextValue::String(invalid_arg)),\n                Some(ContextValue::Number(actual_num_values)),\n                Some(ContextValue::Number(min_values)),\n            ) = (invalid_arg, actual_num_values, min_values)\n            {\n                let were_provided = singular_or_plural(*actual_num_values as usize);\n                let _ = write!(\n                    styled,\n                    \"{valid}{min_values}{valid:#} values required by '{literal}{invalid_arg}{literal:#}'; only {invalid}{actual_num_values}{invalid:#}{were_provided}\",\n                );\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::ValueValidation => {\n            let invalid_arg = error.get(ContextKind::InvalidArg);\n            let invalid_value = error.get(ContextKind::InvalidValue);\n            if let (\n                Some(ContextValue::String(invalid_arg)),\n                Some(ContextValue::String(invalid_value)),\n            ) = (invalid_arg, invalid_value)\n            {\n                let _ = write!(\n                    styled,\n                    \"invalid value '{invalid}{invalid_value}{invalid:#}' for '{literal}{invalid_arg}{literal:#}'\",\n                );\n                if let Some(source) = error.inner.source.as_deref() {\n                    let _ = write!(styled, \": {source}\");\n                }\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::WrongNumberOfValues => {\n            let invalid_arg = error.get(ContextKind::InvalidArg);\n            let actual_num_values = error.get(ContextKind::ActualNumValues);\n            let num_values = error.get(ContextKind::ExpectedNumValues);\n            if let (\n                Some(ContextValue::String(invalid_arg)),\n                Some(ContextValue::Number(actual_num_values)),\n                Some(ContextValue::Number(num_values)),\n            ) = (invalid_arg, actual_num_values, num_values)\n            {\n                let were_provided = singular_or_plural(*actual_num_values as usize);\n                let _ = write!(\n                    styled,\n                    \"{valid}{num_values}{valid:#} values required for '{literal}{invalid_arg}{literal:#}' but {invalid}{actual_num_values}{invalid:#}{were_provided}\",\n                );\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::UnknownArgument => {\n            let invalid_arg = error.get(ContextKind::InvalidArg);\n            if let Some(ContextValue::String(invalid_arg)) = invalid_arg {\n                let _ = write!(\n                    styled,\n                    \"unexpected argument '{invalid}{invalid_arg}{invalid:#}' found\",\n                );\n                true\n            } else {\n                false\n            }\n        }\n        ErrorKind::DisplayHelp\n        | ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand\n        | ErrorKind::DisplayVersion\n        | ErrorKind::Io\n        | ErrorKind::Format => false,\n    }\n}\n\n#[cfg(feature = \"error-context\")]\nfn write_values_list(\n    list_name: &'static str,\n    styled: &mut StyledStr,\n    valid: &anstyle::Style,\n    possible_values: Option<&ContextValue>,\n) {\n    use std::fmt::Write as _;\n    if let Some(ContextValue::Strings(possible_values)) = possible_values {\n        if !possible_values.is_empty() {\n            let _ = write!(styled, \"\\n{TAB}[{list_name}: \");\n\n            for (idx, val) in possible_values.iter().enumerate() {\n                if idx > 0 {\n                    styled.push_str(\", \");\n                }\n                let _ = write!(styled, \"{valid}{}{valid:#}\", Escape(val));\n            }\n\n            styled.push_str(\"]\");\n        }\n    }\n}\n\npub(crate) fn format_error_message(\n    message: &str,\n    styles: &Styles,\n    cmd: Option<&Command>,\n    usage: Option<&StyledStr>,\n) -> StyledStr {\n    let mut styled = StyledStr::new();\n    start_error(&mut styled, styles);\n    styled.push_str(message);\n    if let Some(usage) = usage {\n        put_usage(&mut styled, usage);\n    }\n    if let Some(cmd) = cmd {\n        try_help(&mut styled, styles, get_help_flag(cmd).as_deref());\n    }\n    styled\n}\n\n/// Returns the singular or plural form on the verb to be based on the argument's value.\nfn singular_or_plural(n: usize) -> &'static str {\n    if n > 1 {\n        \" were provided\"\n    } else {\n        \" was provided\"\n    }\n}\n\nfn put_usage(styled: &mut StyledStr, usage: &StyledStr) {\n    styled.push_str(\"\\n\\n\");\n    styled.push_styled(usage);\n}\n\npub(crate) fn get_help_flag(cmd: &Command) -> Option<Cow<'static, str>> {\n    if !cmd.is_disable_help_flag_set() {\n        Some(Cow::Borrowed(\"--help\"))\n    } else if let Some(flag) = get_user_help_flag(cmd) {\n        Some(Cow::Owned(flag))\n    } else if cmd.has_subcommands() && !cmd.is_disable_help_subcommand_set() {\n        Some(Cow::Borrowed(\"help\"))\n    } else {\n        None\n    }\n}\n\nfn get_user_help_flag(cmd: &Command) -> Option<String> {\n    let arg = cmd.get_arguments().find(|arg| match arg.get_action() {\n        ArgAction::Help | ArgAction::HelpShort | ArgAction::HelpLong => true,\n        ArgAction::Append\n        | ArgAction::Count\n        | ArgAction::SetTrue\n        | ArgAction::SetFalse\n        | ArgAction::Set\n        | ArgAction::Version => false,\n    })?;\n\n    arg.get_long()\n        .map(|long| format!(\"--{long}\"))\n        .or_else(|| arg.get_short().map(|short| format!(\"-{short}\")))\n}\n\nfn try_help(styled: &mut StyledStr, styles: &Styles, help: Option<&str>) {\n    if let Some(help) = help {\n        use std::fmt::Write as _;\n        let literal = &styles.get_literal();\n        let _ = write!(\n            styled,\n            \"\\n\\nFor more information, try '{literal}{help}{literal:#}'.\\n\",\n        );\n    } else {\n        styled.push_str(\"\\n\");\n    }\n}\n\n#[cfg(feature = \"error-context\")]\nfn did_you_mean(styled: &mut StyledStr, styles: &Styles, context: &str, possibles: &ContextValue) {\n    use std::fmt::Write as _;\n\n    let valid = &styles.get_valid();\n    let _ = write!(styled, \"{TAB}{valid}tip:{valid:#}\",);\n    if let ContextValue::String(possible) = possibles {\n        let _ = write!(\n            styled,\n            \" a similar {context} exists: '{valid}{possible}{valid:#}'\",\n        );\n    } else if let ContextValue::Strings(possibles) = possibles {\n        if possibles.len() == 1 {\n            let _ = write!(styled, \" a similar {context} exists: \",);\n        } else {\n            let _ = write!(styled, \" some similar {context}s exist: \",);\n        }\n        for (i, possible) in possibles.iter().enumerate() {\n            if i != 0 {\n                styled.push_str(\", \");\n            }\n            let _ = write!(styled, \"'{valid}{possible}{valid:#}'\",);\n        }\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/error/kind.rs",
    "content": "/// Command line argument parser kind of error\n#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]\n#[non_exhaustive]\npub enum ErrorKind {\n    /// Occurs when an [`Arg`][crate::Arg] has a set of possible values,\n    /// and the user provides a value which isn't in that set.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind};\n    /// let result = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"speed\")\n    ///         .value_parser([\"fast\", \"slow\"]))\n    ///     .try_get_matches_from(vec![\"prog\", \"other\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue);\n    /// ```\n    InvalidValue,\n\n    /// Occurs when a user provides a flag, option, argument or subcommand which isn't defined.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg, error::ErrorKind};\n    /// let result = Command::new(\"prog\")\n    ///     .arg(arg!(--flag \"some flag\"))\n    ///     .try_get_matches_from(vec![\"prog\", \"--other\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::UnknownArgument);\n    /// ```\n    UnknownArgument,\n\n    /// Occurs when the user provides an unrecognized [`Subcommand`] which meets the threshold for\n    /// being similar enough to an existing subcommand.\n    /// If it doesn't meet the threshold, or the 'suggestions' feature is disabled,\n    /// the more general [`UnknownArgument`] error is returned.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"suggestions\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, };\n    /// let result = Command::new(\"prog\")\n    ///     .subcommand(Command::new(\"config\")\n    ///         .about(\"Used for configuration\")\n    ///         .arg(Arg::new(\"config_file\")\n    ///             .help(\"The configuration file to use\")))\n    ///     .try_get_matches_from(vec![\"prog\", \"confi\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidSubcommand);\n    /// # }\n    /// ```\n    ///\n    /// [`Subcommand`]: crate::Subcommand\n    /// [`UnknownArgument`]: ErrorKind::UnknownArgument\n    InvalidSubcommand,\n\n    /// Occurs when the user doesn't use equals for an option that requires equal\n    /// sign to provide values.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let res = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"color\")\n    ///          .action(ArgAction::Set)\n    ///          .require_equals(true)\n    ///          .long(\"color\"))\n    ///     .try_get_matches_from(vec![\"prog\", \"--color\", \"red\"]);\n    /// assert!(res.is_err());\n    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::NoEquals);\n    /// ```\n    NoEquals,\n\n    /// Occurs when the user provides a value for an argument with a custom validation and the\n    /// value fails that validation.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, value_parser};\n    /// fn is_numeric(val: &str) -> Result<(), String> {\n    ///     match val.parse::<i64>() {\n    ///         Ok(..) => Ok(()),\n    ///         Err(..) => Err(String::from(\"value wasn't a number!\")),\n    ///     }\n    /// }\n    ///\n    /// let result = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"num\")\n    ///          .value_parser(value_parser!(u8)))\n    ///     .try_get_matches_from(vec![\"prog\", \"NotANumber\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::ValueValidation);\n    /// ```\n    ValueValidation,\n\n    /// Occurs when a user provides more values for an argument than were defined by setting\n    /// [`Arg::num_args`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind};\n    /// let result = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"arg\")\n    ///         .num_args(1..=2))\n    ///     .try_get_matches_from(vec![\"prog\", \"too\", \"many\", \"values\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::TooManyValues);\n    /// ```\n    /// [`Arg::num_args`]: crate::Arg::num_args()\n    TooManyValues,\n\n    /// Occurs when the user provides fewer values for an argument than were defined by setting\n    /// [`Arg::num_args`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind};\n    /// let result = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"some_opt\")\n    ///         .long(\"opt\")\n    ///         .num_args(3..))\n    ///     .try_get_matches_from(vec![\"prog\", \"--opt\", \"too\", \"few\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::TooFewValues);\n    /// ```\n    /// [`Arg::num_args`]: crate::Arg::num_args()\n    TooFewValues,\n\n    /// Occurs when the user provides a different number of values for an argument than what's\n    /// been defined by setting [`Arg::num_args`] or than was implicitly set by\n    /// [`Arg::value_names`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let result = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"some_opt\")\n    ///         .long(\"opt\")\n    ///         .action(ArgAction::Set)\n    ///         .num_args(2))\n    ///     .try_get_matches_from(vec![\"prog\", \"--opt\", \"wrong\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::WrongNumberOfValues);\n    /// ```\n    ///\n    /// [`Arg::num_args`]: crate::Arg::num_args()\n    /// [`Arg::value_names`]: crate::Arg::value_names()\n    WrongNumberOfValues,\n\n    /// Occurs when the user provides two values which conflict with each other and can't be used\n    /// together.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// let result = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"debug\")\n    ///         .long(\"debug\")\n    ///         .action(ArgAction::SetTrue)\n    ///         .conflicts_with(\"color\"))\n    ///     .arg(Arg::new(\"color\")\n    ///         .long(\"color\")\n    ///         .action(ArgAction::SetTrue))\n    ///     .try_get_matches_from(vec![\"prog\", \"--debug\", \"--color\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict);\n    /// ```\n    ArgumentConflict,\n\n    /// Occurs when the user does not provide one or more required arguments.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind};\n    /// let result = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"debug\")\n    ///         .required(true))\n    ///     .try_get_matches_from(vec![\"prog\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n    /// ```\n    MissingRequiredArgument,\n\n    /// Occurs when a subcommand is required (as defined by [`Command::subcommand_required`]),\n    /// but the user does not provide one.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, error::ErrorKind};\n    /// let err = Command::new(\"prog\")\n    ///     .subcommand_required(true)\n    ///     .subcommand(Command::new(\"test\"))\n    ///     .try_get_matches_from(vec![\n    ///         \"myprog\",\n    ///     ]);\n    /// assert!(err.is_err());\n    /// assert_eq!(err.unwrap_err().kind(), ErrorKind::MissingSubcommand);\n    /// # ;\n    /// ```\n    ///\n    /// [`Command::subcommand_required`]: crate::Command::subcommand_required\n    MissingSubcommand,\n\n    /// Occurs when the user provides a value containing invalid UTF-8.\n    ///\n    /// To allow arbitrary data\n    /// - Set [`Arg::value_parser(value_parser!(OsString))`][crate::Arg::value_parser] for argument values\n    /// - Set [`Command::external_subcommand_value_parser`] for external-subcommand\n    ///   values\n    ///\n    /// # Platform Specific\n    ///\n    /// Non-Windows platforms only (such as Linux, Unix, OSX, etc.)\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(unix)] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};\n    /// # use std::os::unix::ffi::OsStringExt;\n    /// # use std::ffi::OsString;\n    /// let result = Command::new(\"prog\")\n    ///     .arg(Arg::new(\"utf8\")\n    ///         .short('u')\n    ///         .action(ArgAction::Set))\n    ///     .try_get_matches_from(vec![OsString::from(\"myprog\"),\n    ///                                 OsString::from(\"-u\"),\n    ///                                 OsString::from_vec(vec![0xE9])]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n    /// # }\n    /// ```\n    ///\n    /// [`Command::external_subcommand_value_parser`]: crate::Command::external_subcommand_value_parser\n    InvalidUtf8,\n\n    /// Not a true \"error\" as it means `--help` or similar was used.\n    /// The help message will be sent to `stdout`.\n    ///\n    /// **Note**: If the help is displayed due to an error (such as missing subcommands) it will\n    /// be sent to `stderr` instead of `stdout`.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"help\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind};\n    /// let result = Command::new(\"prog\")\n    ///     .try_get_matches_from(vec![\"prog\", \"--help\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::DisplayHelp);\n    /// # }\n    /// ```\n    DisplayHelp,\n\n    /// Occurs when either an argument or a [`Subcommand`] is required, as defined by\n    /// [`Command::arg_required_else_help`] , but the user did not provide\n    /// one.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind, };\n    /// let result = Command::new(\"prog\")\n    ///     .arg_required_else_help(true)\n    ///     .subcommand(Command::new(\"config\")\n    ///         .about(\"Used for configuration\")\n    ///         .arg(Arg::new(\"config_file\")\n    ///             .help(\"The configuration file to use\")))\n    ///     .try_get_matches_from(vec![\"prog\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand);\n    /// ```\n    ///\n    /// [`Subcommand`]: crate::Subcommand\n    /// [`Command::arg_required_else_help`]: crate::Command::arg_required_else_help\n    DisplayHelpOnMissingArgumentOrSubcommand,\n\n    /// Not a true \"error\" as it means `--version` or similar was used.\n    /// The message will be sent to `stdout`.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, error::ErrorKind};\n    /// let result = Command::new(\"prog\")\n    ///     .version(\"3.0\")\n    ///     .try_get_matches_from(vec![\"prog\", \"--version\"]);\n    /// assert!(result.is_err());\n    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::DisplayVersion);\n    /// ```\n    DisplayVersion,\n\n    /// Represents an [I/O error].\n    /// Can occur when writing to `stderr` or `stdout` or reading a configuration file.\n    ///\n    /// [I/O error]: std::io::Error\n    Io,\n\n    /// Represents a [Format error] (which is a part of [`Display`]).\n    /// Typically caused by writing to `stderr` or `stdout`.\n    ///\n    /// [`Display`]: std::fmt::Display\n    /// [Format error]: std::fmt::Error\n    Format,\n}\n\nimpl ErrorKind {\n    /// End-user description of the error case, where relevant\n    pub fn as_str(self) -> Option<&'static str> {\n        match self {\n            Self::InvalidValue => Some(\"one of the values isn't valid for an argument\"),\n            Self::UnknownArgument => Some(\"unexpected argument found\"),\n            Self::InvalidSubcommand => Some(\"unrecognized subcommand\"),\n            Self::NoEquals => Some(\"equal is needed when assigning values to one of the arguments\"),\n            Self::ValueValidation => Some(\"invalid value for one of the arguments\"),\n            Self::TooManyValues => Some(\"unexpected value for an argument found\"),\n            Self::TooFewValues => Some(\"more values required for an argument\"),\n            Self::WrongNumberOfValues => Some(\"too many or too few values for an argument\"),\n            Self::ArgumentConflict => {\n                Some(\"an argument cannot be used with one or more of the other specified arguments\")\n            }\n            Self::MissingRequiredArgument => {\n                Some(\"one or more required arguments were not provided\")\n            }\n            Self::MissingSubcommand => Some(\"a subcommand is required but one was not provided\"),\n            Self::InvalidUtf8 => Some(\"invalid UTF-8 was detected in one or more arguments\"),\n            Self::DisplayHelp => None,\n            Self::DisplayHelpOnMissingArgumentOrSubcommand => None,\n            Self::DisplayVersion => None,\n            Self::Io => None,\n            Self::Format => None,\n        }\n    }\n}\n\nimpl std::fmt::Display for ErrorKind {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.as_str().unwrap_or_default().fmt(f)\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/error/mod.rs",
    "content": "//! Error reporting\n\n#![cfg_attr(not(feature = \"error-context\"), allow(dead_code))]\n#![cfg_attr(not(feature = \"error-context\"), allow(unused_imports))]\n#![cfg_attr(not(feature = \"error-context\"), allow(unused_variables))]\n#![cfg_attr(not(feature = \"error-context\"), allow(unused_mut))]\n#![cfg_attr(not(feature = \"error-context\"), allow(clippy::let_and_return))]\n\n// Std\nuse std::{\n    borrow::Cow,\n    convert::From,\n    error,\n    fmt::{self, Debug, Display, Formatter},\n    io,\n    result::Result as StdResult,\n};\n\n// Internal\nuse crate::Command;\nuse crate::builder::StyledStr;\nuse crate::builder::Styles;\nuse crate::output::fmt::Colorizer;\nuse crate::output::fmt::Stream;\nuse crate::parser::features::suggestions;\nuse crate::util::FlatMap;\nuse crate::util::{SUCCESS_CODE, USAGE_CODE, color::ColorChoice};\n\n#[cfg(feature = \"error-context\")]\nmod context;\nmod format;\nmod kind;\n\npub use format::ErrorFormatter;\npub use format::KindFormatter;\npub use kind::ErrorKind;\n\n#[cfg(feature = \"error-context\")]\npub use context::ContextKind;\n#[cfg(feature = \"error-context\")]\npub use context::ContextValue;\n#[cfg(feature = \"error-context\")]\npub use format::RichFormatter;\n\n#[cfg(not(feature = \"error-context\"))]\npub use KindFormatter as DefaultFormatter;\n#[cfg(feature = \"error-context\")]\npub use RichFormatter as DefaultFormatter;\n\n/// Short hand for [`Result`] type\n///\n/// [`Result`]: std::result::Result\npub type Result<T, E = Error> = StdResult<T, E>;\n\n/// Command Line Argument Parser Error\n///\n/// See [`Command::error`] to create an error.\n///\n/// [`Command::error`]: crate::Command::error\npub struct Error<F: ErrorFormatter = DefaultFormatter> {\n    inner: Box<ErrorInner>,\n    phantom: std::marker::PhantomData<F>,\n}\n\n#[derive(Debug)]\nstruct ErrorInner {\n    kind: ErrorKind,\n    #[cfg(feature = \"error-context\")]\n    context: FlatMap<ContextKind, ContextValue>,\n    message: Option<Message>,\n    source: Option<Box<dyn error::Error + Send + Sync>>,\n    help_flag: Option<Cow<'static, str>>,\n    styles: Styles,\n    color_when: ColorChoice,\n    color_help_when: ColorChoice,\n    backtrace: Option<Backtrace>,\n}\n\nimpl<F: ErrorFormatter> Error<F> {\n    /// Create an unformatted error\n    ///\n    /// This is for you need to pass the error up to\n    /// a place that has access to the `Command` at which point you can call [`Error::format`].\n    ///\n    /// Prefer [`Command::error`] for generating errors.\n    ///\n    /// [`Command::error`]: crate::Command::error\n    pub fn raw(kind: ErrorKind, message: impl Display) -> Self {\n        Self::new(kind).set_message(message.to_string())\n    }\n\n    /// Format the existing message with the Command's context\n    #[must_use]\n    pub fn format(mut self, cmd: &mut Command) -> Self {\n        cmd._build_self(false);\n        let usage = cmd.render_usage_();\n        if let Some(message) = self.inner.message.as_mut() {\n            message.format(cmd, usage);\n        }\n        self.with_cmd(cmd)\n    }\n\n    /// Create an error with a pre-defined message\n    ///\n    /// See also\n    /// - [`Error::insert`]\n    /// - [`Error::with_cmd`]\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"error-context\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::error::ErrorKind;\n    /// # use clap::error::ContextKind;\n    /// # use clap::error::ContextValue;\n    ///\n    /// let cmd = clap::Command::new(\"prog\");\n    ///\n    /// let mut err = clap::Error::new(ErrorKind::ValueValidation)\n    ///     .with_cmd(&cmd);\n    /// err.insert(ContextKind::InvalidArg, ContextValue::String(\"--foo\".to_owned()));\n    /// err.insert(ContextKind::InvalidValue, ContextValue::String(\"bar\".to_owned()));\n    ///\n    /// err.print();\n    /// # }\n    /// ```\n    pub fn new(kind: ErrorKind) -> Self {\n        Self {\n            inner: Box::new(ErrorInner {\n                kind,\n                #[cfg(feature = \"error-context\")]\n                context: FlatMap::new(),\n                message: None,\n                source: None,\n                help_flag: None,\n                styles: Styles::plain(),\n                color_when: ColorChoice::Never,\n                color_help_when: ColorChoice::Never,\n                backtrace: Backtrace::new(),\n            }),\n            phantom: Default::default(),\n        }\n    }\n\n    /// Apply [`Command`]'s formatting to the error\n    ///\n    /// Generally, this is used with [`Error::new`]\n    pub fn with_cmd(self, cmd: &Command) -> Self {\n        self.set_styles(cmd.get_styles().clone())\n            .set_color(cmd.get_color())\n            .set_colored_help(cmd.color_help())\n            .set_help_flag(format::get_help_flag(cmd))\n    }\n\n    /// Apply an alternative formatter to the error\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// # use clap::error::KindFormatter;\n    /// let cmd = Command::new(\"foo\")\n    ///     .arg(Arg::new(\"input\").required(true));\n    /// let matches = cmd\n    ///     .try_get_matches_from([\"foo\", \"input.txt\"])\n    ///     .map_err(|e| e.apply::<KindFormatter>())\n    ///     .unwrap_or_else(|e| e.exit());\n    /// ```\n    pub fn apply<EF: ErrorFormatter>(self) -> Error<EF> {\n        Error {\n            inner: self.inner,\n            phantom: Default::default(),\n        }\n    }\n\n    /// Type of error for programmatic processing\n    pub fn kind(&self) -> ErrorKind {\n        self.inner.kind\n    }\n\n    /// Additional information to further qualify the error\n    #[cfg(feature = \"error-context\")]\n    pub fn context(&self) -> impl Iterator<Item = (ContextKind, &ContextValue)> {\n        self.inner.context.iter().map(|(k, v)| (*k, v))\n    }\n\n    /// Lookup a piece of context\n    #[inline(never)]\n    #[cfg(feature = \"error-context\")]\n    pub fn get(&self, kind: ContextKind) -> Option<&ContextValue> {\n        self.inner.context.get(&kind)\n    }\n\n    /// Insert a piece of context\n    ///\n    /// If this `ContextKind` is already present, its value is replaced and the old value is returned.\n    #[inline(never)]\n    #[cfg(feature = \"error-context\")]\n    pub fn insert(&mut self, kind: ContextKind, value: ContextValue) -> Option<ContextValue> {\n        self.inner.context.insert(kind, value)\n    }\n\n    /// Remove a piece of context, return the old value if any\n    ///\n    /// The context is currently implemented in a vector, so `remove` takes\n    /// linear time.\n    #[inline(never)]\n    #[cfg(feature = \"error-context\")]\n    pub fn remove(&mut self, kind: ContextKind) -> Option<ContextValue> {\n        self.inner.context.remove(&kind)\n    }\n\n    /// Should the message be written to `stdout` or not?\n    #[inline]\n    pub fn use_stderr(&self) -> bool {\n        self.stream() == Stream::Stderr\n    }\n\n    pub(crate) fn stream(&self) -> Stream {\n        match self.kind() {\n            ErrorKind::DisplayHelp | ErrorKind::DisplayVersion => Stream::Stdout,\n            _ => Stream::Stderr,\n        }\n    }\n\n    /// Returns the exit code that `.exit` will exit the process with.\n    ///\n    /// When the error's kind would print to `stderr` this returns `2`,\n    /// else it returns `0`.\n    pub fn exit_code(&self) -> i32 {\n        if self.use_stderr() {\n            USAGE_CODE\n        } else {\n            SUCCESS_CODE\n        }\n    }\n\n    /// Prints the error and exits.\n    ///\n    /// Depending on the error kind, this either prints to `stderr` and exits with a status of `2`\n    /// or prints to `stdout` and exits with a status of `0`.\n    pub fn exit(&self) -> ! {\n        // Swallow broken pipe errors\n        let _ = self.print();\n        std::process::exit(self.exit_code());\n    }\n\n    /// Prints formatted and colored error to `stdout` or `stderr` according to its error kind\n    ///\n    /// # Example\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// use clap::Command;\n    ///\n    /// match Command::new(\"Command\").try_get_matches() {\n    ///     Ok(matches) => {\n    ///         // do_something\n    ///     },\n    ///     Err(err) => {\n    ///         err.print().expect(\"Error writing Error\");\n    ///         // do_something\n    ///     },\n    /// };\n    /// ```\n    pub fn print(&self) -> io::Result<()> {\n        let style = self.formatted();\n        let color_when = if matches!(\n            self.kind(),\n            ErrorKind::DisplayHelp | ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand,\n        ) {\n            self.inner.color_help_when\n        } else {\n            self.inner.color_when\n        };\n        let c = Colorizer::new(self.stream(), color_when).with_content(style.into_owned());\n        c.print()\n    }\n\n    /// Render the error message to a [`StyledStr`].\n    ///\n    /// # Example\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// use clap::Command;\n    ///\n    /// match Command::new(\"Command\").try_get_matches() {\n    ///     Ok(matches) => {\n    ///         // do_something\n    ///     },\n    ///     Err(err) => {\n    ///         let err = err.render();\n    ///         println!(\"{err}\");\n    ///         // do_something\n    ///     },\n    /// };\n    /// ```\n    pub fn render(&self) -> StyledStr {\n        self.formatted().into_owned()\n    }\n\n    #[inline(never)]\n    fn for_app(kind: ErrorKind, cmd: &Command, styled: StyledStr) -> Self {\n        Self::new(kind).set_message(styled).with_cmd(cmd)\n    }\n\n    pub(crate) fn set_message(mut self, message: impl Into<Message>) -> Self {\n        self.inner.message = Some(message.into());\n        self\n    }\n\n    pub(crate) fn set_source(mut self, source: Box<dyn error::Error + Send + Sync>) -> Self {\n        self.inner.source = Some(source);\n        self\n    }\n\n    pub(crate) fn set_styles(mut self, styles: Styles) -> Self {\n        self.inner.styles = styles;\n        self\n    }\n\n    pub(crate) fn set_color(mut self, color_when: ColorChoice) -> Self {\n        self.inner.color_when = color_when;\n        self\n    }\n\n    pub(crate) fn set_colored_help(mut self, color_help_when: ColorChoice) -> Self {\n        self.inner.color_help_when = color_help_when;\n        self\n    }\n\n    pub(crate) fn set_help_flag(mut self, help_flag: Option<Cow<'static, str>>) -> Self {\n        self.inner.help_flag = help_flag;\n        self\n    }\n\n    /// Does not verify if `ContextKind` is already present\n    #[inline(never)]\n    #[cfg(feature = \"error-context\")]\n    pub(crate) fn insert_context_unchecked(\n        mut self,\n        kind: ContextKind,\n        value: ContextValue,\n    ) -> Self {\n        self.inner.context.insert_unchecked(kind, value);\n        self\n    }\n\n    /// Does not verify if `ContextKind` is already present\n    #[inline(never)]\n    #[cfg(feature = \"error-context\")]\n    pub(crate) fn extend_context_unchecked<const N: usize>(\n        mut self,\n        context: [(ContextKind, ContextValue); N],\n    ) -> Self {\n        self.inner.context.extend_unchecked(context);\n        self\n    }\n\n    pub(crate) fn display_help(cmd: &Command, styled: StyledStr) -> Self {\n        Self::for_app(ErrorKind::DisplayHelp, cmd, styled)\n    }\n\n    pub(crate) fn display_help_error(cmd: &Command, styled: StyledStr) -> Self {\n        Self::for_app(\n            ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand,\n            cmd,\n            styled,\n        )\n    }\n\n    pub(crate) fn display_version(cmd: &Command, styled: StyledStr) -> Self {\n        Self::for_app(ErrorKind::DisplayVersion, cmd, styled)\n    }\n\n    pub(crate) fn argument_conflict(\n        cmd: &Command,\n        arg: String,\n        mut others: Vec<String>,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        let mut err = Self::new(ErrorKind::ArgumentConflict).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            let others = match others.len() {\n                0 => ContextValue::None,\n                1 => ContextValue::String(others.pop().unwrap()),\n                _ => ContextValue::Strings(others),\n            };\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidArg, ContextValue::String(arg)),\n                (ContextKind::PriorArg, others),\n            ]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn subcommand_conflict(\n        cmd: &Command,\n        sub: String,\n        mut others: Vec<String>,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        let mut err = Self::new(ErrorKind::ArgumentConflict).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            let others = match others.len() {\n                0 => ContextValue::None,\n                1 => ContextValue::String(others.pop().unwrap()),\n                _ => ContextValue::Strings(others),\n            };\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidSubcommand, ContextValue::String(sub)),\n                (ContextKind::PriorArg, others),\n            ]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn empty_value(cmd: &Command, good_vals: &[String], arg: String) -> Self {\n        Self::invalid_value(cmd, \"\".to_owned(), good_vals, arg)\n    }\n\n    pub(crate) fn no_equals(cmd: &Command, arg: String, usage: Option<StyledStr>) -> Self {\n        let mut err = Self::new(ErrorKind::NoEquals).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            err = err\n                .extend_context_unchecked([(ContextKind::InvalidArg, ContextValue::String(arg))]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn invalid_value(\n        cmd: &Command,\n        bad_val: String,\n        good_vals: &[String],\n        arg: String,\n    ) -> Self {\n        let suggestion = suggestions::did_you_mean(&bad_val, good_vals.iter()).pop();\n        let mut err = Self::new(ErrorKind::InvalidValue).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidArg, ContextValue::String(arg)),\n                (ContextKind::InvalidValue, ContextValue::String(bad_val)),\n                (\n                    ContextKind::ValidValue,\n                    ContextValue::Strings(good_vals.iter().map(|s| (*s).clone()).collect()),\n                ),\n            ]);\n            if let Some(suggestion) = suggestion {\n                err = err.insert_context_unchecked(\n                    ContextKind::SuggestedValue,\n                    ContextValue::String(suggestion),\n                );\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn invalid_subcommand(\n        cmd: &Command,\n        subcmd: String,\n        did_you_mean: Vec<String>,\n        name: String,\n        suggested_trailing_arg: bool,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        use std::fmt::Write as _;\n        let styles = cmd.get_styles();\n        let invalid = &styles.get_invalid();\n        let valid = &styles.get_valid();\n        let mut err = Self::new(ErrorKind::InvalidSubcommand).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            let mut suggestions = vec![];\n            if suggested_trailing_arg {\n                let mut styled_suggestion = StyledStr::new();\n                let _ = write!(\n                    styled_suggestion,\n                    \"to pass '{invalid}{subcmd}{invalid:#}' as a value, use '{valid}{name} -- {subcmd}{valid:#}'\",\n                );\n                suggestions.push(styled_suggestion);\n            }\n\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidSubcommand, ContextValue::String(subcmd)),\n                (\n                    ContextKind::SuggestedSubcommand,\n                    ContextValue::Strings(did_you_mean),\n                ),\n                (\n                    ContextKind::Suggested,\n                    ContextValue::StyledStrs(suggestions),\n                ),\n            ]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn unrecognized_subcommand(\n        cmd: &Command,\n        subcmd: String,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        let mut err = Self::new(ErrorKind::InvalidSubcommand).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            err = err.extend_context_unchecked([(\n                ContextKind::InvalidSubcommand,\n                ContextValue::String(subcmd),\n            )]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn missing_required_argument(\n        cmd: &Command,\n        required: Vec<String>,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        let mut err = Self::new(ErrorKind::MissingRequiredArgument).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            err = err.extend_context_unchecked([(\n                ContextKind::InvalidArg,\n                ContextValue::Strings(required),\n            )]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn missing_subcommand(\n        cmd: &Command,\n        parent: String,\n        available: Vec<String>,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        let mut err = Self::new(ErrorKind::MissingSubcommand).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidSubcommand, ContextValue::String(parent)),\n                (\n                    ContextKind::ValidSubcommand,\n                    ContextValue::Strings(available),\n                ),\n            ]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn invalid_utf8(cmd: &Command, usage: Option<StyledStr>) -> Self {\n        let mut err = Self::new(ErrorKind::InvalidUtf8).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn too_many_values(\n        cmd: &Command,\n        val: String,\n        arg: String,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        let mut err = Self::new(ErrorKind::TooManyValues).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidArg, ContextValue::String(arg)),\n                (ContextKind::InvalidValue, ContextValue::String(val)),\n            ]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn too_few_values(\n        cmd: &Command,\n        arg: String,\n        min_vals: usize,\n        curr_vals: usize,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        let mut err = Self::new(ErrorKind::TooFewValues).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidArg, ContextValue::String(arg)),\n                (\n                    ContextKind::MinValues,\n                    ContextValue::Number(min_vals as isize),\n                ),\n                (\n                    ContextKind::ActualNumValues,\n                    ContextValue::Number(curr_vals as isize),\n                ),\n            ]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn value_validation(\n        arg: String,\n        val: String,\n        err: Box<dyn error::Error + Send + Sync>,\n    ) -> Self {\n        let mut err = Self::new(ErrorKind::ValueValidation).set_source(err);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidArg, ContextValue::String(arg)),\n                (ContextKind::InvalidValue, ContextValue::String(val)),\n            ]);\n        }\n\n        err\n    }\n\n    pub(crate) fn wrong_number_of_values(\n        cmd: &Command,\n        arg: String,\n        num_vals: usize,\n        curr_vals: usize,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        let mut err = Self::new(ErrorKind::WrongNumberOfValues).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidArg, ContextValue::String(arg)),\n                (\n                    ContextKind::ExpectedNumValues,\n                    ContextValue::Number(num_vals as isize),\n                ),\n                (\n                    ContextKind::ActualNumValues,\n                    ContextValue::Number(curr_vals as isize),\n                ),\n            ]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn unknown_argument(\n        cmd: &Command,\n        arg: String,\n        did_you_mean: Option<(String, Option<String>)>,\n        suggested_trailing_arg: bool,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        use std::fmt::Write as _;\n        let styles = cmd.get_styles();\n        let invalid = &styles.get_invalid();\n        let valid = &styles.get_valid();\n        let mut err = Self::new(ErrorKind::UnknownArgument).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            let mut suggestions = vec![];\n            if suggested_trailing_arg {\n                let mut styled_suggestion = StyledStr::new();\n                let _ = write!(\n                    styled_suggestion,\n                    \"to pass '{invalid}{arg}{invalid:#}' as a value, use '{valid}-- {arg}{valid:#}'\",\n                );\n                suggestions.push(styled_suggestion);\n            }\n\n            err = err\n                .extend_context_unchecked([(ContextKind::InvalidArg, ContextValue::String(arg))]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n            match did_you_mean {\n                Some((flag, Some(sub))) => {\n                    let mut styled_suggestion = StyledStr::new();\n                    let _ = write!(styled_suggestion, \"'{valid}{sub} {flag}{valid:#}' exists\",);\n                    suggestions.push(styled_suggestion);\n                }\n                Some((flag, None)) => {\n                    err = err.insert_context_unchecked(\n                        ContextKind::SuggestedArg,\n                        ContextValue::String(flag),\n                    );\n                }\n                None => {}\n            }\n            if !suggestions.is_empty() {\n                err = err.insert_context_unchecked(\n                    ContextKind::Suggested,\n                    ContextValue::StyledStrs(suggestions),\n                );\n            }\n        }\n\n        err\n    }\n\n    pub(crate) fn unnecessary_double_dash(\n        cmd: &Command,\n        arg: String,\n        usage: Option<StyledStr>,\n    ) -> Self {\n        use std::fmt::Write as _;\n        let styles = cmd.get_styles();\n        let invalid = &styles.get_invalid();\n        let valid = &styles.get_valid();\n        let mut err = Self::new(ErrorKind::UnknownArgument).with_cmd(cmd);\n\n        #[cfg(feature = \"error-context\")]\n        {\n            let mut styled_suggestion = StyledStr::new();\n            let _ = write!(\n                styled_suggestion,\n                \"subcommand '{valid}{arg}{valid:#}' exists; to use it, remove the '{invalid}--{invalid:#}' before it\",\n            );\n\n            err = err.extend_context_unchecked([\n                (ContextKind::InvalidArg, ContextValue::String(arg)),\n                (\n                    ContextKind::Suggested,\n                    ContextValue::StyledStrs(vec![styled_suggestion]),\n                ),\n            ]);\n            if let Some(usage) = usage {\n                err = err\n                    .insert_context_unchecked(ContextKind::Usage, ContextValue::StyledStr(usage));\n            }\n        }\n\n        err\n    }\n\n    fn formatted(&self) -> Cow<'_, StyledStr> {\n        if let Some(message) = self.inner.message.as_ref() {\n            message.formatted(&self.inner.styles)\n        } else {\n            let styled = F::format_error(self);\n            Cow::Owned(styled)\n        }\n    }\n}\n\nimpl<F: ErrorFormatter> From<io::Error> for Error<F> {\n    fn from(e: io::Error) -> Self {\n        Error::raw(ErrorKind::Io, e)\n    }\n}\n\nimpl<F: ErrorFormatter> From<fmt::Error> for Error<F> {\n    fn from(e: fmt::Error) -> Self {\n        Error::raw(ErrorKind::Format, e)\n    }\n}\n\nimpl<F: ErrorFormatter> Debug for Error<F> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), fmt::Error> {\n        self.inner.fmt(f)\n    }\n}\n\nimpl<F: ErrorFormatter> error::Error for Error<F> {\n    #[allow(trivial_casts)]\n    fn source(&self) -> Option<&(dyn error::Error + 'static)> {\n        self.inner.source.as_ref().map(|e| e.as_ref() as _)\n    }\n}\n\nimpl<F: ErrorFormatter> Display for Error<F> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        // Assuming `self.message` already has a trailing newline, from `try_help` or similar\n        ok!(write!(f, \"{}\", self.formatted()));\n        if let Some(backtrace) = self.inner.backtrace.as_ref() {\n            ok!(writeln!(f));\n            ok!(writeln!(f, \"Backtrace:\"));\n            ok!(writeln!(f, \"{backtrace}\"));\n        }\n        Ok(())\n    }\n}\n\n#[derive(Clone, Debug)]\npub(crate) enum Message {\n    Raw(String),\n    Formatted(StyledStr),\n}\n\nimpl Message {\n    fn format(&mut self, cmd: &Command, usage: Option<StyledStr>) {\n        match self {\n            Message::Raw(s) => {\n                let mut message = String::new();\n                std::mem::swap(s, &mut message);\n\n                let styled = format::format_error_message(\n                    &message,\n                    cmd.get_styles(),\n                    Some(cmd),\n                    usage.as_ref(),\n                );\n\n                *self = Self::Formatted(styled);\n            }\n            Message::Formatted(_) => {}\n        }\n    }\n\n    fn formatted(&self, styles: &Styles) -> Cow<'_, StyledStr> {\n        match self {\n            Message::Raw(s) => {\n                let styled = format::format_error_message(s, styles, None, None);\n\n                Cow::Owned(styled)\n            }\n            Message::Formatted(s) => Cow::Borrowed(s),\n        }\n    }\n}\n\nimpl From<String> for Message {\n    fn from(inner: String) -> Self {\n        Self::Raw(inner)\n    }\n}\n\nimpl From<StyledStr> for Message {\n    fn from(inner: StyledStr) -> Self {\n        Self::Formatted(inner)\n    }\n}\n\n#[cfg(feature = \"debug\")]\n#[derive(Debug)]\nstruct Backtrace(backtrace::Backtrace);\n\n#[cfg(feature = \"debug\")]\nimpl Backtrace {\n    fn new() -> Option<Self> {\n        Some(Self(backtrace::Backtrace::new()))\n    }\n}\n\n#[cfg(feature = \"debug\")]\nimpl Display for Backtrace {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        // `backtrace::Backtrace` uses `Debug` instead of `Display`\n        write!(f, \"{:?}\", self.0)\n    }\n}\n\n#[cfg(not(feature = \"debug\"))]\n#[derive(Debug)]\nstruct Backtrace;\n\n#[cfg(not(feature = \"debug\"))]\nimpl Backtrace {\n    fn new() -> Option<Self> {\n        None\n    }\n}\n\n#[cfg(not(feature = \"debug\"))]\nimpl Display for Backtrace {\n    fn fmt(&self, _: &mut Formatter<'_>) -> fmt::Result {\n        Ok(())\n    }\n}\n\n#[test]\nfn check_auto_traits() {\n    static_assertions::assert_impl_all!(Error: Send, Sync, Unpin);\n}\n"
  },
  {
    "path": "clap_builder/src/lib.rs",
    "content": "// Copyright ⓒ 2015-2016 Kevin B. Knapp and [`clap-rs` contributors](https://github.com/clap-rs/clap/graphs/contributors).\n// Licensed under the MIT license\n// (see LICENSE or <http://opensource.org/licenses/MIT>) All files in the project carrying such\n// notice may not be copied, modified, or distributed except according to those terms.\n\n#![doc = include_str!(\"../README.md\")]\n#![doc(html_logo_url = \"https://raw.githubusercontent.com/clap-rs/clap/master/assets/clap.png\")]\n#![cfg_attr(docsrs, feature(doc_cfg))]\n#![forbid(unsafe_code)]\n#![warn(missing_docs)]\n#![warn(clippy::print_stderr)]\n#![warn(clippy::print_stdout)]\n\n#[cfg(not(feature = \"std\"))]\ncompile_error!(\"`std` feature is currently required to build `clap`\");\n\npub use crate::builder::ArgAction;\npub use crate::builder::Command;\npub use crate::builder::ValueHint;\npub use crate::builder::{Arg, ArgGroup};\npub use crate::parser::ArgMatches;\npub use crate::util::Id;\npub use crate::util::color::ColorChoice;\n\n/// Command Line Argument Parser Error\n///\n/// See [`Command::error`] to create an error.\n///\n/// [`Command::error`]: crate::Command::error\npub type Error = error::Error<error::DefaultFormatter>;\n\npub use crate::derive::{Args, CommandFactory, FromArgMatches, Parser, Subcommand, ValueEnum};\n\n#[macro_use]\n#[allow(missing_docs)]\nmod macros;\n\nmod derive;\n\npub mod builder;\npub mod error;\npub mod parser;\n\nmod mkeymap;\nmod output;\nmod util;\n\nconst INTERNAL_ERROR_MSG: &str = \"Fatal internal error. Please consider filing a bug \\\n                                  report at https://github.com/clap-rs/clap/issues\";\n\n#[doc = include_str!(\"../README.md\")]\n#[cfg(doctest)]\npub struct ReadmeDoctests;\n"
  },
  {
    "path": "clap_builder/src/macros.rs",
    "content": "/// Allows you to pull the version from your Cargo.toml at compile time as\n/// `MAJOR.MINOR.PATCH_PKGVERSION_PRE`\n///\n/// # Examples\n///\n/// ```no_run\n/// # use clap_builder as clap;\n/// # use clap::crate_version;\n/// # use clap::Command;\n/// let m = Command::new(\"cmd\")\n///             .version(crate_version!())\n///             .get_matches();\n/// ```\n#[cfg(feature = \"cargo\")]\n#[macro_export]\nmacro_rules! crate_version {\n    () => {\n        env!(\"CARGO_PKG_VERSION\")\n    };\n}\n\n/// Allows you to pull the authors for the command from your Cargo.toml at\n/// compile time in the form:\n/// `\"author1 lastname <author1@example.com>:author2 lastname <author2@example.com>\"`\n///\n/// You can replace the colons with a custom separator by supplying a\n/// replacement string, so, for example,\n/// `crate_authors!(\",\\n\")` would become\n/// `\"author1 lastname <author1@example.com>,\\nauthor2 lastname <author2@example.com>,\\nauthor3 lastname <author3@example.com>\"`\n///\n/// # Examples\n///\n/// ```no_run\n/// # use clap_builder as clap;\n/// # use clap::crate_authors;\n/// # use clap::Command;\n/// let m = Command::new(\"cmd\")\n///             .author(crate_authors!(\"\\n\"))\n///             .get_matches();\n/// ```\n#[cfg(feature = \"cargo\")]\n#[macro_export]\nmacro_rules! crate_authors {\n    ($sep:expr) => {{\n        static AUTHORS: &str = env!(\"CARGO_PKG_AUTHORS\");\n        if AUTHORS.contains(':') {\n            static CACHED: std::sync::OnceLock<String> = std::sync::OnceLock::new();\n            let s = CACHED.get_or_init(|| AUTHORS.replace(':', $sep));\n            let s: &'static str = &*s;\n            s\n        } else {\n            AUTHORS\n        }\n    }};\n    () => {\n        env!(\"CARGO_PKG_AUTHORS\")\n    };\n}\n\n/// Allows you to pull the description from your Cargo.toml at compile time.\n///\n/// # Examples\n///\n/// ```no_run\n/// # use clap_builder as clap;\n/// # use clap::crate_description;\n/// # use clap::Command;\n/// let m = Command::new(\"cmd\")\n///             .about(crate_description!())\n///             .get_matches();\n/// ```\n#[cfg(feature = \"cargo\")]\n#[macro_export]\nmacro_rules! crate_description {\n    () => {\n        env!(\"CARGO_PKG_DESCRIPTION\")\n    };\n}\n\n/// Allows you to pull the name from your Cargo.toml at compile time.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** This macro extracts the name from an environment variable `CARGO_PKG_NAME`.\n/// When the crate name is set to something different from the package name,\n/// use environment variables `CARGO_CRATE_NAME` or `CARGO_BIN_NAME`.\n/// See [the Cargo Book](https://doc.rust-lang.org/cargo/reference/environment-variables.html)\n/// for more information.\n///\n/// </div>\n///\n/// # Examples\n///\n/// ```no_run\n/// # use clap_builder as clap;\n/// # use clap::crate_name;\n/// # use clap::Command;\n/// let m = Command::new(crate_name!())\n///             .get_matches();\n/// ```\n#[cfg(feature = \"cargo\")]\n#[macro_export]\nmacro_rules! crate_name {\n    () => {\n        env!(\"CARGO_PKG_NAME\")\n    };\n}\n\n/// Allows you to build the `Command` instance from your Cargo.toml at compile time.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** Changing the values in your `Cargo.toml` does not trigger a re-build automatically,\n/// and therefore won't change the generated output until you recompile.\n///\n/// In some cases you can \"trick\" the compiler into triggering a rebuild when your\n/// `Cargo.toml` is changed by including this in your `src/main.rs` file\n/// `include_str!(\"../Cargo.toml\");`\n///\n/// </div>\n///\n/// # Examples\n///\n/// ```no_run\n/// # use clap_builder as clap;\n/// # use clap::command;\n/// let m = command!().get_matches();\n/// ```\n#[cfg(feature = \"cargo\")]\n#[macro_export]\nmacro_rules! command {\n    () => {{ $crate::command!($crate::crate_name!()) }};\n    ($name:expr) => {{\n        let mut cmd = $crate::Command::new($name).version($crate::crate_version!());\n\n        let author = $crate::crate_authors!();\n        if !author.is_empty() {\n            cmd = cmd.author(author)\n        }\n\n        let about = $crate::crate_description!();\n        if !about.is_empty() {\n            cmd = cmd.about(about)\n        }\n\n        cmd\n    }};\n}\n\n/// Requires `cargo` feature flag to be enabled.\n#[cfg(not(feature = \"cargo\"))]\n#[macro_export]\nmacro_rules! command {\n    () => {{\n        compile_error!(\"`cargo` feature flag is required\");\n    }};\n    ($name:expr) => {{\n        compile_error!(\"`cargo` feature flag is required\");\n    }};\n}\n\n#[doc(hidden)]\n#[macro_export]\nmacro_rules! arg_impl {\n    ( @string $val:ident ) => {\n        stringify!($val)\n    };\n    ( @string $val:literal ) => {{\n        let ident_or_string_literal: &str = $val;\n        ident_or_string_literal\n    }};\n    ( @string $val:tt ) => {\n        ::std::compile_error!(\"Only identifiers or string literals supported\");\n    };\n    ( @string ) => {\n        None\n    };\n\n    ( @char $val:ident ) => {{\n        let ident_or_char_literal = stringify!($val);\n        debug_assert_eq!(\n            ident_or_char_literal.len(),\n            1,\n            \"Single-letter identifier expected, got {ident_or_char_literal}\",\n        );\n        ident_or_char_literal.chars().next().unwrap()\n    }};\n    ( @char $val:literal ) => {{\n        let ident_or_char_literal: char = $val;\n        ident_or_char_literal\n    }};\n    ( @char ) => {{\n        None\n    }};\n\n    (\n        @arg\n        ($arg:expr)\n        --$long:ident\n        $($tail:tt)*\n    ) => {{\n        debug_assert_eq!($arg.get_value_names(), None, \"Flags should precede values\");\n        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), \"Flags should precede `...`\");\n\n        let mut arg = $arg;\n        let long = $crate::arg_impl! { @string $long };\n        if arg.get_id() == \"\" {\n            arg = arg.id(long);\n        }\n        let action = $crate::ArgAction::SetTrue;\n        let arg = arg\n            .long(long)\n            .action(action);\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)*\n        };\n        arg\n    }};\n    (\n        @arg\n        ($arg:expr)\n        --$long:literal\n        $($tail:tt)*\n    ) => {{\n        debug_assert_eq!($arg.get_value_names(), None, \"Flags should precede values\");\n        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), \"Flags should precede `...`\");\n\n        let mut arg = $arg;\n        let long = $crate::arg_impl! { @string $long };\n        if arg.get_id() == \"\" {\n            arg = arg.id(long);\n        }\n        let action = $crate::ArgAction::SetTrue;\n        let arg = arg\n            .long(long)\n            .action(action);\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)*\n        };\n        arg\n    }};\n    (\n        @arg\n        ($arg:expr)\n        -$short:ident\n        $($tail:tt)*\n    ) => {{\n        debug_assert_eq!($arg.get_long(), None, \"Short flags should precede long flags\");\n        debug_assert_eq!($arg.get_value_names(), None, \"Flags should precede values\");\n        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), \"Flags should precede `...`\");\n\n        let action = $crate::ArgAction::SetTrue;\n        let arg = $arg\n            .short($crate::arg_impl! { @char $short })\n            .action(action);\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)*\n        };\n        arg\n    }};\n    (\n        @arg\n        ($arg:expr)\n        -$short:literal\n        $($tail:tt)*\n    ) => {{\n        debug_assert_eq!($arg.get_long(), None, \"Short flags should precede long flags\");\n        debug_assert_eq!($arg.get_value_names(), None, \"Flags should precede values\");\n        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), \"Flags should precede `...`\");\n\n        let action = $crate::ArgAction::SetTrue;\n        let arg = $arg\n            .short($crate::arg_impl! { @char $short })\n            .action(action);\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)*\n        };\n        arg\n    }};\n    (\n        @arg\n        ($arg:expr)\n        <$value_name:ident>\n        $($tail:tt)*\n    ) => {{\n        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), \"Flags should precede `...`\");\n        debug_assert_eq!($arg.get_value_names(), None, \"Multiple values not yet supported\");\n\n        let mut arg = $arg;\n\n        if arg.get_long().is_none() && arg.get_short().is_none() {\n            arg = arg.required(true);\n        }\n\n        let value_name = $crate::arg_impl! { @string $value_name };\n        if arg.get_id() == \"\" {\n            arg = arg.id(value_name);\n        }\n        let arg = arg\n            .value_name(value_name)\n            .action($crate::ArgAction::Set);\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)*\n        };\n        arg\n    }};\n    (\n        @arg\n        ($arg:expr)\n        <$value_name:literal>\n        $($tail:tt)*\n    ) => {{\n        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), \"Flags should precede `...`\");\n        debug_assert_eq!($arg.get_value_names(), None, \"Multiple values not yet supported\");\n\n        let mut arg = $arg;\n\n        if arg.get_long().is_none() && arg.get_short().is_none() {\n            arg = arg.required(true);\n        }\n\n        let value_name = $crate::arg_impl! { @string $value_name };\n        if arg.get_id() == \"\" {\n            arg = arg.id(value_name);\n        }\n        let arg = arg\n            .value_name(value_name)\n            .action($crate::ArgAction::Set);\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)*\n        };\n        arg\n    }};\n    (\n        @arg\n        ($arg:expr)\n        [$value_name:ident]\n        $($tail:tt)*\n    ) => {{\n        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), \"Flags should precede `...`\");\n        debug_assert_eq!($arg.get_value_names(), None, \"Multiple values not yet supported\");\n\n        let mut arg = $arg;\n\n        if arg.get_long().is_none() && arg.get_short().is_none() {\n            arg = arg.required(false);\n        } else {\n            arg = arg.num_args(0..=1);\n        }\n\n        let value_name = $crate::arg_impl! { @string $value_name };\n        if arg.get_id() == \"\" {\n            arg = arg.id(value_name);\n        }\n        let arg = arg\n            .value_name(value_name)\n            .action($crate::ArgAction::Set);\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)*\n        };\n        arg\n    }};\n    (\n        @arg\n        ($arg:expr)\n        [$value_name:literal]\n        $($tail:tt)*\n    ) => {{\n        debug_assert!(!matches!($arg.get_action(), $crate::ArgAction::Append), \"Flags should precede `...`\");\n        debug_assert_eq!($arg.get_value_names(), None, \"Multiple values not yet supported\");\n\n        let mut arg = $arg;\n\n        if arg.get_long().is_none() && arg.get_short().is_none() {\n            arg = arg.required(false);\n        } else {\n            arg = arg.num_args(0..=1);\n        }\n\n        let value_name = $crate::arg_impl! { @string $value_name };\n        if arg.get_id() == \"\" {\n            arg = arg.id(value_name);\n        }\n        let arg = arg\n            .value_name(value_name)\n            .action($crate::ArgAction::Set);\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)*\n        };\n        arg\n    }};\n    (\n        @arg\n        ($arg:expr)\n        ...\n        $($tail:tt)*\n    ) => {{\n        let arg = match $arg.get_action() {\n            $crate::ArgAction::Set => {\n                if $arg.get_long().is_none() && $arg.get_short().is_none() {\n                    $arg.num_args(1..)\n                        // Allow collecting arguments interleaved with flags\n                        .action($crate::ArgAction::Append)\n                } else {\n                    $arg.action($crate::ArgAction::Append)\n                }\n            },\n            $crate::ArgAction::SetTrue | $crate::ArgAction::Help | $crate::ArgAction::Version => {\n                $arg.action($crate::ArgAction::Count)\n            }\n            action => {\n                panic!(\"Unexpected action {action:?}\")\n            }\n        };\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)*\n        };\n        arg\n    }};\n    (\n        @arg\n        ($arg:expr)\n        $help:literal\n    ) => {{\n        $arg.help($help)\n    }};\n    (\n        @arg\n        ($arg:expr)\n    ) => {{\n        $arg\n    }};\n}\n\n/// Create an [`Arg`] from a usage string.\n///\n/// Allows creation of basic settings for the [`Arg`].\n///\n/// <div class=\"warning\">\n///\n/// **NOTE**: Not all settings may be set using the usage string method. Some properties are\n/// only available via the builder pattern.\n///\n/// </div>\n///\n/// # Syntax\n///\n/// Usage strings typically following the form:\n///\n/// ```notrust\n/// [explicit name] [short] [long] [value names] [...] [help string]\n/// ```\n///\n/// ### Explicit Name\n///\n/// The name may be either a bare-word or a string, followed by a `:`, like `name:` or\n/// `\"name\":`.\n///\n/// *Note:* This is an optional field, if it's omitted the argument will use one of the additional\n/// fields as the name using the following priority order:\n///\n///  1. Explicit Name\n///  2. Long\n///  3. Value Name\n///\n/// See [`Arg::id`][crate::Arg::id].\n///\n/// ### Short\n///\n/// A short flag is a `-` followed by either a bare-character or quoted character, like `-f` or\n/// `-'f'`.\n///\n/// See [`Arg::short`][crate::Arg::short].\n///\n/// ### Long\n///\n/// A long flag is a `--` followed by either a bare-word or a string, like `--foo` or\n/// `--\"foo\"`.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** Dashes in the long name (e.g. `--foo-bar`) is not supported and quoting is required\n/// (e.g. `--\"foo-bar\"`).\n///\n/// </div>\n///\n/// See [`Arg::long`][crate::Arg::long].\n///\n/// ### Values (Value Notation)\n///\n/// This is set by placing bare-word between:\n/// - `[]` like `[FOO]`\n///   - Positional argument: optional\n///   - Named argument: optional value\n/// - `<>` like `<FOO>`: required\n///\n/// See [`Arg::value_name`][crate::Arg::value_name].\n///\n/// ### `...`\n///\n/// `...` (three consecutive dots/periods) specifies that this argument may occur multiple\n/// times (not to be confused with multiple values per occurrence).\n///\n/// See [`ArgAction::Count`][crate::ArgAction::Count] and [`ArgAction::Append`][crate::ArgAction::Append].\n///\n/// ### Help String\n///\n/// The help string is denoted between a pair of double quotes `\"\"` and may contain any\n/// characters.\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::{Command, Arg, arg};\n/// let cmd = Command::new(\"prog\")\n///     .args(&[\n///         arg!(--config <FILE> \"a required file for the configuration and no short\"),\n///         arg!(-d --debug ... \"turns on debugging information and allows multiples\"),\n///         arg!([input] \"an optional input file to use\")\n///     ]);\n///\n/// let m = cmd.try_get_matches_from([\"prog\", \"--config\", \"file.toml\"]).unwrap();\n/// assert_eq!(m.get_one::<String>(\"config\").unwrap(), \"file.toml\");\n/// assert_eq!(*m.get_one::<u8>(\"debug\").unwrap(), 0);\n/// assert_eq!(m.get_one::<String>(\"input\"), None);\n/// ```\n/// [`Arg`]: crate::Arg\n#[macro_export]\nmacro_rules! arg {\n    ( -$($tail:tt)+ ) => {{\n        let arg = $crate::Arg::default();\n        let arg = $crate::arg_impl! {\n            @arg (arg) -$($tail)+\n        };\n        debug_assert_ne!(arg.get_id(), \"\", \"Without a value or long flag, the `name:` prefix is required\");\n        arg\n    }};\n    ( $name:ident: $($tail:tt)+ ) => {{\n        let arg = $crate::Arg::new($crate::arg_impl! { @string $name });\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)+\n        };\n        arg\n    }};\n    ( $name:literal: $($tail:tt)+ ) => {{\n        let arg = $crate::Arg::new($crate::arg_impl! { @string $name });\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)+\n        };\n        arg\n    }};\n    ( $($tail:tt)+ ) => {{\n        let arg = $crate::Arg::default();\n        let arg = $crate::arg_impl! {\n            @arg (arg) $($tail)+\n        };\n        debug_assert_ne!(arg.get_id(), \"\", \"Without a value or long flag, the `name:` prefix is required\");\n        arg\n    }};\n}\n\n#[cfg(feature = \"debug\")]\nmacro_rules! debug {\n    ($($arg:tt)*) => ({\n        use std::fmt::Write as _;\n        let hint = anstyle::Style::new().dimmed();\n\n        let module_path = module_path!();\n        let body = format!($($arg)*);\n        let mut styled = $crate::builder::StyledStr::new();\n        let _ = write!(styled, \"{hint}[{module_path:>28}]{body}{hint:#}\\n\");\n        let color = $crate::output::fmt::Colorizer::new($crate::output::fmt::Stream::Stderr, $crate::ColorChoice::Auto).with_content(styled);\n        let _ = color.print();\n    })\n}\n\n#[cfg(not(feature = \"debug\"))]\nmacro_rules! debug {\n    ($($arg:tt)*) => {};\n}\n\nmacro_rules! ok {\n    ($expr:expr) => {\n        match $expr {\n            Ok(val) => val,\n            Err(err) => {\n                return Err(err);\n            }\n        }\n    };\n}\n\nmacro_rules! some {\n    ($expr:expr) => {\n        match $expr {\n            Some(val) => val,\n            None => {\n                return None;\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "clap_builder/src/mkeymap.rs",
    "content": "use std::iter::Iterator;\nuse std::ops::Index;\n\nuse crate::Arg;\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::builder::OsStr;\n\n#[derive(PartialEq, Eq, Debug, Clone)]\npub(crate) struct Key {\n    key: KeyType,\n    index: usize,\n}\n\n#[derive(Default, PartialEq, Eq, Debug, Clone)]\npub(crate) struct MKeyMap {\n    /// All of the arguments.\n    args: Vec<Arg>,\n\n    // Cache part:\n    /// Will be set after `_build()`.\n    keys: Vec<Key>,\n}\n\n#[derive(Debug, PartialEq, Eq, Hash, Clone)]\npub(crate) enum KeyType {\n    Short(char),\n    Long(OsStr),\n    Position(usize),\n}\n\nimpl KeyType {\n    pub(crate) fn is_position(&self) -> bool {\n        matches!(self, KeyType::Position(_))\n    }\n}\n\nimpl PartialEq<usize> for KeyType {\n    fn eq(&self, rhs: &usize) -> bool {\n        match self {\n            KeyType::Position(x) => x == rhs,\n            _ => false,\n        }\n    }\n}\n\nimpl PartialEq<&str> for KeyType {\n    fn eq(&self, rhs: &&str) -> bool {\n        match self {\n            KeyType::Long(l) => l == rhs,\n            _ => false,\n        }\n    }\n}\n\nimpl PartialEq<str> for KeyType {\n    fn eq(&self, rhs: &str) -> bool {\n        match self {\n            KeyType::Long(l) => l == rhs,\n            _ => false,\n        }\n    }\n}\n\nimpl PartialEq<OsStr> for KeyType {\n    fn eq(&self, rhs: &OsStr) -> bool {\n        match self {\n            KeyType::Long(l) => l == rhs,\n            _ => false,\n        }\n    }\n}\n\nimpl PartialEq<char> for KeyType {\n    fn eq(&self, rhs: &char) -> bool {\n        match self {\n            KeyType::Short(c) => c == rhs,\n            _ => false,\n        }\n    }\n}\n\nimpl MKeyMap {\n    /// If any arg has corresponding key in this map, we can search the key with\n    /// `u64` (for positional argument), `char` (for short flag), `&str` and `OsString`\n    /// (for long flag)\n    pub(crate) fn contains<K>(&self, key: K) -> bool\n    where\n        KeyType: PartialEq<K>,\n    {\n        self.keys.iter().any(|x| x.key == key)\n    }\n\n    /// Push an argument in the map.\n    pub(crate) fn push(&mut self, new_arg: Arg) {\n        self.args.push(new_arg);\n    }\n\n    /// Find the arg have corresponding key in this map, we can search the key\n    /// with `u64` (for positional argument), `char` (for short flag), `&str` and\n    /// `OsString` (for long flag)\n    pub(crate) fn get<K: ?Sized>(&self, key: &K) -> Option<&Arg>\n    where\n        KeyType: PartialEq<K>,\n    {\n        self.keys\n            .iter()\n            .find(|k| &k.key == key)\n            .map(|k| &self.args[k.index])\n    }\n\n    /// Return iterators of all keys.\n    pub(crate) fn keys(&self) -> impl Iterator<Item = &KeyType> {\n        self.keys.iter().map(|x| &x.key)\n    }\n\n    /// Return iterators of all args.\n    pub(crate) fn args(&self) -> impl Iterator<Item = &Arg> {\n        self.args.iter()\n    }\n\n    /// Return mutable iterators of all args.\n    pub(crate) fn args_mut(&mut self) -> impl Iterator<Item = &mut Arg> {\n        self.args.iter_mut()\n    }\n\n    /// Mutate every argument.\n    pub(crate) fn mut_args<F>(&mut self, f: F)\n    where\n        F: FnMut(Arg) -> Arg,\n    {\n        let mut args = std::mem::take(&mut self.args);\n        self.args.extend(args.drain(..).map(f));\n    }\n\n    /// We need a lazy build here since some we may change args after creating\n    /// the map, you can checkout who uses `args_mut`.\n    pub(crate) fn _build(&mut self) {\n        // There will be at least as many keys as args, so that is a good starting point\n        self.keys.reserve(self.args.len());\n        for (i, arg) in self.args.iter().enumerate() {\n            append_keys(&mut self.keys, arg, i);\n        }\n    }\n\n    /// Remove an arg in the graph by Id, usually used by `mut_arg`. Return\n    /// `Some(arg)` if removed.\n    pub(crate) fn remove_by_name(&mut self, name: &str) -> Option<Arg> {\n        self.args\n            .iter()\n            .position(|arg| arg.id == name)\n            // since it's a cold function, using this wouldn't hurt much\n            .map(|i| self.args.remove(i))\n    }\n}\n\nimpl Index<&'_ KeyType> for MKeyMap {\n    type Output = Arg;\n\n    fn index(&self, key: &KeyType) -> &Self::Output {\n        self.get(key).expect(INTERNAL_ERROR_MSG)\n    }\n}\n\n/// Generate key types for an specific Arg.\nfn append_keys(keys: &mut Vec<Key>, arg: &Arg, index: usize) {\n    if let Some(pos_index) = arg.index {\n        let key = KeyType::Position(pos_index);\n        keys.push(Key { key, index });\n    } else {\n        if let Some(short) = arg.short {\n            let key = KeyType::Short(short);\n            keys.push(Key { key, index });\n        }\n        if let Some(long) = arg.long.clone() {\n            let key = KeyType::Long(long.into());\n            keys.push(Key { key, index });\n        }\n\n        for (short, _) in arg.short_aliases.iter() {\n            let key = KeyType::Short(*short);\n            keys.push(Key { key, index });\n        }\n        for (long, _) in arg.aliases.iter() {\n            let key = KeyType::Long(long.into());\n            keys.push(Key { key, index });\n        }\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/output/fmt.rs",
    "content": "use crate::builder::StyledStr;\nuse crate::util::color::ColorChoice;\n\n#[derive(Copy, Clone, Debug, PartialEq, Eq)]\npub(crate) enum Stream {\n    Stdout,\n    Stderr,\n}\n\n#[derive(Clone, Debug)]\npub(crate) struct Colorizer {\n    stream: Stream,\n    #[allow(unused)]\n    color_when: ColorChoice,\n    content: StyledStr,\n}\n\nimpl Colorizer {\n    pub(crate) fn new(stream: Stream, color_when: ColorChoice) -> Self {\n        Colorizer {\n            stream,\n            color_when,\n            content: Default::default(),\n        }\n    }\n\n    pub(crate) fn with_content(mut self, content: StyledStr) -> Self {\n        self.content = content;\n        self\n    }\n}\n\n/// Printing methods.\nimpl Colorizer {\n    #[cfg(feature = \"color\")]\n    pub(crate) fn print(&self) -> std::io::Result<()> {\n        let color_when = match self.color_when {\n            ColorChoice::Always => anstream::ColorChoice::Always,\n            ColorChoice::Auto => anstream::ColorChoice::Auto,\n            ColorChoice::Never => anstream::ColorChoice::Never,\n        };\n\n        let mut stdout;\n        let mut stderr;\n        let writer: &mut dyn std::io::Write = match self.stream {\n            Stream::Stderr => {\n                stderr = anstream::AutoStream::new(std::io::stderr().lock(), color_when);\n                &mut stderr\n            }\n            Stream::Stdout => {\n                stdout = anstream::AutoStream::new(std::io::stdout().lock(), color_when);\n                &mut stdout\n            }\n        };\n\n        self.content.write_to(writer)\n    }\n\n    #[cfg(not(feature = \"color\"))]\n    pub(crate) fn print(&self) -> std::io::Result<()> {\n        // [e]println can't be used here because it panics\n        // if something went wrong. We don't want that.\n        match self.stream {\n            Stream::Stdout => {\n                let stdout = std::io::stdout();\n                let mut stdout = stdout.lock();\n                self.content.write_to(&mut stdout)\n            }\n            Stream::Stderr => {\n                let stderr = std::io::stderr();\n                let mut stderr = stderr.lock();\n                self.content.write_to(&mut stderr)\n            }\n        }\n    }\n}\n\n/// Color-unaware printing. Never uses coloring.\nimpl std::fmt::Display for Colorizer {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.content.fmt(f)\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/output/help.rs",
    "content": "#![cfg_attr(not(feature = \"help\"), allow(unused_variables))]\n\n// Internal\nuse crate::builder::Command;\nuse crate::builder::StyledStr;\nuse crate::output::Usage;\n\n/// Writes the parser help to the wrapped stream.\npub(crate) fn write_help(writer: &mut StyledStr, cmd: &Command, usage: &Usage<'_>, use_long: bool) {\n    debug!(\"write_help\");\n\n    if let Some(h) = cmd.get_override_help() {\n        writer.push_styled(h);\n    } else {\n        #[cfg(feature = \"help\")]\n        {\n            use super::AutoHelp;\n            use super::HelpTemplate;\n            if let Some(tmpl) = cmd.get_help_template() {\n                HelpTemplate::new(writer, cmd, usage, use_long)\n                    .write_templated_help(tmpl.as_styled_str());\n            } else {\n                AutoHelp::new(writer, cmd, usage, use_long).write_help();\n            }\n        }\n\n        #[cfg(not(feature = \"help\"))]\n        {\n            debug!(\"write_help: no help, `Command::override_help` and `help` is missing\");\n        }\n    }\n\n    // Remove any lines from unused sections\n    writer.trim_start_lines();\n    // Remove any whitespace caused by book keeping\n    writer.trim_end();\n    // Ensure there is still a trailing newline\n    writer.push_str(\"\\n\");\n}\n"
  },
  {
    "path": "clap_builder/src/output/help_template.rs",
    "content": "// HACK: for rust 1.64 (1.68 doesn't need this since this is in lib.rs)\n//\n// Wanting consistency in our calls\n#![allow(clippy::write_with_newline)]\n\n// Std\nuse std::borrow::Cow;\nuse std::cmp;\nuse std::collections::BTreeMap;\n\n// Internal\nuse crate::builder::PossibleValue;\nuse crate::builder::Str;\nuse crate::builder::StyledStr;\nuse crate::builder::Styles;\nuse crate::builder::{Arg, Command};\nuse crate::output::TAB;\nuse crate::output::TAB_WIDTH;\nuse crate::output::Usage;\nuse crate::output::display_width;\nuse crate::output::wrap;\nuse crate::util::Escape;\nuse crate::util::FlatSet;\n\n/// `clap` auto-generated help writer\npub(crate) struct AutoHelp<'cmd, 'writer> {\n    template: HelpTemplate<'cmd, 'writer>,\n}\n\n// Public Functions\nimpl<'cmd, 'writer> AutoHelp<'cmd, 'writer> {\n    /// Create a new `HelpTemplate` instance.\n    pub(crate) fn new(\n        writer: &'writer mut StyledStr,\n        cmd: &'cmd Command,\n        usage: &'cmd Usage<'cmd>,\n        use_long: bool,\n    ) -> Self {\n        Self {\n            template: HelpTemplate::new(writer, cmd, usage, use_long),\n        }\n    }\n\n    pub(crate) fn write_help(&mut self) {\n        let pos = self\n            .template\n            .cmd\n            .get_positionals()\n            .any(|arg| should_show_arg(self.template.use_long, arg));\n        let non_pos = self\n            .template\n            .cmd\n            .get_non_positionals()\n            .any(|arg| should_show_arg(self.template.use_long, arg));\n        let subcmds = self.template.cmd.has_visible_subcommands();\n\n        let template = if non_pos || pos || subcmds {\n            DEFAULT_TEMPLATE\n        } else {\n            DEFAULT_NO_ARGS_TEMPLATE\n        };\n        self.template.write_templated_help(template);\n    }\n}\n\nconst DEFAULT_TEMPLATE: &str = \"\\\n{before-help}{about-with-newline}\n{usage-heading} {usage}\n\n{all-args}{after-help}\\\n    \";\n\nconst DEFAULT_NO_ARGS_TEMPLATE: &str = \"\\\n{before-help}{about-with-newline}\n{usage-heading} {usage}{after-help}\\\n    \";\n\nconst SHORT_SIZE: usize = 4; // See `fn short` for the 4\n\n/// Help template writer\n///\n/// Wraps a writer stream providing different methods to generate help for `clap` objects.\npub(crate) struct HelpTemplate<'cmd, 'writer> {\n    writer: &'writer mut StyledStr,\n    cmd: &'cmd Command,\n    styles: &'cmd Styles,\n    usage: &'cmd Usage<'cmd>,\n    next_line_help: bool,\n    term_w: usize,\n    use_long: bool,\n}\n\n// Public Functions\nimpl<'cmd, 'writer> HelpTemplate<'cmd, 'writer> {\n    /// Create a new `HelpTemplate` instance.\n    pub(crate) fn new(\n        writer: &'writer mut StyledStr,\n        cmd: &'cmd Command,\n        usage: &'cmd Usage<'cmd>,\n        use_long: bool,\n    ) -> Self {\n        debug!(\n            \"HelpTemplate::new cmd={}, use_long={}\",\n            cmd.get_name(),\n            use_long\n        );\n        let term_w = Self::term_w(cmd);\n        let next_line_help = cmd.is_next_line_help_set();\n\n        HelpTemplate {\n            writer,\n            cmd,\n            styles: cmd.get_styles(),\n            usage,\n            next_line_help,\n            term_w,\n            use_long,\n        }\n    }\n\n    #[cfg(not(feature = \"unstable-v5\"))]\n    fn term_w(cmd: &'cmd Command) -> usize {\n        match cmd.get_term_width() {\n            Some(0) => usize::MAX,\n            Some(w) => w,\n            None => {\n                let (current_width, _h) = dimensions();\n                let current_width = current_width.unwrap_or(100);\n                let max_width = match cmd.get_max_term_width() {\n                    None | Some(0) => usize::MAX,\n                    Some(mw) => mw,\n                };\n                cmp::min(current_width, max_width)\n            }\n        }\n    }\n\n    #[cfg(feature = \"unstable-v5\")]\n    fn term_w(cmd: &'cmd Command) -> usize {\n        let term_w = match cmd.get_term_width() {\n            Some(0) => usize::MAX,\n            Some(w) => w,\n            None => {\n                let (current_width, _h) = dimensions();\n                current_width.unwrap_or(usize::MAX)\n            }\n        };\n\n        let max_term_w = match cmd.get_max_term_width() {\n            Some(0) => usize::MAX,\n            Some(mw) => mw,\n            None => 100,\n        };\n\n        cmp::min(term_w, max_term_w)\n    }\n\n    /// Write help to stream for the parser in the format defined by the template.\n    ///\n    /// For details about the template language see [`Command::help_template`].\n    ///\n    /// [`Command::help_template`]: Command::help_template()\n    pub(crate) fn write_templated_help(&mut self, template: &str) {\n        debug!(\"HelpTemplate::write_templated_help\");\n        use std::fmt::Write as _;\n\n        let mut parts = template.split('{');\n        if let Some(first) = parts.next() {\n            self.writer.push_str(first);\n        }\n        for part in parts {\n            if let Some((tag, rest)) = part.split_once('}') {\n                match tag {\n                    \"name\" => {\n                        self.write_display_name();\n                    }\n                    #[cfg(not(feature = \"unstable-v5\"))]\n                    \"bin\" => {\n                        self.write_bin_name();\n                    }\n                    \"version\" => {\n                        self.write_version();\n                    }\n                    \"author\" => {\n                        self.write_author(false, false);\n                    }\n                    \"author-with-newline\" => {\n                        self.write_author(false, true);\n                    }\n                    \"author-section\" => {\n                        self.write_author(true, true);\n                    }\n                    \"about\" => {\n                        self.write_about(false, false);\n                    }\n                    \"about-with-newline\" => {\n                        self.write_about(false, true);\n                    }\n                    \"about-section\" => {\n                        self.write_about(true, true);\n                    }\n                    \"usage-heading\" => {\n                        let _ = write!(\n                            self.writer,\n                            \"{}Usage:{}\",\n                            self.styles.get_usage().render(),\n                            self.styles.get_usage().render_reset()\n                        );\n                    }\n                    \"usage\" => {\n                        self.writer.push_styled(\n                            &self.usage.create_usage_no_title(&[]).unwrap_or_default(),\n                        );\n                    }\n                    \"all-args\" => {\n                        self.write_all_args();\n                    }\n                    \"options\" => {\n                        // Include even those with a heading as we don't have a good way of\n                        // handling help_heading in the template.\n                        self.write_args(\n                            &self.cmd.get_non_positionals().collect::<Vec<_>>(),\n                            \"options\",\n                            option_sort_key,\n                        );\n                    }\n                    \"positionals\" => {\n                        self.write_args(\n                            &self.cmd.get_positionals().collect::<Vec<_>>(),\n                            \"positionals\",\n                            positional_sort_key,\n                        );\n                    }\n                    \"subcommands\" => {\n                        self.write_subcommands(self.cmd);\n                    }\n                    \"tab\" => {\n                        self.writer.push_str(TAB);\n                    }\n                    \"after-help\" => {\n                        self.write_after_help();\n                    }\n                    \"before-help\" => {\n                        self.write_before_help();\n                    }\n                    _ => {\n                        let _ = write!(self.writer, \"{{{tag}}}\");\n                    }\n                }\n                self.writer.push_str(rest);\n            }\n        }\n    }\n}\n\n/// Basic template methods\nimpl HelpTemplate<'_, '_> {\n    /// Writes binary name of a Parser Object to the wrapped stream.\n    fn write_display_name(&mut self) {\n        debug!(\"HelpTemplate::write_display_name\");\n\n        let display_name = wrap(\n            &self\n                .cmd\n                .get_display_name()\n                .unwrap_or_else(|| self.cmd.get_name())\n                .replace(\"{n}\", \"\\n\"),\n            self.term_w,\n        );\n        self.writer.push_string(display_name);\n    }\n\n    /// Writes binary name of a Parser Object to the wrapped stream.\n    #[cfg(not(feature = \"unstable-v5\"))]\n    fn write_bin_name(&mut self) {\n        debug!(\"HelpTemplate::write_bin_name\");\n\n        let bin_name = if let Some(bn) = self.cmd.get_bin_name() {\n            if bn.contains(' ') {\n                // In case we're dealing with subcommands i.e. git mv is translated to git-mv\n                bn.replace(' ', \"-\")\n            } else {\n                wrap(&self.cmd.get_name().replace(\"{n}\", \"\\n\"), self.term_w)\n            }\n        } else {\n            wrap(&self.cmd.get_name().replace(\"{n}\", \"\\n\"), self.term_w)\n        };\n        self.writer.push_string(bin_name);\n    }\n\n    fn write_version(&mut self) {\n        let version = self\n            .cmd\n            .get_version()\n            .or_else(|| self.cmd.get_long_version());\n        if let Some(output) = version {\n            self.writer.push_string(wrap(output, self.term_w));\n        }\n    }\n\n    fn write_author(&mut self, before_new_line: bool, after_new_line: bool) {\n        if let Some(author) = self.cmd.get_author() {\n            if before_new_line {\n                self.writer.push_str(\"\\n\");\n            }\n            self.writer.push_string(wrap(author, self.term_w));\n            if after_new_line {\n                self.writer.push_str(\"\\n\");\n            }\n        }\n    }\n\n    fn write_about(&mut self, before_new_line: bool, after_new_line: bool) {\n        let about = if self.use_long {\n            self.cmd.get_long_about().or_else(|| self.cmd.get_about())\n        } else {\n            self.cmd.get_about()\n        };\n        if let Some(output) = about {\n            if before_new_line {\n                self.writer.push_str(\"\\n\");\n            }\n            let mut output = output.clone();\n            output.replace_newline_var();\n            output.wrap(self.term_w);\n            self.writer.push_styled(&output);\n            if after_new_line {\n                self.writer.push_str(\"\\n\");\n            }\n        }\n    }\n\n    fn write_before_help(&mut self) {\n        debug!(\"HelpTemplate::write_before_help\");\n        let before_help = if self.use_long {\n            self.cmd\n                .get_before_long_help()\n                .or_else(|| self.cmd.get_before_help())\n        } else {\n            self.cmd.get_before_help()\n        };\n        if let Some(output) = before_help {\n            let mut output = output.clone();\n            output.replace_newline_var();\n            output.wrap(self.term_w);\n            self.writer.push_styled(&output);\n            self.writer.push_str(\"\\n\\n\");\n        }\n    }\n\n    fn write_after_help(&mut self) {\n        debug!(\"HelpTemplate::write_after_help\");\n        let after_help = if self.use_long {\n            self.cmd\n                .get_after_long_help()\n                .or_else(|| self.cmd.get_after_help())\n        } else {\n            self.cmd.get_after_help()\n        };\n        if let Some(output) = after_help {\n            self.writer.push_str(\"\\n\\n\");\n            let mut output = output.clone();\n            output.replace_newline_var();\n            output.wrap(self.term_w);\n            self.writer.push_styled(&output);\n        }\n    }\n}\n\n/// Arg handling\nimpl HelpTemplate<'_, '_> {\n    /// Writes help for all arguments (options, flags, args, subcommands)\n    /// including titles of a Parser Object to the wrapped stream.\n    pub(crate) fn write_all_args(&mut self) {\n        debug!(\"HelpTemplate::write_all_args\");\n        use std::fmt::Write as _;\n        let header = &self.styles.get_header();\n\n        let pos = self\n            .cmd\n            .get_positionals()\n            .filter(|a| a.get_help_heading().is_none())\n            .filter(|arg| should_show_arg(self.use_long, arg))\n            .collect::<Vec<_>>();\n        let non_pos = self\n            .cmd\n            .get_non_positionals()\n            .filter(|a| a.get_help_heading().is_none())\n            .filter(|arg| should_show_arg(self.use_long, arg))\n            .collect::<Vec<_>>();\n        let subcmds = self.cmd.has_visible_subcommands();\n\n        let custom_headings = self\n            .cmd\n            .get_arguments()\n            .filter_map(|arg| arg.get_help_heading())\n            .collect::<FlatSet<_>>();\n\n        let flatten = self.cmd.is_flatten_help_set();\n\n        let mut first = true;\n\n        if subcmds && !flatten {\n            if !first {\n                self.writer.push_str(\"\\n\\n\");\n            }\n            first = false;\n            let default_help_heading = Str::from(\"Commands\");\n            let help_heading = self\n                .cmd\n                .get_subcommand_help_heading()\n                .unwrap_or(&default_help_heading);\n            let _ = write!(self.writer, \"{header}{help_heading}:{header:#}\\n\",);\n\n            self.write_subcommands(self.cmd);\n        }\n\n        if !pos.is_empty() {\n            if !first {\n                self.writer.push_str(\"\\n\\n\");\n            }\n            first = false;\n            // Write positional args if any\n            let help_heading = \"Arguments\";\n            let _ = write!(self.writer, \"{header}{help_heading}:{header:#}\\n\",);\n            self.write_args(&pos, \"Arguments\", positional_sort_key);\n        }\n\n        if !non_pos.is_empty() {\n            if !first {\n                self.writer.push_str(\"\\n\\n\");\n            }\n            first = false;\n            let help_heading = \"Options\";\n            let _ = write!(self.writer, \"{header}{help_heading}:{header:#}\\n\",);\n            self.write_args(&non_pos, \"Options\", option_sort_key);\n        }\n        if !custom_headings.is_empty() {\n            for heading in custom_headings {\n                let args = self\n                    .cmd\n                    .get_arguments()\n                    .filter(|a| {\n                        if let Some(help_heading) = a.get_help_heading() {\n                            return help_heading == heading;\n                        }\n                        false\n                    })\n                    .filter(|arg| should_show_arg(self.use_long, arg))\n                    .collect::<Vec<_>>();\n\n                if !args.is_empty() {\n                    if !first {\n                        self.writer.push_str(\"\\n\\n\");\n                    }\n                    first = false;\n                    let _ = write!(self.writer, \"{header}{heading}:{header:#}\\n\",);\n                    self.write_args(&args, heading, option_sort_key);\n                }\n            }\n        }\n        if subcmds && flatten {\n            let mut cmd = self.cmd.clone();\n            cmd.build();\n            self.write_flat_subcommands(&cmd, &mut first);\n        }\n    }\n\n    /// Sorts arguments by length and display order and write their help to the wrapped stream.\n    fn write_args(&mut self, args: &[&Arg], _category: &str, sort_key: ArgSortKey) {\n        debug!(\"HelpTemplate::write_args {_category}\");\n        // The shortest an arg can legally be is 2 (i.e. '-x')\n        let mut longest = 2;\n        let mut ord_v = BTreeMap::new();\n\n        // Determine the longest\n        for &arg in args.iter().filter(|arg| {\n            // If it's NextLineHelp we don't care to compute how long it is because it may be\n            // NextLineHelp on purpose simply *because* it's so long and would throw off all other\n            // args alignment\n            should_show_arg(self.use_long, arg)\n        }) {\n            let width = display_width(&arg.to_string());\n            let actual_width = if arg.get_long().is_some() {\n                width + SHORT_SIZE\n            } else {\n                width\n            };\n            longest = longest.max(actual_width);\n            debug!(\n                \"HelpTemplate::write_args: arg={:?} longest={}\",\n                arg.get_id(),\n                longest\n            );\n\n            let key = (sort_key)(arg);\n            ord_v.insert(key, arg);\n        }\n\n        let next_line_help = self.will_args_wrap(args, longest);\n\n        for (i, (_, arg)) in ord_v.iter().enumerate() {\n            if i != 0 {\n                self.writer.push_str(\"\\n\");\n                if next_line_help && self.use_long {\n                    self.writer.push_str(\"\\n\");\n                }\n            }\n            self.write_arg(arg, next_line_help, longest);\n        }\n    }\n\n    /// Writes help for an argument to the wrapped stream.\n    fn write_arg(&mut self, arg: &Arg, next_line_help: bool, longest: usize) {\n        let spec_vals = &self.spec_vals(arg);\n\n        self.writer.push_str(TAB);\n        self.short(arg);\n        self.long(arg);\n        self.writer\n            .push_styled(&arg.stylize_arg_suffix(self.styles, None));\n        self.align_to_about(arg, next_line_help, longest);\n\n        let about = if self.use_long {\n            arg.get_long_help()\n                .or_else(|| arg.get_help())\n                .unwrap_or_default()\n        } else {\n            arg.get_help()\n                .or_else(|| arg.get_long_help())\n                .unwrap_or_default()\n        };\n\n        self.help(Some(arg), about, spec_vals, next_line_help, longest);\n    }\n\n    /// Writes argument's short command to the wrapped stream.\n    fn short(&mut self, arg: &Arg) {\n        debug!(\"HelpTemplate::short\");\n        use std::fmt::Write as _;\n        let literal = &self.styles.get_literal();\n\n        if let Some(s) = arg.get_short() {\n            let _ = write!(self.writer, \"{literal}-{s}{literal:#}\",);\n        } else if arg.get_long().is_some() {\n            self.writer.push_str(\"    \");\n        }\n    }\n\n    /// Writes argument's long command to the wrapped stream.\n    fn long(&mut self, arg: &Arg) {\n        debug!(\"HelpTemplate::long\");\n        use std::fmt::Write as _;\n        let literal = &self.styles.get_literal();\n\n        if let Some(long) = arg.get_long() {\n            if arg.get_short().is_some() {\n                self.writer.push_str(\", \");\n            }\n            let _ = write!(self.writer, \"{literal}--{long}{literal:#}\",);\n        }\n    }\n\n    /// Write alignment padding between arg's switches/values and its about message.\n    fn align_to_about(&mut self, arg: &Arg, next_line_help: bool, longest: usize) {\n        debug!(\n            \"HelpTemplate::align_to_about: arg={}, next_line_help={}, longest={}\",\n            arg.get_id(),\n            next_line_help,\n            longest\n        );\n        let padding = if self.use_long || next_line_help {\n            // long help prints messages on the next line so it doesn't need to align text\n            debug!(\"HelpTemplate::align_to_about: printing long help so skip alignment\");\n            0\n        } else if !arg.is_positional() {\n            let self_len = display_width(&arg.to_string()) + SHORT_SIZE;\n            // Since we're writing spaces from the tab point we first need to know if we\n            // had a long and short, or just short\n            let padding = if arg.get_long().is_some() {\n                // Only account 4 after the val\n                TAB_WIDTH\n            } else {\n                // Only account for ', --' + 4 after the val\n                TAB_WIDTH + 4\n            };\n            let spcs = longest + padding - self_len;\n            debug!(\n                \"HelpTemplate::align_to_about: positional=false arg_len={self_len}, spaces={spcs}\"\n            );\n\n            spcs\n        } else {\n            let self_len = display_width(&arg.to_string());\n            let padding = TAB_WIDTH;\n            let spcs = longest + padding - self_len;\n            debug!(\n                \"HelpTemplate::align_to_about: positional=true arg_len={self_len}, spaces={spcs}\",\n            );\n\n            spcs\n        };\n\n        self.write_padding(padding);\n    }\n\n    /// Writes argument's help to the wrapped stream.\n    fn help(\n        &mut self,\n        arg: Option<&Arg>,\n        about: &StyledStr,\n        spec_vals: &str,\n        next_line_help: bool,\n        longest: usize,\n    ) {\n        debug!(\"HelpTemplate::help\");\n        use std::fmt::Write as _;\n        let literal = &self.styles.get_literal();\n\n        // Is help on next line, if so then indent\n        if next_line_help {\n            debug!(\"HelpTemplate::help: Next Line...{next_line_help:?}\");\n            self.writer.push_str(\"\\n\");\n            self.writer.push_str(TAB);\n            self.writer.push_str(NEXT_LINE_INDENT);\n        }\n\n        let spaces = if next_line_help {\n            TAB.len() + NEXT_LINE_INDENT.len()\n        } else {\n            longest + TAB_WIDTH * 2\n        };\n        let trailing_indent = spaces; // Don't indent any further than the first line is indented\n        let trailing_indent = self.get_spaces(trailing_indent);\n\n        let mut help = about.clone();\n        let mut help_is_empty = help.is_empty();\n        help.replace_newline_var();\n\n        let next_line_specs = self.use_long && arg.is_some();\n        if !spec_vals.is_empty() && !next_line_specs {\n            if !help_is_empty {\n                let sep = \" \";\n                help.push_str(sep);\n            }\n            help.push_str(spec_vals);\n            help_is_empty = help.is_empty();\n        }\n\n        let avail_chars = self.term_w.saturating_sub(spaces);\n        debug!(\n            \"HelpTemplate::help: help_width={}, spaces={}, avail={}\",\n            spaces,\n            help.display_width(),\n            avail_chars\n        );\n        help.wrap(avail_chars);\n        help.indent(\"\", &trailing_indent);\n        self.writer.push_styled(&help);\n\n        let mut has_possible_values = false;\n        if let Some(arg) = arg {\n            if !arg.is_hide_possible_values_set() && self.use_long_pv(arg) {\n                const DASH_SPACE: usize = \"- \".len();\n                let possible_vals = arg.get_possible_values();\n                if !possible_vals.is_empty() {\n                    debug!(\"HelpTemplate::help: Found possible vals...{possible_vals:?}\");\n                    has_possible_values = true;\n\n                    let longest = possible_vals\n                        .iter()\n                        .filter(|f| !f.is_hide_set())\n                        .map(|f| display_width(f.get_name()))\n                        .max()\n                        .expect(\"Only called with possible value\");\n\n                    let spaces = spaces + TAB_WIDTH - DASH_SPACE;\n                    let trailing_indent = spaces + DASH_SPACE;\n                    let trailing_indent = self.get_spaces(trailing_indent);\n\n                    if !help_is_empty {\n                        let _ = write!(self.writer, \"\\n\\n{:spaces$}\", \"\");\n                    }\n                    self.writer.push_str(\"Possible values:\");\n                    for pv in possible_vals.iter().filter(|pv| !pv.is_hide_set()) {\n                        let name = pv.get_name();\n\n                        let mut descr = StyledStr::new();\n                        let _ = write!(&mut descr, \"{literal}{name}{literal:#}\",);\n                        if let Some(help) = pv.get_help() {\n                            debug!(\"HelpTemplate::help: Possible Value help\");\n                            // To align help messages\n                            let padding = longest - display_width(name);\n                            let _ = write!(&mut descr, \": {:padding$}\", \"\");\n                            descr.push_styled(help);\n                        }\n\n                        let avail_chars = if self.term_w > trailing_indent.len() {\n                            self.term_w - trailing_indent.len()\n                        } else {\n                            usize::MAX\n                        };\n                        descr.replace_newline_var();\n                        descr.wrap(avail_chars);\n                        descr.indent(\"\", &trailing_indent);\n\n                        let _ = write!(self.writer, \"\\n{:spaces$}- \", \"\",);\n                        self.writer.push_styled(&descr);\n                    }\n                }\n            }\n        }\n\n        if !spec_vals.is_empty() && next_line_specs {\n            let mut help = StyledStr::new();\n            if !help_is_empty || has_possible_values {\n                let sep = \"\\n\\n\";\n                help.push_str(sep);\n            }\n            help.push_str(spec_vals);\n\n            help.wrap(avail_chars);\n            help.indent(\"\", &trailing_indent);\n            self.writer.push_styled(&help);\n        }\n    }\n\n    /// Will use next line help on writing args.\n    fn will_args_wrap(&self, args: &[&Arg], longest: usize) -> bool {\n        args.iter()\n            .filter(|arg| should_show_arg(self.use_long, arg))\n            .any(|arg| {\n                let spec_vals = &self.spec_vals(arg);\n                self.arg_next_line_help(arg, spec_vals, longest)\n            })\n    }\n\n    fn arg_next_line_help(&self, arg: &Arg, spec_vals: &str, longest: usize) -> bool {\n        if self.next_line_help || arg.is_next_line_help_set() || self.use_long {\n            // setting_next_line\n            true\n        } else {\n            // force_next_line\n            let h = arg\n                .get_help()\n                .or_else(|| arg.get_long_help())\n                .unwrap_or_default();\n            let h_w = h.display_width() + display_width(spec_vals);\n            let taken = longest + TAB_WIDTH * 2;\n            self.term_w >= taken\n                && (taken as f32 / self.term_w as f32) > 0.40\n                && h_w > (self.term_w - taken)\n        }\n    }\n\n    fn spec_vals(&self, a: &Arg) -> String {\n        debug!(\"HelpTemplate::spec_vals: a={a}\");\n        let ctx = &self.styles.get_context();\n        let ctx_val = &self.styles.get_context_value();\n        let val_sep = format!(\"{ctx}, {ctx:#}\"); // context values styled separator\n\n        let mut spec_vals = Vec::new();\n        #[cfg(feature = \"env\")]\n        if let Some(ref env) = a.env {\n            if !a.is_hide_env_set() {\n                debug!(\n                    \"HelpTemplate::spec_vals: Found environment variable...[{:?}:{:?}]\",\n                    env.0, env.1\n                );\n                let env_val = if !a.is_hide_env_values_set() {\n                    format!(\n                        \"={}\",\n                        env.1\n                            .as_ref()\n                            .map(|s| s.to_string_lossy())\n                            .unwrap_or_default()\n                    )\n                } else {\n                    Default::default()\n                };\n                let env_info = format!(\n                    \"{ctx}[env: {ctx:#}{ctx_val}{}{}{ctx_val:#}{ctx}]{ctx:#}\",\n                    env.0.to_string_lossy(),\n                    env_val\n                );\n                spec_vals.push(env_info);\n            }\n        }\n        if a.is_takes_value_set() && !a.is_hide_default_value_set() && !a.default_vals.is_empty() {\n            debug!(\n                \"HelpTemplate::spec_vals: Found default value...[{:?}]\",\n                a.default_vals\n            );\n\n            let dvs = a\n                .default_vals\n                .iter()\n                .map(|dv| dv.to_string_lossy())\n                .map(|dv| match Escape(dv.as_ref()).to_cow() {\n                    Cow::Borrowed(_) => dv,\n                    Cow::Owned(escaped) => Cow::Owned(escaped),\n                })\n                .collect::<Vec<_>>()\n                .join(\" \");\n\n            spec_vals.push(format!(\n                \"{ctx}[default: {ctx:#}{ctx_val}{dvs}{ctx_val:#}{ctx}]{ctx:#}\"\n            ));\n        }\n\n        let mut als = Vec::new();\n\n        let short_als = a\n            .short_aliases\n            .iter()\n            .filter(|&als| als.1) // visible\n            .map(|als| format!(\"{ctx_val}-{}{ctx_val:#}\", als.0)); // name\n        debug!(\n            \"HelpTemplate::spec_vals: Found short aliases...{:?}\",\n            a.short_aliases\n        );\n        als.extend(short_als);\n\n        let long_als = a\n            .aliases\n            .iter()\n            .filter(|&als| als.1) // visible\n            .map(|als| format!(\"{ctx_val}--{}{ctx_val:#}\", als.0)); // name\n        debug!(\"HelpTemplate::spec_vals: Found aliases...{:?}\", a.aliases);\n        als.extend(long_als);\n\n        if !als.is_empty() {\n            let als = als.join(&val_sep);\n            spec_vals.push(format!(\"{ctx}[aliases: {ctx:#}{als}{ctx}]{ctx:#}\"));\n        }\n\n        if !a.is_hide_possible_values_set() && !self.use_long_pv(a) {\n            let possible_vals = a.get_possible_values();\n            if !possible_vals.is_empty() {\n                debug!(\"HelpTemplate::spec_vals: Found possible vals...{possible_vals:?}\");\n\n                let pvs = possible_vals\n                    .iter()\n                    .filter_map(PossibleValue::get_visible_quoted_name)\n                    .map(|pv| format!(\"{ctx_val}{pv}{ctx_val:#}\"))\n                    .collect::<Vec<_>>()\n                    .join(&val_sep);\n\n                spec_vals.push(format!(\"{ctx}[possible values: {ctx:#}{pvs}{ctx}]{ctx:#}\"));\n            }\n        }\n        let connector = if self.use_long { \"\\n\" } else { \" \" };\n        spec_vals.join(connector)\n    }\n\n    fn get_spaces(&self, n: usize) -> String {\n        \" \".repeat(n)\n    }\n\n    fn write_padding(&mut self, amount: usize) {\n        use std::fmt::Write as _;\n        let _ = write!(self.writer, \"{:amount$}\", \"\");\n    }\n\n    fn use_long_pv(&self, arg: &Arg) -> bool {\n        self.use_long\n            && arg\n                .get_possible_values()\n                .iter()\n                .any(PossibleValue::should_show_help)\n    }\n}\n\n/// Subcommand handling\nimpl HelpTemplate<'_, '_> {\n    /// Writes help for subcommands of a Parser Object to the wrapped stream.\n    fn write_flat_subcommands(&mut self, cmd: &Command, first: &mut bool) {\n        debug!(\n            \"HelpTemplate::write_flat_subcommands, cmd={}, first={}\",\n            cmd.get_name(),\n            *first\n        );\n        use std::fmt::Write as _;\n        let header = &self.styles.get_header();\n\n        let mut ord_v = BTreeMap::new();\n        for subcommand in cmd\n            .get_subcommands()\n            .filter(|subcommand| should_show_subcommand(subcommand))\n        {\n            ord_v.insert(\n                (subcommand.get_display_order(), subcommand.get_name()),\n                subcommand,\n            );\n        }\n        for (_, subcommand) in ord_v {\n            if !*first {\n                self.writer.push_str(\"\\n\\n\");\n            }\n            *first = false;\n\n            let heading = subcommand.get_usage_name_fallback();\n            let about = subcommand\n                .get_about()\n                .or_else(|| subcommand.get_long_about())\n                .unwrap_or_default();\n\n            let _ = write!(self.writer, \"{header}{heading}:{header:#}\",);\n            if !about.is_empty() {\n                let _ = write!(self.writer, \"\\n{about}\",);\n            }\n\n            let args = subcommand\n                .get_arguments()\n                .filter(|arg| should_show_arg(self.use_long, arg) && !arg.is_global_set())\n                .collect::<Vec<_>>();\n            if !args.is_empty() {\n                self.writer.push_str(\"\\n\");\n            }\n\n            let mut sub_help = HelpTemplate {\n                writer: self.writer,\n                cmd: subcommand,\n                styles: self.styles,\n                usage: self.usage,\n                next_line_help: self.next_line_help,\n                term_w: self.term_w,\n                use_long: self.use_long,\n            };\n            sub_help.write_args(&args, heading, option_sort_key);\n            if subcommand.is_flatten_help_set() {\n                sub_help.write_flat_subcommands(subcommand, first);\n            }\n        }\n    }\n\n    /// Writes help for subcommands of a Parser Object to the wrapped stream.\n    fn write_subcommands(&mut self, cmd: &Command) {\n        debug!(\"HelpTemplate::write_subcommands\");\n        use std::fmt::Write as _;\n        let literal = &self.styles.get_literal();\n\n        // The shortest an arg can legally be is 2 (i.e. '-x')\n        let mut longest = 2;\n        let mut ord_v = BTreeMap::new();\n        for subcommand in cmd\n            .get_subcommands()\n            .filter(|subcommand| should_show_subcommand(subcommand))\n        {\n            let mut styled = StyledStr::new();\n            let name = subcommand.get_name();\n            let _ = write!(styled, \"{literal}{name}{literal:#}\",);\n            if let Some(short) = subcommand.get_short_flag() {\n                let _ = write!(styled, \", {literal}-{short}{literal:#}\",);\n            }\n            if let Some(long) = subcommand.get_long_flag() {\n                let _ = write!(styled, \", {literal}--{long}{literal:#}\",);\n            }\n            longest = longest.max(styled.display_width());\n            ord_v.insert((subcommand.get_display_order(), styled), subcommand);\n        }\n\n        debug!(\"HelpTemplate::write_subcommands longest = {longest}\");\n\n        let next_line_help = self.will_subcommands_wrap(cmd.get_subcommands(), longest);\n\n        for (i, (sc_str, sc)) in ord_v.into_iter().enumerate() {\n            if 0 < i {\n                self.writer.push_str(\"\\n\");\n            }\n            self.write_subcommand(sc_str.1, sc, next_line_help, longest);\n        }\n    }\n\n    /// Will use next line help on writing subcommands.\n    fn will_subcommands_wrap<'a>(\n        &self,\n        subcommands: impl IntoIterator<Item = &'a Command>,\n        longest: usize,\n    ) -> bool {\n        subcommands\n            .into_iter()\n            .filter(|&subcommand| should_show_subcommand(subcommand))\n            .any(|subcommand| {\n                let spec_vals = &self.sc_spec_vals(subcommand);\n                self.subcommand_next_line_help(subcommand, spec_vals, longest)\n            })\n    }\n\n    fn write_subcommand(\n        &mut self,\n        sc_str: StyledStr,\n        cmd: &Command,\n        next_line_help: bool,\n        longest: usize,\n    ) {\n        debug!(\"HelpTemplate::write_subcommand\");\n\n        let spec_vals = &self.sc_spec_vals(cmd);\n\n        let about = cmd\n            .get_about()\n            .or_else(|| cmd.get_long_about())\n            .unwrap_or_default();\n\n        self.subcmd(sc_str, next_line_help, longest);\n        self.help(None, about, spec_vals, next_line_help, longest);\n    }\n\n    fn sc_spec_vals(&self, a: &Command) -> String {\n        debug!(\"HelpTemplate::sc_spec_vals: a={}\", a.get_name());\n        let ctx = &self.styles.get_context();\n        let ctx_val = &self.styles.get_context_value();\n        let val_sep = format!(\"{ctx}, {ctx:#}\"); // context values styled separator\n        let mut spec_vals = vec![];\n\n        let mut short_als = a\n            .get_visible_short_flag_aliases()\n            .map(|s| format!(\"{ctx_val}-{s}{ctx_val:#}\"))\n            .collect::<Vec<_>>();\n        let long_als = a\n            .get_visible_long_flag_aliases()\n            .map(|s| format!(\"{ctx_val}--{s}{ctx_val:#}\"));\n        short_als.extend(long_als);\n        let als = a\n            .get_visible_aliases()\n            .map(|s| format!(\"{ctx_val}{s}{ctx_val:#}\"));\n        short_als.extend(als);\n        let all_als = short_als.join(&val_sep);\n        if !all_als.is_empty() {\n            debug!(\n                \"HelpTemplate::spec_vals: Found aliases...{:?}\",\n                a.get_all_aliases().collect::<Vec<_>>()\n            );\n            debug!(\n                \"HelpTemplate::spec_vals: Found short flag aliases...{:?}\",\n                a.get_all_short_flag_aliases().collect::<Vec<_>>()\n            );\n            debug!(\n                \"HelpTemplate::spec_vals: Found long flag aliases...{:?}\",\n                a.get_all_long_flag_aliases().collect::<Vec<_>>()\n            );\n            spec_vals.push(format!(\"{ctx}[aliases: {ctx:#}{all_als}{ctx}]{ctx:#}\"));\n        }\n\n        spec_vals.join(\" \")\n    }\n\n    fn subcommand_next_line_help(&self, cmd: &Command, spec_vals: &str, longest: usize) -> bool {\n        // Ignore `self.use_long` since subcommands are only shown as short help\n        if self.next_line_help {\n            // setting_next_line\n            true\n        } else {\n            // force_next_line\n            let h = cmd\n                .get_about()\n                .or_else(|| cmd.get_long_about())\n                .unwrap_or_default();\n            let h_w = h.display_width() + display_width(spec_vals);\n            let taken = longest + TAB_WIDTH * 2;\n            self.term_w >= taken\n                && (taken as f32 / self.term_w as f32) > 0.40\n                && h_w > (self.term_w - taken)\n        }\n    }\n\n    /// Writes subcommand to the wrapped stream.\n    fn subcmd(&mut self, sc_str: StyledStr, next_line_help: bool, longest: usize) {\n        self.writer.push_str(TAB);\n        self.writer.push_styled(&sc_str);\n        if !next_line_help {\n            let width = sc_str.display_width();\n            let padding = longest + TAB_WIDTH - width;\n            self.write_padding(padding);\n        }\n    }\n}\n\nconst NEXT_LINE_INDENT: &str = \"        \";\n\ntype ArgSortKey = fn(arg: &Arg) -> (usize, String);\n\nfn positional_sort_key(arg: &Arg) -> (usize, String) {\n    (arg.get_index().unwrap_or(0), String::new())\n}\n\nfn option_sort_key(arg: &Arg) -> (usize, String) {\n    // Formatting key like this to ensure that:\n    // 1. Argument has long flags are printed just after short flags.\n    // 2. For two args both have short flags like `-c` and `-C`, the\n    //    `-C` arg is printed just after the `-c` arg\n    // 3. For args without short or long flag, print them at last(sorted\n    //    by arg name).\n    // Example order: -a, -b, -B, -s, --select-file, --select-folder, -x\n\n    let key = if let Some(x) = arg.get_short() {\n        let mut s = x.to_ascii_lowercase().to_string();\n        s.push(if x.is_ascii_lowercase() { '0' } else { '1' });\n        s\n    } else if let Some(x) = arg.get_long() {\n        x.to_string()\n    } else {\n        let mut s = '{'.to_string();\n        s.push_str(arg.get_id().as_str());\n        s\n    };\n    (arg.get_display_order(), key)\n}\n\npub(crate) fn dimensions() -> (Option<usize>, Option<usize>) {\n    #[cfg(not(feature = \"wrap_help\"))]\n    return (None, None);\n\n    #[cfg(feature = \"wrap_help\")]\n    terminal_size::terminal_size()\n        .map(|(w, h)| (Some(w.0.into()), Some(h.0.into())))\n        .unwrap_or_else(|| (parse_env(\"COLUMNS\"), parse_env(\"LINES\")))\n}\n\n#[cfg(feature = \"wrap_help\")]\nfn parse_env(var: &str) -> Option<usize> {\n    some!(some!(std::env::var_os(var)).to_str())\n        .parse::<usize>()\n        .ok()\n}\n\nfn should_show_arg(use_long: bool, arg: &Arg) -> bool {\n    debug!(\n        \"should_show_arg: use_long={:?}, arg={}\",\n        use_long,\n        arg.get_id()\n    );\n    if arg.is_hide_set() {\n        return false;\n    }\n    (!arg.is_hide_long_help_set() && use_long)\n        || (!arg.is_hide_short_help_set() && !use_long)\n        || arg.is_next_line_help_set()\n}\n\nfn should_show_subcommand(subcommand: &Command) -> bool {\n    !subcommand.is_hide_set()\n}\n\n#[cfg(test)]\nmod test {\n    #[test]\n    #[cfg(feature = \"wrap_help\")]\n    fn wrap_help_last_word() {\n        use super::*;\n\n        let help = String::from(\"foo bar baz\");\n        assert_eq!(wrap(&help, 5), \"foo\\nbar\\nbaz\");\n    }\n\n    #[test]\n    #[cfg(feature = \"unicode\")]\n    fn display_width_handles_non_ascii() {\n        use super::*;\n\n        // Popular Danish tongue-twister, the name of a fruit dessert.\n        let text = \"rødgrød med fløde\";\n        assert_eq!(display_width(text), 17);\n        // Note that the string width is smaller than the string\n        // length. This is due to the precomposed non-ASCII letters:\n        assert_eq!(text.len(), 20);\n    }\n\n    #[test]\n    #[cfg(feature = \"unicode\")]\n    fn display_width_handles_emojis() {\n        use super::*;\n\n        let text = \"😂\";\n        // There is a single `char`...\n        assert_eq!(text.chars().count(), 1);\n        // but it is double-width:\n        assert_eq!(display_width(text), 2);\n        // This is much less than the byte length:\n        assert_eq!(text.len(), 4);\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/output/mod.rs",
    "content": "mod help;\n#[cfg(feature = \"help\")]\nmod help_template;\nmod usage;\n\npub(crate) mod fmt;\n#[cfg(feature = \"help\")]\npub(crate) mod textwrap;\n\npub(crate) use self::help::write_help;\n#[cfg(feature = \"help\")]\npub(crate) use self::help_template::AutoHelp;\n#[cfg(feature = \"help\")]\npub(crate) use self::help_template::HelpTemplate;\n#[cfg(feature = \"help\")]\npub(crate) use self::textwrap::core::display_width;\n#[cfg(feature = \"help\")]\npub(crate) use self::textwrap::wrap;\npub(crate) use self::usage::Usage;\n\npub(crate) const TAB: &str = \"  \";\n#[cfg(feature = \"help\")]\npub(crate) const TAB_WIDTH: usize = TAB.len();\n"
  },
  {
    "path": "clap_builder/src/output/textwrap/core.rs",
    "content": "/// Compute the display width of `text`\n///\n/// # Examples\n///\n/// **Note:** When the `unicode` Cargo feature is disabled, all characters are presumed to take up\n/// 1 width.  With the feature enabled, function will correctly deal with [combining characters] in\n/// their decomposed form (see [Unicode equivalence]).\n///\n/// An example of a decomposed character is “é”, which can be decomposed into: “e” followed by a\n/// combining acute accent: “◌́”.  Without the `unicode` Cargo feature, every `char` has a width of\n/// 1. This includes the combining accent:\n///\n/// ## Emojis and CJK Characters\n///\n/// Characters such as emojis and [CJK characters] used in the\n/// Chinese, Japanese, and Korean languages are seen as double-width,\n/// even if the `unicode-width` feature is disabled:\n///\n/// # Limitations\n///\n/// The displayed width of a string cannot always be computed from the\n/// string alone. This is because the width depends on the rendering\n/// engine used. This is particularly visible with [emoji modifier\n/// sequences] where a base emoji is modified with, e.g., skin tone or\n/// hair color modifiers. It is up to the rendering engine to detect\n/// this and to produce a suitable emoji.\n///\n/// A simple example is “❤️”, which consists of “❤” (U+2764: Black\n/// Heart Symbol) followed by U+FE0F (Variation Selector-16). By\n/// itself, “❤” is a black heart, but if you follow it with the\n/// variant selector, you may get a wider red heart.\n///\n/// A more complex example would be “👨‍🦰” which should depict a man\n/// with red hair. Here the computed width is too large — and the\n/// width differs depending on the use of the `unicode-width` feature:\n///\n/// This happens because the grapheme consists of three code points:\n/// “👨” (U+1F468: Man), Zero Width Joiner (U+200D), and “🦰”\n/// (U+1F9B0: Red Hair). You can see them above in the test. With\n/// `unicode-width` enabled, the ZWJ is correctly seen as having zero\n/// width, without it is counted as a double-width character.\n///\n/// ## Terminal Support\n///\n/// Modern browsers typically do a great job at combining characters\n/// as shown above, but terminals often struggle more. As an example,\n/// Gnome Terminal version 3.38.1, shows “❤️” as a big red heart, but\n/// shows \"👨‍🦰\" as “👨🦰”.\n///\n/// [combining characters]: https://en.wikipedia.org/wiki/Combining_character\n/// [Unicode equivalence]: https://en.wikipedia.org/wiki/Unicode_equivalence\n/// [CJK characters]: https://en.wikipedia.org/wiki/CJK_characters\n/// [emoji modifier sequences]: https://unicode.org/emoji/charts/full-emoji-modifiers.html\n#[inline(never)]\npub(crate) fn display_width(text: &str) -> usize {\n    let mut width = 0;\n\n    let mut control_sequence = false;\n    let control_terminate: char = 'm';\n\n    for ch in text.chars() {\n        if ch.is_ascii_control() {\n            control_sequence = true;\n        } else if control_sequence && ch == control_terminate {\n            control_sequence = false;\n            continue;\n        }\n\n        if !control_sequence {\n            width += ch_width(ch);\n        }\n    }\n    width\n}\n\n#[cfg(feature = \"unicode\")]\nfn ch_width(ch: char) -> usize {\n    unicode_width::UnicodeWidthChar::width(ch).unwrap_or(0)\n}\n\n#[cfg(not(feature = \"unicode\"))]\nfn ch_width(_: char) -> usize {\n    1\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[cfg(feature = \"unicode\")]\n    use unicode_width::UnicodeWidthChar;\n\n    #[test]\n    fn emojis_have_correct_width() {\n        use unic_emoji_char::is_emoji;\n\n        // Emojis in the Basic Latin (ASCII) and Latin-1 Supplement\n        // blocks all have a width of 1 column. This includes\n        // characters such as '#' and '©'.\n        for ch in '\\u{1}'..'\\u{FF}' {\n            if is_emoji(ch) {\n                let desc = format!(\"{:?} U+{:04X}\", ch, ch as u32);\n\n                #[cfg(feature = \"unicode\")]\n                assert_eq!(ch.width().unwrap(), 1, \"char: {desc}\");\n\n                #[cfg(not(feature = \"unicode\"))]\n                assert_eq!(ch_width(ch), 1, \"char: {desc}\");\n            }\n        }\n\n        // Emojis in the remaining blocks of the Basic Multilingual\n        // Plane (BMP), in the Supplementary Multilingual Plane (SMP),\n        // and in the Supplementary Ideographic Plane (SIP), are all 1\n        // or 2 columns wide when unicode-width is used, and always 2\n        // columns wide otherwise. This includes all of our favorite\n        // emojis such as 😊.\n        for ch in '\\u{FF}'..'\\u{2FFFF}' {\n            if is_emoji(ch) {\n                let desc = format!(\"{:?} U+{:04X}\", ch, ch as u32);\n\n                #[cfg(feature = \"unicode\")]\n                assert!(ch.width().unwrap() <= 2, \"char: {desc}\");\n\n                #[cfg(not(feature = \"unicode\"))]\n                assert_eq!(ch_width(ch), 1, \"char: {desc}\");\n            }\n        }\n\n        // The remaining planes contain almost no assigned code points\n        // and thus also no emojis.\n    }\n\n    #[test]\n    #[cfg(feature = \"unicode\")]\n    fn display_width_works() {\n        assert_eq!(\"Café Plain\".len(), 11); // “é” is two bytes\n        assert_eq!(display_width(\"Café Plain\"), 10);\n    }\n\n    #[test]\n    #[cfg(feature = \"unicode\")]\n    fn display_width_narrow_emojis() {\n        assert_eq!(display_width(\"⁉\"), 1);\n    }\n\n    #[test]\n    #[cfg(feature = \"unicode\")]\n    fn display_width_narrow_emojis_variant_selector() {\n        assert_eq!(display_width(\"⁉\\u{fe0f}\"), 1);\n    }\n\n    #[test]\n    #[cfg(feature = \"unicode\")]\n    fn display_width_emojis() {\n        assert_eq!(display_width(\"😂😭🥺🤣✨😍🙏🥰😊🔥\"), 20);\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/output/textwrap/mod.rs",
    "content": "//! Fork of `textwrap` crate\n//!\n//! Benefits of forking:\n//! - Pull in only what we need rather than relying on the compiler to remove what we don't need\n//! - `LineWrapper` is able to incrementally wrap which will help with `StyledStr`\n\npub(crate) mod core;\n#[cfg(feature = \"wrap_help\")]\npub(crate) mod word_separators;\n#[cfg(feature = \"wrap_help\")]\npub(crate) mod wrap_algorithms;\n\n#[cfg(feature = \"wrap_help\")]\npub(crate) fn wrap(content: &str, hard_width: usize) -> String {\n    let mut wrapper = wrap_algorithms::LineWrapper::new(hard_width);\n    let mut total = Vec::new();\n    for line in content.split_inclusive('\\n') {\n        wrapper.reset();\n        let line = word_separators::find_words_ascii_space(line).collect::<Vec<_>>();\n        total.extend(wrapper.wrap(line));\n    }\n    total.join(\"\")\n}\n\n#[cfg(not(feature = \"wrap_help\"))]\npub(crate) fn wrap(content: &str, _hard_width: usize) -> String {\n    content.to_owned()\n}\n\n#[cfg(test)]\n#[cfg(feature = \"wrap_help\")]\nmod test {\n    /// Compatibility shim to keep textwrap's tests\n    fn wrap(content: &str, hard_width: usize) -> Vec<String> {\n        super::wrap(content, hard_width)\n            .trim_end()\n            .split('\\n')\n            .map(|s| s.to_owned())\n            .collect::<Vec<_>>()\n    }\n\n    #[test]\n    fn no_wrap() {\n        assert_eq!(wrap(\"foo\", 10), vec![\"foo\"]);\n    }\n\n    #[test]\n    fn wrap_simple() {\n        assert_eq!(wrap(\"foo bar baz\", 5), vec![\"foo\", \"bar\", \"baz\"]);\n    }\n\n    #[test]\n    fn to_be_or_not() {\n        assert_eq!(\n            wrap(\"To be, or not to be, that is the question.\", 10),\n            vec![\"To be, or\", \"not to be,\", \"that is\", \"the\", \"question.\"]\n        );\n    }\n\n    #[test]\n    fn multiple_words_on_first_line() {\n        assert_eq!(wrap(\"foo bar baz\", 10), vec![\"foo bar\", \"baz\"]);\n    }\n\n    #[test]\n    fn long_word() {\n        assert_eq!(wrap(\"foo\", 0), vec![\"foo\"]);\n    }\n\n    #[test]\n    fn long_words() {\n        assert_eq!(wrap(\"foo bar\", 0), vec![\"foo\", \"bar\"]);\n    }\n\n    #[test]\n    fn max_width() {\n        assert_eq!(wrap(\"foo bar\", usize::MAX), vec![\"foo bar\"]);\n\n        let text = \"Hello there! This is some English text. \\\n                    It should not be wrapped given the extents below.\";\n        assert_eq!(wrap(text, usize::MAX), vec![text]);\n    }\n\n    #[test]\n    fn leading_whitespace() {\n        assert_eq!(wrap(\"  foo bar\", 6), vec![\"  foo\", \"  bar\"]);\n    }\n\n    #[test]\n    fn leading_whitespace_empty_first_line() {\n        // If there is no space for the first word, the first line\n        // will be empty. This is because the string is split into\n        // words like [\" \", \"foobar \", \"baz\"], which puts \"foobar \" on\n        // the second line. We never output trailing whitespace\n        assert_eq!(wrap(\" foobar baz\", 6), vec![\" foobar\", \" baz\"]);\n    }\n\n    #[test]\n    fn trailing_whitespace() {\n        // Whitespace is only significant inside a line. After a line\n        // gets too long and is broken, the first word starts in\n        // column zero and is not indented.\n        assert_eq!(wrap(\"foo     bar     baz  \", 5), vec![\"foo\", \"bar\", \"baz\"]);\n    }\n\n    #[test]\n    fn issue_99() {\n        // We did not reset the in_whitespace flag correctly and did\n        // not handle single-character words after a line break.\n        assert_eq!(\n            wrap(\"aaabbbccc x yyyzzzwww\", 9),\n            vec![\"aaabbbccc\", \"x\", \"yyyzzzwww\"]\n        );\n    }\n\n    #[test]\n    fn issue_129() {\n        // The dash is an em-dash which takes up four bytes. We used\n        // to panic since we tried to index into the character.\n        assert_eq!(wrap(\"x – x\", 1), vec![\"x\", \"–\", \"x\"]);\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/output/textwrap/word_separators.rs",
    "content": "pub(crate) fn find_words_ascii_space(line: &str) -> impl Iterator<Item = &'_ str> + '_ {\n    let mut start = 0;\n    let mut in_whitespace = false;\n    let mut char_indices = line.char_indices();\n\n    std::iter::from_fn(move || {\n        for (idx, ch) in char_indices.by_ref() {\n            let next_whitespace = ch == ' ';\n            if in_whitespace && !next_whitespace {\n                let word = &line[start..idx];\n                start = idx;\n                in_whitespace = next_whitespace;\n                return Some(word);\n            }\n\n            in_whitespace = next_whitespace;\n        }\n\n        if start < line.len() {\n            let word = &line[start..];\n            start = line.len();\n            return Some(word);\n        }\n\n        None\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    macro_rules! test_find_words {\n        ($ascii_name:ident,\n         $([ $line:expr, $ascii_words:expr ]),+) => {\n            #[test]\n            fn $ascii_name() {\n                $(\n                    let expected_words: Vec<&str> = $ascii_words.to_vec();\n                    let actual_words = find_words_ascii_space($line)\n                        .collect::<Vec<_>>();\n                    assert_eq!(actual_words, expected_words, \"Line: {:?}\", $line);\n                )+\n            }\n        };\n    }\n\n    test_find_words!(ascii_space_empty, [\"\", []]);\n\n    test_find_words!(ascii_single_word, [\"foo\", [\"foo\"]]);\n\n    test_find_words!(ascii_two_words, [\"foo bar\", [\"foo \", \"bar\"]]);\n\n    test_find_words!(\n        ascii_multiple_words,\n        [\"foo bar\", [\"foo \", \"bar\"]],\n        [\"x y z\", [\"x \", \"y \", \"z\"]]\n    );\n\n    test_find_words!(ascii_only_whitespace, [\" \", [\" \"]], [\"    \", [\"    \"]]);\n\n    test_find_words!(\n        ascii_inter_word_whitespace,\n        [\"foo   bar\", [\"foo   \", \"bar\"]]\n    );\n\n    test_find_words!(ascii_trailing_whitespace, [\"foo   \", [\"foo   \"]]);\n\n    test_find_words!(ascii_leading_whitespace, [\"   foo\", [\"   \", \"foo\"]]);\n\n    test_find_words!(\n        ascii_multi_column_char,\n        [\"\\u{1f920}\", [\"\\u{1f920}\"]] // cowboy emoji 🤠\n    );\n\n    test_find_words!(\n        ascii_hyphens,\n        [\"foo-bar\", [\"foo-bar\"]],\n        [\"foo- bar\", [\"foo- \", \"bar\"]],\n        [\"foo - bar\", [\"foo \", \"- \", \"bar\"]],\n        [\"foo -bar\", [\"foo \", \"-bar\"]]\n    );\n\n    test_find_words!(ascii_newline, [\"foo\\nbar\", [\"foo\\nbar\"]]);\n\n    test_find_words!(ascii_tab, [\"foo\\tbar\", [\"foo\\tbar\"]]);\n\n    test_find_words!(\n        ascii_non_breaking_space,\n        [\"foo\\u{00A0}bar\", [\"foo\\u{00A0}bar\"]]\n    );\n}\n"
  },
  {
    "path": "clap_builder/src/output/textwrap/wrap_algorithms.rs",
    "content": "use super::core::display_width;\n\n#[derive(Debug)]\npub(crate) struct LineWrapper<'w> {\n    hard_width: usize,\n    line_width: usize,\n    indentation: Option<&'w str>,\n}\n\nimpl<'w> LineWrapper<'w> {\n    pub(crate) fn new(hard_width: usize) -> Self {\n        Self {\n            hard_width,\n            line_width: 0,\n            indentation: None,\n        }\n    }\n\n    pub(crate) fn reset(&mut self) {\n        self.line_width = 0;\n        self.indentation = None;\n    }\n\n    pub(crate) fn wrap(&mut self, mut words: Vec<&'w str>) -> Vec<&'w str> {\n        let mut first_word = false;\n        if self.indentation.is_none() {\n            first_word = true;\n            if let Some(word) = words.first() {\n                if word.trim().is_empty() {\n                    self.indentation = Some(*word);\n                } else {\n                    self.indentation = Some(\"\");\n                }\n            }\n        }\n\n        let mut i = 0;\n        while i < words.len() {\n            let word = &words[i];\n            let trimmed = word.trim_end();\n            let word_width = display_width(trimmed);\n            let trimmed_delta = word.len() - trimmed.len();\n            if first_word && 0 < word_width {\n                // Never try to wrap the first word\n                first_word = false;\n            } else if self.hard_width < self.line_width + word_width {\n                if 0 < i {\n                    let prev = i - 1;\n                    let trimmed = words[prev].trim_end();\n                    words[prev] = trimmed;\n                }\n\n                self.line_width = 0;\n                words.insert(i, \"\\n\");\n                i += 1;\n                if let Some(indentation) = self.indentation {\n                    words.insert(i, indentation);\n                    self.line_width += indentation.len();\n                    i += 1;\n                }\n            }\n            self.line_width += word_width + trimmed_delta;\n\n            i += 1;\n        }\n        words\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/output/usage.rs",
    "content": "#![cfg_attr(not(feature = \"usage\"), allow(unused_imports))]\n#![cfg_attr(not(feature = \"usage\"), allow(unused_variables))]\n#![cfg_attr(not(feature = \"usage\"), allow(clippy::manual_map))]\n#![cfg_attr(not(feature = \"usage\"), allow(dead_code))]\n\n// Internal\nuse crate::builder::ArgAction;\nuse crate::builder::StyledStr;\nuse crate::builder::Styles;\nuse crate::builder::{ArgPredicate, Command};\nuse crate::parser::ArgMatcher;\nuse crate::util::ChildGraph;\nuse crate::util::FlatSet;\nuse crate::util::Id;\n\nstatic DEFAULT_SUB_VALUE_NAME: &str = \"COMMAND\";\nconst USAGE_SEP: &str = \"\\n       \";\n\npub(crate) struct Usage<'cmd> {\n    cmd: &'cmd Command,\n    styles: &'cmd Styles,\n    required: Option<&'cmd ChildGraph<Id>>,\n}\n\nimpl<'cmd> Usage<'cmd> {\n    pub(crate) fn new(cmd: &'cmd Command) -> Self {\n        Usage {\n            cmd,\n            styles: cmd.get_styles(),\n            required: None,\n        }\n    }\n\n    pub(crate) fn required(mut self, required: &'cmd ChildGraph<Id>) -> Self {\n        self.required = Some(required);\n        self\n    }\n\n    // Creates a usage string for display. This happens just after all arguments were parsed, but before\n    // any subcommands have been parsed (so as to give subcommands their own usage recursively)\n    pub(crate) fn create_usage_with_title(&self, used: &[Id]) -> Option<StyledStr> {\n        debug!(\"Usage::create_usage_with_title\");\n        use std::fmt::Write as _;\n        let mut styled = StyledStr::new();\n        let _ = write!(\n            styled,\n            \"{}Usage:{} \",\n            self.styles.get_usage().render(),\n            self.styles.get_usage().render_reset()\n        );\n        if self.write_usage_no_title(&mut styled, used) {\n            styled.trim_end();\n        } else {\n            return None;\n        }\n        debug!(\"Usage::create_usage_with_title: usage={styled}\");\n        Some(styled)\n    }\n\n    // Creates a usage string (*without title*) if one was not provided by the user manually.\n    pub(crate) fn create_usage_no_title(&self, used: &[Id]) -> Option<StyledStr> {\n        debug!(\"Usage::create_usage_no_title\");\n\n        let mut styled = StyledStr::new();\n        if self.write_usage_no_title(&mut styled, used) {\n            styled.trim_end();\n            debug!(\"Usage::create_usage_no_title: usage={styled}\");\n            Some(styled)\n        } else {\n            None\n        }\n    }\n\n    // Creates a usage string (*without title*) if one was not provided by the user manually.\n    fn write_usage_no_title(&self, styled: &mut StyledStr, used: &[Id]) -> bool {\n        debug!(\"Usage::create_usage_no_title\");\n        if let Some(u) = self.cmd.get_override_usage() {\n            styled.push_styled(u);\n            true\n        } else {\n            #[cfg(feature = \"usage\")]\n            {\n                if used.is_empty() {\n                    self.write_help_usage(styled);\n                } else {\n                    self.write_smart_usage(styled, used);\n                }\n                true\n            }\n\n            #[cfg(not(feature = \"usage\"))]\n            {\n                false\n            }\n        }\n    }\n}\n\n#[cfg(feature = \"usage\")]\nimpl Usage<'_> {\n    // Creates a usage string for display in help messages (i.e. not for errors)\n    fn write_help_usage(&self, styled: &mut StyledStr) {\n        debug!(\"Usage::write_help_usage\");\n        use std::fmt::Write;\n\n        if self.cmd.has_visible_subcommands() && self.cmd.is_flatten_help_set() {\n            if !self.cmd.is_subcommand_required_set()\n                || self.cmd.is_args_conflicts_with_subcommands_set()\n            {\n                self.write_arg_usage(styled, &[], true);\n                styled.trim_end();\n                let _ = write!(styled, \"{USAGE_SEP}\");\n            }\n            let mut cmd = self.cmd.clone();\n            cmd.build();\n            for (i, sub) in cmd\n                .get_subcommands()\n                .filter(|c| !c.is_hide_set())\n                .enumerate()\n            {\n                if i != 0 {\n                    styled.trim_end();\n                    let _ = write!(styled, \"{USAGE_SEP}\");\n                }\n                Usage::new(sub).write_usage_no_title(styled, &[]);\n            }\n        } else {\n            self.write_arg_usage(styled, &[], true);\n            self.write_subcommand_usage(styled);\n        }\n    }\n\n    // Creates a context aware usage string, or \"smart usage\" from currently used\n    // args, and requirements\n    fn write_smart_usage(&self, styled: &mut StyledStr, used: &[Id]) {\n        debug!(\"Usage::create_smart_usage\");\n        use std::fmt::Write;\n        let placeholder = &self.styles.get_placeholder();\n\n        self.write_arg_usage(styled, used, true);\n\n        if self.cmd.is_subcommand_required_set() {\n            let value_name = self\n                .cmd\n                .get_subcommand_value_name()\n                .unwrap_or(DEFAULT_SUB_VALUE_NAME);\n            let _ = write!(styled, \"{placeholder}<{value_name}>{placeholder:#}\",);\n        }\n    }\n\n    fn write_arg_usage(&self, styled: &mut StyledStr, used: &[Id], incl_reqs: bool) {\n        debug!(\"Usage::write_arg_usage; incl_reqs={incl_reqs:?}\");\n        use std::fmt::Write as _;\n        let literal = &self.styles.get_literal();\n        let placeholder = &self.styles.get_placeholder();\n\n        let bin_name = self.cmd.get_usage_name_fallback();\n        if !bin_name.is_empty() {\n            // the trim won't properly remove a leading space due to the formatting\n            let _ = write!(styled, \"{literal}{bin_name}{literal:#} \",);\n        }\n\n        if used.is_empty() && self.needs_options_tag() {\n            let _ = write!(styled, \"{placeholder}[OPTIONS]{placeholder:#} \",);\n        }\n\n        self.write_args(styled, used, !incl_reqs);\n    }\n\n    fn write_subcommand_usage(&self, styled: &mut StyledStr) {\n        debug!(\"Usage::write_subcommand_usage\");\n        use std::fmt::Write as _;\n\n        // incl_reqs is only false when this function is called recursively\n        if self.cmd.has_visible_subcommands() || self.cmd.is_allow_external_subcommands_set() {\n            let literal = &self.styles.get_literal();\n            let placeholder = &self.styles.get_placeholder();\n            let value_name = self\n                .cmd\n                .get_subcommand_value_name()\n                .unwrap_or(DEFAULT_SUB_VALUE_NAME);\n            if self.cmd.is_subcommand_negates_reqs_set()\n                || self.cmd.is_args_conflicts_with_subcommands_set()\n            {\n                styled.trim_end();\n                let _ = write!(styled, \"{USAGE_SEP}\");\n                if self.cmd.is_args_conflicts_with_subcommands_set() {\n                    let bin_name = self.cmd.get_usage_name_fallback();\n                    // Short-circuit full usage creation since no args will be relevant\n                    let _ = write!(styled, \"{literal}{bin_name}{literal:#} \",);\n                } else {\n                    self.write_arg_usage(styled, &[], false);\n                }\n                let _ = write!(styled, \"{placeholder}<{value_name}>{placeholder:#}\",);\n            } else if self.cmd.is_subcommand_required_set() {\n                let _ = write!(styled, \"{placeholder}<{value_name}>{placeholder:#}\",);\n            } else {\n                let _ = write!(styled, \"{placeholder}[{value_name}]{placeholder:#}\",);\n            }\n        }\n    }\n\n    // Determines if we need the `[OPTIONS]` tag in the usage string\n    fn needs_options_tag(&self) -> bool {\n        debug!(\"Usage::needs_options_tag\");\n        'outer: for f in self.cmd.get_non_positionals() {\n            debug!(\"Usage::needs_options_tag:iter: f={}\", f.get_id());\n\n            // Don't print `[OPTIONS]` just for help or version\n            if f.get_long() == Some(\"help\") || f.get_long() == Some(\"version\") {\n                debug!(\"Usage::needs_options_tag:iter Option is built-in\");\n                continue;\n            }\n            match f.get_action() {\n                ArgAction::Set\n                | ArgAction::Append\n                | ArgAction::SetTrue\n                | ArgAction::SetFalse\n                | ArgAction::Count => {}\n                ArgAction::Help\n                | ArgAction::HelpShort\n                | ArgAction::HelpLong\n                | ArgAction::Version => {\n                    debug!(\"Usage::needs_options_tag:iter Option is built-in\");\n                    continue;\n                }\n            }\n\n            if f.is_hide_set() {\n                debug!(\"Usage::needs_options_tag:iter Option is hidden\");\n                continue;\n            }\n            if f.is_required_set() {\n                debug!(\"Usage::needs_options_tag:iter Option is required\");\n                continue;\n            }\n            for grp_s in self.cmd.groups_for_arg(f.get_id()) {\n                debug!(\"Usage::needs_options_tag:iter:iter: grp_s={grp_s:?}\");\n                if self.cmd.get_groups().any(|g| g.id == grp_s && g.required) {\n                    debug!(\"Usage::needs_options_tag:iter:iter: Group is required\");\n                    continue 'outer;\n                }\n            }\n\n            debug!(\"Usage::needs_options_tag:iter: [OPTIONS] required\");\n            return true;\n        }\n\n        debug!(\"Usage::needs_options_tag: [OPTIONS] not required\");\n        false\n    }\n\n    // Returns the required args in usage string form by fully unrolling all groups\n    pub(crate) fn write_args(&self, styled: &mut StyledStr, incls: &[Id], force_optional: bool) {\n        debug!(\"Usage::write_args: incls={incls:?}\",);\n        use std::fmt::Write as _;\n        let literal = &self.styles.get_literal();\n\n        let required_owned;\n        let required = if let Some(required) = self.required {\n            required\n        } else {\n            required_owned = self.cmd.required_graph();\n            &required_owned\n        };\n\n        let mut unrolled_reqs = Vec::new();\n        for a in required.iter() {\n            let is_relevant = |(val, req_arg): &(ArgPredicate, Id)| -> Option<Id> {\n                let required = match val {\n                    ArgPredicate::Equals(_) => false,\n                    ArgPredicate::IsPresent => true,\n                };\n                required.then(|| req_arg.clone())\n            };\n\n            for aa in self.cmd.unroll_arg_requires(is_relevant, a) {\n                // if we don't check for duplicates here this causes duplicate error messages\n                // see https://github.com/clap-rs/clap/issues/2770\n                unrolled_reqs.push(aa);\n            }\n            // always include the required arg itself. it will not be enumerated\n            // by unroll_requirements_for_arg.\n            unrolled_reqs.push(a.clone());\n        }\n        debug!(\"Usage::get_args: unrolled_reqs={unrolled_reqs:?}\");\n\n        let mut required_groups_members = FlatSet::new();\n        let mut required_groups = FlatSet::new();\n        for req in unrolled_reqs.iter().chain(incls.iter()) {\n            if self.cmd.find_group(req).is_some() {\n                let group_members = self.cmd.unroll_args_in_group(req);\n                let elem = self.cmd.format_group(req);\n                required_groups.insert(elem);\n                required_groups_members.extend(group_members);\n            } else {\n                debug_assert!(self.cmd.find(req).is_some());\n            }\n        }\n\n        let mut required_opts = FlatSet::new();\n        let mut required_positionals = Vec::new();\n        for req in unrolled_reqs.iter().chain(incls.iter()) {\n            if let Some(arg) = self.cmd.find(req) {\n                if required_groups_members.contains(arg.get_id()) {\n                    continue;\n                }\n\n                let stylized = arg.stylized(self.styles, Some(!force_optional));\n                if let Some(index) = arg.get_index() {\n                    let new_len = index + 1;\n                    if required_positionals.len() < new_len {\n                        required_positionals.resize(new_len, None);\n                    }\n                    required_positionals[index] = Some(stylized);\n                } else {\n                    required_opts.insert(stylized);\n                }\n            } else {\n                debug_assert!(self.cmd.find_group(req).is_some());\n            }\n        }\n\n        for pos in self.cmd.get_positionals() {\n            if pos.is_hide_set() {\n                continue;\n            }\n            if required_groups_members.contains(pos.get_id()) {\n                continue;\n            }\n\n            let index = pos.get_index().unwrap();\n            let new_len = index + 1;\n            if required_positionals.len() < new_len {\n                required_positionals.resize(new_len, None);\n            }\n            if required_positionals[index].is_some() {\n                if pos.is_last_set() {\n                    let styled = required_positionals[index].take().unwrap();\n                    let mut new = StyledStr::new();\n                    let _ = write!(new, \"{literal}--{literal:#} \");\n                    new.push_styled(&styled);\n                    required_positionals[index] = Some(new);\n                }\n            } else {\n                let mut styled;\n                if pos.is_last_set() {\n                    styled = StyledStr::new();\n                    let _ = write!(styled, \"{literal}[--{literal:#} \");\n                    styled.push_styled(&pos.stylized(self.styles, Some(true)));\n                    let _ = write!(styled, \"{literal}]{literal:#}\");\n                } else {\n                    styled = pos.stylized(self.styles, Some(false));\n                }\n                required_positionals[index] = Some(styled);\n            }\n            if pos.is_last_set() && force_optional {\n                required_positionals[index] = None;\n            }\n        }\n\n        if !force_optional {\n            for arg in required_opts {\n                styled.push_styled(&arg);\n                styled.push_str(\" \");\n            }\n            for arg in required_groups {\n                styled.push_styled(&arg);\n                styled.push_str(\" \");\n            }\n        }\n        for arg in required_positionals.into_iter().flatten() {\n            styled.push_styled(&arg);\n            styled.push_str(\" \");\n        }\n    }\n\n    pub(crate) fn get_required_usage_from(\n        &self,\n        incls: &[Id],\n        matcher: Option<&ArgMatcher>,\n        incl_last: bool,\n    ) -> Vec<StyledStr> {\n        debug!(\n            \"Usage::get_required_usage_from: incls={:?}, matcher={:?}, incl_last={:?}\",\n            incls,\n            matcher.is_some(),\n            incl_last\n        );\n\n        let required_owned;\n        let required = if let Some(required) = self.required {\n            required\n        } else {\n            required_owned = self.cmd.required_graph();\n            &required_owned\n        };\n\n        let mut unrolled_reqs = Vec::new();\n        for a in required.iter() {\n            let is_relevant = |(val, req_arg): &(ArgPredicate, Id)| -> Option<Id> {\n                let required = match val {\n                    ArgPredicate::Equals(_) => {\n                        if let Some(matcher) = matcher {\n                            matcher.check_explicit(a, val)\n                        } else {\n                            false\n                        }\n                    }\n                    ArgPredicate::IsPresent => true,\n                };\n                required.then(|| req_arg.clone())\n            };\n\n            for aa in self.cmd.unroll_arg_requires(is_relevant, a) {\n                // if we don't check for duplicates here this causes duplicate error messages\n                // see https://github.com/clap-rs/clap/issues/2770\n                unrolled_reqs.push(aa);\n            }\n            // always include the required arg itself. it will not be enumerated\n            // by unroll_requirements_for_arg.\n            unrolled_reqs.push(a.clone());\n        }\n        debug!(\"Usage::get_required_usage_from: unrolled_reqs={unrolled_reqs:?}\");\n\n        let mut required_groups_members = FlatSet::new();\n        let mut required_groups = FlatSet::new();\n        for req in unrolled_reqs.iter().chain(incls.iter()) {\n            if self.cmd.find_group(req).is_some() {\n                let group_members = self.cmd.unroll_args_in_group(req);\n                let is_present = matcher\n                    .map(|m| {\n                        group_members\n                            .iter()\n                            .any(|arg| m.check_explicit(arg, &ArgPredicate::IsPresent))\n                    })\n                    .unwrap_or(false);\n                debug!(\"Usage::get_required_usage_from:iter:{req:?} group is_present={is_present}\");\n                if is_present {\n                    continue;\n                }\n\n                let elem = self.cmd.format_group(req);\n                required_groups.insert(elem);\n                required_groups_members.extend(group_members);\n            } else {\n                debug_assert!(self.cmd.find(req).is_some(), \"`{req}` must exist\");\n            }\n        }\n\n        let mut required_opts = FlatSet::new();\n        let mut required_positionals = Vec::new();\n        for req in unrolled_reqs.iter().chain(incls.iter()) {\n            if let Some(arg) = self.cmd.find(req) {\n                if required_groups_members.contains(arg.get_id()) {\n                    continue;\n                }\n\n                let is_present = matcher\n                    .map(|m| m.check_explicit(req, &ArgPredicate::IsPresent))\n                    .unwrap_or(false);\n                debug!(\"Usage::get_required_usage_from:iter:{req:?} arg is_present={is_present}\");\n                if is_present {\n                    continue;\n                }\n\n                let stylized = arg.stylized(self.styles, Some(true));\n                if let Some(index) = arg.get_index() {\n                    if !arg.is_last_set() || incl_last {\n                        let new_len = index + 1;\n                        if required_positionals.len() < new_len {\n                            required_positionals.resize(new_len, None);\n                        }\n                        required_positionals[index] = Some(stylized);\n                    }\n                } else {\n                    required_opts.insert(stylized);\n                }\n            } else {\n                debug_assert!(self.cmd.find_group(req).is_some());\n            }\n        }\n\n        let mut ret_val = Vec::new();\n        ret_val.extend(required_opts);\n        ret_val.extend(required_groups);\n        for pos in required_positionals.into_iter().flatten() {\n            ret_val.push(pos);\n        }\n\n        debug!(\"Usage::get_required_usage_from: ret_val={ret_val:?}\");\n        ret_val\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/parser/arg_matcher.rs",
    "content": "// Std\nuse std::ffi::OsString;\nuse std::mem;\nuse std::ops::Deref;\n\n// Internal\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::builder::{Arg, ArgPredicate, Command};\nuse crate::parser::Identifier;\nuse crate::parser::PendingArg;\nuse crate::parser::{ArgMatches, MatchedArg, SubCommand, ValueSource};\nuse crate::util::AnyValue;\nuse crate::util::FlatMap;\nuse crate::util::Id;\n\n#[derive(Debug, Default)]\npub(crate) struct ArgMatcher {\n    matches: ArgMatches,\n    pending: Option<PendingArg>,\n}\n\nimpl ArgMatcher {\n    pub(crate) fn new(_cmd: &Command) -> Self {\n        ArgMatcher {\n            matches: ArgMatches {\n                #[cfg(debug_assertions)]\n                valid_args: {\n                    let args = _cmd.get_arguments().map(|a| a.get_id().clone());\n                    let groups = _cmd.get_groups().map(|g| g.get_id().clone());\n                    args.chain(groups).collect()\n                },\n                #[cfg(debug_assertions)]\n                valid_subcommands: _cmd\n                    .get_subcommands()\n                    .map(|sc| sc.get_name_str().clone())\n                    .collect(),\n                ..Default::default()\n            },\n            pending: None,\n        }\n    }\n\n    pub(crate) fn into_inner(self) -> ArgMatches {\n        self.matches\n    }\n\n    pub(crate) fn propagate_globals(&mut self, global_arg_vec: &[Id]) {\n        debug!(\"ArgMatcher::get_global_values: global_arg_vec={global_arg_vec:?}\");\n        let mut vals_map = FlatMap::new();\n        self.fill_in_global_values(global_arg_vec, &mut vals_map);\n    }\n\n    fn fill_in_global_values(\n        &mut self,\n        global_arg_vec: &[Id],\n        vals_map: &mut FlatMap<Id, MatchedArg>,\n    ) {\n        for global_arg in global_arg_vec {\n            if let Some(ma) = self.get(global_arg) {\n                // We have to check if the parent's global arg wasn't used but still exists\n                // such as from a default value.\n                //\n                // For example, `myprog subcommand --global-arg=value` where `--global-arg` defines\n                // a default value of `other` myprog would have an existing MatchedArg for\n                // `--global-arg` where the value is `other`\n                let to_update = if let Some(parent_ma) = vals_map.get(global_arg) {\n                    if parent_ma.source() > ma.source() {\n                        parent_ma\n                    } else {\n                        ma\n                    }\n                } else {\n                    ma\n                }\n                .clone();\n                vals_map.insert(global_arg.clone(), to_update);\n            }\n        }\n        if let Some(ref mut sc) = self.matches.subcommand {\n            let mut am = ArgMatcher {\n                matches: mem::take(&mut sc.matches),\n                pending: None,\n            };\n            am.fill_in_global_values(global_arg_vec, vals_map);\n            mem::swap(&mut am.matches, &mut sc.matches);\n        }\n\n        for (name, matched_arg) in vals_map.iter_mut() {\n            self.matches.args.insert(name.clone(), matched_arg.clone());\n        }\n    }\n\n    pub(crate) fn get(&self, arg: &Id) -> Option<&MatchedArg> {\n        self.matches.args.get(arg)\n    }\n\n    pub(crate) fn get_mut(&mut self, arg: &Id) -> Option<&mut MatchedArg> {\n        self.matches.args.get_mut(arg)\n    }\n\n    pub(crate) fn remove(&mut self, arg: &Id) -> bool {\n        self.matches.args.remove(arg).is_some()\n    }\n\n    pub(crate) fn contains(&self, arg: &Id) -> bool {\n        self.matches.args.contains_key(arg)\n    }\n\n    pub(crate) fn arg_ids(&self) -> std::slice::Iter<'_, Id> {\n        self.matches.args.keys()\n    }\n\n    pub(crate) fn args(&self) -> crate::util::flat_map::Iter<'_, Id, MatchedArg> {\n        self.matches.args.iter()\n    }\n\n    pub(crate) fn entry(&mut self, arg: Id) -> crate::util::Entry<'_, Id, MatchedArg> {\n        self.matches.args.entry(arg)\n    }\n\n    pub(crate) fn subcommand(&mut self, sc: SubCommand) {\n        self.matches.subcommand = Some(Box::new(sc));\n    }\n\n    pub(crate) fn subcommand_name(&self) -> Option<&str> {\n        self.matches.subcommand_name()\n    }\n\n    pub(crate) fn check_explicit(&self, arg: &Id, predicate: &ArgPredicate) -> bool {\n        self.get(arg)\n            .map(|a| a.check_explicit(predicate))\n            .unwrap_or_default()\n    }\n\n    pub(crate) fn start_custom_arg(&mut self, arg: &Arg, source: ValueSource) {\n        let id = arg.get_id().clone();\n        debug!(\"ArgMatcher::start_custom_arg: id={id:?}, source={source:?}\");\n        let ma = self.entry(id).or_insert(MatchedArg::new_arg(arg));\n        debug_assert_eq!(ma.type_id(), Some(arg.get_value_parser().type_id()));\n        ma.set_source(source);\n        ma.new_val_group();\n    }\n\n    pub(crate) fn start_custom_group(&mut self, id: Id, source: ValueSource) {\n        debug!(\"ArgMatcher::start_custom_arg: id={id:?}, source={source:?}\");\n        let ma = self.entry(id).or_insert(MatchedArg::new_group());\n        debug_assert_eq!(ma.type_id(), None);\n        ma.set_source(source);\n        ma.new_val_group();\n    }\n\n    pub(crate) fn start_occurrence_of_external(&mut self, cmd: &Command) {\n        let id = Id::from_static_ref(Id::EXTERNAL);\n        debug!(\"ArgMatcher::start_occurrence_of_external: id={id:?}\");\n        let ma = self.entry(id).or_insert(MatchedArg::new_external(cmd));\n        debug_assert_eq!(\n            ma.type_id(),\n            Some(\n                cmd.get_external_subcommand_value_parser()\n                    .expect(INTERNAL_ERROR_MSG)\n                    .type_id()\n            )\n        );\n        ma.set_source(ValueSource::CommandLine);\n        ma.new_val_group();\n    }\n\n    pub(crate) fn add_val_to(&mut self, arg: &Id, val: AnyValue, raw_val: OsString) {\n        let ma = self.get_mut(arg).expect(INTERNAL_ERROR_MSG);\n        ma.append_val(val, raw_val);\n    }\n\n    pub(crate) fn add_index_to(&mut self, arg: &Id, idx: usize) {\n        let ma = self.get_mut(arg).expect(INTERNAL_ERROR_MSG);\n        ma.push_index(idx);\n    }\n\n    pub(crate) fn needs_more_vals(&self, o: &Arg) -> bool {\n        let num_pending = self\n            .pending\n            .as_ref()\n            .and_then(|p| (p.id == *o.get_id()).then_some(p.raw_vals.len()))\n            .unwrap_or(0);\n        debug!(\n            \"ArgMatcher::needs_more_vals: o={}, pending={}\",\n            o.get_id(),\n            num_pending\n        );\n        let expected = o.get_num_args().expect(INTERNAL_ERROR_MSG);\n        debug!(\"ArgMatcher::needs_more_vals: expected={expected}, actual={num_pending}\");\n        expected.accepts_more(num_pending)\n    }\n\n    pub(crate) fn pending_arg_id(&self) -> Option<&Id> {\n        self.pending.as_ref().map(|p| &p.id)\n    }\n\n    pub(crate) fn pending_values_mut(\n        &mut self,\n        id: &Id,\n        ident: Option<Identifier>,\n        trailing_values: bool,\n    ) -> &mut Vec<OsString> {\n        let pending = self.pending.get_or_insert_with(|| PendingArg {\n            id: id.clone(),\n            ident,\n            raw_vals: Default::default(),\n            trailing_idx: None,\n        });\n        debug_assert_eq!(pending.id, *id, \"{INTERNAL_ERROR_MSG}\");\n        if ident.is_some() {\n            debug_assert_eq!(pending.ident, ident, \"{INTERNAL_ERROR_MSG}\");\n        }\n        if trailing_values {\n            pending.trailing_idx.get_or_insert(pending.raw_vals.len());\n        }\n        &mut pending.raw_vals\n    }\n\n    pub(crate) fn start_trailing(&mut self) {\n        if let Some(pending) = &mut self.pending {\n            // Allow asserting its started on subsequent calls\n            pending.trailing_idx.get_or_insert(pending.raw_vals.len());\n        }\n    }\n\n    pub(crate) fn take_pending(&mut self) -> Option<PendingArg> {\n        self.pending.take()\n    }\n}\n\nimpl Deref for ArgMatcher {\n    type Target = ArgMatches;\n\n    fn deref(&self) -> &Self::Target {\n        &self.matches\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/parser/error.rs",
    "content": "use crate::util::AnyValueId;\n\n/// Violation of [`ArgMatches`][crate::ArgMatches] assumptions\n#[derive(Clone, Debug)]\n#[allow(missing_copy_implementations)] // We might add non-Copy types in the future\n#[non_exhaustive]\npub enum MatchesError {\n    /// Failed to downcast `AnyValue` to the specified type\n    #[non_exhaustive]\n    Downcast {\n        /// Type for value stored in [`ArgMatches`][crate::ArgMatches]\n        actual: AnyValueId,\n        /// The target type to downcast to\n        expected: AnyValueId,\n    },\n    /// Argument not defined in [`Command`][crate::Command]\n    #[non_exhaustive]\n    UnknownArgument {\n        // Missing `id` but blocked on a public id type which will hopefully come with `unstable-v4`\n    },\n}\n\nimpl MatchesError {\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub(crate) fn unwrap<T>(id: &str, r: Result<T, MatchesError>) -> T {\n        let err = match r {\n            Ok(t) => {\n                return t;\n            }\n            Err(err) => err,\n        };\n        panic!(\"Mismatch between definition and access of `{id}`. {err}\",)\n    }\n}\n\nimpl std::error::Error for MatchesError {}\n\nimpl std::fmt::Display for MatchesError {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        match self {\n            Self::Downcast { actual, expected } => {\n                writeln!(\n                    f,\n                    \"Could not downcast to {expected:?}, need to downcast to {actual:?}\"\n                )\n            }\n            Self::UnknownArgument {} => {\n                writeln!(\n                    f,\n                    \"Unknown argument or group id.  Make sure you are using the argument id and not the short or long flags\"\n                )\n            }\n        }\n    }\n}\n\n#[test]\nfn check_auto_traits() {\n    static_assertions::assert_impl_all!(\n        MatchesError: Send,\n        Sync,\n        std::panic::RefUnwindSafe,\n        std::panic::UnwindSafe,\n        Unpin\n    );\n}\n"
  },
  {
    "path": "clap_builder/src/parser/features/mod.rs",
    "content": "pub(crate) mod suggestions;\n"
  },
  {
    "path": "clap_builder/src/parser/features/suggestions.rs",
    "content": "// Internal\nuse crate::builder::Command;\n\n/// Find strings from an iterable of `possible_values` similar to a given value `v`\n/// Returns a Vec of all possible values that exceed a similarity threshold\n/// sorted by ascending similarity, most similar comes last\n#[cfg(feature = \"suggestions\")]\npub(crate) fn did_you_mean<T, I>(v: &str, possible_values: I) -> Vec<String>\nwhere\n    T: AsRef<str>,\n    I: IntoIterator<Item = T>,\n{\n    use std::cmp::Ordering;\n\n    let mut candidates: Vec<(f64, String)> = Vec::new();\n    for pv in possible_values {\n        // GH #4660: using `jaro` because `jaro_winkler` implementation in `strsim-rs` is wrong\n        // causing strings with common prefix >=10 to be considered perfectly similar\n        let confidence = strsim::jaro(v, pv.as_ref());\n\n        if confidence > 0.7 {\n            let new_elem = (confidence, pv.as_ref().to_owned());\n            let pos = candidates\n                .binary_search_by(|probe| {\n                    if probe.0 > confidence {\n                        Ordering::Greater\n                    } else {\n                        Ordering::Less\n                    }\n                })\n                .unwrap_or_else(|e| e);\n            candidates.insert(pos, new_elem);\n        }\n    }\n\n    candidates.into_iter().map(|(_, pv)| pv).collect()\n}\n\n#[cfg(not(feature = \"suggestions\"))]\npub(crate) fn did_you_mean<T, I>(_: &str, _: I) -> Vec<String>\nwhere\n    T: AsRef<str>,\n    I: IntoIterator<Item = T>,\n{\n    Vec::new()\n}\n\n/// Returns a suffix that can be empty, or is the standard 'did you mean' phrase\npub(crate) fn did_you_mean_flag<'a, 'help, I, T>(\n    arg: &str,\n    remaining_args: &[&std::ffi::OsStr],\n    longs: I,\n    subcommands: impl IntoIterator<Item = &'a mut Command>,\n) -> Option<(String, Option<String>)>\nwhere\n    'help: 'a,\n    T: AsRef<str>,\n    I: IntoIterator<Item = T>,\n{\n    use crate::mkeymap::KeyType;\n\n    match did_you_mean(arg, longs).pop() {\n        Some(candidate) => Some((candidate, None)),\n        None => subcommands\n            .into_iter()\n            .filter_map(|subcommand| {\n                subcommand._build_self(false);\n\n                let longs = subcommand.get_keymap().keys().filter_map(|a| {\n                    if let KeyType::Long(v) = a {\n                        Some(v.to_string_lossy().into_owned())\n                    } else {\n                        None\n                    }\n                });\n\n                let subcommand_name = subcommand.get_name();\n\n                let candidate = some!(did_you_mean(arg, longs).pop());\n                let score = some!(remaining_args.iter().position(|x| subcommand_name == *x));\n                Some((score, (candidate, Some(subcommand_name.to_string()))))\n            })\n            .min_by_key(|(x, _)| *x)\n            .map(|(_, suggestion)| suggestion),\n    }\n}\n\n#[cfg(all(test, feature = \"suggestions\"))]\nmod test {\n    use super::*;\n\n    #[test]\n    fn missing_letter() {\n        let p_vals = [\"test\", \"possible\", \"values\"];\n        assert_eq!(did_you_mean(\"tst\", p_vals.iter()), vec![\"test\"]);\n    }\n\n    #[test]\n    fn ambiguous() {\n        let p_vals = [\"test\", \"temp\", \"possible\", \"values\"];\n        assert_eq!(did_you_mean(\"te\", p_vals.iter()), vec![\"test\", \"temp\"]);\n    }\n\n    #[test]\n    fn unrelated() {\n        let p_vals = [\"test\", \"possible\", \"values\"];\n        assert_eq!(\n            did_you_mean(\"hahaahahah\", p_vals.iter()),\n            Vec::<String>::new()\n        );\n    }\n\n    #[test]\n    fn best_fit() {\n        let p_vals = [\n            \"test\",\n            \"possible\",\n            \"values\",\n            \"alignmentStart\",\n            \"alignmentScore\",\n        ];\n        assert_eq!(\n            did_you_mean(\"alignmentScorr\", p_vals.iter()),\n            vec![\"alignmentStart\", \"alignmentScore\"]\n        );\n    }\n\n    #[test]\n    fn best_fit_long_common_prefix_issue_4660() {\n        let p_vals = [\"alignmentScore\", \"alignmentStart\"];\n        assert_eq!(\n            did_you_mean(\"alignmentScorr\", p_vals.iter()),\n            vec![\"alignmentStart\", \"alignmentScore\"]\n        );\n    }\n\n    #[test]\n    fn flag_missing_letter() {\n        let p_vals = [\"test\", \"possible\", \"values\"];\n        assert_eq!(\n            did_you_mean_flag(\"tst\", &[], p_vals.iter(), []),\n            Some((\"test\".to_owned(), None))\n        );\n    }\n\n    #[test]\n    fn flag_ambiguous() {\n        let p_vals = [\"test\", \"temp\", \"possible\", \"values\"];\n        assert_eq!(\n            did_you_mean_flag(\"te\", &[], p_vals.iter(), []),\n            Some((\"temp\".to_owned(), None))\n        );\n    }\n\n    #[test]\n    fn flag_unrelated() {\n        let p_vals = [\"test\", \"possible\", \"values\"];\n        assert_eq!(\n            did_you_mean_flag(\"hahaahahah\", &[], p_vals.iter(), []),\n            None\n        );\n    }\n\n    #[test]\n    fn flag_best_fit() {\n        let p_vals = [\n            \"test\",\n            \"possible\",\n            \"values\",\n            \"alignmentStart\",\n            \"alignmentScore\",\n        ];\n        assert_eq!(\n            did_you_mean_flag(\"alignmentScorr\", &[], p_vals.iter(), []),\n            Some((\"alignmentScore\".to_owned(), None))\n        );\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/parser/matches/arg_matches.rs",
    "content": "// Std\nuse std::any::Any;\nuse std::ffi::{OsStr, OsString};\nuse std::fmt::Debug;\nuse std::iter::{Cloned, Flatten, Map};\nuse std::slice::Iter;\n\n// Internal\nuse crate::INTERNAL_ERROR_MSG;\n#[cfg(debug_assertions)]\nuse crate::builder::Str;\nuse crate::parser::MatchedArg;\nuse crate::parser::MatchesError;\nuse crate::parser::ValueSource;\nuse crate::util::AnyValue;\nuse crate::util::AnyValueId;\nuse crate::util::FlatMap;\nuse crate::util::Id;\n\n/// Container for parse results.\n///\n/// Used to get information about the arguments that were supplied to the program at runtime by\n/// the user. New instances of this struct are obtained by using the [`Command::get_matches`] family of\n/// methods.\n///\n/// # Examples\n///\n/// ```no_run\n/// # use clap_builder as clap;\n/// # use clap::{Command, Arg, ArgAction};\n/// # use clap::parser::ValueSource;\n/// let matches = Command::new(\"MyApp\")\n///     .arg(Arg::new(\"out\")\n///         .long(\"output\")\n///         .required(true)\n///         .action(ArgAction::Set)\n///         .default_value(\"-\"))\n///     .arg(Arg::new(\"cfg\")\n///         .short('c')\n///         .action(ArgAction::Set))\n///     .get_matches(); // builds the instance of ArgMatches\n///\n/// // to get information about the \"cfg\" argument we created, such as the value supplied we use\n/// // various ArgMatches methods, such as [ArgMatches::get_one]\n/// if let Some(c) = matches.get_one::<String>(\"cfg\") {\n///     println!(\"Value for -c: {c}\");\n/// }\n///\n/// // The ArgMatches::get_one method returns an Option because the user may not have supplied\n/// // that argument at runtime. But if we specified that the argument was \"required\" as we did\n/// // with the \"out\" argument, we can safely unwrap because `clap` verifies that was actually\n/// // used at runtime.\n/// println!(\"Value for --output: {}\", matches.get_one::<String>(\"out\").unwrap());\n///\n/// // You can check the presence of an argument's values\n/// if matches.contains_id(\"out\") {\n///     // However, if you want to know where the value came from\n///     if matches.value_source(\"out\").expect(\"checked contains_id\") == ValueSource::CommandLine {\n///         println!(\"`out` set by user\");\n///     } else {\n///         println!(\"`out` is defaulted\");\n///     }\n/// }\n/// ```\n/// [`Command::get_matches`]: crate::Command::get_matches()\n#[derive(Debug, Clone, Default, PartialEq, Eq)]\npub struct ArgMatches {\n    #[cfg(debug_assertions)]\n    pub(crate) valid_args: Vec<Id>,\n    #[cfg(debug_assertions)]\n    pub(crate) valid_subcommands: Vec<Str>,\n    pub(crate) args: FlatMap<Id, MatchedArg>,\n    pub(crate) subcommand: Option<Box<SubCommand>>,\n}\n\n/// # Arguments\nimpl ArgMatches {\n    /// Gets the value of a specific option or positional argument.\n    ///\n    /// i.e. an argument that [takes an additional value][crate::Arg::num_args] at runtime.\n    ///\n    /// Returns an error if the wrong type was used.\n    ///\n    /// Returns `None` if the option wasn't present.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// *NOTE:* This will always return `Some(value)` if [`default_value`] has been set.\n    /// [`ArgMatches::value_source`] can be used to check if a value is present at runtime.\n    ///\n    /// </div>\n    ///\n    /// # Panic\n    ///\n    /// If the argument definition and access mismatch.  To handle this case programmatically, see\n    /// [`ArgMatches::try_get_one`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, value_parser, ArgAction};\n    /// let m = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"port\")\n    ///         .value_parser(value_parser!(usize))\n    ///         .action(ArgAction::Set)\n    ///         .required(true))\n    ///     .get_matches_from(vec![\"myapp\", \"2020\"]);\n    ///\n    /// let port: usize = *m\n    ///     .get_one(\"port\")\n    ///     .expect(\"`port`is required\");\n    /// assert_eq!(port, 2020);\n    /// ```\n    /// [positional]: crate::Arg::index()\n    /// [`default_value`]: crate::Arg::default_value()\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn get_one<T: Any + Clone + Send + Sync + 'static>(&self, id: &str) -> Option<&T> {\n        MatchesError::unwrap(id, self.try_get_one(id))\n    }\n\n    /// Gets the value of a specific [`ArgAction::Count`][crate::ArgAction::Count] flag\n    ///\n    /// # Panic\n    ///\n    /// If the argument's action is not [`ArgAction::Count`][crate::ArgAction::Count]\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::Count)\n    ///     );\n    ///\n    /// let matches = cmd.clone().try_get_matches_from([\"mycmd\", \"--flag\", \"--flag\"]).unwrap();\n    /// assert_eq!(\n    ///     matches.get_count(\"flag\"),\n    ///     2\n    /// );\n    /// ```\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn get_count(&self, id: &str) -> u8 {\n        *self.get_one::<u8>(id).unwrap_or_else(|| {\n            panic!(\"arg `{id}`'s `ArgAction` should be `Count` which should provide a default\")\n        })\n    }\n\n    /// Gets the value of a specific [`ArgAction::SetTrue`][crate::ArgAction::SetTrue] or [`ArgAction::SetFalse`][crate::ArgAction::SetFalse] flag\n    ///\n    /// # Panic\n    ///\n    /// If the argument's action is not [`ArgAction::SetTrue`][crate::ArgAction::SetTrue] or [`ArgAction::SetFalse`][crate::ArgAction::SetFalse]\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::Command;\n    /// # use clap::Arg;\n    /// let cmd = Command::new(\"mycmd\")\n    ///     .arg(\n    ///         Arg::new(\"flag\")\n    ///             .long(\"flag\")\n    ///             .action(clap::ArgAction::SetTrue)\n    ///     );\n    ///\n    /// let matches = cmd.clone().try_get_matches_from([\"mycmd\", \"--flag\"]).unwrap();\n    /// assert!(matches.contains_id(\"flag\"));\n    /// assert_eq!(\n    ///     matches.get_flag(\"flag\"),\n    ///     true\n    /// );\n    /// ```\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn get_flag(&self, id: &str) -> bool {\n        *self\n            .get_one::<bool>(id)\n            .unwrap_or_else(|| {\n                panic!(\n                    \"arg `{id}`'s `ArgAction` should be one of `SetTrue`, `SetFalse` which should provide a default\"\n                )\n            })\n    }\n\n    /// Iterate over values of a specific option or positional argument.\n    ///\n    /// i.e. an argument that takes multiple values at runtime.\n    ///\n    /// Returns an error if the wrong type was used.\n    ///\n    /// Returns `None` if the option wasn't present.\n    ///\n    /// # Panic\n    ///\n    /// If the argument definition and access mismatch.  To handle this case programmatically, see\n    /// [`ArgMatches::try_get_many`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, value_parser, ArgAction};\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"ports\")\n    ///         .action(ArgAction::Append)\n    ///         .value_parser(value_parser!(usize))\n    ///         .short('p')\n    ///         .required(true))\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"-p\", \"22\", \"-p\", \"80\", \"-p\", \"2020\"\n    ///     ]);\n    /// let vals: Vec<usize> = m.get_many(\"ports\")\n    ///     .expect(\"`port`is required\")\n    ///     .copied()\n    ///     .collect();\n    /// assert_eq!(vals, [22, 80, 2020]);\n    /// ```\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn get_many<T: Any + Clone + Send + Sync + 'static>(\n        &self,\n        id: &str,\n    ) -> Option<ValuesRef<'_, T>> {\n        MatchesError::unwrap(id, self.try_get_many(id))\n    }\n\n    /// Iterate over the values passed to each occurrence of an option.\n    ///\n    /// Each item is itself an iterator containing the arguments passed to a single occurrence\n    /// of the option.\n    ///\n    /// If the option doesn't support multiple occurrences, or there was only a single occurrence,\n    /// the iterator will only contain a single item.\n    ///\n    /// Returns `None` if the option wasn't present.\n    ///\n    /// # Panics\n    ///\n    /// If the argument definition and access mismatch (debug builds). To handle this case programmatically, see\n    /// [`ArgMatches::try_get_occurrences`].\n    ///\n    /// # Examples\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command,Arg, ArgAction, value_parser};\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"x\")\n    ///         .short('x')\n    ///         .num_args(2)\n    ///         .action(ArgAction::Append)\n    ///         .value_parser(value_parser!(String)))\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"-x\", \"a\", \"b\", \"-x\", \"c\", \"d\"]);\n    /// let vals: Vec<Vec<&String>> = m.get_occurrences(\"x\").unwrap().map(Iterator::collect).collect();\n    /// assert_eq!(vals, [[\"a\", \"b\"], [\"c\", \"d\"]]);\n    /// ```\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn get_occurrences<T: Any + Clone + Send + Sync + 'static>(\n        &self,\n        id: &str,\n    ) -> Option<OccurrencesRef<'_, T>> {\n        MatchesError::unwrap(id, self.try_get_occurrences(id))\n    }\n\n    /// Iterate over the original argument values.\n    ///\n    /// An `OsStr` on Unix-like systems is any series of bytes, regardless of whether or not they\n    /// contain valid UTF-8. Since [`String`]s in Rust are guaranteed to be valid UTF-8, a valid\n    /// filename on a Unix system as an argument value may contain invalid UTF-8.\n    ///\n    /// Returns `None` if the option wasn't present.\n    ///\n    /// # Panic\n    ///\n    /// If the argument definition and access mismatch.  To handle this case programmatically, see\n    /// [`ArgMatches::try_get_raw`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(unix)] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg, value_parser};\n    /// # use std::ffi::{OsStr,OsString};\n    /// # use std::os::unix::ffi::{OsStrExt,OsStringExt};\n    /// use std::path::PathBuf;\n    ///\n    /// let m = Command::new(\"utf8\")\n    ///     .arg(arg!(<arg> ... \"some arg\").value_parser(value_parser!(PathBuf)))\n    ///     .get_matches_from(vec![OsString::from(\"myprog\"),\n    ///                                 // \"Hi\"\n    ///                                 OsString::from_vec(vec![b'H', b'i']),\n    ///                                 // \"{0xe9}!\"\n    ///                                 OsString::from_vec(vec![0xe9, b'!'])]);\n    ///\n    /// let mut itr = m.get_raw(\"arg\")\n    ///     .expect(\"`port`is required\")\n    ///     .into_iter();\n    /// assert_eq!(itr.next(), Some(OsStr::new(\"Hi\")));\n    /// assert_eq!(itr.next(), Some(OsStr::from_bytes(&[0xe9, b'!'])));\n    /// assert_eq!(itr.next(), None);\n    /// # }\n    /// ```\n    /// [`Iterator`]: std::iter::Iterator\n    /// [`OsSt`]: std::ffi::OsStr\n    /// [`String`]: std::string::String\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn get_raw(&self, id: &str) -> Option<RawValues<'_>> {\n        MatchesError::unwrap(id, self.try_get_raw(id))\n    }\n\n    /// Iterate over the original values for each occurrence of an option.\n    ///\n    /// Similar to [`ArgMatches::get_occurrences`] but returns raw values.\n    ///\n    /// An `OsStr` on Unix-like systems is any series of bytes, regardless of whether or not they\n    /// contain valid UTF-8. Since [`String`]s in Rust are guaranteed to be valid UTF-8, a valid\n    /// filename on a Unix system as an argument value may contain invalid UTF-8.\n    ///\n    /// Returns `None` if the option wasn't present.\n    ///\n    /// # Panic\n    ///\n    /// If the argument definition and access mismatch.  To handle this case programmatically, see\n    /// [`ArgMatches::try_get_raw_occurrences`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(unix)] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg, value_parser, ArgAction, Arg};\n    /// # use std::ffi::{OsStr,OsString};\n    /// # use std::os::unix::ffi::{OsStrExt,OsStringExt};\n    /// use std::path::PathBuf;\n    ///\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"x\")\n    ///         .short('x')\n    ///         .num_args(2)\n    ///         .action(ArgAction::Append)\n    ///         .value_parser(value_parser!(PathBuf)))\n    ///     .get_matches_from(vec![OsString::from(\"myprog\"),\n    ///                             OsString::from(\"-x\"),\n    ///                             OsString::from(\"a\"), OsString::from(\"b\"),\n    ///                             OsString::from(\"-x\"),\n    ///                             OsString::from(\"c\"),\n    ///                             // \"{0xe9}!\"\n    ///                             OsString::from_vec(vec![0xe9, b'!'])]);\n    /// let mut itr = m.get_raw_occurrences(\"x\")\n    ///     .expect(\"`-x`is required\")\n    ///     .map(Iterator::collect::<Vec<_>>);\n    /// assert_eq!(itr.next(), Some(vec![OsStr::new(\"a\"), OsStr::new(\"b\")]));\n    /// assert_eq!(itr.next(), Some(vec![OsStr::new(\"c\"), OsStr::from_bytes(&[0xe9, b'!'])]));\n    /// assert_eq!(itr.next(), None);\n    /// # }\n    /// ```\n    /// [`Iterator`]: std::iter::Iterator\n    /// [`OsStr`]: std::ffi::OsStr\n    /// [`String`]: std::string::String\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn get_raw_occurrences(&self, id: &str) -> Option<RawOccurrences<'_>> {\n        MatchesError::unwrap(id, self.try_get_raw_occurrences(id))\n    }\n\n    /// Returns the value of a specific option or positional argument.\n    ///\n    /// i.e. an argument that [takes an additional value][crate::Arg::num_args] at runtime.\n    ///\n    /// Returns an error if the wrong type was used.  No item will have been removed.\n    ///\n    /// Returns `None` if the option wasn't present.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// *NOTE:* This will always return `Some(value)` if [`default_value`] has been set.\n    /// [`ArgMatches::value_source`] can be used to check if a value is present at runtime.\n    ///\n    /// </div>\n    ///\n    /// # Panic\n    ///\n    /// If the argument definition and access mismatch.  To handle this case programmatically, see\n    /// [`ArgMatches::try_remove_one`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, value_parser, ArgAction};\n    /// let mut m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"file\")\n    ///         .required(true)\n    ///         .action(ArgAction::Set))\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"file.txt\",\n    ///     ]);\n    /// let vals: String = m.remove_one(\"file\")\n    ///     .expect(\"`file`is required\");\n    /// assert_eq!(vals, \"file.txt\");\n    /// ```\n    /// [positional]: crate::Arg::index()\n    /// [`default_value`]: crate::Arg::default_value()\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn remove_one<T: Any + Clone + Send + Sync + 'static>(&mut self, id: &str) -> Option<T> {\n        MatchesError::unwrap(id, self.try_remove_one(id))\n    }\n\n    /// Return values of a specific option or positional argument.\n    ///\n    /// i.e. an argument that takes multiple values at runtime.\n    ///\n    /// Returns an error if the wrong type was used.  No item will have been removed.\n    ///\n    /// Returns `None` if the option wasn't present.\n    ///\n    /// # Panic\n    ///\n    /// If the argument definition and access mismatch.  To handle this case programmatically, see\n    /// [`ArgMatches::try_remove_many`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, value_parser, ArgAction};\n    /// let mut m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"file\")\n    ///         .action(ArgAction::Append)\n    ///         .num_args(1..)\n    ///         .required(true))\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"file1.txt\", \"file2.txt\", \"file3.txt\", \"file4.txt\",\n    ///     ]);\n    /// let vals: Vec<String> = m.remove_many(\"file\")\n    ///     .expect(\"`file`is required\")\n    ///     .collect();\n    /// assert_eq!(vals, [\"file1.txt\", \"file2.txt\", \"file3.txt\", \"file4.txt\"]);\n    /// ```\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn remove_many<T: Any + Clone + Send + Sync + 'static>(\n        &mut self,\n        id: &str,\n    ) -> Option<Values<T>> {\n        MatchesError::unwrap(id, self.try_remove_many(id))\n    }\n\n    /// Return values for each occurrence of an option.\n    ///\n    /// Each item is itself an iterator containing the arguments passed to a single occurrence of\n    /// the option.\n    ///\n    /// If the option doesn't support multiple occurrences, or there was only a single occurrence,\n    /// the iterator will only contain a single item.\n    ///\n    /// Returns `None` if the option wasn't present.\n    ///\n    /// # Panic\n    ///\n    /// If the argument definition and access mismatch.  To handle this case programmatically, see\n    /// [`ArgMatches::try_remove_occurrences`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, value_parser, ArgAction};\n    /// let mut m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"x\")\n    ///         .short('x')\n    ///         .num_args(2)\n    ///         .action(ArgAction::Append)\n    ///         .value_parser(value_parser!(String)))\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"-x\", \"a\", \"b\", \"-x\", \"c\", \"d\"]);\n    /// let vals: Vec<Vec<String>> = m.remove_occurrences(\"x\").unwrap().map(Iterator::collect).collect();\n    /// assert_eq!(vals, [[\"a\", \"b\"], [\"c\", \"d\"]]);\n    /// ```\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn remove_occurrences<T: Any + Clone + Send + Sync + 'static>(\n        &mut self,\n        id: &str,\n    ) -> Option<Occurrences<T>> {\n        MatchesError::unwrap(id, self.try_remove_occurrences(id))\n    }\n\n    /// Check if values are present for the argument or group id\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// *NOTE:* This will always return `true` if [`default_value`] has been set.\n    /// [`ArgMatches::value_source`] can be used to check if a value is present at runtime.\n    ///\n    /// </div>\n    ///\n    /// # Panics\n    ///\n    /// If `id` is not a valid argument or group name (debug builds).  To handle this case programmatically, see\n    /// [`ArgMatches::try_contains_id`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"debug\")\n    ///         .short('d')\n    ///         .action(ArgAction::SetTrue))\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"-d\"\n    ///     ]);\n    ///\n    /// assert!(m.contains_id(\"debug\"));\n    /// ```\n    ///\n    /// [`default_value`]: crate::Arg::default_value()\n    pub fn contains_id(&self, id: &str) -> bool {\n        MatchesError::unwrap(id, self.try_contains_id(id))\n    }\n\n    /// Iterate over [`Arg`][crate::Arg] and [`ArgGroup`][crate::ArgGroup] [`Id`]s via [`ArgMatches::ids`].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, arg, value_parser};\n    ///\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(arg!(--color <when>)\n    ///         .value_parser([\"auto\", \"always\", \"never\"]))\n    ///     .arg(arg!(--config <path>)\n    ///         .value_parser(value_parser!(std::path::PathBuf)))\n    ///     .get_matches_from([\"myprog\", \"--config=config.toml\", \"--color=auto\"]);\n    /// assert_eq!(m.ids().len(), 2);\n    /// assert_eq!(\n    ///     m.ids()\n    ///         .map(|id| id.as_str())\n    ///         .collect::<Vec<_>>(),\n    ///     [\"config\", \"color\"]\n    /// );\n    /// ```\n    pub fn ids(&self) -> IdsRef<'_> {\n        IdsRef {\n            iter: self.args.keys(),\n        }\n    }\n\n    /// Check if any [`Arg`][crate::Arg]s were present on the command line\n    ///\n    /// See [`ArgMatches::subcommand_name()`] or [`ArgMatches::subcommand()`] to check if a\n    /// subcommand was present on the command line.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let mut cmd = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"output\")\n    ///         .action(ArgAction::Set));\n    ///\n    /// let m = cmd\n    ///     .try_get_matches_from_mut(vec![\"myapp\", \"something\"])\n    ///     .unwrap();\n    /// assert!(m.args_present());\n    ///\n    /// let m = cmd\n    ///     .try_get_matches_from_mut(vec![\"myapp\"])\n    ///     .unwrap();\n    /// assert!(! m.args_present());\n    pub fn args_present(&self) -> bool {\n        self.args\n            .values()\n            .any(|v| v.source().map(|s| s.is_explicit()).unwrap_or(false))\n    }\n\n    /// Report where argument value came from\n    ///\n    /// # Panics\n    ///\n    /// If `id` is not a valid argument or group id (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// # use clap::parser::ValueSource;\n    /// let m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"debug\")\n    ///         .short('d')\n    ///         .action(ArgAction::SetTrue))\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"-d\"\n    ///     ]);\n    ///\n    /// assert_eq!(m.value_source(\"debug\"), Some(ValueSource::CommandLine));\n    /// ```\n    ///\n    /// [`default_value`]: crate::Arg::default_value()\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn value_source(&self, id: &str) -> Option<ValueSource> {\n        let value = self.get_arg(id);\n\n        value.and_then(MatchedArg::source)\n    }\n\n    /// The first index of that an argument showed up.\n    ///\n    /// Indices are similar to argv indices, but are not exactly 1:1.\n    ///\n    /// For flags (i.e. those arguments which don't have an associated value), indices refer\n    /// to occurrence of the switch, such as `-f`, or `--flag`. However, for options the indices\n    /// refer to the *values* `-o val` would therefore not represent two distinct indices, only the\n    /// index for `val` would be recorded. This is by design.\n    ///\n    /// Besides the flag/option discrepancy, the primary difference between an argv index and clap\n    /// index, is that clap continues counting once all arguments have properly separated, whereas\n    /// an argv index does not.\n    ///\n    /// The examples should clear this up.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// *NOTE:* If an argument is allowed multiple times, this method will only give the *first*\n    /// index.  See [`ArgMatches::indices_of`].\n    ///\n    /// </div>\n    ///\n    /// # Panics\n    ///\n    /// If `id` is not a valid argument or group id (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// The argv indices are listed in the comments below. See how they correspond to the clap\n    /// indices. Note that if it's not listed in a clap index, this is because it's not saved in\n    /// in an `ArgMatches` struct for querying.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"option\")\n    ///         .short('o')\n    ///         .action(ArgAction::Set))\n    ///     .get_matches_from(vec![\"myapp\", \"-f\", \"-o\", \"val\"]);\n    ///            // ARGV indices: ^0       ^1    ^2    ^3\n    ///            // clap indices:          ^1          ^3\n    ///\n    /// assert_eq!(m.index_of(\"flag\"), Some(1));\n    /// assert_eq!(m.index_of(\"option\"), Some(3));\n    /// ```\n    ///\n    /// Now notice, if we use one of the other styles of options:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"option\")\n    ///         .short('o')\n    ///         .action(ArgAction::Set))\n    ///     .get_matches_from(vec![\"myapp\", \"-f\", \"-o=val\"]);\n    ///            // ARGV indices: ^0       ^1    ^2\n    ///            // clap indices:          ^1       ^3\n    ///\n    /// assert_eq!(m.index_of(\"flag\"), Some(1));\n    /// assert_eq!(m.index_of(\"option\"), Some(3));\n    /// ```\n    ///\n    /// Things become much more complicated, or clear if we look at a more complex combination of\n    /// flags. Let's also throw in the final option style for good measure.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"flag2\")\n    ///         .short('F')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"flag3\")\n    ///         .short('z')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"option\")\n    ///         .short('o')\n    ///         .action(ArgAction::Set))\n    ///     .get_matches_from(vec![\"myapp\", \"-fzF\", \"-oval\"]);\n    ///            // ARGV indices: ^0      ^1       ^2\n    ///            // clap indices:         ^1,2,3    ^5\n    ///            //\n    ///            // clap sees the above as 'myapp -f -z -F -o val'\n    ///            //                         ^0    ^1 ^2 ^3 ^4 ^5\n    /// assert_eq!(m.index_of(\"flag\"), Some(1));\n    /// assert_eq!(m.index_of(\"flag2\"), Some(3));\n    /// assert_eq!(m.index_of(\"flag3\"), Some(2));\n    /// assert_eq!(m.index_of(\"option\"), Some(5));\n    /// ```\n    ///\n    /// One final combination of flags/options to see how they combine:\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"flag2\")\n    ///         .short('F')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"flag3\")\n    ///         .short('z')\n    ///         .action(ArgAction::SetTrue))\n    ///     .arg(Arg::new(\"option\")\n    ///         .short('o')\n    ///         .action(ArgAction::Set))\n    ///     .get_matches_from(vec![\"myapp\", \"-fzFoval\"]);\n    ///            // ARGV indices: ^0       ^1\n    ///            // clap indices:          ^1,2,3^5\n    ///            //\n    ///            // clap sees the above as 'myapp -f -z -F -o val'\n    ///            //                         ^0    ^1 ^2 ^3 ^4 ^5\n    /// assert_eq!(m.index_of(\"flag\"), Some(1));\n    /// assert_eq!(m.index_of(\"flag2\"), Some(3));\n    /// assert_eq!(m.index_of(\"flag3\"), Some(2));\n    /// assert_eq!(m.index_of(\"option\"), Some(5));\n    /// ```\n    ///\n    /// The last part to mention is when values are sent in multiple groups with a [delimiter].\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"option\")\n    ///         .short('o')\n    ///         .value_delimiter(',')\n    ///         .num_args(1..))\n    ///     .get_matches_from(vec![\"myapp\", \"-o=val1,val2,val3\"]);\n    ///            // ARGV indices: ^0       ^1\n    ///            // clap indices:             ^2   ^3   ^4\n    ///            //\n    ///            // clap sees the above as 'myapp -o val1 val2 val3'\n    ///            //                         ^0    ^1 ^2   ^3   ^4\n    /// assert_eq!(m.index_of(\"option\"), Some(2));\n    /// assert_eq!(m.indices_of(\"option\").unwrap().collect::<Vec<_>>(), &[2, 3, 4]);\n    /// ```\n    /// [delimiter]: crate::Arg::value_delimiter()\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn index_of(&self, id: &str) -> Option<usize> {\n        let arg = some!(self.get_arg(id));\n        let i = some!(arg.get_index(0));\n        Some(i)\n    }\n\n    /// All indices an argument appeared at when parsing.\n    ///\n    /// Indices are similar to argv indices, but are not exactly 1:1.\n    ///\n    /// For flags (i.e. those arguments which don't have an associated value), indices refer\n    /// to occurrence of the switch, such as `-f`, or `--flag`. However, for options the indices\n    /// refer to the *values* `-o val` would therefore not represent two distinct indices, only the\n    /// index for `val` would be recorded. This is by design.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// *NOTE:* For more information about how clap indices compared to argv indices, see\n    /// [`ArgMatches::index_of`]\n    ///\n    /// </div>\n    ///\n    /// # Panics\n    ///\n    /// If `id` is not a valid argument or group id (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg};\n    /// let m = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"option\")\n    ///         .short('o')\n    ///         .value_delimiter(','))\n    ///     .get_matches_from(vec![\"myapp\", \"-o=val1,val2,val3\"]);\n    ///            // ARGV indices: ^0       ^1\n    ///            // clap indices:             ^2   ^3   ^4\n    ///            //\n    ///            // clap sees the above as 'myapp -o val1 val2 val3'\n    ///            //                         ^0    ^1 ^2   ^3   ^4\n    /// assert_eq!(m.indices_of(\"option\").unwrap().collect::<Vec<_>>(), &[2, 3, 4]);\n    /// ```\n    ///\n    /// Another quick example is when flags and options are used together\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"option\")\n    ///         .short('o')\n    ///         .action(ArgAction::Set)\n    ///         .action(ArgAction::Append))\n    ///     .arg(Arg::new(\"flag\")\n    ///         .short('f')\n    ///         .action(ArgAction::Count))\n    ///     .get_matches_from(vec![\"myapp\", \"-o\", \"val1\", \"-f\", \"-o\", \"val2\", \"-f\"]);\n    ///            // ARGV indices: ^0       ^1    ^2      ^3    ^4    ^5      ^6\n    ///            // clap indices:                ^2      ^3          ^5      ^6\n    ///\n    /// assert_eq!(m.indices_of(\"option\").unwrap().collect::<Vec<_>>(), &[2, 5]);\n    /// assert_eq!(m.indices_of(\"flag\").unwrap().collect::<Vec<_>>(), &[6]);\n    /// ```\n    ///\n    /// One final example, which is an odd case; if we *don't* use  value delimiter as we did with\n    /// the first example above instead of `val1`, `val2` and `val3` all being distinc values, they\n    /// would all be a single value of `val1,val2,val3`, in which case they'd only receive a single\n    /// index.\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let m = Command::new(\"myapp\")\n    ///     .arg(Arg::new(\"option\")\n    ///         .short('o')\n    ///         .action(ArgAction::Set)\n    ///         .num_args(1..))\n    ///     .get_matches_from(vec![\"myapp\", \"-o=val1,val2,val3\"]);\n    ///            // ARGV indices: ^0       ^1\n    ///            // clap indices:             ^2\n    ///            //\n    ///            // clap sees the above as 'myapp -o \"val1,val2,val3\"'\n    ///            //                         ^0    ^1  ^2\n    /// assert_eq!(m.indices_of(\"option\").unwrap().collect::<Vec<_>>(), &[2]);\n    /// ```\n    /// [`ArgMatches::index_of`]: ArgMatches::index_of()\n    #[cfg_attr(debug_assertions, track_caller)]\n    pub fn indices_of(&self, id: &str) -> Option<Indices<'_>> {\n        let arg = some!(self.get_arg(id));\n        let i = Indices {\n            iter: arg.indices(),\n            len: arg.num_vals(),\n        };\n        Some(i)\n    }\n}\n\n/// # Subcommands\nimpl ArgMatches {\n    /// The name and `ArgMatches` of the current [subcommand].\n    ///\n    /// Subcommand values are put in a child [`ArgMatches`]\n    ///\n    /// Returns `None` if the subcommand wasn't present at runtime,\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    ///  let app_m = Command::new(\"git\")\n    ///      .subcommand(Command::new(\"clone\"))\n    ///      .subcommand(Command::new(\"push\"))\n    ///      .subcommand(Command::new(\"commit\"))\n    ///      .get_matches();\n    ///\n    /// match app_m.subcommand() {\n    ///     Some((\"clone\",  sub_m)) => {}, // clone was used\n    ///     Some((\"push\",   sub_m)) => {}, // push was used\n    ///     Some((\"commit\", sub_m)) => {}, // commit was used\n    ///     _                       => {}, // Either no subcommand or one not tested for...\n    /// }\n    /// ```\n    ///\n    /// Another useful scenario is when you want to support third party, or external, subcommands.\n    /// In these cases you can't know the subcommand name ahead of time, so use a variable instead\n    /// with pattern matching!\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::ffi::OsString;\n    /// # use std::ffi::OsStr;\n    /// # use clap::Command;\n    /// // Assume there is an external subcommand named \"subcmd\"\n    /// let app_m = Command::new(\"myprog\")\n    ///     .allow_external_subcommands(true)\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"subcmd\", \"--option\", \"value\", \"-fff\", \"--flag\"\n    ///     ]);\n    ///\n    /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty\n    /// // string argument name\n    /// match app_m.subcommand() {\n    ///     Some((external, sub_m)) => {\n    ///          let ext_args: Vec<&OsStr> = sub_m.get_many::<OsString>(\"\")\n    ///             .unwrap().map(|s| s.as_os_str()).collect();\n    ///          assert_eq!(external, \"subcmd\");\n    ///          assert_eq!(ext_args, [\"--option\", \"value\", \"-fff\", \"--flag\"]);\n    ///     },\n    ///     _ => {},\n    /// }\n    /// ```\n    /// [subcommand]: crate::Command::subcommand\n    #[inline]\n    pub fn subcommand(&self) -> Option<(&str, &ArgMatches)> {\n        self.subcommand.as_ref().map(|sc| (&*sc.name, &sc.matches))\n    }\n\n    /// Return the name and `ArgMatches` of the current [subcommand].\n    ///\n    /// Subcommand values are put in a child [`ArgMatches`]\n    ///\n    /// Returns `None` if the subcommand wasn't present at runtime,\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    ///  let mut app_m = Command::new(\"git\")\n    ///      .subcommand(Command::new(\"clone\"))\n    ///      .subcommand(Command::new(\"push\"))\n    ///      .subcommand(Command::new(\"commit\"))\n    ///      .subcommand_required(true)\n    ///      .get_matches();\n    ///\n    /// let (name, sub_m) = app_m.remove_subcommand().expect(\"required\");\n    /// match (name.as_str(), sub_m) {\n    ///     (\"clone\",  sub_m) => {}, // clone was used\n    ///     (\"push\",   sub_m) => {}, // push was used\n    ///     (\"commit\", sub_m) => {}, // commit was used\n    ///     (name, _)         => unimplemented!(\"{name}\"),\n    /// }\n    /// ```\n    ///\n    /// Another useful scenario is when you want to support third party, or external, subcommands.\n    /// In these cases you can't know the subcommand name ahead of time, so use a variable instead\n    /// with pattern matching!\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use std::ffi::OsString;\n    /// # use clap::Command;\n    /// // Assume there is an external subcommand named \"subcmd\"\n    /// let mut app_m = Command::new(\"myprog\")\n    ///     .allow_external_subcommands(true)\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"subcmd\", \"--option\", \"value\", \"-fff\", \"--flag\"\n    ///     ]);\n    ///\n    /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty\n    /// // string argument name\n    /// match app_m.remove_subcommand() {\n    ///     Some((external, mut sub_m)) => {\n    ///          let ext_args: Vec<OsString> = sub_m.remove_many(\"\")\n    ///             .expect(\"`file`is required\")\n    ///             .collect();\n    ///          assert_eq!(external, \"subcmd\");\n    ///          assert_eq!(ext_args, [\"--option\", \"value\", \"-fff\", \"--flag\"]);\n    ///     },\n    ///     _ => {},\n    /// }\n    /// ```\n    /// [subcommand]: crate::Command::subcommand\n    pub fn remove_subcommand(&mut self) -> Option<(String, ArgMatches)> {\n        self.subcommand.take().map(|sc| (sc.name, sc.matches))\n    }\n\n    /// The `ArgMatches` for the current [subcommand].\n    ///\n    /// Subcommand values are put in a child [`ArgMatches`]\n    ///\n    /// Returns `None` if the subcommand wasn't present at runtime,\n    ///\n    /// # Panics\n    ///\n    /// If `id` is not a valid subcommand (debug builds).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, ArgAction};\n    /// let app_m = Command::new(\"myprog\")\n    ///     .arg(Arg::new(\"debug\")\n    ///         .short('d')\n    ///         .action(ArgAction::SetTrue)\n    ///     )\n    ///     .subcommand(Command::new(\"test\")\n    ///         .arg(Arg::new(\"opt\")\n    ///             .long(\"option\")\n    ///             .action(ArgAction::Set)))\n    ///     .get_matches_from(vec![\n    ///         \"myprog\", \"-d\", \"test\", \"--option\", \"val\"\n    ///     ]);\n    ///\n    /// // Both parent commands, and child subcommands can have arguments present at the same times\n    /// assert!(app_m.get_flag(\"debug\"));\n    ///\n    /// // Get the subcommand's ArgMatches instance\n    /// if let Some(sub_m) = app_m.subcommand_matches(\"test\") {\n    ///     // Use the struct like normal\n    ///     assert_eq!(sub_m.get_one::<String>(\"opt\").map(|s| s.as_str()), Some(\"val\"));\n    /// }\n    /// ```\n    ///\n    /// [subcommand]: crate::Command::subcommand\n    /// [`Command`]: crate::Command\n    pub fn subcommand_matches(&self, name: &str) -> Option<&ArgMatches> {\n        self.get_subcommand(name).map(|sc| &sc.matches)\n    }\n\n    /// The name of the current [subcommand].\n    ///\n    /// Returns `None` if the subcommand wasn't present at runtime,\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, Arg, };\n    ///  let app_m = Command::new(\"git\")\n    ///      .subcommand(Command::new(\"clone\"))\n    ///      .subcommand(Command::new(\"push\"))\n    ///      .subcommand(Command::new(\"commit\"))\n    ///      .get_matches();\n    ///\n    /// match app_m.subcommand_name() {\n    ///     Some(\"clone\")  => {}, // clone was used\n    ///     Some(\"push\")   => {}, // push was used\n    ///     Some(\"commit\") => {}, // commit was used\n    ///     _              => {}, // Either no subcommand or one not tested for...\n    /// }\n    /// ```\n    /// [subcommand]: crate::Command::subcommand\n    /// [`Command`]: crate::Command\n    #[inline]\n    pub fn subcommand_name(&self) -> Option<&str> {\n        self.subcommand.as_ref().map(|sc| &*sc.name)\n    }\n\n    /// Check if a subcommand can be queried\n    ///\n    /// By default, `ArgMatches` functions assert on undefined `Id`s to help catch programmer\n    /// mistakes.  In some context, this doesn't work, so users can use this function to check\n    /// before they do a query on `ArgMatches`.\n    #[inline]\n    #[doc(hidden)]\n    pub fn is_valid_subcommand(&self, _name: &str) -> bool {\n        #[cfg(debug_assertions)]\n        {\n            _name.is_empty() || self.valid_subcommands.iter().any(|s| *s == _name)\n        }\n        #[cfg(not(debug_assertions))]\n        {\n            true\n        }\n    }\n}\n\n/// # Advanced\nimpl ArgMatches {\n    /// Non-panicking version of [`ArgMatches::get_one`]\n    pub fn try_get_one<T: Any + Clone + Send + Sync + 'static>(\n        &self,\n        id: &str,\n    ) -> Result<Option<&T>, MatchesError> {\n        let arg = ok!(self.try_get_arg_t::<T>(id));\n        let value = match arg.and_then(|a| a.first()) {\n            Some(value) => value,\n            None => {\n                return Ok(None);\n            }\n        };\n        Ok(value\n            .downcast_ref::<T>()\n            .map(Some)\n            .expect(INTERNAL_ERROR_MSG)) // enforced by `try_get_arg_t`\n    }\n\n    /// Non-panicking version of [`ArgMatches::get_many`]\n    pub fn try_get_many<T: Any + Clone + Send + Sync + 'static>(\n        &self,\n        id: &str,\n    ) -> Result<Option<ValuesRef<'_, T>>, MatchesError> {\n        let arg = match ok!(self.try_get_arg_t::<T>(id)) {\n            Some(arg) => arg,\n            None => return Ok(None),\n        };\n        let len = arg.num_vals();\n        let values = arg.vals_flatten();\n        let values = ValuesRef {\n            // enforced by `try_get_arg_t`\n            iter: values.map(unwrap_downcast_ref),\n            len,\n        };\n        Ok(Some(values))\n    }\n\n    /// Non-panicking version of [`ArgMatches::get_occurrences`]\n    pub fn try_get_occurrences<T: Any + Clone + Send + Sync + 'static>(\n        &self,\n        id: &str,\n    ) -> Result<Option<OccurrencesRef<'_, T>>, MatchesError> {\n        let arg = match ok!(self.try_get_arg_t::<T>(id)) {\n            Some(arg) => arg,\n            None => return Ok(None),\n        };\n        let values = arg.vals();\n        Ok(Some(OccurrencesRef {\n            iter: values.map(|g| OccurrenceValuesRef {\n                iter: g.iter().map(unwrap_downcast_ref),\n            }),\n        }))\n    }\n\n    /// Non-panicking version of [`ArgMatches::get_raw`]\n    pub fn try_get_raw(&self, id: &str) -> Result<Option<RawValues<'_>>, MatchesError> {\n        let arg = match ok!(self.try_get_arg(id)) {\n            Some(arg) => arg,\n            None => return Ok(None),\n        };\n        let len = arg.num_vals();\n        let values = arg.raw_vals_flatten();\n        let values = RawValues {\n            iter: values.map(OsString::as_os_str),\n            len,\n        };\n        Ok(Some(values))\n    }\n\n    /// Non-panicking version of [`ArgMatches::get_raw_occurrences`]\n    pub fn try_get_raw_occurrences(\n        &self,\n        id: &str,\n    ) -> Result<Option<RawOccurrences<'_>>, MatchesError> {\n        let arg = match ok!(self.try_get_arg(id)) {\n            Some(arg) => arg,\n            None => return Ok(None),\n        };\n        let values = arg.raw_vals();\n        let occurrences = RawOccurrences {\n            iter: values.map(|g| RawOccurrenceValues {\n                iter: g.iter().map(OsString::as_os_str),\n            }),\n        };\n        Ok(Some(occurrences))\n    }\n\n    /// Non-panicking version of [`ArgMatches::remove_one`]\n    pub fn try_remove_one<T: Any + Clone + Send + Sync + 'static>(\n        &mut self,\n        id: &str,\n    ) -> Result<Option<T>, MatchesError> {\n        match ok!(self.try_remove_arg_t::<T>(id)) {\n            Some(values) => Ok(values\n                .into_vals_flatten()\n                // enforced by `try_get_arg_t`\n                .map(unwrap_downcast_into)\n                .next()),\n            None => Ok(None),\n        }\n    }\n\n    /// Non-panicking version of [`ArgMatches::remove_many`]\n    pub fn try_remove_many<T: Any + Clone + Send + Sync + 'static>(\n        &mut self,\n        id: &str,\n    ) -> Result<Option<Values<T>>, MatchesError> {\n        let arg = match ok!(self.try_remove_arg_t::<T>(id)) {\n            Some(arg) => arg,\n            None => return Ok(None),\n        };\n        let len = arg.num_vals();\n        let values = arg.into_vals_flatten();\n        let values = Values {\n            // enforced by `try_get_arg_t`\n            iter: values.map(unwrap_downcast_into),\n            len,\n        };\n        Ok(Some(values))\n    }\n\n    /// Non-panicking version of [`ArgMatches::remove_occurrences`]\n    pub fn try_remove_occurrences<T: Any + Clone + Send + Sync + 'static>(\n        &mut self,\n        id: &str,\n    ) -> Result<Option<Occurrences<T>>, MatchesError> {\n        let arg = match ok!(self.try_remove_arg_t::<T>(id)) {\n            Some(arg) => arg,\n            None => return Ok(None),\n        };\n        let values = arg.into_vals();\n        let occurrences = Occurrences {\n            iter: values.into_iter().map(|g| OccurrenceValues {\n                iter: g.into_iter().map(unwrap_downcast_into),\n            }),\n        };\n        Ok(Some(occurrences))\n    }\n\n    /// Non-panicking version of [`ArgMatches::contains_id`]\n    pub fn try_contains_id(&self, id: &str) -> Result<bool, MatchesError> {\n        ok!(self.verify_arg(id));\n\n        let presence = self.args.contains_key(id);\n        Ok(presence)\n    }\n\n    /// Clears the values for the given `id`\n    ///\n    /// Alternative to [`try_remove_*`][ArgMatches::try_remove_one] when the type is not known.\n    ///\n    /// Returns `Err([``MatchesError``])` if the given `id` isn't valid for current `ArgMatches` instance.\n    ///\n    /// Returns `Ok(true)` if there were any matches with the given `id`, `Ok(false)` otherwise.\n    pub fn try_clear_id(&mut self, id: &str) -> Result<bool, MatchesError> {\n        ok!(self.verify_arg(id));\n        Ok(self.args.remove_entry(id).is_some())\n    }\n}\n\n// Private methods\nimpl ArgMatches {\n    #[inline]\n    fn try_get_arg(&self, arg: &str) -> Result<Option<&MatchedArg>, MatchesError> {\n        ok!(self.verify_arg(arg));\n        Ok(self.args.get(arg))\n    }\n\n    #[inline]\n    fn try_get_arg_t<T: Any + Send + Sync + 'static>(\n        &self,\n        arg: &str,\n    ) -> Result<Option<&MatchedArg>, MatchesError> {\n        let arg = match ok!(self.try_get_arg(arg)) {\n            Some(arg) => arg,\n            None => {\n                return Ok(None);\n            }\n        };\n        ok!(self.verify_arg_t::<T>(arg));\n        Ok(Some(arg))\n    }\n\n    #[inline]\n    fn try_remove_arg_t<T: Any + Send + Sync + 'static>(\n        &mut self,\n        arg: &str,\n    ) -> Result<Option<MatchedArg>, MatchesError> {\n        ok!(self.verify_arg(arg));\n        let (id, matched) = match self.args.remove_entry(arg) {\n            Some((id, matched)) => (id, matched),\n            None => {\n                return Ok(None);\n            }\n        };\n\n        let expected = AnyValueId::of::<T>();\n        let actual = matched.infer_type_id(expected);\n        if actual == expected {\n            Ok(Some(matched))\n        } else {\n            self.args.insert(id, matched);\n            Err(MatchesError::Downcast { actual, expected })\n        }\n    }\n\n    fn verify_arg_t<T: Any + Send + Sync + 'static>(\n        &self,\n        arg: &MatchedArg,\n    ) -> Result<(), MatchesError> {\n        let expected = AnyValueId::of::<T>();\n        let actual = arg.infer_type_id(expected);\n        if expected == actual {\n            Ok(())\n        } else {\n            Err(MatchesError::Downcast { actual, expected })\n        }\n    }\n\n    #[inline]\n    fn verify_arg(&self, _arg: &str) -> Result<(), MatchesError> {\n        #[cfg(debug_assertions)]\n        {\n            if _arg == Id::EXTERNAL || self.valid_args.iter().any(|s| *s == _arg) {\n            } else {\n                debug!(\n                    \"`{:?}` is not an id of an argument or a group.\\n\\\n                     Make sure you're using the name of the argument itself \\\n                     and not the name of short or long flags.\",\n                    _arg\n                );\n                return Err(MatchesError::UnknownArgument {});\n            }\n        }\n        Ok(())\n    }\n\n    #[inline]\n    #[cfg_attr(debug_assertions, track_caller)]\n    fn get_arg<'s>(&'s self, arg: &str) -> Option<&'s MatchedArg> {\n        #[cfg(debug_assertions)]\n        {\n            if arg == Id::EXTERNAL || self.valid_args.iter().any(|s| *s == arg) {\n            } else {\n                panic!(\n                    \"`{arg:?}` is not an id of an argument or a group.\\n\\\n                     Make sure you're using the name of the argument itself \\\n                     and not the name of short or long flags.\"\n                );\n            }\n        }\n\n        self.args.get(arg)\n    }\n\n    #[inline]\n    #[cfg_attr(debug_assertions, track_caller)]\n    fn get_subcommand(&self, name: &str) -> Option<&SubCommand> {\n        #[cfg(debug_assertions)]\n        {\n            if name.is_empty() || self.valid_subcommands.iter().any(|s| *s == name) {\n            } else {\n                panic!(\"`{name}` is not a name of a subcommand.\");\n            }\n        }\n\n        if let Some(ref sc) = self.subcommand {\n            if sc.name == name {\n                return Some(sc);\n            }\n        }\n\n        None\n    }\n}\n\n#[derive(Debug, Clone, PartialEq, Eq)]\npub(crate) struct SubCommand {\n    pub(crate) name: String,\n    pub(crate) matches: ArgMatches,\n}\n\n/// Iterate over [`Arg`][crate::Arg] and [`ArgGroup`][crate::ArgGroup] [`Id`]s via [`ArgMatches::ids`].\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::{Command, arg, value_parser};\n///\n/// let m = Command::new(\"myprog\")\n///     .arg(arg!(--color <when>)\n///         .value_parser([\"auto\", \"always\", \"never\"]))\n///     .arg(arg!(--config <path>)\n///         .value_parser(value_parser!(std::path::PathBuf)))\n///     .get_matches_from([\"myprog\", \"--config=config.toml\", \"--color=auto\"]);\n/// assert_eq!(\n///     m.ids()\n///         .map(|id| id.as_str())\n///         .collect::<Vec<_>>(),\n///     [\"config\", \"color\"]\n/// );\n/// ```\n#[derive(Clone, Debug)]\npub struct IdsRef<'a> {\n    iter: Iter<'a, Id>,\n}\n\nimpl<'a> Iterator for IdsRef<'a> {\n    type Item = &'a Id;\n\n    fn next(&mut self) -> Option<&'a Id> {\n        self.iter.next()\n    }\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        self.iter.size_hint()\n    }\n}\n\nimpl<'a> DoubleEndedIterator for IdsRef<'a> {\n    fn next_back(&mut self) -> Option<&'a Id> {\n        self.iter.next_back()\n    }\n}\n\nimpl ExactSizeIterator for IdsRef<'_> {}\n\n/// Iterate over multiple values for an argument via [`ArgMatches::remove_many`].\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::{Command, Arg, ArgAction};\n/// let mut m = Command::new(\"myapp\")\n///     .arg(Arg::new(\"output\")\n///         .short('o')\n///         .action(ArgAction::Append))\n///     .get_matches_from(vec![\"myapp\", \"-o\", \"val1\", \"-o\", \"val2\"]);\n///\n/// let mut values = m.remove_many::<String>(\"output\")\n///     .unwrap();\n///\n/// assert_eq!(values.next(), Some(String::from(\"val1\")));\n/// assert_eq!(values.next(), Some(String::from(\"val2\")));\n/// assert_eq!(values.next(), None);\n/// ```\n#[derive(Clone, Debug)]\npub struct Values<T> {\n    #[allow(clippy::type_complexity)]\n    iter: Map<Flatten<std::vec::IntoIter<Vec<AnyValue>>>, fn(AnyValue) -> T>,\n    len: usize,\n}\n\nimpl<T> Iterator for Values<T> {\n    type Item = T;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        if let Some(next) = self.iter.next() {\n            self.len -= 1;\n            Some(next)\n        } else {\n            None\n        }\n    }\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        (self.len, Some(self.len))\n    }\n}\n\nimpl<T> DoubleEndedIterator for Values<T> {\n    fn next_back(&mut self) -> Option<Self::Item> {\n        if let Some(next) = self.iter.next_back() {\n            self.len -= 1;\n            Some(next)\n        } else {\n            None\n        }\n    }\n}\n\nimpl<T> ExactSizeIterator for Values<T> {}\n\n/// Creates an empty iterator.\nimpl<T> Default for Values<T> {\n    fn default() -> Self {\n        let empty: Vec<Vec<AnyValue>> = Default::default();\n        Values {\n            iter: empty.into_iter().flatten().map(|_| unreachable!()),\n            len: 0,\n        }\n    }\n}\n\n/// Iterate over multiple values for an argument via [`ArgMatches::get_many`].\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::{Command, Arg, ArgAction};\n/// let m = Command::new(\"myapp\")\n///     .arg(Arg::new(\"output\")\n///         .short('o')\n///         .action(ArgAction::Append))\n///     .get_matches_from(vec![\"myapp\", \"-o\", \"val1\", \"-o\", \"val2\"]);\n///\n/// let mut values = m.get_many::<String>(\"output\")\n///     .unwrap()\n///     .map(|s| s.as_str());\n///\n/// assert_eq!(values.next(), Some(\"val1\"));\n/// assert_eq!(values.next(), Some(\"val2\"));\n/// assert_eq!(values.next(), None);\n/// ```\n#[derive(Clone, Debug)]\npub struct ValuesRef<'a, T> {\n    #[allow(clippy::type_complexity)]\n    iter: Map<Flatten<Iter<'a, Vec<AnyValue>>>, fn(&AnyValue) -> &T>,\n    len: usize,\n}\n\nimpl<'a, T: 'a> Iterator for ValuesRef<'a, T> {\n    type Item = &'a T;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        if let Some(next) = self.iter.next() {\n            self.len -= 1;\n            Some(next)\n        } else {\n            None\n        }\n    }\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        (self.len, Some(self.len))\n    }\n}\n\nimpl<'a, T: 'a> DoubleEndedIterator for ValuesRef<'a, T> {\n    fn next_back(&mut self) -> Option<Self::Item> {\n        if let Some(next) = self.iter.next_back() {\n            self.len -= 1;\n            Some(next)\n        } else {\n            None\n        }\n    }\n}\n\nimpl<'a, T: 'a> ExactSizeIterator for ValuesRef<'a, T> {}\n\n/// Creates an empty iterator.\nimpl<'a, T: 'a> Default for ValuesRef<'a, T> {\n    fn default() -> Self {\n        static EMPTY: [Vec<AnyValue>; 0] = [];\n        ValuesRef {\n            iter: EMPTY[..].iter().flatten().map(|_| unreachable!()),\n            len: 0,\n        }\n    }\n}\n\n/// Iterate over raw argument values via [`ArgMatches::get_raw`].\n///\n/// # Examples\n///\n/// ```rust\n/// # #[cfg(unix)] {\n/// # use clap_builder as clap;\n/// # use clap::{Command, arg, value_parser};\n/// use std::ffi::OsString;\n/// use std::os::unix::ffi::{OsStrExt,OsStringExt};\n///\n/// let m = Command::new(\"utf8\")\n///     .arg(arg!(<arg> \"some arg\")\n///         .value_parser(value_parser!(OsString)))\n///     .get_matches_from(vec![OsString::from(\"myprog\"),\n///                             // \"Hi {0xe9}!\"\n///                             OsString::from_vec(vec![b'H', b'i', b' ', 0xe9, b'!'])]);\n/// assert_eq!(\n///     &*m.get_raw(\"arg\")\n///         .unwrap()\n///         .next().unwrap()\n///         .as_bytes(),\n///     [b'H', b'i', b' ', 0xe9, b'!']\n/// );\n/// # }\n/// ```\n#[derive(Clone, Debug)]\npub struct RawValues<'a> {\n    #[allow(clippy::type_complexity)]\n    iter: Map<Flatten<Iter<'a, Vec<OsString>>>, fn(&OsString) -> &OsStr>,\n    len: usize,\n}\n\nimpl<'a> Iterator for RawValues<'a> {\n    type Item = &'a OsStr;\n\n    fn next(&mut self) -> Option<&'a OsStr> {\n        if let Some(next) = self.iter.next() {\n            self.len -= 1;\n            Some(next)\n        } else {\n            None\n        }\n    }\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        (self.len, Some(self.len))\n    }\n}\n\nimpl<'a> DoubleEndedIterator for RawValues<'a> {\n    fn next_back(&mut self) -> Option<&'a OsStr> {\n        if let Some(next) = self.iter.next_back() {\n            self.len -= 1;\n            Some(next)\n        } else {\n            None\n        }\n    }\n}\n\nimpl ExactSizeIterator for RawValues<'_> {}\n\n/// Creates an empty iterator.\nimpl Default for RawValues<'_> {\n    fn default() -> Self {\n        static EMPTY: [Vec<OsString>; 0] = [];\n        RawValues {\n            iter: EMPTY[..].iter().flatten().map(|_| unreachable!()),\n            len: 0,\n        }\n    }\n}\n\n// The following were taken and adapted from vec_map source\n// repo: https://github.com/contain-rs/vec-map\n// commit: be5e1fa3c26e351761b33010ddbdaf5f05dbcc33\n// license: MIT - Copyright (c) 2015 The Rust Project Developers\n\n#[derive(Clone, Debug)]\npub struct Occurrences<T> {\n    #[allow(clippy::type_complexity)]\n    iter: Map<std::vec::IntoIter<Vec<AnyValue>>, fn(Vec<AnyValue>) -> OccurrenceValues<T>>,\n}\n\nimpl<T> Iterator for Occurrences<T> {\n    type Item = OccurrenceValues<T>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.iter.next()\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        self.iter.size_hint()\n    }\n}\n\nimpl<T> DoubleEndedIterator for Occurrences<T> {\n    fn next_back(&mut self) -> Option<Self::Item> {\n        self.iter.next_back()\n    }\n}\n\nimpl<T> ExactSizeIterator for Occurrences<T> {}\n\nimpl<T> Default for Occurrences<T> {\n    fn default() -> Self {\n        let empty: Vec<Vec<AnyValue>> = Default::default();\n        Occurrences {\n            iter: empty.into_iter().map(|_| unreachable!()),\n        }\n    }\n}\n\n#[derive(Clone, Debug)]\npub struct OccurrenceValues<T> {\n    #[allow(clippy::type_complexity)]\n    iter: Map<std::vec::IntoIter<AnyValue>, fn(AnyValue) -> T>,\n}\n\nimpl<T> Iterator for OccurrenceValues<T> {\n    type Item = T;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.iter.next()\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        self.iter.size_hint()\n    }\n}\n\nimpl<T> DoubleEndedIterator for OccurrenceValues<T> {\n    fn next_back(&mut self) -> Option<Self::Item> {\n        self.iter.next_back()\n    }\n}\n\nimpl<T> ExactSizeIterator for OccurrenceValues<T> {}\n\n#[derive(Clone, Debug)]\npub struct OccurrencesRef<'a, T> {\n    #[allow(clippy::type_complexity)]\n    iter: Map<Iter<'a, Vec<AnyValue>>, fn(&Vec<AnyValue>) -> OccurrenceValuesRef<'_, T>>,\n}\n\nimpl<'a, T> Iterator for OccurrencesRef<'a, T>\nwhere\n    Self: 'a,\n{\n    type Item = OccurrenceValuesRef<'a, T>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.iter.next()\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        self.iter.size_hint()\n    }\n}\n\nimpl<'a, T> DoubleEndedIterator for OccurrencesRef<'a, T>\nwhere\n    Self: 'a,\n{\n    fn next_back(&mut self) -> Option<Self::Item> {\n        self.iter.next_back()\n    }\n}\n\nimpl<'a, T> ExactSizeIterator for OccurrencesRef<'a, T> where Self: 'a {}\nimpl<T> Default for OccurrencesRef<'_, T> {\n    fn default() -> Self {\n        static EMPTY: [Vec<AnyValue>; 0] = [];\n        OccurrencesRef {\n            iter: EMPTY[..].iter().map(|_| unreachable!()),\n        }\n    }\n}\n\n#[derive(Clone, Debug)]\npub struct OccurrenceValuesRef<'a, T> {\n    #[allow(clippy::type_complexity)]\n    iter: Map<Iter<'a, AnyValue>, fn(&AnyValue) -> &T>,\n}\n\nimpl<'a, T> Iterator for OccurrenceValuesRef<'a, T>\nwhere\n    Self: 'a,\n{\n    type Item = &'a T;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.iter.next()\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        self.iter.size_hint()\n    }\n}\n\nimpl<'a, T> DoubleEndedIterator for OccurrenceValuesRef<'a, T>\nwhere\n    Self: 'a,\n{\n    fn next_back(&mut self) -> Option<Self::Item> {\n        self.iter.next_back()\n    }\n}\n\nimpl<'a, T> ExactSizeIterator for OccurrenceValuesRef<'a, T> where Self: 'a {}\n\n#[derive(Clone, Debug)]\npub struct RawOccurrences<'a> {\n    #[allow(clippy::type_complexity)]\n    iter: Map<Iter<'a, Vec<OsString>>, fn(&Vec<OsString>) -> RawOccurrenceValues<'_>>,\n}\n\nimpl<'a> Iterator for RawOccurrences<'a> {\n    type Item = RawOccurrenceValues<'a>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.iter.next()\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        self.iter.size_hint()\n    }\n}\n\nimpl DoubleEndedIterator for RawOccurrences<'_> {\n    fn next_back(&mut self) -> Option<Self::Item> {\n        self.iter.next_back()\n    }\n}\n\nimpl ExactSizeIterator for RawOccurrences<'_> {}\n\nimpl Default for RawOccurrences<'_> {\n    fn default() -> Self {\n        static EMPTY: [Vec<OsString>; 0] = [];\n        RawOccurrences {\n            iter: EMPTY[..].iter().map(|_| unreachable!()),\n        }\n    }\n}\n\n#[derive(Clone, Debug)]\npub struct RawOccurrenceValues<'a> {\n    #[allow(clippy::type_complexity)]\n    iter: Map<Iter<'a, OsString>, fn(&OsString) -> &OsStr>,\n}\n\nimpl<'a> Iterator for RawOccurrenceValues<'a>\nwhere\n    Self: 'a,\n{\n    type Item = &'a OsStr;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.iter.next()\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        self.iter.size_hint()\n    }\n}\n\nimpl<'a> DoubleEndedIterator for RawOccurrenceValues<'a>\nwhere\n    Self: 'a,\n{\n    fn next_back(&mut self) -> Option<Self::Item> {\n        self.iter.next_back()\n    }\n}\n\nimpl ExactSizeIterator for RawOccurrenceValues<'_> {}\n\n/// Iterate over indices for where an argument appeared when parsing, via [`ArgMatches::indices_of`]\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_builder as clap;\n/// # use clap::{Command, Arg, ArgAction};\n/// let m = Command::new(\"myapp\")\n///     .arg(Arg::new(\"output\")\n///         .short('o')\n///         .num_args(1..)\n///         .action(ArgAction::Set))\n///     .get_matches_from(vec![\"myapp\", \"-o\", \"val1\", \"val2\"]);\n///\n/// let mut indices = m.indices_of(\"output\").unwrap();\n///\n/// assert_eq!(indices.next(), Some(2));\n/// assert_eq!(indices.next(), Some(3));\n/// assert_eq!(indices.next(), None);\n/// ```\n/// [`ArgMatches::indices_of`]: ArgMatches::indices_of()\n#[derive(Clone, Debug)]\npub struct Indices<'a> {\n    iter: Cloned<Iter<'a, usize>>,\n    len: usize,\n}\n\nimpl Iterator for Indices<'_> {\n    type Item = usize;\n\n    fn next(&mut self) -> Option<usize> {\n        if let Some(next) = self.iter.next() {\n            self.len -= 1;\n            Some(next)\n        } else {\n            None\n        }\n    }\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        (self.len, Some(self.len))\n    }\n}\n\nimpl DoubleEndedIterator for Indices<'_> {\n    fn next_back(&mut self) -> Option<usize> {\n        if let Some(next) = self.iter.next_back() {\n            self.len -= 1;\n            Some(next)\n        } else {\n            None\n        }\n    }\n}\n\nimpl ExactSizeIterator for Indices<'_> {}\n\n/// Creates an empty iterator.\nimpl Default for Indices<'_> {\n    fn default() -> Self {\n        static EMPTY: [usize; 0] = [];\n        // This is never called because the iterator is empty:\n        Indices {\n            iter: EMPTY[..].iter().cloned(),\n            len: 0,\n        }\n    }\n}\n\n#[track_caller]\nfn unwrap_downcast_ref<T: Any + Clone + Send + Sync + 'static>(value: &AnyValue) -> &T {\n    value.downcast_ref().expect(INTERNAL_ERROR_MSG)\n}\n\n#[track_caller]\nfn unwrap_downcast_into<T: Any + Clone + Send + Sync + 'static>(value: AnyValue) -> T {\n    value.downcast_into().expect(INTERNAL_ERROR_MSG)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    use crate::ArgAction;\n\n    #[test]\n    fn check_auto_traits() {\n        static_assertions::assert_impl_all!(ArgMatches: Send, Sync, Unpin);\n    }\n\n    #[test]\n    fn test_default_raw_values() {\n        let mut values: RawValues<'_> = Default::default();\n        assert_eq!(values.next(), None);\n    }\n\n    #[test]\n    fn test_default_indices() {\n        let mut indices: Indices<'_> = Indices::default();\n        assert_eq!(indices.next(), None);\n    }\n\n    #[test]\n    fn test_default_indices_with_shorter_lifetime() {\n        let matches = ArgMatches::default();\n        let mut indices = matches.indices_of(\"\").unwrap_or_default();\n        assert_eq!(indices.next(), None);\n    }\n\n    #[test]\n    fn values_exact_size() {\n        let l = crate::Command::new(\"test\")\n            .arg(\n                crate::Arg::new(\"POTATO\")\n                    .action(ArgAction::Set)\n                    .num_args(1..)\n                    .required(true),\n            )\n            .try_get_matches_from([\"test\", \"one\"])\n            .unwrap()\n            .get_many::<String>(\"POTATO\")\n            .expect(\"present\")\n            .count();\n        assert_eq!(l, 1);\n    }\n\n    #[test]\n    fn os_values_exact_size() {\n        let l = crate::Command::new(\"test\")\n            .arg(\n                crate::Arg::new(\"POTATO\")\n                    .action(ArgAction::Set)\n                    .num_args(1..)\n                    .value_parser(crate::builder::ValueParser::os_string())\n                    .required(true),\n            )\n            .try_get_matches_from([\"test\", \"one\"])\n            .unwrap()\n            .get_many::<OsString>(\"POTATO\")\n            .expect(\"present\")\n            .count();\n        assert_eq!(l, 1);\n    }\n\n    #[test]\n    fn indices_exact_size() {\n        let l = crate::Command::new(\"test\")\n            .arg(\n                crate::Arg::new(\"POTATO\")\n                    .action(ArgAction::Set)\n                    .num_args(1..)\n                    .required(true),\n            )\n            .try_get_matches_from([\"test\", \"one\"])\n            .unwrap()\n            .indices_of(\"POTATO\")\n            .expect(\"present\")\n            .len();\n        assert_eq!(l, 1);\n    }\n\n    #[test]\n    fn rev_iter() {\n        let mut matches = crate::Command::new(\"myprog\")\n            .arg(crate::Arg::new(\"a\").short('a').action(ArgAction::Append))\n            .arg(crate::Arg::new(\"b\").short('b').action(ArgAction::Append))\n            .try_get_matches_from(vec![\"myprog\", \"-a1\", \"-b1\", \"-b3\"])\n            .unwrap();\n\n        let a_index = matches\n            .indices_of(\"a\")\n            .expect(\"missing aopt indices\")\n            .collect::<Vec<_>>();\n        dbg!(&a_index);\n        let a_value = matches\n            .remove_many::<String>(\"a\")\n            .expect(\"missing aopt values\");\n        dbg!(&a_value);\n        let a = a_index.into_iter().zip(a_value).rev().collect::<Vec<_>>();\n        dbg!(a);\n\n        let b_index = matches\n            .indices_of(\"b\")\n            .expect(\"missing aopt indices\")\n            .collect::<Vec<_>>();\n        dbg!(&b_index);\n        let b_value = matches\n            .remove_many::<String>(\"b\")\n            .expect(\"missing aopt values\");\n        dbg!(&b_value);\n        let b = b_index.into_iter().zip(b_value).rev().collect::<Vec<_>>();\n        dbg!(b);\n    }\n\n    #[test]\n    fn delete_id_without_returning() {\n        let mut matches = crate::Command::new(\"myprog\")\n            .arg(crate::Arg::new(\"a\").short('a').action(ArgAction::Append))\n            .arg(crate::Arg::new(\"b\").short('b').action(ArgAction::Append))\n            .arg(crate::Arg::new(\"c\").short('c').action(ArgAction::Append))\n            .try_get_matches_from(vec![\"myprog\", \"-b1\", \"-a1\", \"-b2\"])\n            .unwrap();\n        let matches_ids_count = matches.ids().count();\n        assert_eq!(matches_ids_count, 2);\n\n        let _ = matches\n            .try_clear_id(\"d\")\n            .expect_err(\"should fail due to there is no arg 'd'\");\n\n        let c_was_presented = matches\n            .try_clear_id(\"c\")\n            .expect(\"doesn't fail because there is no matches for 'c' argument\");\n        assert!(!c_was_presented);\n        let matches_ids_count = matches.ids().count();\n        assert_eq!(matches_ids_count, 2);\n\n        let b_was_presented = matches.try_clear_id(\"b\").unwrap();\n        assert!(b_was_presented);\n        let matches_ids_count = matches.ids().count();\n        assert_eq!(matches_ids_count, 1);\n\n        let a_was_presented = matches.try_clear_id(\"a\").unwrap();\n        assert!(a_was_presented);\n        let matches_ids_count = matches.ids().count();\n        assert_eq!(matches_ids_count, 0);\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/parser/matches/matched_arg.rs",
    "content": "// Std\nuse std::{\n    ffi::{OsStr, OsString},\n    iter::{Cloned, Flatten},\n    slice::Iter,\n};\n\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::builder::ArgPredicate;\nuse crate::parser::ValueSource;\nuse crate::util::AnyValue;\nuse crate::util::AnyValueId;\nuse crate::util::eq_ignore_case;\n\n#[derive(Debug, Clone)]\npub(crate) struct MatchedArg {\n    source: Option<ValueSource>,\n    indices: Vec<usize>,\n    type_id: Option<AnyValueId>,\n    vals: Vec<Vec<AnyValue>>,\n    raw_vals: Vec<Vec<OsString>>,\n    ignore_case: bool,\n}\n\nimpl MatchedArg {\n    pub(crate) fn new_arg(arg: &crate::Arg) -> Self {\n        let ignore_case = arg.is_ignore_case_set();\n        Self {\n            source: None,\n            indices: Vec::new(),\n            type_id: Some(arg.get_value_parser().type_id()),\n            vals: Vec::new(),\n            raw_vals: Vec::new(),\n            ignore_case,\n        }\n    }\n\n    pub(crate) fn new_group() -> Self {\n        let ignore_case = false;\n        Self {\n            source: None,\n            indices: Vec::new(),\n            type_id: None,\n            vals: Vec::new(),\n            raw_vals: Vec::new(),\n            ignore_case,\n        }\n    }\n\n    pub(crate) fn new_external(cmd: &crate::Command) -> Self {\n        let ignore_case = false;\n        Self {\n            source: None,\n            indices: Vec::new(),\n            type_id: Some(\n                cmd.get_external_subcommand_value_parser()\n                    .expect(INTERNAL_ERROR_MSG)\n                    .type_id(),\n            ),\n            vals: Vec::new(),\n            raw_vals: Vec::new(),\n            ignore_case,\n        }\n    }\n\n    pub(crate) fn indices(&self) -> Cloned<Iter<'_, usize>> {\n        self.indices.iter().cloned()\n    }\n\n    pub(crate) fn get_index(&self, index: usize) -> Option<usize> {\n        self.indices.get(index).cloned()\n    }\n\n    pub(crate) fn push_index(&mut self, index: usize) {\n        self.indices.push(index);\n    }\n\n    pub(crate) fn vals(&self) -> Iter<'_, Vec<AnyValue>> {\n        self.vals.iter()\n    }\n\n    pub(crate) fn into_vals(self) -> Vec<Vec<AnyValue>> {\n        self.vals\n    }\n\n    pub(crate) fn vals_flatten(&self) -> Flatten<Iter<'_, Vec<AnyValue>>> {\n        self.vals.iter().flatten()\n    }\n\n    pub(crate) fn into_vals_flatten(self) -> Flatten<std::vec::IntoIter<Vec<AnyValue>>> {\n        self.vals.into_iter().flatten()\n    }\n\n    pub(crate) fn raw_vals(&self) -> Iter<'_, Vec<OsString>> {\n        self.raw_vals.iter()\n    }\n\n    pub(crate) fn raw_vals_flatten(&self) -> Flatten<Iter<'_, Vec<OsString>>> {\n        self.raw_vals.iter().flatten()\n    }\n\n    pub(crate) fn first(&self) -> Option<&AnyValue> {\n        self.vals_flatten().next()\n    }\n\n    #[cfg(test)]\n    pub(crate) fn first_raw(&self) -> Option<&OsString> {\n        self.raw_vals_flatten().next()\n    }\n\n    pub(crate) fn new_val_group(&mut self) {\n        self.vals.push(vec![]);\n        self.raw_vals.push(vec![]);\n    }\n\n    pub(crate) fn append_val(&mut self, val: AnyValue, raw_val: OsString) {\n        // We assume there is always a group created before.\n        self.vals.last_mut().expect(INTERNAL_ERROR_MSG).push(val);\n        self.raw_vals\n            .last_mut()\n            .expect(INTERNAL_ERROR_MSG)\n            .push(raw_val);\n    }\n\n    pub(crate) fn num_vals(&self) -> usize {\n        self.vals.iter().map(|v| v.len()).sum()\n    }\n\n    // Will be used later\n    #[allow(dead_code)]\n    pub(crate) fn num_vals_last_group(&self) -> usize {\n        self.vals.last().map(|x| x.len()).unwrap_or(0)\n    }\n\n    pub(crate) fn check_explicit(&self, predicate: &ArgPredicate) -> bool {\n        if self.source.map(|s| !s.is_explicit()).unwrap_or(false) {\n            return false;\n        }\n\n        match predicate {\n            ArgPredicate::Equals(val) => self.raw_vals_flatten().any(|v| {\n                if self.ignore_case {\n                    // If `v` isn't utf8, it can't match `val`, so `OsStr::to_str` should be fine\n                    eq_ignore_case(&v.to_string_lossy(), &val.to_string_lossy())\n                } else {\n                    OsString::as_os_str(v) == OsStr::new(val)\n                }\n            }),\n            ArgPredicate::IsPresent => true,\n        }\n    }\n\n    pub(crate) fn source(&self) -> Option<ValueSource> {\n        self.source\n    }\n\n    pub(crate) fn set_source(&mut self, source: ValueSource) {\n        if let Some(existing) = self.source {\n            self.source = Some(existing.max(source));\n        } else {\n            self.source = Some(source);\n        }\n    }\n\n    pub(crate) fn type_id(&self) -> Option<AnyValueId> {\n        self.type_id\n    }\n\n    pub(crate) fn infer_type_id(&self, expected: AnyValueId) -> AnyValueId {\n        self.type_id()\n            .or_else(|| {\n                self.vals_flatten()\n                    .map(|v| v.type_id())\n                    .find(|actual| *actual != expected)\n            })\n            .unwrap_or(expected)\n    }\n}\n\nimpl PartialEq for MatchedArg {\n    fn eq(&self, other: &MatchedArg) -> bool {\n        let MatchedArg {\n            source: self_source,\n            indices: self_indices,\n            type_id: self_type_id,\n            vals: _,\n            raw_vals: self_raw_vals,\n            ignore_case: self_ignore_case,\n        } = self;\n        let MatchedArg {\n            source: other_source,\n            indices: other_indices,\n            type_id: other_type_id,\n            vals: _,\n            raw_vals: other_raw_vals,\n            ignore_case: other_ignore_case,\n        } = other;\n        self_source == other_source\n            && self_indices == other_indices\n            && self_type_id == other_type_id\n            && self_raw_vals == other_raw_vals\n            && self_ignore_case == other_ignore_case\n    }\n}\n\nimpl Eq for MatchedArg {}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_grouped_vals_first() {\n        let mut m = MatchedArg::new_group();\n        m.new_val_group();\n        m.new_val_group();\n        m.append_val(AnyValue::new(String::from(\"bbb\")), \"bbb\".into());\n        m.append_val(AnyValue::new(String::from(\"ccc\")), \"ccc\".into());\n        assert_eq!(m.first_raw(), Some(&OsString::from(\"bbb\")));\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/parser/matches/mod.rs",
    "content": "mod arg_matches;\nmod matched_arg;\nmod value_source;\n\npub use arg_matches::IdsRef;\npub use arg_matches::RawValues;\npub use arg_matches::Values;\npub use arg_matches::ValuesRef;\npub use arg_matches::{ArgMatches, Indices};\npub use value_source::ValueSource;\n\npub(crate) use arg_matches::SubCommand;\npub(crate) use matched_arg::MatchedArg;\n"
  },
  {
    "path": "clap_builder/src/parser/matches/value_source.rs",
    "content": "/// Origin of the argument's value\n#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]\n#[non_exhaustive]\npub enum ValueSource {\n    /// Value came [`Arg::default_value`][crate::Arg::default_value]\n    DefaultValue,\n    /// Value came [`Arg::env`][crate::Arg::env]\n    EnvVariable,\n    /// Value was passed in on the command-line\n    CommandLine,\n}\n\nimpl ValueSource {\n    pub(crate) fn is_explicit(self) -> bool {\n        self != Self::DefaultValue\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/parser/mod.rs",
    "content": "//! [`Command`][crate::Command] line argument parser\n\nmod arg_matcher;\nmod error;\nmod matches;\n#[allow(clippy::module_inception)]\nmod parser;\nmod validator;\n\npub(crate) mod features;\n\npub(crate) use self::arg_matcher::ArgMatcher;\npub(crate) use self::matches::{MatchedArg, SubCommand};\npub(crate) use self::parser::Identifier;\npub(crate) use self::parser::Parser;\npub(crate) use self::parser::PendingArg;\npub(crate) use self::validator::Validator;\npub(crate) use self::validator::get_possible_values_cli;\n\npub use self::matches::IdsRef;\npub use self::matches::RawValues;\npub use self::matches::Values;\npub use self::matches::ValuesRef;\npub use self::matches::{ArgMatches, Indices, ValueSource};\npub use error::MatchesError;\n"
  },
  {
    "path": "clap_builder/src/parser/parser.rs",
    "content": "// Std\nuse std::{\n    cell::Cell,\n    ffi::{OsStr, OsString},\n};\n\nuse clap_lex::OsStrExt as _;\n\n// Internal\nuse crate::ArgAction;\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::builder::{Arg, Command};\nuse crate::error::Error as ClapError;\nuse crate::error::Result as ClapResult;\nuse crate::mkeymap::KeyType;\nuse crate::output::Usage;\nuse crate::parser::features::suggestions;\nuse crate::parser::{ArgMatcher, SubCommand};\nuse crate::parser::{Validator, ValueSource};\nuse crate::util::AnyValue;\nuse crate::util::Id;\n\npub(crate) struct Parser<'cmd> {\n    cmd: &'cmd mut Command,\n    cur_idx: Cell<usize>,\n    /// Index of the previous flag subcommand in a group of flags.\n    flag_subcmd_at: Option<usize>,\n    /// Counter indicating the number of items to skip\n    /// when revisiting the group of flags which includes the flag subcommand.\n    flag_subcmd_skip: usize,\n}\n\n// Initializing Methods\nimpl<'cmd> Parser<'cmd> {\n    pub(crate) fn new(cmd: &'cmd mut Command) -> Self {\n        Parser {\n            cmd,\n            cur_idx: Cell::new(0),\n            flag_subcmd_at: None,\n            flag_subcmd_skip: 0,\n        }\n    }\n}\n\n// Parsing Methods\nimpl<'cmd> Parser<'cmd> {\n    // The actual parsing function\n    #[allow(clippy::cognitive_complexity)]\n    pub(crate) fn get_matches_with(\n        &mut self,\n        matcher: &mut ArgMatcher,\n        raw_args: &mut clap_lex::RawArgs,\n        args_cursor: clap_lex::ArgCursor,\n    ) -> ClapResult<()> {\n        debug!(\"Parser::get_matches_with\");\n\n        ok!(self\n            .parse(matcher, raw_args, args_cursor)\n            .inspect_err(|_err| {\n                if self.cmd.is_ignore_errors_set() {\n                    #[cfg(feature = \"env\")]\n                    let _ = self.add_env(matcher);\n                    let _ = self.add_defaults(matcher);\n                }\n            }));\n        ok!(self.resolve_pending(matcher));\n\n        #[cfg(feature = \"env\")]\n        ok!(self.add_env(matcher));\n        ok!(self.add_defaults(matcher));\n\n        Validator::new(self.cmd).validate(matcher)\n    }\n\n    // The actual parsing function\n    #[allow(clippy::cognitive_complexity)]\n    pub(crate) fn parse(\n        &mut self,\n        matcher: &mut ArgMatcher,\n        raw_args: &mut clap_lex::RawArgs,\n        mut args_cursor: clap_lex::ArgCursor,\n    ) -> ClapResult<()> {\n        debug!(\"Parser::parse\");\n        // Verify all positional assertions pass\n\n        let mut subcmd_name: Option<String> = None;\n        let mut keep_state = false;\n        let mut parse_state = ParseState::ValuesDone;\n        let mut pos_counter = 1;\n\n        // Already met any valid arg(then we shouldn't expect subcommands after it).\n        let mut valid_arg_found = false;\n        // If the user already passed '--'. Meaning only positional args follow.\n        let mut trailing_values = false;\n\n        // Count of positional args\n        let positional_count = self\n            .cmd\n            .get_keymap()\n            .keys()\n            .filter(|x| x.is_position())\n            .count();\n        // If any arg sets .last(true)\n        let contains_last = self.cmd.get_arguments().any(|x| x.is_last_set());\n\n        while let Some(arg_os) = raw_args.next(&mut args_cursor) {\n            debug!(\n                \"Parser::get_matches_with: Begin parsing '{:?}'\",\n                arg_os.to_value_os(),\n            );\n\n            // Has the user already passed '--'? Meaning only positional args follow\n            if !trailing_values {\n                if self.cmd.is_subcommand_precedence_over_arg_set()\n                    || !matches!(parse_state, ParseState::Opt(_) | ParseState::Pos(_))\n                {\n                    // Does the arg match a subcommand name, or any of its aliases (if defined)\n                    let sc_name = self.possible_subcommand(arg_os.to_value(), valid_arg_found);\n                    debug!(\"Parser::get_matches_with: sc={sc_name:?}\");\n                    if let Some(sc_name) = sc_name {\n                        if sc_name == \"help\" && !self.cmd.is_disable_help_subcommand_set() {\n                            ok!(self.parse_help_subcommand(raw_args.remaining(&mut args_cursor)));\n                            unreachable!(\"`parse_help_subcommand` always errors\");\n                        } else {\n                            subcmd_name = Some(sc_name.to_owned());\n                        }\n                        break;\n                    }\n                }\n\n                if arg_os.is_escape() {\n                    if matches!(&parse_state, ParseState::Opt(opt) | ParseState::Pos(opt) if\n                        self.cmd[opt].is_allow_hyphen_values_set())\n                    {\n                        // ParseResult::MaybeHyphenValue, do nothing\n                    } else {\n                        debug!(\"Parser::get_matches_with: setting TrailingVals=true\");\n                        if self.cmd.get_keymap().get(&pos_counter).is_some_and(|arg| {\n                            self.check_terminator(arg, arg_os.to_value_os()).is_some()\n                        }) {\n                            // count as both an escape and terminator\n                            pos_counter += 1;\n                        }\n                        trailing_values = true;\n                        matcher.start_trailing();\n                        continue;\n                    }\n                } else if let Some((long_arg, long_value)) = arg_os.to_long() {\n                    let parse_result = ok!(self.parse_long_arg(\n                        matcher,\n                        long_arg,\n                        long_value,\n                        &parse_state,\n                        pos_counter,\n                        &mut valid_arg_found,\n                    ));\n                    debug!(\"Parser::get_matches_with: After parse_long_arg {parse_result:?}\");\n                    match parse_result {\n                        ParseResult::NoArg => {\n                            unreachable!(\"`to_long` always has the flag specified\")\n                        }\n                        ParseResult::ValuesDone => {\n                            parse_state = ParseState::ValuesDone;\n                            continue;\n                        }\n                        ParseResult::Opt(id) => {\n                            parse_state = ParseState::Opt(id);\n                            continue;\n                        }\n                        ParseResult::FlagSubCommand(name) => {\n                            debug!(\n                                \"Parser::get_matches_with: FlagSubCommand found in long arg {:?}\",\n                                &name\n                            );\n                            subcmd_name = Some(name);\n                            break;\n                        }\n                        ParseResult::EqualsNotProvided { arg } => {\n                            let _ = self.resolve_pending(matcher);\n                            return Err(ClapError::no_equals(\n                                self.cmd,\n                                arg,\n                                Usage::new(self.cmd).create_usage_with_title(&[]),\n                            ));\n                        }\n                        ParseResult::NoMatchingArg { arg } => {\n                            let _ = self.resolve_pending(matcher);\n                            let remaining_args: Vec<_> =\n                                raw_args.remaining(&mut args_cursor).collect();\n                            return Err(self.did_you_mean_error(\n                                &arg,\n                                matcher,\n                                &remaining_args,\n                                trailing_values,\n                            ));\n                        }\n                        ParseResult::UnneededAttachedValue { rest, used, arg } => {\n                            let _ = self.resolve_pending(matcher);\n                            return Err(ClapError::too_many_values(\n                                self.cmd,\n                                rest,\n                                arg,\n                                Usage::new(self.cmd).create_usage_with_title(&used),\n                            ));\n                        }\n                        ParseResult::MaybeHyphenValue => {\n                            // Maybe a hyphen value, do nothing.\n                        }\n                        ParseResult::AttachedValueNotConsumed => {\n                            unreachable!()\n                        }\n                    }\n                } else if let Some(short_arg) = arg_os.to_short() {\n                    // Arg looks like a short flag, and not a possible number\n\n                    // Try to parse short args like normal, if allow_hyphen_values or\n                    // AllowNegativeNumbers is set, parse_short_arg will *not* throw\n                    // an error, and instead return Ok(None)\n                    let parse_result = ok!(self.parse_short_arg(\n                        matcher,\n                        short_arg,\n                        &parse_state,\n                        pos_counter,\n                        &mut valid_arg_found,\n                    ));\n                    // If it's None, we then check if one of those two AppSettings was set\n                    debug!(\"Parser::get_matches_with: After parse_short_arg {parse_result:?}\");\n                    match parse_result {\n                        ParseResult::NoArg => {\n                            // Is a single dash `-`, try positional.\n                        }\n                        ParseResult::ValuesDone => {\n                            parse_state = ParseState::ValuesDone;\n                            continue;\n                        }\n                        ParseResult::Opt(id) => {\n                            parse_state = ParseState::Opt(id);\n                            continue;\n                        }\n                        ParseResult::FlagSubCommand(name) => {\n                            // If there are more short flags to be processed, we should keep the state, and later\n                            // revisit the current group of short flags skipping the subcommand.\n                            keep_state = self\n                                .flag_subcmd_at\n                                .map(|at| {\n                                    raw_args\n                                        .seek(&mut args_cursor, clap_lex::SeekFrom::Current(-1));\n                                    // Since we are now saving the current state, the number of flags to skip during state recovery should\n                                    // be the current index (`cur_idx`) minus ONE UNIT TO THE LEFT of the starting position.\n                                    self.flag_subcmd_skip = self.cur_idx.get() - at + 1;\n                                })\n                                .is_some();\n\n                            debug!(\n                                \"Parser::get_matches_with:FlagSubCommandShort: subcmd_name={}, keep_state={}, flag_subcmd_skip={}\",\n                                name, keep_state, self.flag_subcmd_skip\n                            );\n\n                            subcmd_name = Some(name);\n                            break;\n                        }\n                        ParseResult::EqualsNotProvided { arg } => {\n                            let _ = self.resolve_pending(matcher);\n                            return Err(ClapError::no_equals(\n                                self.cmd,\n                                arg,\n                                Usage::new(self.cmd).create_usage_with_title(&[]),\n                            ));\n                        }\n                        ParseResult::NoMatchingArg { arg } => {\n                            let _ = self.resolve_pending(matcher);\n                            // We already know it looks like a flag\n                            let suggested_trailing_arg =\n                                !trailing_values && self.cmd.has_positionals();\n                            return Err(ClapError::unknown_argument(\n                                self.cmd,\n                                arg,\n                                None,\n                                suggested_trailing_arg,\n                                Usage::new(self.cmd).create_usage_with_title(&[]),\n                            ));\n                        }\n                        ParseResult::MaybeHyphenValue => {\n                            // Maybe a hyphen value, do nothing.\n                        }\n                        ParseResult::UnneededAttachedValue { .. }\n                        | ParseResult::AttachedValueNotConsumed => unreachable!(),\n                    }\n                }\n\n                if let ParseState::Opt(id) = &parse_state {\n                    // Assume this is a value of a previous arg.\n\n                    // get the option so we can check the settings\n                    let arg = &self.cmd[id];\n                    let parse_result = if let Some(parse_result) =\n                        self.check_terminator(arg, arg_os.to_value_os())\n                    {\n                        parse_result\n                    } else {\n                        let trailing_values = false;\n                        let arg_values = matcher.pending_values_mut(id, None, trailing_values);\n                        arg_values.push(arg_os.to_value_os().to_owned());\n                        if matcher.needs_more_vals(arg) {\n                            ParseResult::Opt(arg.get_id().clone())\n                        } else {\n                            ParseResult::ValuesDone\n                        }\n                    };\n                    parse_state = match parse_result {\n                        ParseResult::Opt(id) => ParseState::Opt(id),\n                        ParseResult::ValuesDone => ParseState::ValuesDone,\n                        _ => unreachable!(),\n                    };\n                    // get the next value from the iterator\n                    continue;\n                }\n            }\n\n            // Correct pos_counter.\n            pos_counter = {\n                let is_second_to_last = pos_counter + 1 == positional_count;\n\n                // The last positional argument, or second to last positional\n                // argument may be set to .multiple_values(true) or `.multiple_occurrences(true)`\n                let low_index_mults = is_second_to_last\n                    && self.cmd.get_positionals().any(|a| {\n                        a.is_multiple() && (positional_count != a.get_index().unwrap_or(0))\n                    })\n                    && self\n                        .cmd\n                        .get_positionals()\n                        .last()\n                        .map(|p_name| !p_name.is_last_set())\n                        .unwrap_or_default();\n\n                let is_terminated = self\n                    .cmd\n                    .get_keymap()\n                    .get(&pos_counter)\n                    .map(|a| a.get_value_terminator().is_some())\n                    .unwrap_or_default();\n\n                let missing_pos = self.cmd.is_allow_missing_positional_set()\n                    && is_second_to_last\n                    && !trailing_values;\n\n                debug!(\"Parser::get_matches_with: Positional counter...{pos_counter}\");\n                debug!(\"Parser::get_matches_with: Low index multiples...{low_index_mults:?}\");\n\n                if (low_index_mults || missing_pos) && !is_terminated {\n                    let skip_current = if let Some(n) = raw_args.peek(&args_cursor) {\n                        if let Some(arg) = self\n                            .cmd\n                            .get_positionals()\n                            .find(|a| a.get_index() == Some(pos_counter))\n                        {\n                            // If next value looks like a new_arg or it's a\n                            // subcommand, skip positional argument under current\n                            // pos_counter(which means current value cannot be a\n                            // positional argument with a value next to it), assume\n                            // current value matches the next arg.\n                            self.is_new_arg(&n, arg)\n                                || self\n                                    .possible_subcommand(n.to_value(), valid_arg_found)\n                                    .is_some()\n                        } else {\n                            true\n                        }\n                    } else {\n                        true\n                    };\n\n                    if skip_current {\n                        debug!(\"Parser::get_matches_with: Bumping the positional counter...\");\n                        pos_counter + 1\n                    } else {\n                        pos_counter\n                    }\n                } else if trailing_values\n                    && (self.cmd.is_allow_missing_positional_set() || contains_last)\n                {\n                    // Came to -- and one positional has .last(true) set, so we go immediately\n                    // to the last (highest index) positional\n                    debug!(\"Parser::get_matches_with: .last(true) and --, setting last pos\");\n                    positional_count\n                } else {\n                    pos_counter\n                }\n            };\n\n            if let Some(arg) = self.cmd.get_keymap().get(&pos_counter) {\n                if arg.is_last_set() && !trailing_values {\n                    let _ = self.resolve_pending(matcher);\n                    // Its already considered a positional, we don't need to suggest turning it\n                    // into one\n                    let suggested_trailing_arg = false;\n                    return Err(ClapError::unknown_argument(\n                        self.cmd,\n                        arg_os.display().to_string(),\n                        None,\n                        suggested_trailing_arg,\n                        Usage::new(self.cmd).create_usage_with_title(&[]),\n                    ));\n                }\n\n                if arg.is_trailing_var_arg_set() {\n                    trailing_values = true;\n                }\n\n                if matcher.pending_arg_id() != Some(arg.get_id()) || !arg.is_multiple_values_set() {\n                    ok!(self.resolve_pending(matcher));\n                }\n                parse_state =\n                    if let Some(parse_result) = self.check_terminator(arg, arg_os.to_value_os()) {\n                        debug_assert_eq!(parse_result, ParseResult::ValuesDone);\n                        pos_counter += 1;\n                        ParseState::ValuesDone\n                    } else {\n                        let arg_values = matcher.pending_values_mut(\n                            arg.get_id(),\n                            Some(Identifier::Index),\n                            trailing_values,\n                        );\n                        arg_values.push(arg_os.to_value_os().to_owned());\n\n                        // Only increment the positional counter if it doesn't allow multiples\n                        if !arg.is_multiple() {\n                            pos_counter += 1;\n                            ParseState::ValuesDone\n                        } else {\n                            ParseState::Pos(arg.get_id().clone())\n                        }\n                    };\n                valid_arg_found = true;\n            } else if let Some(external_parser) =\n                self.cmd.get_external_subcommand_value_parser().cloned()\n            {\n                // Get external subcommand name\n                let sc_name = match arg_os.to_value() {\n                    Ok(s) => s.to_owned(),\n                    Err(_) => {\n                        let _ = self.resolve_pending(matcher);\n                        return Err(ClapError::invalid_utf8(\n                            self.cmd,\n                            Usage::new(self.cmd).create_usage_with_title(&[]),\n                        ));\n                    }\n                };\n\n                // Collect the external subcommand args\n                let mut sc_m = ArgMatcher::new(self.cmd);\n                sc_m.start_occurrence_of_external(self.cmd);\n\n                for raw_val in raw_args.remaining(&mut args_cursor) {\n                    let val = ok!(external_parser.parse_ref(\n                        self.cmd,\n                        None,\n                        raw_val,\n                        ValueSource::CommandLine\n                    ));\n                    let external_id = Id::from_static_ref(Id::EXTERNAL);\n                    sc_m.add_val_to(&external_id, val, raw_val.to_os_string());\n                }\n\n                matcher.subcommand(SubCommand {\n                    name: sc_name,\n                    matches: sc_m.into_inner(),\n                });\n\n                return Ok(());\n            } else {\n                // Start error processing\n                let _ = self.resolve_pending(matcher);\n                return Err(self.match_arg_error(\n                    &arg_os,\n                    valid_arg_found,\n                    trailing_values,\n                    matcher,\n                ));\n            }\n        }\n\n        if let Some(ref pos_sc_name) = subcmd_name {\n            if self.cmd.is_args_conflicts_with_subcommands_set() && valid_arg_found {\n                return Err(ClapError::subcommand_conflict(\n                    self.cmd,\n                    pos_sc_name.clone(),\n                    matcher\n                        .arg_ids()\n                        // skip groups\n                        .filter_map(|id| self.cmd.find(id).map(|a| a.to_string()))\n                        .collect(),\n                    Usage::new(self.cmd).create_usage_with_title(&[]),\n                ));\n            }\n            let sc_name = self\n                .cmd\n                .find_subcommand(pos_sc_name)\n                .expect(INTERNAL_ERROR_MSG)\n                .get_name()\n                .to_owned();\n            ok!(self.parse_subcommand(&sc_name, matcher, raw_args, args_cursor, keep_state));\n        }\n\n        Ok(())\n    }\n\n    fn match_arg_error(\n        &self,\n        arg_os: &clap_lex::ParsedArg<'_>,\n        valid_arg_found: bool,\n        trailing_values: bool,\n        matcher: &ArgMatcher,\n    ) -> ClapError {\n        // If argument follows a `--`\n        if trailing_values {\n            // If the arg matches a subcommand name, or any of its aliases (if defined)\n            if self\n                .possible_subcommand(arg_os.to_value(), valid_arg_found)\n                .is_some()\n            {\n                return ClapError::unnecessary_double_dash(\n                    self.cmd,\n                    arg_os.display().to_string(),\n                    Usage::new(self.cmd).create_usage_with_title(&[]),\n                );\n            }\n        }\n\n        let suggested_trailing_arg = !trailing_values\n            && self.cmd.has_positionals()\n            && (arg_os.is_long() || arg_os.is_short());\n\n        if self.cmd.has_subcommands() {\n            if self.cmd.is_args_conflicts_with_subcommands_set() && valid_arg_found {\n                return ClapError::subcommand_conflict(\n                    self.cmd,\n                    arg_os.display().to_string(),\n                    matcher\n                        .arg_ids()\n                        .filter_map(|id| self.cmd.find(id).map(|a| a.to_string()))\n                        .collect(),\n                    Usage::new(self.cmd).create_usage_with_title(&[]),\n                );\n            }\n\n            let candidates = suggestions::did_you_mean(\n                &arg_os.display().to_string(),\n                self.cmd.all_subcommand_names(),\n            );\n            // If the argument looks like a subcommand.\n            if !candidates.is_empty() {\n                return ClapError::invalid_subcommand(\n                    self.cmd,\n                    arg_os.display().to_string(),\n                    candidates,\n                    self.cmd.get_bin_name_fallback().to_owned(),\n                    suggested_trailing_arg,\n                    Usage::new(self.cmd).create_usage_with_title(&[]),\n                );\n            }\n\n            // If the argument must be a subcommand.\n            if !self.cmd.has_positionals() || self.cmd.is_infer_subcommands_set() {\n                return ClapError::unrecognized_subcommand(\n                    self.cmd,\n                    arg_os.display().to_string(),\n                    Usage::new(self.cmd).create_usage_with_title(&[]),\n                );\n            }\n        }\n\n        ClapError::unknown_argument(\n            self.cmd,\n            arg_os.display().to_string(),\n            None,\n            suggested_trailing_arg,\n            Usage::new(self.cmd).create_usage_with_title(&[]),\n        )\n    }\n\n    // Checks if the arg matches a subcommand name, or any of its aliases (if defined)\n    fn possible_subcommand(\n        &self,\n        arg: Result<&str, &OsStr>,\n        valid_arg_found: bool,\n    ) -> Option<&str> {\n        debug!(\"Parser::possible_subcommand: arg={arg:?}\");\n        let arg = some!(arg.ok());\n\n        if !(self.cmd.is_args_conflicts_with_subcommands_set() && valid_arg_found) {\n            if self.cmd.is_infer_subcommands_set() {\n                // For subcommand `test`, we accepts it's prefix: `t`, `te`,\n                // `tes` and `test`.\n                let mut iter = self.cmd.get_subcommands().filter_map(|s| {\n                    if s.get_name().starts_with(arg) {\n                        return Some(s.get_name());\n                    }\n\n                    // Use find here instead of chaining the iterator because we want to accept\n                    // conflicts in aliases.\n                    s.get_all_aliases().find(|s| s.starts_with(arg))\n                });\n\n                if let name @ Some(_) = iter.next() {\n                    if iter.next().is_none() {\n                        return name;\n                    }\n                }\n            }\n            // Don't use an else here because we want inference to support exact matching even if\n            // there are conflicts.\n            if let Some(sc) = self.cmd.find_subcommand(arg) {\n                return Some(sc.get_name());\n            }\n        }\n        None\n    }\n\n    // Checks if the arg matches a long flag subcommand name, or any of its aliases (if defined)\n    fn possible_long_flag_subcommand(&self, arg: &str) -> Option<&str> {\n        debug!(\"Parser::possible_long_flag_subcommand: arg={arg:?}\");\n        if self.cmd.is_infer_subcommands_set() {\n            let mut iter = self.cmd.get_subcommands().filter_map(|sc| {\n                sc.get_long_flag().and_then(|long| {\n                    if long.starts_with(arg) {\n                        Some(sc.get_name())\n                    } else {\n                        sc.get_all_long_flag_aliases().find_map(|alias| {\n                            if alias.starts_with(arg) {\n                                Some(sc.get_name())\n                            } else {\n                                None\n                            }\n                        })\n                    }\n                })\n            });\n\n            if let name @ Some(_) = iter.next() {\n                if iter.next().is_none() {\n                    return name;\n                }\n            }\n        }\n        if let Some(sc_name) = self.cmd.find_long_subcmd(arg) {\n            return Some(sc_name);\n        }\n        None\n    }\n\n    fn parse_help_subcommand(\n        &self,\n        cmds: impl Iterator<Item = &'cmd OsStr>,\n    ) -> ClapResult<std::convert::Infallible> {\n        debug!(\"Parser::parse_help_subcommand\");\n\n        let mut cmd = self.cmd.clone();\n        let sc = {\n            let mut sc = &mut cmd;\n\n            for cmd in cmds {\n                sc = if let Some(sc_name) =\n                    sc.find_subcommand(cmd).map(|sc| sc.get_name().to_owned())\n                {\n                    sc._build_subcommand(&sc_name).unwrap()\n                } else {\n                    return Err(ClapError::unrecognized_subcommand(\n                        sc,\n                        cmd.to_string_lossy().into_owned(),\n                        Usage::new(sc).create_usage_with_title(&[]),\n                    ));\n                };\n            }\n\n            sc\n        };\n        let parser = Parser::new(sc);\n\n        Err(parser.help_err(true))\n    }\n\n    fn is_new_arg(&self, next: &clap_lex::ParsedArg<'_>, current_positional: &Arg) -> bool {\n        #![allow(clippy::needless_bool)] // Prefer consistent if/else-if ladder\n\n        debug!(\n            \"Parser::is_new_arg: {:?}:{}\",\n            next.to_value_os(),\n            current_positional.get_id()\n        );\n\n        if self.cmd[current_positional.get_id()].is_allow_hyphen_values_set()\n            || (self.cmd[current_positional.get_id()].is_allow_negative_numbers_set()\n                && next.is_negative_number())\n        {\n            // If allow hyphen, this isn't a new arg.\n            debug!(\"Parser::is_new_arg: Allow hyphen\");\n            false\n        } else if next.is_long() {\n            // If this is a long flag, this is a new arg.\n            debug!(\"Parser::is_new_arg: --<something> found\");\n            true\n        } else if next.is_short() {\n            // If this is a short flag, this is a new arg. But a single '-' by\n            // itself is a value and typically means \"stdin\" on unix systems.\n            debug!(\"Parser::is_new_arg: -<something> found\");\n            true\n        } else {\n            // Nothing special, this is a value.\n            debug!(\"Parser::is_new_arg: value\");\n            false\n        }\n    }\n\n    fn parse_subcommand(\n        &mut self,\n        sc_name: &str,\n        matcher: &mut ArgMatcher,\n        raw_args: &mut clap_lex::RawArgs,\n        args_cursor: clap_lex::ArgCursor,\n        keep_state: bool,\n    ) -> ClapResult<()> {\n        debug!(\"Parser::parse_subcommand\");\n\n        let partial_parsing_enabled = self.cmd.is_ignore_errors_set();\n\n        if let Some(sc) = self.cmd._build_subcommand(sc_name) {\n            let mut sc_matcher = ArgMatcher::new(sc);\n\n            debug!(\n                \"Parser::parse_subcommand: About to parse sc={}\",\n                sc.get_name()\n            );\n\n            {\n                let mut p = Parser::new(sc);\n                // HACK: maintain indexes between parsers\n                // FlagSubCommand short arg needs to revisit the current short args, but skip the subcommand itself\n                if keep_state {\n                    p.cur_idx.set(self.cur_idx.get());\n                    p.flag_subcmd_at = self.flag_subcmd_at;\n                    p.flag_subcmd_skip = self.flag_subcmd_skip;\n                }\n                if let Err(error) = p.get_matches_with(&mut sc_matcher, raw_args, args_cursor) {\n                    if partial_parsing_enabled && error.use_stderr() {\n                        debug!(\n                            \"Parser::parse_subcommand: ignored error in subcommand {sc_name}: {error:?}\"\n                        );\n                    } else {\n                        return Err(error);\n                    }\n                }\n            }\n            matcher.subcommand(SubCommand {\n                name: sc.get_name().to_owned(),\n                matches: sc_matcher.into_inner(),\n            });\n        }\n        Ok(())\n    }\n\n    fn parse_long_arg(\n        &mut self,\n        matcher: &mut ArgMatcher,\n        long_arg: Result<&str, &OsStr>,\n        long_value: Option<&OsStr>,\n        parse_state: &ParseState,\n        pos_counter: usize,\n        valid_arg_found: &mut bool,\n    ) -> ClapResult<ParseResult> {\n        // maybe here lifetime should be 'a\n        debug!(\"Parser::parse_long_arg\");\n\n        #[allow(clippy::blocks_in_conditions)]\n        if matches!(parse_state, ParseState::Opt(opt) | ParseState::Pos(opt) if\n            self.cmd[opt].is_allow_hyphen_values_set())\n        {\n            debug!(\"Parser::parse_long_arg: prior arg accepts hyphenated values\",);\n            return Ok(ParseResult::MaybeHyphenValue);\n        }\n\n        debug!(\"Parser::parse_long_arg: Does it contain '='...\");\n        let long_arg = match long_arg {\n            Ok(long_arg) => long_arg,\n            Err(long_arg_os) => {\n                return Ok(ParseResult::NoMatchingArg {\n                    arg: long_arg_os.to_string_lossy().into_owned(),\n                });\n            }\n        };\n        if long_arg.is_empty() {\n            debug_assert!(\n                long_value.is_some(),\n                \"`--` should be filtered out before this point\"\n            );\n        }\n\n        let arg = if let Some(arg) = self.cmd.get_keymap().get(long_arg) {\n            debug!(\"Parser::parse_long_arg: Found valid arg or flag '{arg}'\");\n            Some((long_arg, arg))\n        } else if self.cmd.is_infer_long_args_set() {\n            let mut iter = self.cmd.get_arguments().filter_map(|a| {\n                if let Some(long) = a.get_long() {\n                    if long.starts_with(long_arg) {\n                        return Some((long, a));\n                    }\n                }\n                a.aliases\n                    .iter()\n                    .find_map(|(alias, _)| alias.starts_with(long_arg).then(|| (alias.as_str(), a)))\n            });\n\n            iter.next().filter(|_| iter.next().is_none())\n        } else {\n            None\n        };\n\n        if let Some((_long_arg, arg)) = arg {\n            let ident = Identifier::Long;\n            *valid_arg_found = true;\n            if arg.is_takes_value_set() {\n                debug!(\n                    \"Parser::parse_long_arg({:?}): Found an arg with value '{:?}'\",\n                    long_arg, &long_value\n                );\n                let has_eq = long_value.is_some();\n                self.parse_opt_value(ident, long_value, arg, matcher, has_eq)\n            } else if let Some(rest) = long_value {\n                let required = self.cmd.required_graph();\n                debug!(\"Parser::parse_long_arg({long_arg:?}): Got invalid literal `{rest:?}`\");\n                let mut used: Vec<Id> = matcher\n                    .arg_ids()\n                    .filter(|arg_id| {\n                        matcher.check_explicit(arg_id, &crate::builder::ArgPredicate::IsPresent)\n                    })\n                    .filter(|&n| {\n                        self.cmd\n                            .find(n)\n                            .map(|a| !(a.is_hide_set() || required.contains(a.get_id())))\n                            .unwrap_or(true)\n                    })\n                    .cloned()\n                    .collect();\n                used.push(arg.get_id().clone());\n\n                Ok(ParseResult::UnneededAttachedValue {\n                    rest: rest.to_string_lossy().into_owned(),\n                    used,\n                    arg: arg.to_string(),\n                })\n            } else {\n                debug!(\"Parser::parse_long_arg({long_arg:?}): Presence validated\");\n                let trailing_idx = None;\n                self.react(\n                    Some(ident),\n                    ValueSource::CommandLine,\n                    arg,\n                    vec![],\n                    trailing_idx,\n                    matcher,\n                )\n            }\n        } else if let Some(sc_name) = self.possible_long_flag_subcommand(long_arg) {\n            Ok(ParseResult::FlagSubCommand(sc_name.to_string()))\n        } else if self\n            .cmd\n            .get_keymap()\n            .get(&pos_counter)\n            .map(|arg| arg.is_allow_hyphen_values_set() && !arg.is_last_set())\n            .unwrap_or_default()\n        {\n            debug!(\"Parser::parse_long_args: positional at {pos_counter} allows hyphens\");\n            Ok(ParseResult::MaybeHyphenValue)\n        } else {\n            Ok(ParseResult::NoMatchingArg {\n                arg: long_arg.to_owned(),\n            })\n        }\n    }\n\n    fn parse_short_arg(\n        &mut self,\n        matcher: &mut ArgMatcher,\n        mut short_arg: clap_lex::ShortFlags<'_>,\n        parse_state: &ParseState,\n        // change this to possible pos_arg when removing the usage of &mut Parser.\n        pos_counter: usize,\n        valid_arg_found: &mut bool,\n    ) -> ClapResult<ParseResult> {\n        debug!(\"Parser::parse_short_arg: short_arg={short_arg:?}\");\n\n        #[allow(clippy::blocks_in_conditions)]\n        if matches!(parse_state, ParseState::Opt(opt) | ParseState::Pos(opt)\n                if self.cmd[opt].is_allow_hyphen_values_set() || (self.cmd[opt].is_allow_negative_numbers_set() && short_arg.is_negative_number()))\n        {\n            debug!(\"Parser::parse_short_args: prior arg accepts hyphenated values\",);\n            return Ok(ParseResult::MaybeHyphenValue);\n        } else if self\n            .cmd\n            .get_keymap()\n            .get(&pos_counter)\n            .map(|arg| arg.is_allow_negative_numbers_set())\n            .unwrap_or_default()\n            && short_arg.is_negative_number()\n        {\n            debug!(\"Parser::parse_short_arg: negative number\");\n            return Ok(ParseResult::MaybeHyphenValue);\n        } else if self\n            .cmd\n            .get_keymap()\n            .get(&pos_counter)\n            .map(|arg| arg.is_allow_hyphen_values_set() && !arg.is_last_set())\n            .unwrap_or_default()\n            && short_arg\n                .clone()\n                .any(|c| !c.map(|c| self.cmd.contains_short(c)).unwrap_or_default())\n        {\n            debug!(\"Parser::parse_short_args: positional at {pos_counter} allows hyphens\");\n            return Ok(ParseResult::MaybeHyphenValue);\n        }\n\n        let mut ret = ParseResult::NoArg;\n\n        let skip = self.flag_subcmd_skip;\n        self.flag_subcmd_skip = 0;\n        let res = short_arg.advance_by(skip);\n        debug_assert_eq!(\n            res,\n            Ok(()),\n            \"tracking of `flag_subcmd_skip` is off for `{short_arg:?}`\"\n        );\n        while let Some(c) = short_arg.next_flag() {\n            let c = match c {\n                Ok(c) => c,\n                Err(rest) => {\n                    return Ok(ParseResult::NoMatchingArg {\n                        arg: format!(\"-{}\", rest.to_string_lossy()),\n                    });\n                }\n            };\n            debug!(\"Parser::parse_short_arg:iter:{c}\");\n\n            // Check for matching short options, and return the name if there is no trailing\n            // concatenated value: -oval\n            // Option: -o\n            // Value: val\n            if let Some(arg) = self.cmd.get_keymap().get(&c) {\n                let ident = Identifier::Short;\n                debug!(\"Parser::parse_short_arg:iter:{c}: Found valid opt or flag\");\n                *valid_arg_found = true;\n                if !arg.is_takes_value_set() {\n                    let arg_values = Vec::new();\n                    let trailing_idx = None;\n                    ret = ok!(self.react(\n                        Some(ident),\n                        ValueSource::CommandLine,\n                        arg,\n                        arg_values,\n                        trailing_idx,\n                        matcher,\n                    ));\n                    continue;\n                }\n\n                // Check for trailing concatenated value\n                //\n                // Cloning the iterator, so we rollback if it isn't there.\n                let val = short_arg.clone().next_value_os().unwrap_or_default();\n                debug!(\"Parser::parse_short_arg:iter:{c}: val={val:?}, short_arg={short_arg:?}\");\n                let val = Some(val).filter(|v| !v.is_empty());\n\n                // Default to \"we're expecting a value later\".\n                //\n                // If attached value is not consumed, we may have more short\n                // flags to parse, continue.\n                //\n                // e.g. `-xvf`, when require_equals && x.min_vals == 0, we don't\n                // consume the `vf`, even if it's provided as value.\n                let (val, has_eq) = if let Some(val) = val.and_then(|v| v.strip_prefix(\"=\")) {\n                    (Some(val), true)\n                } else {\n                    (val, false)\n                };\n                match ok!(self.parse_opt_value(ident, val, arg, matcher, has_eq)) {\n                    ParseResult::AttachedValueNotConsumed => continue,\n                    x => return Ok(x),\n                }\n            }\n\n            return if let Some(sc_name) = self.cmd.find_short_subcmd(c) {\n                debug!(\"Parser::parse_short_arg:iter:{c}: subcommand={sc_name}\");\n                // Make sure indices get updated before reading `self.cur_idx`\n                ok!(self.resolve_pending(matcher));\n                self.cur_idx.set(self.cur_idx.get() + 1);\n                debug!(\"Parser::parse_short_arg: cur_idx:={}\", self.cur_idx.get());\n\n                let name = sc_name.to_string();\n                // Get the index of the previously saved flag subcommand in the group of flags (if exists).\n                // If it is a new flag subcommand, then the formentioned index should be the current one\n                // (ie. `cur_idx`), and should be registered.\n                let cur_idx = self.cur_idx.get();\n                self.flag_subcmd_at.get_or_insert(cur_idx);\n                let done_short_args = short_arg.is_empty();\n                if done_short_args {\n                    self.flag_subcmd_at = None;\n                }\n                Ok(ParseResult::FlagSubCommand(name))\n            } else {\n                Ok(ParseResult::NoMatchingArg {\n                    arg: format!(\"-{c}\"),\n                })\n            };\n        }\n        Ok(ret)\n    }\n\n    fn parse_opt_value(\n        &self,\n        ident: Identifier,\n        attached_value: Option<&OsStr>,\n        arg: &Arg,\n        matcher: &mut ArgMatcher,\n        has_eq: bool,\n    ) -> ClapResult<ParseResult> {\n        debug!(\n            \"Parser::parse_opt_value; arg={}, val={:?}, has_eq={:?}\",\n            arg.get_id(),\n            attached_value,\n            has_eq\n        );\n        debug!(\"Parser::parse_opt_value; arg.settings={:?}\", arg.settings);\n\n        debug!(\"Parser::parse_opt_value; Checking for val...\");\n        // require_equals is set, but no '=' is provided, try throwing error.\n        if arg.is_require_equals_set() && !has_eq {\n            if arg.get_min_vals() == 0 {\n                debug!(\"Requires equals, but min_vals == 0\");\n                let arg_values = Vec::new();\n                let trailing_idx = None;\n                let react_result = ok!(self.react(\n                    Some(ident),\n                    ValueSource::CommandLine,\n                    arg,\n                    arg_values,\n                    trailing_idx,\n                    matcher,\n                ));\n                debug_assert_eq!(react_result, ParseResult::ValuesDone);\n                if attached_value.is_some() {\n                    Ok(ParseResult::AttachedValueNotConsumed)\n                } else {\n                    Ok(ParseResult::ValuesDone)\n                }\n            } else {\n                debug!(\"Requires equals but not provided. Error.\");\n                Ok(ParseResult::EqualsNotProvided {\n                    arg: arg.to_string(),\n                })\n            }\n        } else if let Some(v) = attached_value {\n            let arg_values = vec![v.to_owned()];\n            let trailing_idx = None;\n            let react_result = ok!(self.react(\n                Some(ident),\n                ValueSource::CommandLine,\n                arg,\n                arg_values,\n                trailing_idx,\n                matcher,\n            ));\n            debug_assert_eq!(react_result, ParseResult::ValuesDone);\n            // Attached are always done\n            Ok(ParseResult::ValuesDone)\n        } else {\n            debug!(\"Parser::parse_opt_value: More arg vals required...\");\n            ok!(self.resolve_pending(matcher));\n            let trailing_values = false;\n            matcher.pending_values_mut(arg.get_id(), Some(ident), trailing_values);\n            Ok(ParseResult::Opt(arg.get_id().clone()))\n        }\n    }\n\n    fn check_terminator(&self, arg: &Arg, val: &OsStr) -> Option<ParseResult> {\n        if Some(val) == arg.terminator.as_ref().map(|s| OsStr::new(s.as_str())) {\n            debug!(\"Parser::check_terminator: terminator={:?}\", arg.terminator);\n            Some(ParseResult::ValuesDone)\n        } else {\n            None\n        }\n    }\n\n    fn push_arg_values(\n        &self,\n        arg: &Arg,\n        raw_vals: Vec<OsString>,\n        source: ValueSource,\n        matcher: &mut ArgMatcher,\n    ) -> ClapResult<()> {\n        debug!(\"Parser::push_arg_values: {raw_vals:?}\");\n\n        for raw_val in raw_vals {\n            // update the current index because each value is a distinct index to clap\n            self.cur_idx.set(self.cur_idx.get() + 1);\n            debug!(\n                \"Parser::add_single_val_to_arg: cur_idx:={}\",\n                self.cur_idx.get()\n            );\n            let value_parser = arg.get_value_parser();\n            let val = ok!(value_parser.parse_ref(self.cmd, Some(arg), &raw_val, source));\n\n            matcher.add_val_to(arg.get_id(), val, raw_val);\n            matcher.add_index_to(arg.get_id(), self.cur_idx.get());\n        }\n\n        Ok(())\n    }\n\n    fn resolve_pending(&self, matcher: &mut ArgMatcher) -> ClapResult<()> {\n        let pending = match matcher.take_pending() {\n            Some(pending) => pending,\n            None => {\n                return Ok(());\n            }\n        };\n\n        debug!(\"Parser::resolve_pending: id={:?}\", pending.id);\n        let arg = self.cmd.find(&pending.id).expect(INTERNAL_ERROR_MSG);\n        let _ = ok!(self.react(\n            pending.ident,\n            ValueSource::CommandLine,\n            arg,\n            pending.raw_vals,\n            pending.trailing_idx,\n            matcher,\n        ));\n\n        Ok(())\n    }\n\n    fn react(\n        &self,\n        ident: Option<Identifier>,\n        source: ValueSource,\n        arg: &Arg,\n        mut raw_vals: Vec<OsString>,\n        mut trailing_idx: Option<usize>,\n        matcher: &mut ArgMatcher,\n    ) -> ClapResult<ParseResult> {\n        ok!(self.resolve_pending(matcher));\n\n        debug!(\n            \"Parser::react action={:?}, identifier={:?}, source={:?}\",\n            arg.get_action(),\n            ident,\n            source\n        );\n\n        // Process before `default_missing_values` to avoid it counting as values from the command\n        // line\n        if source == ValueSource::CommandLine {\n            ok!(self.verify_num_args(arg, &raw_vals));\n        }\n\n        if raw_vals.is_empty() {\n            // We assume this case is valid: require equals, but min_vals == 0.\n            if !arg.default_missing_vals.is_empty() {\n                debug!(\"Parser::react: has default_missing_vals\");\n                trailing_idx = None;\n                raw_vals.extend(\n                    arg.default_missing_vals\n                        .iter()\n                        .map(|s| s.as_os_str().to_owned()),\n                );\n            }\n        }\n\n        if let Some(val_delim) = arg.get_value_delimiter() {\n            if self.cmd.is_dont_delimit_trailing_values_set() && trailing_idx == Some(0) {\n                // Nothing to do\n            } else {\n                let mut val_delim_buffer = [0; 4];\n                let val_delim = val_delim.encode_utf8(&mut val_delim_buffer);\n                let mut split_raw_vals = Vec::with_capacity(raw_vals.len());\n                for (i, raw_val) in raw_vals.into_iter().enumerate() {\n                    if !raw_val.contains(val_delim)\n                        || (self.cmd.is_dont_delimit_trailing_values_set()\n                            && trailing_idx == Some(i))\n                    {\n                        split_raw_vals.push(raw_val);\n                    } else {\n                        split_raw_vals.extend(raw_val.split(val_delim).map(|x| x.to_owned()));\n                    }\n                }\n                raw_vals = split_raw_vals;\n            }\n        }\n\n        match arg.get_action() {\n            ArgAction::Set => {\n                if source == ValueSource::CommandLine\n                    && matches!(ident, Some(Identifier::Short) | Some(Identifier::Long))\n                {\n                    // Record flag's index\n                    self.cur_idx.set(self.cur_idx.get() + 1);\n                    debug!(\"Parser::react: cur_idx:={}\", self.cur_idx.get());\n                }\n                if matcher.remove(arg.get_id())\n                    && !(self.cmd.is_args_override_self() || arg.overrides.contains(arg.get_id()))\n                {\n                    return Err(ClapError::argument_conflict(\n                        self.cmd,\n                        arg.to_string(),\n                        vec![arg.to_string()],\n                        Usage::new(self.cmd).create_usage_with_title(&[]),\n                    ));\n                }\n                self.start_custom_arg(matcher, arg, source);\n                ok!(self.push_arg_values(arg, raw_vals, source, matcher));\n                if cfg!(debug_assertions) && matcher.needs_more_vals(arg) {\n                    debug!(\n                        \"Parser::react not enough values passed in, leaving it to the validator to complain\",\n                    );\n                }\n                Ok(ParseResult::ValuesDone)\n            }\n            ArgAction::Append => {\n                if source == ValueSource::CommandLine\n                    && matches!(ident, Some(Identifier::Short) | Some(Identifier::Long))\n                {\n                    // Record flag's index\n                    self.cur_idx.set(self.cur_idx.get() + 1);\n                    debug!(\"Parser::react: cur_idx:={}\", self.cur_idx.get());\n                }\n                self.start_custom_arg(matcher, arg, source);\n                ok!(self.push_arg_values(arg, raw_vals, source, matcher));\n                if cfg!(debug_assertions) && matcher.needs_more_vals(arg) {\n                    debug!(\n                        \"Parser::react not enough values passed in, leaving it to the validator to complain\",\n                    );\n                }\n                Ok(ParseResult::ValuesDone)\n            }\n            ArgAction::SetTrue => {\n                let raw_vals = if raw_vals.is_empty() {\n                    vec![OsString::from(\"true\")]\n                } else {\n                    raw_vals\n                };\n\n                if matcher.remove(arg.get_id())\n                    && !(self.cmd.is_args_override_self() || arg.overrides.contains(arg.get_id()))\n                {\n                    return Err(ClapError::argument_conflict(\n                        self.cmd,\n                        arg.to_string(),\n                        vec![arg.to_string()],\n                        Usage::new(self.cmd).create_usage_with_title(&[]),\n                    ));\n                }\n                self.start_custom_arg(matcher, arg, source);\n                ok!(self.push_arg_values(arg, raw_vals, source, matcher));\n                Ok(ParseResult::ValuesDone)\n            }\n            ArgAction::SetFalse => {\n                let raw_vals = if raw_vals.is_empty() {\n                    vec![OsString::from(\"false\")]\n                } else {\n                    raw_vals\n                };\n\n                if matcher.remove(arg.get_id())\n                    && !(self.cmd.is_args_override_self() || arg.overrides.contains(arg.get_id()))\n                {\n                    return Err(ClapError::argument_conflict(\n                        self.cmd,\n                        arg.to_string(),\n                        vec![arg.to_string()],\n                        Usage::new(self.cmd).create_usage_with_title(&[]),\n                    ));\n                }\n                self.start_custom_arg(matcher, arg, source);\n                ok!(self.push_arg_values(arg, raw_vals, source, matcher));\n                Ok(ParseResult::ValuesDone)\n            }\n            ArgAction::Count => {\n                let raw_vals = if raw_vals.is_empty() {\n                    let existing_value = *matcher\n                        .get_one::<crate::builder::CountType>(arg.get_id().as_str())\n                        .unwrap_or(&0);\n                    let next_value = existing_value.saturating_add(1);\n                    vec![OsString::from(next_value.to_string())]\n                } else {\n                    raw_vals\n                };\n\n                matcher.remove(arg.get_id());\n                self.start_custom_arg(matcher, arg, source);\n                ok!(self.push_arg_values(arg, raw_vals, source, matcher));\n                Ok(ParseResult::ValuesDone)\n            }\n            ArgAction::Help => {\n                let use_long = match ident {\n                    Some(Identifier::Long) => true,\n                    Some(Identifier::Short) => false,\n                    Some(Identifier::Index) => true,\n                    None => true,\n                };\n                debug!(\"Help: use_long={use_long}\");\n                Err(self.help_err(use_long))\n            }\n            ArgAction::HelpShort => {\n                let use_long = false;\n                debug!(\"Help: use_long={use_long}\");\n                Err(self.help_err(use_long))\n            }\n            ArgAction::HelpLong => {\n                let use_long = true;\n                debug!(\"Help: use_long={use_long}\");\n                Err(self.help_err(use_long))\n            }\n            ArgAction::Version => {\n                let use_long = match ident {\n                    Some(Identifier::Long) => true,\n                    Some(Identifier::Short) => false,\n                    Some(Identifier::Index) => true,\n                    None => true,\n                };\n                debug!(\"Version: use_long={use_long}\");\n                Err(self.version_err(use_long))\n            }\n        }\n    }\n\n    fn verify_num_args(&self, arg: &Arg, raw_vals: &[OsString]) -> ClapResult<()> {\n        if self.cmd.is_ignore_errors_set() {\n            return Ok(());\n        }\n\n        let actual = raw_vals.len();\n        let expected = arg.get_num_args().expect(INTERNAL_ERROR_MSG);\n\n        if 0 < expected.min_values() && actual == 0 {\n            // Issue 665 (https://github.com/clap-rs/clap/issues/665)\n            // Issue 1105 (https://github.com/clap-rs/clap/issues/1105)\n            return Err(ClapError::empty_value(\n                self.cmd,\n                &super::get_possible_values_cli(arg)\n                    .iter()\n                    .filter(|pv| !pv.is_hide_set())\n                    .map(|n| n.get_name().to_owned())\n                    .collect::<Vec<_>>(),\n                arg.to_string(),\n            ));\n        } else if let Some(expected) = expected.num_values() {\n            if expected != actual {\n                debug!(\"Validator::validate_arg_num_vals: Sending error WrongNumberOfValues\");\n                return Err(ClapError::wrong_number_of_values(\n                    self.cmd,\n                    arg.to_string(),\n                    expected,\n                    actual,\n                    Usage::new(self.cmd).create_usage_with_title(&[]),\n                ));\n            }\n        } else if actual < expected.min_values() {\n            return Err(ClapError::too_few_values(\n                self.cmd,\n                arg.to_string(),\n                expected.min_values(),\n                actual,\n                Usage::new(self.cmd).create_usage_with_title(&[]),\n            ));\n        } else if expected.max_values() < actual {\n            debug!(\"Validator::validate_arg_num_vals: Sending error TooManyValues\");\n            return Err(ClapError::too_many_values(\n                self.cmd,\n                raw_vals\n                    .last()\n                    .expect(INTERNAL_ERROR_MSG)\n                    .to_string_lossy()\n                    .into_owned(),\n                arg.to_string(),\n                Usage::new(self.cmd).create_usage_with_title(&[]),\n            ));\n        }\n\n        Ok(())\n    }\n\n    fn remove_overrides(&self, arg: &Arg, matcher: &mut ArgMatcher) {\n        debug!(\"Parser::remove_overrides: id={:?}\", arg.id);\n        for override_id in &arg.overrides {\n            debug!(\"Parser::remove_overrides:iter:{override_id:?}: removing\");\n            matcher.remove(override_id);\n        }\n\n        // Override anything that can override us\n        let mut transitive = Vec::new();\n        for arg_id in matcher.arg_ids() {\n            if let Some(overrider) = self.cmd.find(arg_id) {\n                if overrider.overrides.contains(arg.get_id()) {\n                    transitive.push(overrider.get_id());\n                }\n            }\n        }\n        for overrider_id in transitive {\n            debug!(\"Parser::remove_overrides:iter:{overrider_id:?}: removing\");\n            matcher.remove(overrider_id);\n        }\n    }\n\n    #[cfg(feature = \"env\")]\n    fn add_env(&mut self, matcher: &mut ArgMatcher) -> ClapResult<()> {\n        debug!(\"Parser::add_env\");\n\n        for arg in self.cmd.get_arguments() {\n            // Use env only if the arg was absent among command line args,\n            // early return if this is not the case.\n            if matcher.contains(&arg.id) {\n                debug!(\"Parser::add_env: Skipping existing arg `{arg}`\");\n                continue;\n            }\n\n            debug!(\"Parser::add_env: Checking arg `{arg}`\");\n            if let Some((_, Some(ref val))) = arg.env {\n                debug!(\"Parser::add_env: Found an opt with value={val:?}\");\n                let arg_values = vec![val.to_owned()];\n                let trailing_idx = None;\n                let _ = ok!(self.react(\n                    None,\n                    ValueSource::EnvVariable,\n                    arg,\n                    arg_values,\n                    trailing_idx,\n                    matcher,\n                ));\n            }\n        }\n\n        Ok(())\n    }\n\n    fn add_defaults(&self, matcher: &mut ArgMatcher) -> ClapResult<()> {\n        debug!(\"Parser::add_defaults\");\n\n        for arg in self.cmd.get_arguments() {\n            debug!(\"Parser::add_defaults:iter:{}:\", arg.get_id());\n            ok!(self.add_default_value(arg, matcher));\n        }\n\n        Ok(())\n    }\n\n    fn add_default_value(&self, arg: &Arg, matcher: &mut ArgMatcher) -> ClapResult<()> {\n        if !arg.default_vals_ifs.is_empty() {\n            debug!(\"Parser::add_default_value: has conditional defaults\");\n            if !matcher.contains(arg.get_id()) {\n                for (id, val, default) in arg.default_vals_ifs.iter() {\n                    let add = if let Some(a) = matcher.get(id) {\n                        match val {\n                            crate::builder::ArgPredicate::Equals(v) => {\n                                a.raw_vals_flatten().any(|value| v == value)\n                            }\n                            crate::builder::ArgPredicate::IsPresent => true,\n                        }\n                    } else {\n                        false\n                    };\n\n                    if add {\n                        if let Some(default) = default {\n                            let arg_values =\n                                default.iter().map(|os_str| os_str.to_os_string()).collect();\n                            let trailing_idx = None;\n                            let _ = ok!(self.react(\n                                None,\n                                ValueSource::DefaultValue,\n                                arg,\n                                arg_values,\n                                trailing_idx,\n                                matcher,\n                            ));\n                        }\n                        return Ok(());\n                    }\n                }\n            }\n        } else {\n            debug!(\"Parser::add_default_value: doesn't have conditional defaults\");\n        }\n\n        if !arg.default_vals.is_empty() {\n            debug!(\n                \"Parser::add_default_value:iter:{}: has default vals\",\n                arg.get_id()\n            );\n            if matcher.contains(arg.get_id()) {\n                debug!(\"Parser::add_default_value:iter:{}: was used\", arg.get_id());\n            // do nothing\n            } else {\n                debug!(\n                    \"Parser::add_default_value:iter:{}: wasn't used\",\n                    arg.get_id()\n                );\n                let arg_values: Vec<_> = arg\n                    .default_vals\n                    .iter()\n                    .map(crate::builder::OsStr::to_os_string)\n                    .collect();\n                let trailing_idx = None;\n                let _ = ok!(self.react(\n                    None,\n                    ValueSource::DefaultValue,\n                    arg,\n                    arg_values,\n                    trailing_idx,\n                    matcher,\n                ));\n            }\n        } else {\n            debug!(\n                \"Parser::add_default_value:iter:{}: doesn't have default vals\",\n                arg.get_id()\n            );\n\n            // do nothing\n        }\n\n        Ok(())\n    }\n\n    fn start_custom_arg(&self, matcher: &mut ArgMatcher, arg: &Arg, source: ValueSource) {\n        if source == ValueSource::CommandLine {\n            // With each new occurrence, remove overrides from prior occurrences\n            self.remove_overrides(arg, matcher);\n        }\n        matcher.start_custom_arg(arg, source);\n        if source.is_explicit() {\n            for group in self.cmd.groups_for_arg(arg.get_id()) {\n                matcher.start_custom_group(group.clone(), source);\n                matcher.add_val_to(\n                    &group,\n                    AnyValue::new(arg.get_id().clone()),\n                    OsString::from(arg.get_id().as_str()),\n                );\n            }\n        }\n    }\n}\n\n// Error, Help, and Version Methods\nimpl Parser<'_> {\n    /// Is only used for the long flag(which is the only one needs fuzzy searching)\n    fn did_you_mean_error(\n        &mut self,\n        arg: &str,\n        matcher: &mut ArgMatcher,\n        remaining_args: &[&OsStr],\n        trailing_values: bool,\n    ) -> ClapError {\n        debug!(\"Parser::did_you_mean_error: arg={arg}\");\n        // Didn't match a flag or option\n        let longs = self\n            .cmd\n            .get_keymap()\n            .keys()\n            .filter_map(|x| match x {\n                KeyType::Long(l) => Some(l.to_string_lossy().into_owned()),\n                _ => None,\n            })\n            .collect::<Vec<_>>();\n        debug!(\"Parser::did_you_mean_error: longs={longs:?}\");\n\n        let did_you_mean = suggestions::did_you_mean_flag(\n            arg,\n            remaining_args,\n            longs.iter().map(|x| &x[..]),\n            self.cmd.get_subcommands_mut(),\n        );\n\n        // Add the arg to the matches to build a proper usage string\n        if !self.cmd.is_ignore_errors_set() {\n            if let Some((name, _)) = did_you_mean.as_ref() {\n                if let Some(arg) = self.cmd.get_keymap().get(&name.as_ref()) {\n                    self.start_custom_arg(matcher, arg, ValueSource::CommandLine);\n                }\n            }\n        }\n        let did_you_mean = did_you_mean.map(|(arg, cmd)| (format!(\"--{arg}\"), cmd));\n\n        let required = self.cmd.required_graph();\n        let used: Vec<Id> = matcher\n            .arg_ids()\n            .filter(|arg_id| {\n                matcher.check_explicit(arg_id, &crate::builder::ArgPredicate::IsPresent)\n            })\n            .filter(|n| self.cmd.find(n).map(|a| !a.is_hide_set()).unwrap_or(false))\n            .cloned()\n            .collect();\n\n        // `did_you_mean` is a lot more likely and should cause us to skip the `--` suggestion\n        // with the one exception being that the CLI is trying to capture arguments\n        //\n        // In theory, this is only called for `--long`s, so we don't need to check\n        let suggested_trailing_arg = (did_you_mean.is_none()\n            || self\n                .cmd\n                .get_positionals()\n                .any(|arg| arg.is_last_set() || arg.is_trailing_var_arg_set()))\n            && !trailing_values\n            && self.cmd.has_positionals();\n        ClapError::unknown_argument(\n            self.cmd,\n            format!(\"--{arg}\"),\n            did_you_mean,\n            suggested_trailing_arg,\n            Usage::new(self.cmd)\n                .required(&required)\n                .create_usage_with_title(&used),\n        )\n    }\n\n    fn help_err(&self, use_long: bool) -> ClapError {\n        let styled = self.cmd.write_help_err(use_long);\n        ClapError::display_help(self.cmd, styled)\n    }\n\n    fn version_err(&self, use_long: bool) -> ClapError {\n        let styled = self.cmd.write_version_err(use_long);\n        ClapError::display_version(self.cmd, styled)\n    }\n}\n\n#[derive(Debug, PartialEq, Eq)]\npub(crate) enum ParseState {\n    ValuesDone,\n    Opt(Id),\n    Pos(Id),\n}\n\n/// Recoverable Parsing results.\n#[derive(Debug, PartialEq, Clone)]\n#[must_use]\nenum ParseResult {\n    FlagSubCommand(String),\n    Opt(Id),\n    ValuesDone,\n    /// Value attached to the short flag is not consumed(e.g. 'u' for `-cu` is\n    /// not consumed).\n    AttachedValueNotConsumed,\n    /// This long flag doesn't need a value but is provided one.\n    UnneededAttachedValue {\n        rest: String,\n        used: Vec<Id>,\n        arg: String,\n    },\n    /// This flag might be an hyphen Value.\n    MaybeHyphenValue,\n    /// Equals required but not provided.\n    EqualsNotProvided {\n        arg: String,\n    },\n    /// Failed to match a Arg.\n    NoMatchingArg {\n        arg: String,\n    },\n    /// No argument found e.g. parser is given `-` when parsing a flag.\n    NoArg,\n}\n\n#[derive(Clone, Debug, PartialEq, Eq)]\npub(crate) struct PendingArg {\n    pub(crate) id: Id,\n    pub(crate) ident: Option<Identifier>,\n    pub(crate) raw_vals: Vec<OsString>,\n    pub(crate) trailing_idx: Option<usize>,\n}\n\n#[derive(Copy, Clone, Debug, PartialEq, Eq)]\npub(crate) enum Identifier {\n    Short,\n    Long,\n    Index,\n}\n"
  },
  {
    "path": "clap_builder/src/parser/validator.rs",
    "content": "// Internal\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::builder::StyledStr;\nuse crate::builder::{Arg, ArgGroup, ArgPredicate, Command, PossibleValue};\nuse crate::error::{Error, Result as ClapResult};\nuse crate::output::Usage;\nuse crate::parser::ArgMatcher;\nuse crate::util::ChildGraph;\nuse crate::util::FlatMap;\nuse crate::util::FlatSet;\nuse crate::util::Id;\n\npub(crate) struct Validator<'cmd> {\n    cmd: &'cmd Command,\n    required: ChildGraph<Id>,\n}\n\nimpl<'cmd> Validator<'cmd> {\n    pub(crate) fn new(cmd: &'cmd Command) -> Self {\n        let required = cmd.required_graph();\n        Validator { cmd, required }\n    }\n\n    pub(crate) fn validate(&mut self, matcher: &mut ArgMatcher) -> ClapResult<()> {\n        debug!(\"Validator::validate\");\n        let conflicts = Conflicts::with_args(self.cmd, matcher);\n        let has_subcmd = matcher.subcommand_name().is_some();\n\n        if !has_subcmd && self.cmd.is_arg_required_else_help_set() {\n            let num_user_values = matcher\n                .args()\n                .filter(|(_, matched)| matched.check_explicit(&ArgPredicate::IsPresent))\n                .count();\n            if num_user_values == 0 {\n                let message = self.cmd.write_help_err(false);\n                return Err(Error::display_help_error(self.cmd, message));\n            }\n        }\n        if !has_subcmd && self.cmd.is_subcommand_required_set() {\n            let bn = self.cmd.get_bin_name_fallback();\n            return Err(Error::missing_subcommand(\n                self.cmd,\n                bn.to_string(),\n                self.cmd\n                    .all_subcommand_names()\n                    .map(|s| s.to_owned())\n                    .collect::<Vec<_>>(),\n                Usage::new(self.cmd)\n                    .required(&self.required)\n                    .create_usage_with_title(&[]),\n            ));\n        }\n\n        ok!(self.validate_conflicts(matcher, &conflicts));\n        if !(self.cmd.is_subcommand_negates_reqs_set() && has_subcmd) {\n            ok!(self.validate_required(matcher, &conflicts));\n        }\n\n        Ok(())\n    }\n\n    fn validate_conflicts(\n        &mut self,\n        matcher: &ArgMatcher,\n        conflicts: &Conflicts,\n    ) -> ClapResult<()> {\n        debug!(\"Validator::validate_conflicts\");\n\n        ok!(self.validate_exclusive(matcher));\n\n        for (arg_id, _) in matcher\n            .args()\n            .filter(|(_, matched)| matched.check_explicit(&ArgPredicate::IsPresent))\n            .filter(|(arg_id, _)| self.cmd.find(arg_id).is_some())\n        {\n            debug!(\"Validator::validate_conflicts::iter: id={arg_id:?}\");\n            let conflicts = conflicts.gather_conflicts(self.cmd, arg_id);\n            ok!(self.build_conflict_err(arg_id, &conflicts, matcher));\n        }\n\n        Ok(())\n    }\n\n    fn validate_exclusive(&self, matcher: &ArgMatcher) -> ClapResult<()> {\n        debug!(\"Validator::validate_exclusive\");\n        let args_count = matcher\n            .args()\n            .filter(|(arg_id, matched)| {\n                matched.check_explicit(&ArgPredicate::IsPresent)\n                    // Avoid including our own groups by checking none of them.  If a group is present, the\n                    // args for the group will be.\n                    && self.cmd.find(arg_id).is_some()\n            })\n            .count();\n        if args_count <= 1 {\n            // Nothing present to conflict with\n            return Ok(());\n        }\n\n        matcher\n            .args()\n            .filter(|(_, matched)| matched.check_explicit(&ArgPredicate::IsPresent))\n            .find_map(|(id, _)| {\n                debug!(\"Validator::validate_exclusive:iter:{id:?}\");\n                self.cmd\n                    .find(id)\n                    // Find `arg`s which are exclusive but also appear with other args.\n                    .filter(|&arg| arg.is_exclusive_set() && args_count > 1)\n            })\n            .map(|arg| {\n                // Throw an error for the first conflict found.\n                Err(Error::argument_conflict(\n                    self.cmd,\n                    arg.to_string(),\n                    Vec::new(),\n                    Usage::new(self.cmd)\n                        .required(&self.required)\n                        .create_usage_with_title(&[]),\n                ))\n            })\n            .unwrap_or(Ok(()))\n    }\n\n    fn build_conflict_err(\n        &self,\n        name: &Id,\n        conflict_ids: &[Id],\n        matcher: &ArgMatcher,\n    ) -> ClapResult<()> {\n        if conflict_ids.is_empty() {\n            return Ok(());\n        }\n\n        debug!(\"Validator::build_conflict_err: name={name:?}\");\n        let conflict_ids = conflict_ids\n            .iter()\n            .flat_map(|c_id| {\n                if self.cmd.find_group(c_id).is_some() {\n                    self.cmd.unroll_args_in_group(c_id)\n                } else {\n                    vec![c_id.clone()]\n                }\n            })\n            .collect::<FlatSet<_>>()\n            .into_vec();\n        let conflicts = conflict_ids\n            .iter()\n            .map(|c_id| {\n                let c_arg = self.cmd.find(c_id).expect(INTERNAL_ERROR_MSG);\n                c_arg.to_string()\n            })\n            .collect();\n\n        let former_arg = self.cmd.find(name).expect(INTERNAL_ERROR_MSG);\n        let usg = self.build_conflict_err_usage(matcher, &conflict_ids);\n        Err(Error::argument_conflict(\n            self.cmd,\n            former_arg.to_string(),\n            conflicts,\n            usg,\n        ))\n    }\n\n    fn build_conflict_err_usage(\n        &self,\n        matcher: &ArgMatcher,\n        conflicting_keys: &[Id],\n    ) -> Option<StyledStr> {\n        let used_filtered: Vec<Id> = matcher\n            .args()\n            .filter(|(_, matched)| matched.check_explicit(&ArgPredicate::IsPresent))\n            .map(|(n, _)| n)\n            .filter(|n| {\n                // Filter out the args we don't want to specify.\n                self.cmd\n                    .find(n)\n                    .map(|a| !a.is_hide_set())\n                    .unwrap_or_default()\n            })\n            .filter(|key| !conflicting_keys.contains(key))\n            .cloned()\n            .collect();\n        let required: Vec<Id> = used_filtered\n            .iter()\n            .filter_map(|key| self.cmd.find(key))\n            .flat_map(|arg| arg.requires.iter().map(|item| &item.1))\n            .filter(|key| !used_filtered.contains(key) && !conflicting_keys.contains(key))\n            .chain(used_filtered.iter())\n            .cloned()\n            .collect();\n        Usage::new(self.cmd)\n            .required(&self.required)\n            .create_usage_with_title(&required)\n    }\n\n    fn gather_requires(&mut self, matcher: &ArgMatcher) {\n        debug!(\"Validator::gather_requires\");\n        for (name, matched) in matcher\n            .args()\n            .filter(|(_, matched)| matched.check_explicit(&ArgPredicate::IsPresent))\n        {\n            debug!(\"Validator::gather_requires:iter:{name:?}\");\n            if let Some(arg) = self.cmd.find(name) {\n                let is_relevant = |(val, req_arg): &(ArgPredicate, Id)| -> Option<Id> {\n                    let required = matched.check_explicit(val);\n                    required.then(|| req_arg.clone())\n                };\n\n                for req in self.cmd.unroll_arg_requires(is_relevant, arg.get_id()) {\n                    self.required.insert(req);\n                }\n            } else if let Some(g) = self.cmd.find_group(name) {\n                debug!(\"Validator::gather_requires:iter:{name:?}:group\");\n                for r in &g.requires {\n                    self.required.insert(r.clone());\n                }\n            }\n        }\n    }\n\n    fn validate_required(&mut self, matcher: &ArgMatcher, conflicts: &Conflicts) -> ClapResult<()> {\n        debug!(\"Validator::validate_required: required={:?}\", self.required);\n        self.gather_requires(matcher);\n\n        let mut missing_required = Vec::new();\n        let mut highest_index = 0;\n\n        let is_exclusive_present = matcher\n            .args()\n            .filter(|(_, matched)| matched.check_explicit(&ArgPredicate::IsPresent))\n            .any(|(id, _)| {\n                self.cmd\n                    .find(id)\n                    .map(|arg| arg.is_exclusive_set())\n                    .unwrap_or_default()\n            });\n        debug!(\"Validator::validate_required: is_exclusive_present={is_exclusive_present}\");\n\n        for arg_or_group in self\n            .required\n            .iter()\n            .filter(|r| !matcher.check_explicit(r, &ArgPredicate::IsPresent))\n        {\n            debug!(\"Validator::validate_required:iter:aog={arg_or_group:?}\");\n            if let Some(arg) = self.cmd.find(arg_or_group) {\n                debug!(\"Validator::validate_required:iter: This is an arg\");\n                if !is_exclusive_present && !self.is_missing_required_ok(arg, conflicts) {\n                    debug!(\n                        \"Validator::validate_required:iter: Missing {:?}\",\n                        arg.get_id()\n                    );\n                    missing_required.push(arg.get_id().clone());\n                    if !arg.is_last_set() {\n                        highest_index = highest_index.max(arg.get_index().unwrap_or(0));\n                    }\n                }\n            } else if let Some(group) = self.cmd.find_group(arg_or_group) {\n                debug!(\"Validator::validate_required:iter: This is a group\");\n                if !self\n                    .cmd\n                    .unroll_args_in_group(&group.id)\n                    .iter()\n                    .any(|a| matcher.check_explicit(a, &ArgPredicate::IsPresent))\n                {\n                    debug!(\n                        \"Validator::validate_required:iter: Missing {:?}\",\n                        group.get_id()\n                    );\n                    missing_required.push(group.get_id().clone());\n                }\n            }\n        }\n\n        // Validate the conditionally required args\n        for a in self\n            .cmd\n            .get_arguments()\n            .filter(|a| !matcher.check_explicit(a.get_id(), &ArgPredicate::IsPresent))\n        {\n            let mut required = false;\n\n            for (other, val) in &a.r_ifs {\n                if matcher.check_explicit(other, &ArgPredicate::Equals(val.into())) {\n                    debug!(\n                        \"Validator::validate_required:iter: Missing {:?}\",\n                        a.get_id()\n                    );\n                    required = true;\n                }\n            }\n\n            let match_all = a.r_ifs_all.iter().all(|(other, val)| {\n                matcher.check_explicit(other, &ArgPredicate::Equals(val.into()))\n            });\n            if match_all && !a.r_ifs_all.is_empty() {\n                debug!(\n                    \"Validator::validate_required:iter: Missing {:?}\",\n                    a.get_id()\n                );\n                required = true;\n            }\n\n            if (!a.r_unless.is_empty() || !a.r_unless_all.is_empty())\n                && self.fails_arg_required_unless(a, matcher)\n            {\n                debug!(\n                    \"Validator::validate_required:iter: Missing {:?}\",\n                    a.get_id()\n                );\n                required = true;\n            }\n\n            if !is_exclusive_present && required {\n                missing_required.push(a.get_id().clone());\n                if !a.is_last_set() {\n                    highest_index = highest_index.max(a.get_index().unwrap_or(0));\n                }\n            }\n        }\n\n        // For display purposes, include all of the preceding positional arguments\n        if !self.cmd.is_allow_missing_positional_set() {\n            for pos in self\n                .cmd\n                .get_positionals()\n                .filter(|a| !matcher.check_explicit(a.get_id(), &ArgPredicate::IsPresent))\n            {\n                if pos.get_index() < Some(highest_index) {\n                    debug!(\n                        \"Validator::validate_required:iter: Missing {:?}\",\n                        pos.get_id()\n                    );\n                    missing_required.push(pos.get_id().clone());\n                }\n            }\n        }\n\n        if !missing_required.is_empty() {\n            ok!(self.missing_required_error(matcher, missing_required));\n        }\n\n        Ok(())\n    }\n\n    fn is_missing_required_ok(&self, a: &Arg, conflicts: &Conflicts) -> bool {\n        debug!(\"Validator::is_missing_required_ok: {}\", a.get_id());\n        if !conflicts.gather_conflicts(self.cmd, a.get_id()).is_empty() {\n            debug!(\"Validator::is_missing_required_ok: true (self)\");\n            return true;\n        }\n        for group_id in self.cmd.groups_for_arg(a.get_id()) {\n            if !conflicts.gather_conflicts(self.cmd, &group_id).is_empty() {\n                debug!(\"Validator::is_missing_required_ok: true ({group_id})\");\n                return true;\n            }\n        }\n        false\n    }\n\n    // Failing a required unless means, the arg's \"unless\" wasn't present, and neither were they\n    fn fails_arg_required_unless(&self, a: &Arg, matcher: &ArgMatcher) -> bool {\n        debug!(\"Validator::fails_arg_required_unless: a={:?}\", a.get_id());\n        let exists = |id| matcher.check_explicit(id, &ArgPredicate::IsPresent);\n\n        (a.r_unless_all.is_empty() || !a.r_unless_all.iter().all(exists))\n            && !a.r_unless.iter().any(exists)\n    }\n\n    // `req_args`: an arg to include in the error even if not used\n    fn missing_required_error(\n        &self,\n        matcher: &ArgMatcher,\n        raw_req_args: Vec<Id>,\n    ) -> ClapResult<()> {\n        debug!(\"Validator::missing_required_error; incl={raw_req_args:?}\");\n        debug!(\n            \"Validator::missing_required_error: reqs={:?}\",\n            self.required\n        );\n\n        let usg = Usage::new(self.cmd).required(&self.required);\n\n        let req_args = {\n            #[cfg(feature = \"usage\")]\n            {\n                usg.get_required_usage_from(&raw_req_args, Some(matcher), true)\n                    .into_iter()\n                    .map(|s| s.to_string())\n                    .collect::<Vec<_>>()\n            }\n\n            #[cfg(not(feature = \"usage\"))]\n            {\n                raw_req_args\n                    .iter()\n                    .map(|id| {\n                        if let Some(arg) = self.cmd.find(id) {\n                            arg.to_string()\n                        } else if let Some(_group) = self.cmd.find_group(id) {\n                            self.cmd.format_group(id).to_string()\n                        } else {\n                            debug_assert!(false, \"id={id:?} is unknown\");\n                            \"\".to_owned()\n                        }\n                    })\n                    .collect::<FlatSet<_>>()\n                    .into_iter()\n                    .collect::<Vec<_>>()\n            }\n        };\n\n        debug!(\"Validator::missing_required_error: req_args={req_args:#?}\");\n\n        let used: Vec<Id> = matcher\n            .args()\n            .filter(|(_, matched)| matched.check_explicit(&ArgPredicate::IsPresent))\n            .map(|(n, _)| n)\n            .filter(|n| {\n                // Filter out the args we don't want to specify.\n                self.cmd\n                    .find(n)\n                    .map(|a| !a.is_hide_set())\n                    .unwrap_or_default()\n            })\n            .cloned()\n            .chain(raw_req_args)\n            .collect();\n\n        Err(Error::missing_required_argument(\n            self.cmd,\n            req_args,\n            usg.create_usage_with_title(&used),\n        ))\n    }\n}\n\n#[derive(Default, Clone, Debug)]\nstruct Conflicts {\n    potential: FlatMap<Id, Vec<Id>>,\n}\n\nimpl Conflicts {\n    fn with_args(cmd: &Command, matcher: &ArgMatcher) -> Self {\n        let mut potential = FlatMap::new();\n        potential.extend_unchecked(\n            matcher\n                .args()\n                .filter(|(_, matched)| matched.check_explicit(&ArgPredicate::IsPresent))\n                .map(|(id, _)| {\n                    let conf = gather_direct_conflicts(cmd, id);\n                    (id.clone(), conf)\n                }),\n        );\n        Self { potential }\n    }\n\n    fn gather_conflicts(&self, cmd: &Command, arg_id: &Id) -> Vec<Id> {\n        debug!(\"Conflicts::gather_conflicts: arg={arg_id:?}\");\n        let mut conflicts = Vec::new();\n\n        let arg_id_conflicts_storage;\n        let arg_id_conflicts = if let Some(arg_id_conflicts) = self.get_direct_conflicts(arg_id) {\n            arg_id_conflicts\n        } else {\n            // `is_missing_required_ok` is a case where we check not-present args for conflicts\n            arg_id_conflicts_storage = gather_direct_conflicts(cmd, arg_id);\n            &arg_id_conflicts_storage\n        };\n        for (other_arg_id, other_arg_id_conflicts) in self.potential.iter() {\n            if arg_id == other_arg_id {\n                continue;\n            }\n\n            if arg_id_conflicts.contains(other_arg_id) {\n                conflicts.push(other_arg_id.clone());\n            }\n            if other_arg_id_conflicts.contains(arg_id) {\n                conflicts.push(other_arg_id.clone());\n            }\n        }\n\n        debug!(\"Conflicts::gather_conflicts: conflicts={conflicts:?}\");\n        conflicts\n    }\n\n    fn get_direct_conflicts(&self, arg_id: &Id) -> Option<&[Id]> {\n        self.potential.get(arg_id).map(Vec::as_slice)\n    }\n}\n\nfn gather_direct_conflicts(cmd: &Command, id: &Id) -> Vec<Id> {\n    let conf = if let Some(arg) = cmd.find(id) {\n        gather_arg_direct_conflicts(cmd, arg)\n    } else if let Some(group) = cmd.find_group(id) {\n        gather_group_direct_conflicts(group)\n    } else {\n        debug_assert!(false, \"id={id:?} is unknown\");\n        Vec::new()\n    };\n    debug!(\"Conflicts::gather_direct_conflicts id={id:?}, conflicts={conf:?}\",);\n    conf\n}\n\nfn gather_arg_direct_conflicts(cmd: &Command, arg: &Arg) -> Vec<Id> {\n    let mut conf = arg.blacklist.clone();\n    for group_id in cmd.groups_for_arg(arg.get_id()) {\n        let group = cmd.find_group(&group_id).expect(INTERNAL_ERROR_MSG);\n        conf.extend(group.conflicts.iter().cloned());\n        if !group.multiple {\n            for member_id in &group.args {\n                if member_id != arg.get_id() {\n                    conf.push(member_id.clone());\n                }\n            }\n        }\n    }\n\n    // Overrides are implicitly conflicts\n    conf.extend(arg.overrides.iter().cloned());\n\n    conf\n}\n\nfn gather_group_direct_conflicts(group: &ArgGroup) -> Vec<Id> {\n    group.conflicts.clone()\n}\n\npub(crate) fn get_possible_values_cli(a: &Arg) -> Vec<PossibleValue> {\n    if !a.is_takes_value_set() {\n        vec![]\n    } else {\n        a.get_value_parser()\n            .possible_values()\n            .map(|pvs| pvs.collect())\n            .unwrap_or_default()\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/util/any_value.rs",
    "content": "#[derive(Clone)]\npub(crate) struct AnyValue {\n    inner: std::sync::Arc<dyn std::any::Any + Send + Sync + 'static>,\n    // While we can extract `TypeId` from `inner`, the debug repr is of a number, so let's track\n    // the type_name in debug builds.\n    id: AnyValueId,\n}\n\nimpl AnyValue {\n    pub(crate) fn new<V: std::any::Any + Clone + Send + Sync + 'static>(inner: V) -> Self {\n        let id = AnyValueId::of::<V>();\n        let inner = std::sync::Arc::new(inner);\n        Self { inner, id }\n    }\n\n    pub(crate) fn downcast_ref<T: std::any::Any + Clone + Send + Sync + 'static>(\n        &self,\n    ) -> Option<&T> {\n        self.inner.downcast_ref::<T>()\n    }\n\n    pub(crate) fn downcast_into<T: std::any::Any + Clone + Send + Sync>(self) -> Result<T, Self> {\n        let id = self.id;\n        let value =\n            ok!(std::sync::Arc::downcast::<T>(self.inner).map_err(|inner| Self { inner, id }));\n        let value = std::sync::Arc::try_unwrap(value).unwrap_or_else(|arc| (*arc).clone());\n        Ok(value)\n    }\n\n    pub(crate) fn type_id(&self) -> AnyValueId {\n        self.id\n    }\n}\n\nimpl std::fmt::Debug for AnyValue {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {\n        f.debug_struct(\"AnyValue\").field(\"inner\", &self.id).finish()\n    }\n}\n\n#[derive(Copy, Clone)]\npub struct AnyValueId {\n    type_id: std::any::TypeId,\n    #[cfg(debug_assertions)]\n    type_name: &'static str,\n}\n\nimpl AnyValueId {\n    pub(crate) fn of<A: ?Sized + 'static>() -> Self {\n        Self {\n            type_id: std::any::TypeId::of::<A>(),\n            #[cfg(debug_assertions)]\n            type_name: std::any::type_name::<A>(),\n        }\n    }\n}\n\nimpl PartialEq for AnyValueId {\n    fn eq(&self, other: &Self) -> bool {\n        self.type_id == other.type_id\n    }\n}\n\nimpl Eq for AnyValueId {}\n\nimpl PartialOrd for AnyValueId {\n    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nimpl PartialEq<std::any::TypeId> for AnyValueId {\n    fn eq(&self, other: &std::any::TypeId) -> bool {\n        self.type_id == *other\n    }\n}\n\nimpl Ord for AnyValueId {\n    fn cmp(&self, other: &Self) -> std::cmp::Ordering {\n        self.type_id.cmp(&other.type_id)\n    }\n}\n\nimpl std::hash::Hash for AnyValueId {\n    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {\n        self.type_id.hash(state);\n    }\n}\n\nimpl std::fmt::Debug for AnyValueId {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {\n        #[cfg(not(debug_assertions))]\n        {\n            self.type_id.fmt(f)\n        }\n        #[cfg(debug_assertions)]\n        {\n            f.debug_struct(self.type_name).finish()\n        }\n    }\n}\n\nimpl<'a, A: ?Sized + 'static> From<&'a A> for AnyValueId {\n    fn from(_: &'a A) -> Self {\n        Self::of::<A>()\n    }\n}\n\n#[cfg(test)]\nmod test {\n    #[test]\n    #[cfg(debug_assertions)]\n    fn debug_impl() {\n        use super::*;\n\n        assert_eq!(format!(\"{:?}\", AnyValue::new(5)), \"AnyValue { inner: i32 }\");\n    }\n\n    #[test]\n    fn eq_to_type_id() {\n        use super::*;\n\n        let any_value_id = AnyValueId::of::<i32>();\n        let type_id = std::any::TypeId::of::<i32>();\n        assert_eq!(any_value_id, type_id);\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/util/color.rs",
    "content": "use crate::builder::PossibleValue;\nuse crate::derive::ValueEnum;\n\n/// Represents the color preferences for program output\n#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)]\npub enum ColorChoice {\n    /// Enables colored output only when the output is going to a terminal or TTY.\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** This is the default behavior of `clap`.\n    ///\n    /// </div>\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"color\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, ColorChoice};\n    /// Command::new(\"myprog\")\n    ///     .color(ColorChoice::Auto)\n    ///     .get_matches();\n    /// # }\n    /// ```\n    #[default]\n    Auto,\n\n    /// Enables colored output regardless of whether or not the output is going to a terminal/TTY.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"color\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, ColorChoice};\n    /// Command::new(\"myprog\")\n    ///     .color(ColorChoice::Always)\n    ///     .get_matches();\n    /// # }\n    /// ```\n    Always,\n\n    /// Disables colored output no matter if the output is going to a terminal/TTY, or not.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"color\")] {\n    /// # use clap_builder as clap;\n    /// # use clap::{Command, ColorChoice};\n    /// Command::new(\"myprog\")\n    ///     .color(ColorChoice::Never)\n    ///     .get_matches();\n    /// # }\n    /// ```\n    Never,\n}\n\nimpl ColorChoice {\n    /// Report all `possible_values`\n    pub fn possible_values() -> impl Iterator<Item = PossibleValue> {\n        Self::value_variants()\n            .iter()\n            .filter_map(ValueEnum::to_possible_value)\n    }\n}\n\nimpl std::fmt::Display for ColorChoice {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.to_possible_value()\n            .expect(\"no values are skipped\")\n            .get_name()\n            .fmt(f)\n    }\n}\n\nimpl std::str::FromStr for ColorChoice {\n    type Err = String;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        for variant in Self::value_variants() {\n            if variant.to_possible_value().unwrap().matches(s, false) {\n                return Ok(*variant);\n            }\n        }\n        Err(format!(\"invalid variant: {s}\"))\n    }\n}\n\nimpl ValueEnum for ColorChoice {\n    fn value_variants<'a>() -> &'a [Self] {\n        &[Self::Auto, Self::Always, Self::Never]\n    }\n\n    fn to_possible_value(&self) -> Option<PossibleValue> {\n        Some(match self {\n            Self::Auto => PossibleValue::new(\"auto\"),\n            Self::Always => PossibleValue::new(\"always\"),\n            Self::Never => PossibleValue::new(\"never\"),\n        })\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/util/escape.rs",
    "content": "#[cfg(feature = \"help\")]\nuse std::borrow::Cow;\n\npub(crate) struct Escape<'s>(pub(crate) &'s str);\n\nimpl<'s> Escape<'s> {\n    pub(crate) fn needs_escaping(&self) -> bool {\n        self.0.is_empty() || self.0.contains(char::is_whitespace)\n    }\n\n    #[cfg(feature = \"help\")]\n    pub(crate) fn to_cow(&self) -> Cow<'s, str> {\n        if self.needs_escaping() {\n            Cow::Owned(format!(\"{:?}\", self.0))\n        } else {\n            Cow::Borrowed(self.0)\n        }\n    }\n}\n\nimpl std::fmt::Display for Escape<'_> {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        if self.needs_escaping() {\n            std::fmt::Debug::fmt(self.0, f)\n        } else {\n            self.0.fmt(f)\n        }\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/util/flat_map.rs",
    "content": "#![allow(dead_code)]\n\nuse std::borrow::Borrow;\n\n/// Flat (Vec) backed map\n///\n/// This preserves insertion order\n#[derive(Clone, Debug, PartialEq, Eq)]\npub(crate) struct FlatMap<K, V> {\n    keys: Vec<K>,\n    values: Vec<V>,\n}\n\nimpl<K: PartialEq + Eq, V> FlatMap<K, V> {\n    pub(crate) fn new() -> Self {\n        Default::default()\n    }\n\n    pub(crate) fn insert(&mut self, key: K, mut value: V) -> Option<V> {\n        for (index, existing) in self.keys.iter().enumerate() {\n            if *existing == key {\n                std::mem::swap(&mut self.values[index], &mut value);\n                return Some(value);\n            }\n        }\n\n        self.insert_unchecked(key, value);\n        None\n    }\n\n    pub(crate) fn insert_unchecked(&mut self, key: K, value: V) {\n        self.keys.push(key);\n        self.values.push(value);\n    }\n\n    pub(crate) fn extend_unchecked(&mut self, iter: impl IntoIterator<Item = (K, V)>) {\n        for (key, value) in iter {\n            self.insert_unchecked(key, value);\n        }\n    }\n\n    pub(crate) fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool\n    where\n        K: Borrow<Q>,\n        Q: Eq,\n    {\n        for existing in &self.keys {\n            if existing.borrow() == key {\n                return true;\n            }\n        }\n        false\n    }\n\n    pub(crate) fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>\n    where\n        K: Borrow<Q>,\n        Q: std::hash::Hash + Eq,\n    {\n        self.remove_entry(key).map(|(_, v)| v)\n    }\n\n    pub(crate) fn remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)>\n    where\n        K: Borrow<Q>,\n        Q: std::hash::Hash + Eq,\n    {\n        let index = some!(\n            self.keys\n                .iter()\n                .enumerate()\n                .find_map(|(i, k)| (k.borrow() == key).then_some(i))\n        );\n        let key = self.keys.remove(index);\n        let value = self.values.remove(index);\n        Some((key, value))\n    }\n\n    pub(crate) fn is_empty(&self) -> bool {\n        self.keys.is_empty()\n    }\n\n    pub(crate) fn entry(&mut self, key: K) -> Entry<'_, K, V> {\n        for (index, existing) in self.keys.iter().enumerate() {\n            if *existing == key {\n                return Entry::Occupied(OccupiedEntry { v: self, index });\n            }\n        }\n        Entry::Vacant(VacantEntry { v: self, key })\n    }\n\n    pub(crate) fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>\n    where\n        K: Borrow<Q>,\n        Q: Eq,\n    {\n        for (index, existing) in self.keys.iter().enumerate() {\n            if existing.borrow() == k {\n                return Some(&self.values[index]);\n            }\n        }\n        None\n    }\n\n    pub(crate) fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V>\n    where\n        K: Borrow<Q>,\n        Q: Eq,\n    {\n        for (index, existing) in self.keys.iter().enumerate() {\n            if existing.borrow() == k {\n                return Some(&mut self.values[index]);\n            }\n        }\n        None\n    }\n\n    pub(crate) fn keys(&self) -> std::slice::Iter<'_, K> {\n        self.keys.iter()\n    }\n\n    pub(crate) fn values(&self) -> std::slice::Iter<'_, V> {\n        self.values.iter()\n    }\n\n    pub(crate) fn iter(&self) -> Iter<'_, K, V> {\n        Iter {\n            keys: self.keys.iter(),\n            values: self.values.iter(),\n        }\n    }\n\n    pub(crate) fn iter_mut(&mut self) -> IterMut<'_, K, V> {\n        IterMut {\n            keys: self.keys.iter_mut(),\n            values: self.values.iter_mut(),\n        }\n    }\n}\n\nimpl<K: PartialEq + Eq, V> Default for FlatMap<K, V> {\n    fn default() -> Self {\n        Self {\n            keys: Default::default(),\n            values: Default::default(),\n        }\n    }\n}\n\npub(crate) enum Entry<'a, K, V> {\n    Vacant(VacantEntry<'a, K, V>),\n    Occupied(OccupiedEntry<'a, K, V>),\n}\n\nimpl<'a, K: 'a, V: 'a> Entry<'a, K, V> {\n    pub(crate) fn or_insert(self, default: V) -> &'a mut V {\n        match self {\n            Entry::Occupied(entry) => &mut entry.v.values[entry.index],\n            Entry::Vacant(entry) => {\n                entry.v.keys.push(entry.key);\n                entry.v.values.push(default);\n                entry.v.values.last_mut().unwrap()\n            }\n        }\n    }\n\n    pub(crate) fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {\n        match self {\n            Entry::Occupied(entry) => &mut entry.v.values[entry.index],\n            Entry::Vacant(entry) => {\n                entry.v.keys.push(entry.key);\n                entry.v.values.push(default());\n                entry.v.values.last_mut().unwrap()\n            }\n        }\n    }\n}\n\npub(crate) struct VacantEntry<'a, K, V> {\n    v: &'a mut FlatMap<K, V>,\n    key: K,\n}\n\npub(crate) struct OccupiedEntry<'a, K, V> {\n    v: &'a mut FlatMap<K, V>,\n    index: usize,\n}\n\npub(crate) struct Iter<'a, K, V> {\n    keys: std::slice::Iter<'a, K>,\n    values: std::slice::Iter<'a, V>,\n}\n\nimpl<'a, K, V> Iterator for Iter<'a, K, V> {\n    type Item = (&'a K, &'a V);\n\n    fn next(&mut self) -> Option<(&'a K, &'a V)> {\n        match self.keys.next() {\n            Some(k) => {\n                let v = self.values.next().unwrap();\n                Some((k, v))\n            }\n            None => None,\n        }\n    }\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        self.keys.size_hint()\n    }\n}\n\nimpl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {\n    fn next_back(&mut self) -> Option<(&'a K, &'a V)> {\n        match self.keys.next_back() {\n            Some(k) => {\n                let v = self.values.next_back().unwrap();\n                Some((k, v))\n            }\n            None => None,\n        }\n    }\n}\n\nimpl<K, V> ExactSizeIterator for Iter<'_, K, V> {}\n\npub(crate) struct IterMut<'a, K, V> {\n    keys: std::slice::IterMut<'a, K>,\n    values: std::slice::IterMut<'a, V>,\n}\n\nimpl<'a, K, V> Iterator for IterMut<'a, K, V> {\n    type Item = (&'a K, &'a mut V);\n\n    fn next(&mut self) -> Option<(&'a K, &'a mut V)> {\n        match self.keys.next() {\n            Some(k) => {\n                let v = self.values.next().unwrap();\n                Some((k, v))\n            }\n            None => None,\n        }\n    }\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        self.keys.size_hint()\n    }\n}\n\nimpl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {\n    fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {\n        match self.keys.next_back() {\n            Some(k) => {\n                let v = self.values.next_back().unwrap();\n                Some((k, v))\n            }\n            None => None,\n        }\n    }\n}\n\nimpl<K, V> ExactSizeIterator for IterMut<'_, K, V> {}\n"
  },
  {
    "path": "clap_builder/src/util/flat_set.rs",
    "content": "#![allow(dead_code)]\n\nuse std::borrow::Borrow;\n\n/// Flat (Vec) backed set\n///\n/// This preserves insertion order\n#[derive(Clone, Debug, PartialEq, Eq)]\npub(crate) struct FlatSet<T> {\n    inner: Vec<T>,\n}\n\nimpl<T: PartialEq + Eq> FlatSet<T> {\n    pub(crate) fn new() -> Self {\n        Default::default()\n    }\n\n    pub(crate) fn insert(&mut self, value: T) -> bool {\n        for existing in &self.inner {\n            if *existing == value {\n                return false;\n            }\n        }\n        self.inner.push(value);\n        true\n    }\n\n    pub(crate) fn contains<Q: ?Sized>(&self, value: &Q) -> bool\n    where\n        T: Borrow<Q>,\n        Q: Eq,\n    {\n        for existing in &self.inner {\n            if existing.borrow() == value {\n                return true;\n            }\n        }\n        false\n    }\n\n    pub(crate) fn retain<F>(&mut self, f: F)\n    where\n        F: FnMut(&T) -> bool,\n    {\n        self.inner.retain(f);\n    }\n\n    pub(crate) fn is_empty(&self) -> bool {\n        self.inner.is_empty()\n    }\n\n    pub(crate) fn iter(&self) -> std::slice::Iter<'_, T> {\n        self.inner.iter()\n    }\n\n    pub(crate) fn sort_by_key<K, F>(&mut self, f: F)\n    where\n        F: FnMut(&T) -> K,\n        K: Ord,\n    {\n        self.inner.sort_by_key(f);\n    }\n\n    pub(crate) fn into_vec(self) -> Vec<T> {\n        self.inner\n    }\n}\n\nimpl<T: PartialEq + Eq> Default for FlatSet<T> {\n    fn default() -> Self {\n        Self {\n            inner: Default::default(),\n        }\n    }\n}\n\nimpl<T: PartialEq + Eq> IntoIterator for FlatSet<T> {\n    type Item = T;\n    type IntoIter = std::vec::IntoIter<T>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        self.inner.into_iter()\n    }\n}\n\nimpl<'s, T: PartialEq + Eq> IntoIterator for &'s FlatSet<T> {\n    type Item = &'s T;\n    type IntoIter = std::slice::Iter<'s, T>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        self.inner.iter()\n    }\n}\n\nimpl<T: PartialEq + Eq> Extend<T> for FlatSet<T> {\n    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {\n        for value in iter {\n            self.insert(value);\n        }\n    }\n}\n\nimpl<T: PartialEq + Eq> FromIterator<T> for FlatSet<T> {\n    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {\n        let mut set = Self::new();\n        for value in iter {\n            set.insert(value);\n        }\n        set\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/util/graph.rs",
    "content": "#[derive(Debug)]\nstruct Child<T> {\n    id: T,\n    children: Vec<usize>,\n}\n\nimpl<T> Child<T> {\n    fn new(id: T) -> Self {\n        Child {\n            id,\n            children: vec![],\n        }\n    }\n}\n\n#[derive(Debug)]\npub(crate) struct ChildGraph<T>(Vec<Child<T>>);\n\nimpl<T> ChildGraph<T>\nwhere\n    T: Sized + PartialEq + Clone,\n{\n    pub(crate) fn with_capacity(s: usize) -> Self {\n        ChildGraph(Vec::with_capacity(s))\n    }\n\n    pub(crate) fn insert(&mut self, req: T) -> usize {\n        self.0.iter().position(|e| e.id == req).unwrap_or_else(|| {\n            let idx = self.0.len();\n            self.0.push(Child::new(req));\n            idx\n        })\n    }\n\n    pub(crate) fn insert_child(&mut self, parent: usize, child: T) -> usize {\n        let c_idx = self.0.len();\n        self.0.push(Child::new(child));\n        self.0[parent].children.push(c_idx);\n        c_idx\n    }\n\n    pub(crate) fn iter(&self) -> impl Iterator<Item = &T> {\n        self.0.iter().map(|r| &r.id)\n    }\n\n    pub(crate) fn contains(&self, req: &T) -> bool {\n        self.0.iter().any(|r| r.id == *req)\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/util/id.rs",
    "content": "use crate::builder::Str;\n#[cfg(feature = \"string\")]\nuse std::borrow::Cow;\n\n/// [`Arg`][crate::Arg] or [`ArgGroup`][crate::ArgGroup] identifier\n///\n/// This is used for accessing the value in [`ArgMatches`][crate::ArgMatches] or defining\n/// relationships between `Arg`s and `ArgGroup`s with functions like\n/// [`Arg::conflicts_with`][crate::Arg::conflicts_with].\n#[derive(Default, Clone, Eq, PartialEq, PartialOrd, Ord, Hash)]\npub struct Id(Str);\n\nimpl Id {\n    pub(crate) const HELP: &'static str = \"help\";\n    pub(crate) const VERSION: &'static str = \"version\";\n    pub(crate) const EXTERNAL: &'static str = \"\";\n\n    pub(crate) fn from_static_ref(name: &'static str) -> Self {\n        Self(Str::from_static_ref(name))\n    }\n\n    /// Get the raw string of the `Id`\n    pub fn as_str(&self) -> &str {\n        self.0.as_str()\n    }\n\n    pub(crate) fn as_internal_str(&self) -> &Str {\n        &self.0\n    }\n}\n\nimpl From<&'_ Id> for Id {\n    fn from(id: &'_ Id) -> Self {\n        id.clone()\n    }\n}\n\nimpl From<Str> for Id {\n    fn from(name: Str) -> Self {\n        Self(name)\n    }\n}\n\nimpl From<&'_ Str> for Id {\n    fn from(name: &'_ Str) -> Self {\n        Self(name.into())\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<String> for Id {\n    fn from(name: String) -> Self {\n        Self(name.into())\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<&'_ String> for Id {\n    fn from(name: &'_ String) -> Self {\n        Self(name.into())\n    }\n}\n\nimpl From<&'static str> for Id {\n    fn from(name: &'static str) -> Self {\n        Self(name.into())\n    }\n}\n\nimpl From<&'_ &'static str> for Id {\n    fn from(name: &'_ &'static str) -> Self {\n        Self(name.into())\n    }\n}\n\nimpl From<Id> for Str {\n    fn from(name: Id) -> Self {\n        name.0\n    }\n}\n\n#[cfg(feature = \"string\")]\nimpl From<Cow<'static, str>> for Id {\n    fn from(name: Cow<'static, str>) -> Self {\n        Self(name.into())\n    }\n}\n\nimpl From<Id> for String {\n    fn from(name: Id) -> Self {\n        Str::from(name).into()\n    }\n}\n\nimpl std::fmt::Display for Id {\n    #[inline]\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        std::fmt::Display::fmt(self.as_str(), f)\n    }\n}\n\nimpl std::fmt::Debug for Id {\n    #[inline]\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        std::fmt::Debug::fmt(self.as_str(), f)\n    }\n}\n\nimpl AsRef<str> for Id {\n    #[inline]\n    fn as_ref(&self) -> &str {\n        self.as_str()\n    }\n}\n\nimpl std::borrow::Borrow<str> for Id {\n    #[inline]\n    fn borrow(&self) -> &str {\n        self.as_str()\n    }\n}\n\nimpl PartialEq<str> for Id {\n    #[inline]\n    fn eq(&self, other: &str) -> bool {\n        PartialEq::eq(self.as_str(), other)\n    }\n}\nimpl PartialEq<Id> for str {\n    #[inline]\n    fn eq(&self, other: &Id) -> bool {\n        PartialEq::eq(self, other.as_str())\n    }\n}\n\nimpl PartialEq<&'_ str> for Id {\n    #[inline]\n    fn eq(&self, other: &&str) -> bool {\n        PartialEq::eq(self.as_str(), *other)\n    }\n}\nimpl PartialEq<Id> for &'_ str {\n    #[inline]\n    fn eq(&self, other: &Id) -> bool {\n        PartialEq::eq(*self, other.as_str())\n    }\n}\n\nimpl PartialEq<Str> for Id {\n    #[inline]\n    fn eq(&self, other: &Str) -> bool {\n        PartialEq::eq(self.as_str(), other.as_str())\n    }\n}\nimpl PartialEq<Id> for Str {\n    #[inline]\n    fn eq(&self, other: &Id) -> bool {\n        PartialEq::eq(self.as_str(), other.as_str())\n    }\n}\n\nimpl PartialEq<String> for Id {\n    #[inline]\n    fn eq(&self, other: &String) -> bool {\n        PartialEq::eq(self.as_str(), other.as_str())\n    }\n}\nimpl PartialEq<Id> for String {\n    #[inline]\n    fn eq(&self, other: &Id) -> bool {\n        PartialEq::eq(other, self)\n    }\n}\n\n#[cfg(test)]\n#[cfg(feature = \"string\")]\nmod tests {\n    use super::*;\n\n    #[test]\n    #[cfg(feature = \"string\")]\n    fn from_cow_borrowed() {\n        let cow = Cow::Borrowed(\"hello\");\n        let id = Id::from(cow);\n        assert_eq!(id, Id::from(\"hello\"));\n    }\n\n    #[test]\n    #[cfg(feature = \"string\")]\n    fn from_cow_owned() {\n        let cow = Cow::Owned(\"world\".to_string());\n        let id = Id::from(cow);\n        assert_eq!(id, Id::from(\"world\"));\n    }\n}\n"
  },
  {
    "path": "clap_builder/src/util/mod.rs",
    "content": "#![allow(clippy::single_component_path_imports)]\n\nmod any_value;\nmod escape;\npub(crate) mod flat_map;\npub(crate) mod flat_set;\nmod graph;\nmod id;\nmod str_to_bool;\n\npub use self::id::Id;\n\npub(crate) use self::any_value::AnyValue;\npub(crate) use self::any_value::AnyValueId;\npub(crate) use self::escape::Escape;\npub(crate) use self::flat_map::Entry;\npub(crate) use self::flat_map::FlatMap;\npub(crate) use self::flat_set::FlatSet;\npub(crate) use self::graph::ChildGraph;\npub(crate) use self::str_to_bool::FALSE_LITERALS;\npub(crate) use self::str_to_bool::TRUE_LITERALS;\npub(crate) use self::str_to_bool::str_to_bool;\n\npub(crate) mod color;\n\npub(crate) const SUCCESS_CODE: i32 = 0;\n// While sysexists.h defines EX_USAGE as 64, this doesn't seem to be used much in practice but\n// instead 2 seems to be frequently used.\n// Examples\n// - GNU `ls` returns 2\n// - Python's `argparse` returns 2\npub(crate) const USAGE_CODE: i32 = 2;\n\n#[cfg(not(feature = \"unicode\"))]\npub(crate) fn eq_ignore_case(left: &str, right: &str) -> bool {\n    left.eq_ignore_ascii_case(right)\n}\n\n#[cfg(feature = \"unicode\")]\npub(crate) use unicase::eq as eq_ignore_case;\n"
  },
  {
    "path": "clap_builder/src/util/str_to_bool.rs",
    "content": "/// True values are `y`, `yes`, `t`, `true`, `on`, and `1`.\npub(crate) const TRUE_LITERALS: [&str; 6] = [\"y\", \"yes\", \"t\", \"true\", \"on\", \"1\"];\n\n/// False values are `n`, `no`, `f`, `false`, `off`, and `0`.\npub(crate) const FALSE_LITERALS: [&str; 6] = [\"n\", \"no\", \"f\", \"false\", \"off\", \"0\"];\n\n/// Converts a string literal representation of truth to true or false.\n///\n/// `false` values are `n`, `no`, `f`, `false`, `off`, and `0` (case insensitive).\n///\n/// Any other value will be considered as `true`.\npub(crate) fn str_to_bool(val: impl AsRef<str>) -> Option<bool> {\n    let pat: &str = &val.as_ref().to_lowercase();\n    if TRUE_LITERALS.contains(&pat) {\n        Some(true)\n    } else if FALSE_LITERALS.contains(&pat) {\n        Some(false)\n    } else {\n        None\n    }\n}\n"
  },
  {
    "path": "clap_complete/CHANGELOG.md",
    "content": "# Change Log\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/)\nand this project adheres to [Semantic Versioning](https://semver.org/).\n\n<!-- next-header -->\n## [Unreleased] - ReleaseDate\n\n## [4.6.0] - 2026-03-12\n\n### Compatibility\n\n- Update MSRV to 1.85\n\n## [4.5.67] - 2026-03-12\n\n### Internal\n\n- Update dependencies\n\n## [4.5.66] - 2026-02-11\n\n## [4.5.65] - 2026-01-07\n\n### Fixes\n\n- *(zsh)* Correctly complete zero values for `num_args(0..)`\n\n## [4.5.64] - 2025-12-30\n\n### Fixes\n\n- *(dynamic/zsh)* Remove trailing space after directory completions\n\n## [4.5.63] - 2025-12-29\n\n### Fixes\n\n- *(dynamic)* Complete symlinks as their target's file type\n\n## [4.5.62] - 2025-12-18\n\n### Fixes\n\n- *(dynamic/fish)* Properly escape binaries with spaces in them\n\n## [4.5.61] - 2025-11-19\n\n## [4.5.60] - 2025-10-29\n\n### Fixes\n\n- *(dynamic/powershell)* don't repeat previous words when completing\n\n## [4.5.59] - 2025-10-13\n\n## [4.5.58] - 2025-09-16\n\n### Features\n\n- Recognize that after `--`, options should not be completed\n\n### Documentation\n\n- *(dynamic/fish)* Simplify setup instructions\n\n## [4.5.57] - 2025-08-11\n\n### Features\n\n- *(aot)* Hide `.file` paths by default\n\n## [4.5.56] - 2025-08-07\n\n### Features\n\n- *(aot)* Complete `~/` paths\n\n## [4.5.55] - 2025-07-09\n\n## [4.5.54] - 2025-06-09\n\n### Features\n\n- *(aot/zsh)* Revert to the default completions for external subcommands\n\n## [4.5.53] - 2025-06-09\n\n## [4.5.52] - 2025-05-30\n\n### Features\n\n- *(aot/zsh)* Fix handling of completing between spaces\n\n## [4.5.51] - 2025-05-27\n\n### Features\n\n- *(aot)* Add `Generator::try_generate`\n\n## [4.5.50] - 2025-05-06\n\n### Fixes\n\n- *(aot/bash)* Don't suggest subcommand arguments when cursor is before the subcommand\n\n## [4.5.49] - 2025-05-05\n\n### Fixes\n\n- *(dynamic/bash)* Improve handling of empty or quoted content\n- *(aot/bash)* Improve handling of empty or quoted content\n\n## [4.5.48] - 2025-04-28\n\n### Fixes\n\n- *(dynamic)* Restore nospace support\n\n## [4.5.47] - 2025-03-19\n\n### Features\n\n- *(dynamic)* Complete flags with variable-number of `num_args`\n\n## [4.5.46] - 2025-02-24\n\n## [4.5.45] - 2025-02-17\n\n### Fixes\n\n- *(dynamic)* Correctly complete option values based on `num_args`\n\n## [4.5.44] - 2025-01-29\n\n### Features\n\n- *(dynamic)* Allow disabling completions through `COMPLETE=` and `COMPLETE=0`\n\n## [4.5.43] - 2025-01-27\n\n### Fixes\n\n- *(powershell)* Correctly escape backtick\n- *(powershell)* Improve handling of empty help\n\n## [4.5.42] - 2025-01-09\n\n### Fixes\n\n- *(fish)* Corectly generate `aot` completions for single-value `ValueEnum`s\n\n## [4.5.41] - 2025-01-07\n\n### Fixes\n\n- *(elvish)* Avoid leaking env variables in dynamic completions\n\n## [4.5.40] - 2024-12-17\n\n### Fixes\n\n- *(powershell)* Fix syntax in dynamic registration script\n\n## [4.5.39] - 2024-12-16\n\n### Fixes\n\n- *(bash)* For AOT completions, de-duplicate when subcommand aliases are used\n\n## [4.5.38] - 2024-11-13\n\n## [4.5.37] - 2024-11-04\n\n### Fixes\n\n- *(dynamic)* Be compatible with package's MSRV\n\n## [4.5.36] - 2024-10-29\n\n### Fixes\n\n- *(zsh)* Change `ValueHint::Unknown` to `_default` in static completions\n\n## [4.5.35] - 2024-10-24\n\n## [4.5.34] - 2024-10-24\n\n### Features\n\n- *(dynamic)* Show description in zsh\n\n## [4.5.33] - 2024-10-08\n\n### Features\n\n- *(dynamic)* `SubcommandCandidates` support\n\n## [4.5.32] - 2024-10-02\n\n## [4.5.31] - 2024-10-02\n\n### Compatibility\n\n- *(dynamic)* `CompleteEnv::with_factory` now takes in a `Fn` instead of a `FnOnce`\n\n## [4.5.30] - 2024-10-02\n\n### Fixes\n\n- *(dynamic)* Don't default to `ValueHint::AnyPath` but \"no completion\"\n\n## [4.5.29] - 2024-09-20\n\n### Features\n\n- *(dynamic)* Change completion order to subcommands, positional values, flags\n- *(dynamic)* When completing `-[TAB]`, prioritize shorts over longs\n- *(dynamic)* De-duplicate completions that have the same result (longs, shorts, aliases)\n- *(dynamic)* Group candidates from the same `CompletionCandidate::tag`\n- *(dynamic)* Sort candidates within a `CompletionCandidate::tag` by their `display_order`\n\n## [4.5.28] - 2024-09-17\n\n### Compatibility\n\n- *(dynamic)* The binary called when completing is now `std::env::args_os()[0]`, rather than `Command::name`\n\n### Features\n\n- *(dynamic)* Allow overriding the binary being completed and the binary being called for completions\n\n### Fixes\n\n- *(dynamic)* By default, remove wrappers around a binary when calling for completions\n\n## [4.5.27] - 2024-09-17\n\n### Fixes\n\n- *(dynamic)* Fix completions for bash for at least some users\n\n## [4.5.26] - 2024-09-05\n\n### Features\n\n- *(dynamic)* `allow_hyphen_values` support\n\n## [4.5.25] - 2024-09-04\n\n### Compatibility\n\n- *(dynamic)* Removed `CompleteCommand`\n\n### Fixes\n\n- *(dynamic)* Take over ordering of Fish completions\n\n## [4.5.24] - 2024-08-27\n\n### Fixes\n\n- *(dynamic)* Ensure a new enough `shlex` is required\n\n## [4.5.23] - 2024-08-22\n\n### Compatibility\n\n- *(dynamic)* Rename `CompletionCandidate::get_content` to `CompletionCandidate::get_value`\n\n## [4.5.22] - 2024-08-21\n\n### Fixes\n\n- *(dynamic)* Dir completions now include `.`\n\n## [4.5.21] - 2024-08-21\n\n### Features\n\n- *(dynamic)* Add `ArgValueCompleter`, a more flexible `ArgValueCandidates`\n- *(dynamic)* Add `PathCompleter`, a more flexible `ValueHint::*Path`\n\n### Fixes\n\n- *(dynamic)* Sort `ValueHint::*Path` results\n- *(dynamic)* Preserve the users path for `ValueHint::*Path` results\n\n## [4.5.20] - 2024-08-20\n\n### Compatibility\n\n- *(dynamic)* Renamed `CustomCompleter` to `ValueCandidates`\n- *(dynamic)* Renamed `ArgValueCompleter` to `ArgValueCandidates`\n\n## [4.5.19] - 2024-08-19\n\n### Compatibility\n\n- *(dynamic)* Renamed `dynamic` to `engine`\n\n### Fixes\n\n- *(dynamic)* *(bash)* Don't cause a completion to make the program un-runnabe\n- *(dynamic)* *(zsh)* Don't cause a completion to make the program un-runnabe\n\n## [4.5.18] - 2024-08-16\n\n### Features\n\n- *(dynamic)* Complete the last value in a delimited list\n\n## [4.5.17] - 2024-08-16\n\n### Compatibility\n\n- *(dynamic)* Move `command` and `env` out of `dynamic`\n\n### Fixes\n\n- *(dynamic)* Increase `ArgValueCompleter` precedence over `ValueEnum`\n- *(dynamic)* Move `command` and `env` out of `dynamic`\n- Move pre-generated completions to `aot` module\n\n## [4.5.16] - 2024-08-12\n\n## [4.5.15] - 2024-08-12\n\n### Compatibility\n\n- *(dynamic)* Moved `dynamic::shells` to `dynamic::command`\n- *(dynamic)* Guarded `dynamic::command` with `unstable-command` feature\n\n### Features\n\n- *(dynamic)* Added `env::CompleteEnv` application integration\n\n## [4.5.14] - 2024-08-10\n\n### Compatibility\n\n- *(dynamic)* Renamed `CustomCompleter::completions` to `CustomCompleter::candidates`\n- *(dynamic)* Renamed `Completer` to `shells::ShellCompleter`\n\n### Features\n\n- *(dynamic)* Add `shells::CompleteArgs::complete`\n- *(dynamic)* Make `--register` optional\n- *(dynamic)* Make `--shell` optional\n- *(dynamic)* Add powershell support\n\n### Fixes\n\n- *(powershell)* Add missing option hyphens\n- *(dynamic)* Expose `shells::CompleteArgs` and `shells::CompleteCommand` at top-level\n- *(dynamic)* Improve help output\n\n## [4.5.13] - 2024-08-08\n\n### Features\n\n- *(dynamic)* Added `ArgValueCompleter` for custom completions\n\n### Compatibility\n\n- *(dynamic)* `CompletionCandidate::visible` was renamed to `CompletionCandidate::hide`\n\n## [4.5.12] - 2024-07-31\n\n#### Features\n\n- *(dynamic)* Support completing with `num_args`\n\n## [4.5.11] - 2024-07-25\n\n#### Features\n\n- *(dynamic)* Add support for `-fbar` and `-f=bar` completions\n\n## [4.5.10] - 2024-07-25\n\n## [4.5.9] - 2024-07-23\n\n### Features\n\n- *(dynamic)* Support for zsh, elvis, powershell\n- *(dynamic)* Complete `--option val[TAB]`\n- *(dynamic)* Complete subcommand aliases\n- *(dynamic)* Hide hidden flags, subcommands, values, and aliases, only completeing them if no visible variant is available\n\n## [4.5.8] - 2024-07-11\n\n### Fixes\n\n- *(fish)* Nested subcommand completions\n\n## [4.5.7] - 2024-06-28\n\n### Fixes\n\n- *(fish)* Allow completing positionals when subcommands are present\n\n## [4.5.6] - 2024-06-19\n\n## [4.5.5] - 2024-06-07\n\n### Fixes\n\n- *(zsh)* Don't fail or ignore options consumed by `_arguments`\n\n## [4.5.4] - 2024-06-06\n\n## [4.5.3] - 2024-06-06\n\n## [4.5.2] - 2024-04-09\n\n### Fixes\n\n- *(bash)* Improve compatibility with older bash versions\n\n## [4.5.1] - 2024-02-16\n\n### Fixes\n\n- Correctly handle completion descriptions with newlines\n\n## [4.5.0] - 2024-02-08\n\n### Compatibility\n\n- Update MSRV to 1.74\n\n## [4.4.10] - 2024-02-02\n\n### Fixes\n\n- *(bash)* Allow completing filenames with spaces\n\n## [4.4.9] - 2024-01-22\n\n### Features\n\n- *(bash)* Add support file `ValueHint::FilePath`\n- *(bash)* Add support file `ValueHint::DirPath`\n- *(bash)* Don't add space for `ValueHint::Other`\n\n## [4.4.8] - 2024-01-19\n\n### Fixes\n\n- *(bash)* be consistent in identifiers when custom bin names are used\n\n## [4.4.7] - 2024-01-15\n\n### Fixes\n\n- *(unstable)* Don't have dynamic completions pollute the parent command's help output\n\n## [4.4.6] - 2024-01-02\n\n### Fixes\n\n- Work with older Bash versions, particularly for MacOS\n\n## [4.4.5] - 2023-12-27\n\n### Documentation\n\n- *(unstable)* Include / expand `dynamic` on docs.rs\n\n## [4.4.4] - 2023-10-24\n\n## [4.4.3] - 2023-09-28\n\n## [4.4.2] - 2023-09-25\n\n### Fixes\n\n- *(unstable)* Complete positionals in subcommands\n\n## [4.4.1] - 2023-09-07\n\n### Fixes\n\n- *(fish)* Properly escape `()` in descriptions\n\n## [4.4.0] - 2023-08-24\n\n### Compatibility\n\n- Update MSRV to 1.70.0\n\n### Features\n\n- *(unstable)* Fish dynamic completion support\n\n### Fixes\n\n- *(unstable)* Manual control over sort order\n- *(unstable)* Don't recursively report subcommands\n- *(unstable)* Get bash support working again\n- *(unstable)* Ensure shorts keep their leading `-`\n\n## [4.3.2] - 2023-07-05\n\n### Fixes\n\n- *(powershell)* Attempt to allow completing `-s` separately from `-S`\n\n## [4.3.1] - 2023-06-02\n\n## [4.3.0] - 2023-05-19\n\n## [4.2.3] - 2023-05-12\n\n### Fixes\n\n- *(zsh)* Avoid error when mixing multiple values with subcommands\n\n## [4.2.2] - 2023-05-09\n\n- *(bash)* Respect `ValueHint::Other`\n\n## [4.2.1] - 2023-04-21\n\n- *(zsh)* Improved escaping\n\n## [4.2.0] - 2023-03-28\n\n## [4.1.6] - 2023-03-28\n\n## [4.1.5] - 2023-03-16\n\n## [4.1.4] - 2023-02-27\n\n### Features\n\n- *(zsh)* Allow sourcing completion\n\n## [4.1.3] - 2023-02-23\n\n### Fixes\n\n- *(zsh)* Improve handling of multi-valued arguments\n\n## [4.1.2] - 2023-02-15\n\n## [4.1.1] - 2023-01-23\n\n### Fixes\n\n- *(bash)* Mark `cmd` variable as local\n\n## [4.1.0] - 2023-01-13\n\n### Compatibility\n\nMSRV changed to 1.64.0\n\n## [4.0.7] - 2022-12-22\n\n## [4.0.6] - 2022-11-24\n\n## [4.0.5] - 2022-11-07\n\n### Features\n\n- Added `Shell::from_env`\n\n## [4.0.4] - 2022-11-07\n\n## [4.0.3] - 2022-10-18\n\n## [4.0.2] - 2022-09-29\n\n### Fixes\n\n- *(bash)* Fix `git diff git <TAB>` completions\n- *(bash)* Fix `git diff log <TAB>` completions\n- *(bash)* Fix command alias\n\n## [4.0.1] - 2022-09-28\n\n### Fixes\n\n- *(zsh)* Fix multiple-items regression introduced in v4\n\n## [4.0.0] - 2022-09-28\n\n## [3.2.3] - 2022-06-28\n\n## [3.2.2] - 2022-06-21\n\n## [3.2.1] - 2022-06-13\n\n## [3.2.0] - 2022-06-13\n\n## [3.1.4] - 2022-05-06\n\n### Fixes\n\n- *(bash)* Complete visible `PossibleValue`s, rather than hidden\n\n## [3.1.3] - 2022-04-30\n\n### Fixes\n\n- Minimal rust-implemented clap completion engine, behind `unstable-dynamic` feature flag\n\n## [3.1.2] - 2022-04-19\n\n## [3.1.1] - 2022-03-02\n\n## [3.1.0] - 2022-02-16\n\n### Fixes\n\n- Fish: escape possible values (#3467)\n\n## [3.0.6] - 2022-02-05\n\n### Fixes\n\n- Powershell: Allow completion of partial commands\n\n## [3.0.5] - 2022-01-24\n\n### Fixes\n\n- Clarified panics\n\n## [3.0.4] - 2022-01-15\n\n### Fixes\n\n- Unescaped chars in zsh completions\n\n## [3.0.3] - 2022-01-12\n\n### Fixes\n\n- Use new Elvish 0.17 syntax\n- Add newline at end of zsh output\n\n## [3.0.2] - 2022-01-04\n\n## [3.0.1] - 2022-01-03\n\n<!-- next-url -->\n[Unreleased]: https://github.com/clap-rs/clap/compare/clap_complete-v4.6.0...HEAD\n[4.6.0]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.67...clap_complete-v4.6.0\n[4.5.67]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.66...clap_complete-v4.5.67\n[4.5.66]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.65...clap_complete-v4.5.66\n[4.5.65]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.64...clap_complete-v4.5.65\n[4.5.64]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.63...clap_complete-v4.5.64\n[4.5.63]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.62...clap_complete-v4.5.63\n[4.5.62]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.61...clap_complete-v4.5.62\n[4.5.61]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.60...clap_complete-v4.5.61\n[4.5.60]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.59...clap_complete-v4.5.60\n[4.5.59]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.58...clap_complete-v4.5.59\n[4.5.58]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.57...clap_complete-v4.5.58\n[4.5.57]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.56...clap_complete-v4.5.57\n[4.5.56]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.55...clap_complete-v4.5.56\n[4.5.55]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.54...clap_complete-v4.5.55\n[4.5.54]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.53...clap_complete-v4.5.54\n[4.5.53]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.52...clap_complete-v4.5.53\n[4.5.52]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.51...clap_complete-v4.5.52\n[4.5.51]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.50...clap_complete-v4.5.51\n[4.5.50]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.49...clap_complete-v4.5.50\n[4.5.49]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.48...clap_complete-v4.5.49\n[4.5.48]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.47...clap_complete-v4.5.48\n[4.5.47]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.46...clap_complete-v4.5.47\n[4.5.46]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.45...clap_complete-v4.5.46\n[4.5.45]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.44...clap_complete-v4.5.45\n[4.5.44]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.43...clap_complete-v4.5.44\n[4.5.43]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.42...clap_complete-v4.5.43\n[4.5.42]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.41...clap_complete-v4.5.42\n[4.5.41]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.40...clap_complete-v4.5.41\n[4.5.40]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.39...clap_complete-v4.5.40\n[4.5.39]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.38...clap_complete-v4.5.39\n[4.5.38]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.37...clap_complete-v4.5.38\n[4.5.37]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.36...clap_complete-v4.5.37\n[4.5.36]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.35...clap_complete-v4.5.36\n[4.5.35]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.34...clap_complete-v4.5.35\n[4.5.34]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.33...clap_complete-v4.5.34\n[4.5.33]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.32...clap_complete-v4.5.33\n[4.5.32]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.31...clap_complete-v4.5.32\n[4.5.31]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.30...clap_complete-v4.5.31\n[4.5.30]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.29...clap_complete-v4.5.30\n[4.5.29]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.28...clap_complete-v4.5.29\n[4.5.28]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.27...clap_complete-v4.5.28\n[4.5.27]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.26...clap_complete-v4.5.27\n[4.5.26]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.25...clap_complete-v4.5.26\n[4.5.25]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.24...clap_complete-v4.5.25\n[4.5.24]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.23...clap_complete-v4.5.24\n[4.5.23]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.22...clap_complete-v4.5.23\n[4.5.22]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.21...clap_complete-v4.5.22\n[4.5.21]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.20...clap_complete-v4.5.21\n[4.5.20]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.19...clap_complete-v4.5.20\n[4.5.19]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.18...clap_complete-v4.5.19\n[4.5.18]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.17...clap_complete-v4.5.18\n[4.5.17]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.16...clap_complete-v4.5.17\n[4.5.16]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.15...clap_complete-v4.5.16\n[4.5.15]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.14...clap_complete-v4.5.15\n[4.5.14]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.13...clap_complete-v4.5.14\n[4.5.13]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.12...clap_complete-v4.5.13\n[4.5.12]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.11...clap_complete-v4.5.12\n[4.5.11]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.10...clap_complete-v4.5.11\n[4.5.10]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.9...clap_complete-v4.5.10\n[4.5.9]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.8...clap_complete-v4.5.9\n[4.5.8]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.7...clap_complete-v4.5.8\n[4.5.7]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.6...clap_complete-v4.5.7\n[4.5.6]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.5...clap_complete-v4.5.6\n[4.5.5]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.4...clap_complete-v4.5.5\n[4.5.4]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.3...clap_complete-v4.5.4\n[4.5.3]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.2...clap_complete-v4.5.3\n[4.5.2]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.1...clap_complete-v4.5.2\n[4.5.1]: https://github.com/clap-rs/clap/compare/clap_complete-v4.5.0...clap_complete-v4.5.1\n[4.5.0]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.10...clap_complete-v4.5.0\n[4.4.10]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.9...clap_complete-v4.4.10\n[4.4.9]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.8...clap_complete-v4.4.9\n[4.4.8]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.7...clap_complete-v4.4.8\n[4.4.7]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.6...clap_complete-v4.4.7\n[4.4.6]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.5...clap_complete-v4.4.6\n[4.4.5]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.4...clap_complete-v4.4.5\n[4.4.4]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.3...clap_complete-v4.4.4\n[4.4.3]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.2...clap_complete-v4.4.3\n[4.4.2]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.1...clap_complete-v4.4.2\n[4.4.1]: https://github.com/clap-rs/clap/compare/clap_complete-v4.4.0...clap_complete-v4.4.1\n[4.4.0]: https://github.com/clap-rs/clap/compare/clap_complete-v4.3.2...clap_complete-v4.4.0\n[4.3.2]: https://github.com/clap-rs/clap/compare/clap_complete-v4.3.1...clap_complete-v4.3.2\n[4.3.1]: https://github.com/clap-rs/clap/compare/clap_complete-v4.3.0...clap_complete-v4.3.1\n[4.3.0]: https://github.com/clap-rs/clap/compare/clap_complete-v4.2.3...clap_complete-v4.3.0\n[4.2.3]: https://github.com/clap-rs/clap/compare/clap_complete-v4.2.2...clap_complete-v4.2.3\n[4.2.2]: https://github.com/clap-rs/clap/compare/clap_complete-v4.2.1...clap_complete-v4.2.2\n[4.2.1]: https://github.com/clap-rs/clap/compare/clap_complete-v4.2.0...clap_complete-v4.2.1\n[4.2.0]: https://github.com/clap-rs/clap/compare/clap_complete-v4.1.6...clap_complete-v4.2.0\n[4.1.6]: https://github.com/clap-rs/clap/compare/clap_complete-v4.1.5...clap_complete-v4.1.6\n[4.1.5]: https://github.com/clap-rs/clap/compare/clap_complete-v4.1.4...clap_complete-v4.1.5\n[4.1.4]: https://github.com/clap-rs/clap/compare/clap_complete-v4.1.3...clap_complete-v4.1.4\n[4.1.3]: https://github.com/clap-rs/clap/compare/clap_complete-v4.1.2...clap_complete-v4.1.3\n[4.1.2]: https://github.com/clap-rs/clap/compare/clap_complete-v4.1.1...clap_complete-v4.1.2\n[4.1.1]: https://github.com/clap-rs/clap/compare/clap_complete-v4.1.0...clap_complete-v4.1.1\n[4.1.0]: https://github.com/clap-rs/clap/compare/clap_complete-v4.0.7...clap_complete-v4.1.0\n[4.0.7]: https://github.com/clap-rs/clap/compare/clap_complete-v4.0.6...clap_complete-v4.0.7\n[4.0.6]: https://github.com/clap-rs/clap/compare/clap_complete-v4.0.5...clap_complete-v4.0.6\n[4.0.5]: https://github.com/clap-rs/clap/compare/clap_complete-v4.0.4...clap_complete-v4.0.5\n[4.0.4]: https://github.com/clap-rs/clap/compare/clap_complete-v4.0.3...clap_complete-v4.0.4\n[4.0.3]: https://github.com/clap-rs/clap/compare/clap_complete-v4.0.2...clap_complete-v4.0.3\n[4.0.2]: https://github.com/clap-rs/clap/compare/clap_complete-v4.0.1...clap_complete-v4.0.2\n[4.0.1]: https://github.com/clap-rs/clap/compare/clap_complete-v4.0.0...clap_complete-v4.0.1\n[4.0.0]: https://github.com/clap-rs/clap/compare/clap_complete-v3.2.3...clap_complete-v4.0.0\n[3.2.3]: https://github.com/clap-rs/clap/compare/clap_complete-v3.2.2...clap_complete-v3.2.3\n[3.2.2]: https://github.com/clap-rs/clap/compare/clap_complete-v3.2.1...clap_complete-v3.2.2\n[3.2.1]: https://github.com/clap-rs/clap/compare/clap_complete-v3.2.0...clap_complete-v3.2.1\n[3.2.0]: https://github.com/clap-rs/clap/compare/clap_complete-v3.1.4...clap_complete-v3.2.0\n[3.1.4]: https://github.com/clap-rs/clap/compare/clap_complete-v3.1.3...clap_complete-v3.1.4\n[3.1.3]: https://github.com/clap-rs/clap/compare/clap_complete-v3.1.2...clap_complete-v3.1.3\n[3.1.2]: https://github.com/clap-rs/clap/compare/clap_complete-v3.1.1...clap_complete-v3.1.2\n[3.1.1]: https://github.com/clap-rs/clap/compare/clap_complete-v3.1.0...clap_complete-v3.1.1\n[3.1.0]: https://github.com/clap-rs/clap/compare/clap_complete-v3.0.6...clap_complete-v3.1.0\n[3.0.6]: https://github.com/clap-rs/clap/compare/clap_complete-v3.0.5...clap_complete-v3.0.6\n[3.0.5]: https://github.com/clap-rs/clap/compare/clap_complete-v3.0.4...clap_complete-v3.0.5\n[3.0.4]: https://github.com/clap-rs/clap/compare/clap_complete-v3.0.3...clap_complete-v3.0.4\n[3.0.3]: https://github.com/clap-rs/clap/compare/v3.0.2...clap_complete-v3.0.3\n[3.0.2]: https://github.com/clap-rs/clap/compare/v3.0.1...v3.0.2\n[3.0.1]: https://github.com/clap-rs/clap/compare/v3.0.0...v3.0.1\n"
  },
  {
    "path": "clap_complete/CONTRIBUTING.md",
    "content": "# How to Contribute\n\nSee the [clap-wide CONTRIBUTING.md](../CONTRIBUTING.md).  This will contain `clap_complete` specific notes.\n\n### Scope\n\n`clap_complete` contains the core completion generators, meaning ones\nmaintained by the clap maintainers that get priority for features and fixes.\nAdditional, including contributor-maintained generators can also be contributed\nto the clap repo and sit alongside `clap_complete` in a `clap_complete_<name>`\ncrate.\n"
  },
  {
    "path": "clap_complete/Cargo.toml",
    "content": "[package]\nname = \"clap_complete\"\nversion = \"4.6.0\"\ndescription = \"Generate shell completion scripts for your clap::Command\"\ncategories = [\"command-line-interface\"]\nkeywords = [\n  \"clap\",\n  \"cli\",\n  \"completion\",\n  \"bash\",\n]\nrepository.workspace = true\nlicense.workspace = true\nedition.workspace = true\nrust-version.workspace = true\ninclude.workspace = true\n\n[package.metadata.docs.rs]\nfeatures = [\"unstable-doc\"]\nrustdoc-args = [\"--generate-link-to-definition\"]\n\n[package.metadata.release]\npre-release-replacements = [\n  {file=\"CHANGELOG.md\", search=\"Unreleased\", replace=\"{{version}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"\\\\.\\\\.\\\\.HEAD\", replace=\"...{{tag_name}}\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"ReleaseDate\", replace=\"{{date}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-header -->\", replace=\"<!-- next-header -->\\n## [Unreleased] - ReleaseDate\\n\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-url -->\", replace=\"<!-- next-url -->\\n[Unreleased]: https://github.com/clap-rs/clap/compare/{{tag_name}}...HEAD\", exactly=1},\n  {file=\"README.md\", search=\"github.com/clap-rs/clap/blob/[^/]+/\", replace=\"github.com/clap-rs/clap/blob/{{tag_name}}/\", exactly=4, prerelease = true},\n]\n\n[lib]\nbench = false\n\n[dependencies]\nclap = { path = \"../\", version = \"4.5.20\", default-features = false, features = [\"std\"] }\nclap_lex = { path = \"../clap_lex\", version = \"1.0.0\", optional = true }\nis_executable = { version = \"1.0.5\", optional = true }\nshlex = { version = \"1.3.0\", optional = true }\ncompletest = { version = \"1.0.0\", optional = true }\ncompletest-pty = { version = \"1.0.0\", optional = true }\n\n[dev-dependencies]\nsnapbox = { version = \"1.1.0\", features = [\"diff\", \"dir\", \"examples\"] }\n# Cutting out `filesystem` feature\ntrycmd = { version = \"1.1.1\", default-features = false, features = [\"color-auto\", \"diff\", \"examples\"] }\nclap = { path = \"../\", version = \"4.5.20\", default-features = false, features = [\"std\", \"derive\", \"help\"] }\nautomod = \"1.0.16\"\n\n[[example]]\nname = \"dynamic\"\nrequired-features = [\"unstable-dynamic\"]\n\n[features]\ndefault = []\nunstable-doc = [\"unstable-dynamic\"] # for docs.rs\nunstable-dynamic = [\"dep:clap_lex\", \"dep:shlex\", \"dep:is_executable\", \"clap/unstable-ext\"]\nunstable-shell-tests = [\"dep:completest\", \"dep:completest-pty\"]\ndebug = [\"clap/debug\"]\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "clap_complete/README.md",
    "content": "<!-- omit in TOC -->\n# clap_complete\n\n> **Shell completion generation for `clap`**\n\n[![Crates.io](https://img.shields.io/crates/v/clap_complete?style=flat-square)](https://crates.io/crates/clap_complete)\n[![Crates.io](https://img.shields.io/crates/d/clap_complete?style=flat-square)](https://crates.io/crates/clap_complete)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square)](https://github.com/clap-rs/clap/blob/clap_complete-v4.6.0/LICENSE-APACHE)\n[![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](https://github.com/clap-rs/clap/blob/clap_complete-v4.6.0/LICENSE-MIT)\n\nDual-licensed under [Apache 2.0](LICENSE-APACHE) or [MIT](LICENSE-MIT).\n\n1. [About](#about)\n2. [API Reference](https://docs.rs/clap_complete)\n3. [Questions & Discussions](https://github.com/clap-rs/clap/discussions)\n4. [CONTRIBUTING](https://github.com/clap-rs/clap/blob/clap_complete-v4.6.0/clap_complete/CONTRIBUTING.md)\n5. [Sponsors](https://github.com/clap-rs/clap/blob/clap_complete-v4.6.0/README.md#sponsors)\n\n## About\n\n### Related Projects\n\n- [clap_complete_nushell](https://crates.io/crates/clap_complete_nushell) for [nushell](https://www.nushell.sh/) shell completion support\n"
  },
  {
    "path": "clap_complete/examples/completion-derive.rs",
    "content": "//! How to use value hints and generate shell completions.\n//!\n//! Usage with zsh:\n//! ```console\n//! $ cargo run --example completion-derive -- --generate=zsh > /usr/local/share/zsh/site-functions/_completion_derive\n//! $ compinit\n//! $ ./target/debug/examples/completion_derive --<TAB>\n//! ```\n//! fish:\n//! ```console\n//! $ cargo run --example completion-derive -- --generate=fish > completion_derive.fish\n//! $ . ./completion_derive.fish\n//! $ ./target/debug/examples/completion_derive --<TAB>\n//! ```\nuse clap::{Args, Command, CommandFactory, Parser, Subcommand, ValueHint};\nuse clap_complete::{Generator, Shell, generate};\nuse std::ffi::OsString;\nuse std::io;\nuse std::path::PathBuf;\n\n#[derive(Parser, Debug, PartialEq)]\n#[command(name = \"completion-derive\")]\nstruct Opt {\n    // If provided, outputs the completion file for given shell\n    #[arg(long = \"generate\", value_enum)]\n    generator: Option<Shell>,\n    #[command(subcommand)]\n    command: Option<Commands>,\n}\n\n#[derive(Subcommand, Debug, PartialEq)]\nenum Commands {\n    #[command(visible_alias = \"hint\")]\n    ValueHint(ValueHintOpt),\n}\n\n#[derive(Args, Debug, PartialEq)]\nstruct ValueHintOpt {\n    // Showcasing all possible ValueHints:\n    #[arg(long, value_hint = ValueHint::Unknown)]\n    unknown: Option<String>,\n    #[arg(long, value_hint = ValueHint::Other)]\n    other: Option<String>,\n    #[arg(short, long, value_hint = ValueHint::AnyPath)]\n    path: Option<PathBuf>,\n    #[arg(short, long, value_hint = ValueHint::FilePath)]\n    file: Option<PathBuf>,\n    #[arg(short, long, value_hint = ValueHint::DirPath)]\n    dir: Option<PathBuf>,\n    #[arg(short, long, value_hint = ValueHint::ExecutablePath)]\n    exe: Option<PathBuf>,\n    #[arg(long, value_hint = ValueHint::CommandName)]\n    cmd_name: Option<OsString>,\n    #[arg(short, long, value_hint = ValueHint::CommandString)]\n    cmd: Option<String>,\n    // Command::trailing_var_ar is required to use ValueHint::CommandWithArguments\n    #[arg(trailing_var_arg = true, value_hint = ValueHint::CommandWithArguments)]\n    command_with_args: Vec<String>,\n    #[arg(short, long, value_hint = ValueHint::Username)]\n    user: Option<String>,\n    #[arg(long, value_hint = ValueHint::Hostname)]\n    host: Option<String>,\n    #[arg(long, value_hint = ValueHint::Url)]\n    url: Option<String>,\n    #[arg(long, value_hint = ValueHint::EmailAddress)]\n    email: Option<String>,\n}\n\nfn print_completions<G: Generator>(generator: G, cmd: &mut Command) {\n    generate(\n        generator,\n        cmd,\n        cmd.get_name().to_string(),\n        &mut io::stdout(),\n    );\n}\n\nfn main() {\n    let opt = Opt::parse();\n\n    if let Some(generator) = opt.generator {\n        let mut cmd = Opt::command();\n        eprintln!(\"Generating completion file for {generator:?}...\");\n        print_completions(generator, &mut cmd);\n    } else {\n        println!(\"{opt:#?}\");\n    }\n}\n"
  },
  {
    "path": "clap_complete/examples/completion.rs",
    "content": "//! Example to test arguments with different `ValueHint` values.\n//!\n//! Usage with zsh:\n//! ```console\n//! $ cargo run --example completion -- --generate=zsh > /usr/local/share/zsh/site-functions/_completion$\n//! $ compinit\n//! $ ./target/debug/examples/completion --<TAB>\n//! ```\n//! fish:\n//! ```console\n//! $ cargo run --example completion -- --generate=fish > completion.fish\n//! $ . ./completion.fish\n//! $ ./target/debug/examples/completion --<TAB>\n//! ```\nuse clap::{Arg, Command, ValueHint, value_parser};\nuse clap_complete::{Generator, Shell, generate};\nuse std::io;\n\nfn build_cli() -> Command {\n    let value_hint_command = Command::new(\"value-hint\")\n        .visible_alias(\"hint\")\n        .arg(\n            Arg::new(\"unknown\")\n                .long(\"unknown\")\n                .value_hint(ValueHint::Unknown),\n        )\n        .arg(Arg::new(\"other\").long(\"other\").value_hint(ValueHint::Other))\n        .arg(\n            Arg::new(\"path\")\n                .long(\"path\")\n                .short('p')\n                .value_hint(ValueHint::AnyPath),\n        )\n        .arg(\n            Arg::new(\"file\")\n                .long(\"file\")\n                .short('f')\n                .value_hint(ValueHint::FilePath),\n        )\n        .arg(\n            Arg::new(\"dir\")\n                .long(\"dir\")\n                .short('d')\n                .value_hint(ValueHint::DirPath),\n        )\n        .arg(\n            Arg::new(\"exe\")\n                .long(\"exe\")\n                .short('e')\n                .value_hint(ValueHint::ExecutablePath),\n        )\n        .arg(\n            Arg::new(\"cmd_name\")\n                .long(\"cmd-name\")\n                .value_hint(ValueHint::CommandName),\n        )\n        .arg(\n            Arg::new(\"cmd\")\n                .long(\"cmd\")\n                .short('c')\n                .value_hint(ValueHint::CommandString),\n        )\n        .arg(\n            Arg::new(\"command_with_args\")\n                .num_args(1..)\n                // AppSettings::TrailingVarArg is required to use ValueHint::CommandWithArguments\n                .trailing_var_arg(true)\n                .value_hint(ValueHint::CommandWithArguments),\n        )\n        .arg(\n            Arg::new(\"user\")\n                .short('u')\n                .long(\"user\")\n                .value_hint(ValueHint::Username),\n        )\n        .arg(\n            Arg::new(\"host\")\n                .long(\"host\")\n                .value_hint(ValueHint::Hostname),\n        )\n        .arg(Arg::new(\"url\").long(\"url\").value_hint(ValueHint::Url))\n        .arg(\n            Arg::new(\"email\")\n                .long(\"email\")\n                .value_hint(ValueHint::EmailAddress),\n        );\n\n    Command::new(\"completion\")\n        .arg(\n            Arg::new(\"generator\")\n                .long(\"generate\")\n                .value_parser(value_parser!(Shell)),\n        )\n        .subcommand(value_hint_command)\n}\n\nfn print_completions<G: Generator>(generator: G, cmd: &mut Command) {\n    generate(\n        generator,\n        cmd,\n        cmd.get_name().to_string(),\n        &mut io::stdout(),\n    );\n}\n\nfn main() {\n    let matches = build_cli().get_matches();\n\n    if let Some(generator) = matches.get_one::<Shell>(\"generator\") {\n        let mut cmd = build_cli();\n        eprintln!(\"Generating completion file for {generator}...\");\n        print_completions(*generator, &mut cmd);\n    }\n}\n"
  },
  {
    "path": "clap_complete/examples/dynamic.rs",
    "content": "fn command() -> clap::Command {\n    clap::Command::new(\"dynamic\")\n        .arg(\n            clap::Arg::new(\"input\")\n                .long(\"input\")\n                .short('i')\n                .value_hint(clap::ValueHint::FilePath),\n        )\n        .arg(\n            clap::Arg::new(\"format\")\n                .long(\"format\")\n                .short('F')\n                .value_parser([\"json\", \"yaml\", \"toml\"]),\n        )\n        .args_conflicts_with_subcommands(true)\n}\n\nfn main() {\n    clap_complete::CompleteEnv::with_factory(command).complete();\n\n    let cmd = command();\n    let matches = cmd.get_matches();\n    println!(\"{matches:#?}\");\n}\n\n#[test]\nfn verify_cli() {\n    command().debug_assert();\n}\n"
  },
  {
    "path": "clap_complete/examples/exhaustive.rs",
    "content": "use clap::builder::PossibleValue;\nuse clap_complete::{Generator, Shell, generate};\n\nfn main() {\n    #[cfg(feature = \"unstable-dynamic\")]\n    clap_complete::CompleteEnv::with_factory(cli)\n        // Avoid tests snapshotting a path into `target/`\n        .completer(\"exhaustive\")\n        .complete();\n\n    let matches = cli().get_matches();\n    if let Some(generator) = matches.get_one::<Shell>(\"generate\") {\n        let mut cmd = cli();\n        eprintln!(\"Generating completion file for {generator}...\");\n        print_completions(*generator, &mut cmd);\n        return;\n    }\n\n    println!(\"{matches:?}\");\n}\n\nfn print_completions<G: Generator>(generator: G, cmd: &mut clap::Command) {\n    generate(\n        generator,\n        cmd,\n        cmd.get_name().to_string(),\n        &mut std::io::stdout(),\n    );\n}\n\nconst EMPTY: [&str; 0] = [];\n\n#[allow(clippy::let_and_return)]\nfn cli() -> clap::Command {\n    clap::Command::new(\"exhaustive\")\n        .args([\n            clap::Arg::new(\"generate\")\n                .long(\"generate\")\n                .value_name(\"SHELL\")\n                .value_parser(clap::value_parser!(Shell))\n                .help(\"generate\"),\n            clap::Arg::new(\"empty-choice\")\n                .long(\"empty-choice\")\n                .value_parser(EMPTY),\n        ])\n        .subcommands([\n            clap::Command::new(\"empty\")\n                .disable_help_subcommand(true)\n                .disable_help_flag(true),\n            clap::Command::new(\"global\")\n                .version(\"3.0\")\n                .propagate_version(true)\n                .args([clap::Arg::new(\"global\")\n                    .long(\"global\")\n                    .global(true)\n                    .action(clap::ArgAction::SetTrue)\n                    .help(\"everywhere\")])\n                .subcommands([\n                    clap::Command::new(\"one\").subcommand(clap::Command::new(\"one-one\")),\n                    clap::Command::new(\"two\"),\n                ]),\n            clap::Command::new(\"action\").args([\n                clap::Arg::new(\"set-true\")\n                    .long(\"set-true\")\n                    .action(clap::ArgAction::SetTrue)\n                    .help(\"bool\"),\n                clap::Arg::new(\"set\")\n                    .long(\"set\")\n                    .action(clap::ArgAction::Set)\n                    .help(\"value\"),\n                clap::Arg::new(\"count\")\n                    .long(\"count\")\n                    .action(clap::ArgAction::Count)\n                    .help(\"number\"),\n                clap::Arg::new(\"choice\")\n                    .long(\"choice\")\n                    .value_parser([\"first\", \"second\"])\n                    .help(\"enum\"),\n            ]),\n            clap::Command::new(\"quote\")\n                .args([\n                    clap::Arg::new(\"single-quotes\")\n                        .long(\"single-quotes\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"Can be 'always', 'auto', or 'never'\"),\n                    clap::Arg::new(\"double-quotes\")\n                        .long(\"double-quotes\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n                    clap::Arg::new(\"backticks\")\n                        .long(\"backticks\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"For more information see `echo test`\"),\n                    clap::Arg::new(\"backslash\")\n                        .long(\"backslash\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"Avoid '\\\\n'\"),\n                    clap::Arg::new(\"brackets\")\n                        .long(\"brackets\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"List packages [filter]\"),\n                    clap::Arg::new(\"expansions\")\n                        .long(\"expansions\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"Execute the shell command with $SHELL\"),\n                    clap::Arg::new(\"choice\")\n                        .long(\"choice\")\n                        .action(clap::ArgAction::Set)\n                        .value_parser(clap::builder::PossibleValuesParser::new([\n                            PossibleValue::new(\"another shell\").help(\"something with a space\"),\n                            PossibleValue::new(\"bash\").help(\"bash (shell)\"),\n                            PossibleValue::new(\"fish\").help(\"fish shell\"),\n                            PossibleValue::new(\"zsh\").help(\"zsh shell\"),\n                        ])),\n                ])\n                .subcommands([\n                    clap::Command::new(\"cmd-single-quotes\")\n                        .about(\"Can be 'always', 'auto', or 'never'\"),\n                    clap::Command::new(\"cmd-double-quotes\")\n                        .about(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n                    clap::Command::new(\"cmd-backticks\")\n                        .about(\"For more information see `echo test`\"),\n                    clap::Command::new(\"cmd-backslash\").about(\"Avoid '\\\\n'\"),\n                    clap::Command::new(\"cmd-brackets\").about(\"List packages [filter]\"),\n                    clap::Command::new(\"cmd-expansions\")\n                        .about(\"Execute the shell command with $SHELL\"),\n                    clap::Command::new(\"escape-help\").about(\"\\\\tab\\t\\\"'\\nNew Line\"),\n                ]),\n            clap::Command::new(\"value\").args([\n                clap::Arg::new(\"delim\").long(\"delim\").value_delimiter(','),\n                clap::Arg::new(\"tuple\").long(\"tuple\").num_args(2),\n                clap::Arg::new(\"require-eq\")\n                    .long(\"require-eq\")\n                    .require_equals(true),\n                clap::Arg::new(\"term\").num_args(1..).value_terminator(\";\"),\n            ]),\n            clap::Command::new(\"pacman\").subcommands([\n                clap::Command::new(\"one\").long_flag(\"one\").short_flag('o'),\n                clap::Command::new(\"two\").long_flag(\"two\").short_flag('t'),\n            ]),\n            clap::Command::new(\"last\")\n                .args([clap::Arg::new(\"first\"), clap::Arg::new(\"free\").last(true)]),\n            clap::Command::new(\"alias\").args([\n                clap::Arg::new(\"flag\")\n                    .short('f')\n                    .visible_short_alias('F')\n                    .long(\"flag\")\n                    .action(clap::ArgAction::SetTrue)\n                    .visible_alias(\"flg\")\n                    .help(\"cmd flag\"),\n                clap::Arg::new(\"option\")\n                    .short('o')\n                    .visible_short_alias('O')\n                    .long(\"option\")\n                    .visible_alias(\"opt\")\n                    .help(\"cmd option\")\n                    .action(clap::ArgAction::Set),\n                clap::Arg::new(\"positional\"),\n            ]),\n            clap::Command::new(\"hint\").args([\n                clap::Arg::new(\"choice\")\n                    .long(\"choice\")\n                    .action(clap::ArgAction::Set)\n                    .value_parser([\"bash\", \"fish\", \"zsh\"]),\n                clap::Arg::new(\"unknown\")\n                    .long(\"unknown\")\n                    .value_hint(clap::ValueHint::Unknown),\n                clap::Arg::new(\"other\")\n                    .long(\"other\")\n                    .value_hint(clap::ValueHint::Other),\n                clap::Arg::new(\"path\")\n                    .long(\"path\")\n                    .short('p')\n                    .value_hint(clap::ValueHint::AnyPath),\n                clap::Arg::new(\"file\")\n                    .long(\"file\")\n                    .short('f')\n                    .value_hint(clap::ValueHint::FilePath),\n                clap::Arg::new(\"dir\")\n                    .long(\"dir\")\n                    .short('d')\n                    .value_hint(clap::ValueHint::DirPath),\n                clap::Arg::new(\"exe\")\n                    .long(\"exe\")\n                    .short('e')\n                    .value_hint(clap::ValueHint::ExecutablePath),\n                clap::Arg::new(\"cmd_name\")\n                    .long(\"cmd-name\")\n                    .value_hint(clap::ValueHint::CommandName),\n                clap::Arg::new(\"cmd\")\n                    .long(\"cmd\")\n                    .short('c')\n                    .value_hint(clap::ValueHint::CommandString),\n                clap::Arg::new(\"command_with_args\")\n                    .action(clap::ArgAction::Set)\n                    .num_args(1..)\n                    .trailing_var_arg(true)\n                    .value_hint(clap::ValueHint::CommandWithArguments),\n                clap::Arg::new(\"user\")\n                    .short('u')\n                    .long(\"user\")\n                    .value_hint(clap::ValueHint::Username),\n                clap::Arg::new(\"host\")\n                    .short('H')\n                    .long(\"host\")\n                    .value_hint(clap::ValueHint::Hostname),\n                clap::Arg::new(\"url\")\n                    .long(\"url\")\n                    .value_hint(clap::ValueHint::Url),\n                clap::Arg::new(\"email\")\n                    .long(\"email\")\n                    .value_hint(clap::ValueHint::EmailAddress),\n            ]),\n        ])\n}\n"
  },
  {
    "path": "clap_complete/src/aot/generator/mod.rs",
    "content": "//! Shell completion machinery\n\npub mod utils;\n\nuse std::ffi::OsString;\nuse std::fs::File;\nuse std::io::Error;\nuse std::io::Write;\nuse std::path::PathBuf;\n\nuse clap::Command;\n\n/// Generator trait which can be used to write generators\npub trait Generator {\n    /// Returns the file name that is created when this generator is called during compile time.\n    ///\n    /// # Panics\n    ///\n    /// May panic when called outside of the context of [`generate`] or [`generate_to`]\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// # use std::io::{Error, Write};\n    /// # use clap::Command;\n    /// use clap_complete::Generator;\n    ///\n    /// pub struct Fish;\n    ///\n    /// impl Generator for Fish {\n    ///     fn file_name(&self, name: &str) -> String {\n    ///         format!(\"{name}.fish\")\n    ///     }\n    /// #   fn generate(&self, cmd: &Command, buf: &mut dyn Write) {}\n    /// #   fn try_generate(&self, cmd: &Command, buf: &mut dyn Write) -> Result<(), Error> {Ok(())}\n    /// }\n    /// ```\n    fn file_name(&self, name: &str) -> String;\n\n    /// Generates output out of [`clap::Command`].\n    ///\n    /// # Panics\n    ///\n    /// May panic when called outside of the context of [`generate`] or [`generate_to`]\n    ///\n    /// # Examples\n    ///\n    /// The following example generator displays the [`clap::Command`]\n    /// as if it is printed using [`std::println`].\n    ///\n    /// ```\n    /// use std::{io::{Error, Write}, fmt::write};\n    /// use clap::Command;\n    /// use clap_complete::Generator;\n    ///\n    /// pub struct ClapDebug;\n    ///\n    /// impl Generator for ClapDebug {\n    /// #   fn file_name(&self, name: &str) -> String {\n    /// #       name.into()\n    /// #   }\n    ///     fn generate(&self, cmd: &Command, buf: &mut dyn Write) {\n    ///         write!(buf, \"{cmd}\").unwrap();\n    ///     }\n    /// #   fn try_generate(&self, cmd: &Command, buf: &mut dyn Write) -> Result<(), Error> {\n    /// #       write!(buf, \"{cmd}\")\n    /// #   }\n    /// }\n    /// ```\n    fn generate(&self, cmd: &Command, buf: &mut dyn Write);\n\n    ///\n    /// Fallible version to generate output out of [`clap::Command`].\n    ///\n    /// # Examples\n    ///\n    /// The following example generator displays the [`clap::Command`]\n    /// as if it is printed using [`std::println`].\n    ///\n    /// ```\n    /// use std::{io::{Error, Write}, fmt::write};\n    /// use clap::Command;\n    /// use clap_complete::Generator;\n    ///\n    /// pub struct ClapDebug;\n    ///\n    /// impl Generator for ClapDebug {\n    /// #   fn file_name(&self, name: &str) -> String {\n    /// #       name.into()\n    /// #   }\n    /// #   fn generate(&self, cmd: &Command, buf: &mut dyn Write) {\n    /// #       self.try_generate(cmd, buf).expect(\"failed to write completion file\");\n    /// #   }\n    ///     fn try_generate(&self, cmd: &Command, buf: &mut dyn Write) -> Result<(), Error> {\n    ///         write!(buf, \"{cmd}\")\n    ///     }\n    /// }\n    /// ```\n    fn try_generate(&self, cmd: &Command, buf: &mut dyn Write) -> Result<(), Error> {\n        self.generate(cmd, buf);\n        Ok(())\n    }\n}\n\n/// Generate a completions file for a specified shell at compile-time.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** to generate the file at compile time you must use a `build.rs` \"Build Script\" or a\n/// [`cargo-xtask`](https://github.com/matklad/cargo-xtask)\n///\n/// </div>\n///\n/// # Examples\n///\n/// The following example generates a bash completion script via a `build.rs` script. In this\n/// simple example, we'll demo a very small application with only a single subcommand and two\n/// args. Real applications could be many multiple levels deep in subcommands, and have tens or\n/// potentially hundreds of arguments.\n///\n/// First, it helps if we separate out our `Command` definition into a separate file. Whether you\n/// do this as a function, or bare Command definition is a matter of personal preference.\n///\n/// ```\n/// // src/cli.rs\n/// # use clap::{Command, Arg, ArgAction};\n/// pub fn build_cli() -> Command {\n///     Command::new(\"compl\")\n///         .about(\"Tests completions\")\n///         .arg(Arg::new(\"file\")\n///             .help(\"some input file\"))\n///         .subcommand(Command::new(\"test\")\n///             .about(\"tests things\")\n///             .arg(Arg::new(\"case\")\n///                 .long(\"case\")\n///                 .action(ArgAction::Set)\n///                 .help(\"the case to test\")))\n/// }\n/// ```\n///\n/// In our regular code, we can simply call this `build_cli()` function, then call\n/// `get_matches()`, or any of the other normal methods directly after. For example:\n///\n/// ```ignore\n/// // src/main.rs\n///\n/// mod cli;\n///\n/// let _m = cli::build_cli().get_matches();\n///\n/// // normal logic continues...\n/// ```\n///\n/// Next, we set up our `Cargo.toml` to use a `build.rs` build script.\n///\n/// ```toml\n/// # Cargo.toml\n/// build = \"build.rs\"\n///\n/// [dependencies]\n/// clap = \"*\"\n///\n/// [build-dependencies]\n/// clap = \"*\"\n/// clap_complete = \"*\"\n/// ```\n///\n/// Next, we place a `build.rs` in our project root.\n///\n/// ```ignore\n/// use clap_complete::{generate_to, shells::Bash};\n/// use std::env;\n/// use std::io::Error;\n///\n/// include!(\"src/cli.rs\");\n///\n/// let outdir = match env::var_os(\"OUT_DIR\") {\n///     None => return Ok(()),\n///     Some(outdir) => outdir,\n/// };\n///\n/// let mut cmd = build_cli();\n/// let path = generate_to(\n///     Bash,\n///     &mut cmd, // We need to specify what generator to use\n///     \"myapp\",  // We need to specify the bin name manually\n///     outdir,   // We need to specify where to write to\n/// )?;\n///\n/// println!(\"cargo:warning=completion file is generated: {path:?}\");\n///\n/// Ok(())\n/// ```\n///\n/// Now, once we compile there will be a `{bin_name}.bash` file in the directory.\n/// Assuming we compiled with debug mode, it would be somewhere similar to\n/// `<project>/target/debug/build/myapp-<hash>/out/myapp.bash`.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** Please look at the individual [shells][crate::shells]\n/// to see the name of the files generated.\n///\n/// </div>\n///\n/// Using [`ValueEnum::value_variants()`][clap::ValueEnum::value_variants] you can easily loop over\n/// all the supported shell variants to generate all the completions at once too.\n///\n/// ```ignore\n/// use clap::ValueEnum;\n/// use clap_complete::{generate_to, Shell};\n/// use std::env;\n/// use std::io::Error;\n///\n/// include!(\"src/cli.rs\");\n///\n/// let outdir = match env::var_os(\"OUT_DIR\") {\n///     None => return Ok(()),\n///     Some(outdir) => outdir,\n/// };\n///\n/// let mut cmd = build_cli();\n/// for &shell in Shell::value_variants() {\n///     generate_to(shell, &mut cmd, \"myapp\", outdir)?;\n/// }\n///\n/// Ok(())\n/// ```\npub fn generate_to<G, S, T>(\n    generator: G,\n    cmd: &mut Command,\n    bin_name: S,\n    out_dir: T,\n) -> Result<PathBuf, Error>\nwhere\n    G: Generator,\n    S: Into<String>,\n    T: Into<OsString>,\n{\n    cmd.set_bin_name(bin_name);\n\n    let out_dir = PathBuf::from(out_dir.into());\n    let file_name = generator.file_name(cmd.get_bin_name().unwrap());\n\n    let path = out_dir.join(file_name);\n    let mut file = File::create(&path)?;\n\n    _generate::<G>(generator, cmd, &mut file);\n    Ok(path)\n}\n\n/// Generate a completions file for a specified shell at runtime.\n///\n/// Until `cargo install` can install extra files like a completion script, this may be\n/// used e.g. in a command that outputs the contents of the completion script, to be\n/// redirected into a file by the user.\n///\n/// # Examples\n///\n/// Assuming a separate `cli.rs` like the [`generate_to` example](generate_to()),\n/// we can let users generate a completion script using a command:\n///\n/// ```ignore\n/// // src/main.rs\n///\n/// mod cli;\n/// use std::io;\n/// use clap_complete::{generate, shells::Bash};\n///\n/// let matches = cli::build_cli().get_matches();\n///\n/// if matches.is_present(\"generate-bash-completions\") {\n///     generate(Bash, &mut cli::build_cli(), \"myapp\", &mut io::stdout());\n/// }\n///\n/// // normal logic continues...\n/// ```\n///\n/// Usage:\n///\n/// ```console\n/// $ myapp generate-bash-completions > /usr/share/bash-completion/completions/myapp.bash\n/// ```\npub fn generate<G, S>(generator: G, cmd: &mut Command, bin_name: S, buf: &mut dyn Write)\nwhere\n    G: Generator,\n    S: Into<String>,\n{\n    cmd.set_bin_name(bin_name);\n    _generate::<G>(generator, cmd, buf);\n}\n\nfn _generate<G: Generator>(generator: G, cmd: &mut Command, buf: &mut dyn Write) {\n    cmd.build();\n    generator.generate(cmd, buf);\n}\n"
  },
  {
    "path": "clap_complete/src/aot/generator/utils.rs",
    "content": "//! Helpers for writing generators\n\nuse clap::{Arg, Command};\n\n/// Gets all subcommands including child subcommands in the form of `(\"name\", \"bin_name\")`.\n///\n/// Subcommand `rustup toolchain install` would be converted to\n/// `(\"install\", \"rustup toolchain install\")`.\npub fn all_subcommands(cmd: &Command) -> Vec<(String, String)> {\n    let mut subcmds: Vec<_> = subcommands(cmd);\n\n    for sc_v in cmd.get_subcommands().map(all_subcommands) {\n        subcmds.extend(sc_v);\n    }\n\n    subcmds\n}\n\n/// Finds the subcommand [`clap::Command`] from the given [`clap::Command`] with the given path.\n///\n/// <div class=\"warning\">\n///\n/// **NOTE:** `path` should not contain the root `bin_name`.\n///\n/// </div>\npub fn find_subcommand_with_path<'cmd>(p: &'cmd Command, path: Vec<&str>) -> &'cmd Command {\n    let mut cmd = p;\n\n    for sc in path {\n        cmd = cmd.find_subcommand(sc).unwrap();\n    }\n\n    cmd\n}\n\n/// Gets subcommands of [`clap::Command`] in the form of `(\"name\", \"bin_name\")`.\n///\n/// Subcommand `rustup toolchain install` would be converted to\n/// `(\"install\", \"rustup toolchain install\")`.\npub fn subcommands(p: &Command) -> Vec<(String, String)> {\n    debug!(\"subcommands: name={}\", p.get_name());\n    debug!(\"subcommands: Has subcommands...{:?}\", p.has_subcommands());\n\n    let mut subcmds = vec![];\n\n    for sc in p.get_subcommands() {\n        let sc_bin_name = sc.get_bin_name().unwrap();\n\n        debug!(\n            \"subcommands:iter: name={}, bin_name={}\",\n            sc.get_name(),\n            sc_bin_name\n        );\n        subcmds.push((sc.get_name().to_string(), sc_bin_name.to_string()));\n\n        for alias in sc.get_visible_aliases() {\n            debug!(\n                \"subcommands:iter: alias={}, bin_name={}\",\n                alias, sc_bin_name\n            );\n            subcmds.push((alias.to_string(), sc_bin_name.to_string()));\n        }\n    }\n\n    subcmds\n}\n\n/// Gets all the short options, their visible aliases and flags of a [`clap::Command`].\n/// Includes `h` and `V` depending on the [`clap::Command`] settings.\npub fn shorts_and_visible_aliases(p: &Command) -> Vec<char> {\n    debug!(\"shorts: name={}\", p.get_name());\n\n    p.get_arguments()\n        .filter_map(|a| {\n            if !a.is_positional() {\n                if a.get_visible_short_aliases().is_some() && a.get_short().is_some() {\n                    let mut shorts_and_visible_aliases = a.get_visible_short_aliases().unwrap();\n                    shorts_and_visible_aliases.push(a.get_short().unwrap());\n                    Some(shorts_and_visible_aliases)\n                } else if a.get_visible_short_aliases().is_none() && a.get_short().is_some() {\n                    Some(vec![a.get_short().unwrap()])\n                } else {\n                    None\n                }\n            } else {\n                None\n            }\n        })\n        .flatten()\n        .collect()\n}\n\n/// Gets all the long options, their visible aliases and flags of a [`clap::Command`].\n/// Includes `help` and `version` depending on the [`clap::Command`] settings.\npub fn longs_and_visible_aliases(p: &Command) -> Vec<String> {\n    debug!(\"longs: name={}\", p.get_name());\n\n    p.get_arguments()\n        .filter_map(|a| {\n            if !a.is_positional() {\n                if a.get_visible_aliases().is_some() && a.get_long().is_some() {\n                    let mut visible_aliases: Vec<_> = a\n                        .get_visible_aliases()\n                        .unwrap()\n                        .into_iter()\n                        .map(|s| s.to_string())\n                        .collect();\n                    visible_aliases.push(a.get_long().unwrap().to_string());\n                    Some(visible_aliases)\n                } else if a.get_visible_aliases().is_none() && a.get_long().is_some() {\n                    Some(vec![a.get_long().unwrap().to_string()])\n                } else {\n                    None\n                }\n            } else {\n                None\n            }\n        })\n        .flatten()\n        .collect()\n}\n\n/// Gets all the flags of a [`clap::Command`].\n/// Includes `help` and `version` depending on the [`clap::Command`] settings.\npub fn flags(p: &Command) -> Vec<Arg> {\n    debug!(\"flags: name={}\", p.get_name());\n    p.get_arguments()\n        .filter(|a| !a.get_num_args().expect(\"built\").takes_values() && !a.is_positional())\n        .cloned()\n        .collect()\n}\n\n/// Get the possible values for completion\npub fn possible_values(a: &Arg) -> Option<Vec<clap::builder::PossibleValue>> {\n    if !a.get_num_args().expect(\"built\").takes_values() {\n        None\n    } else {\n        a.get_value_parser()\n            .possible_values()\n            .map(|pvs| pvs.collect())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use clap::Arg;\n    use clap::ArgAction;\n\n    fn common_app() -> Command {\n        Command::new(\"myapp\")\n            .subcommand(\n                Command::new(\"test\").subcommand(Command::new(\"config\")).arg(\n                    Arg::new(\"file\")\n                        .short('f')\n                        .short_alias('c')\n                        .visible_short_alias('p')\n                        .long(\"file\")\n                        .action(ArgAction::SetTrue)\n                        .visible_alias(\"path\"),\n                ),\n            )\n            .subcommand(Command::new(\"hello\"))\n            .bin_name(\"my-cmd\")\n    }\n\n    fn built() -> Command {\n        let mut cmd = common_app();\n\n        cmd.build();\n        cmd\n    }\n\n    fn built_with_version() -> Command {\n        let mut cmd = common_app().version(\"3.0\");\n\n        cmd.build();\n        cmd\n    }\n\n    #[test]\n    fn test_subcommands() {\n        let cmd = built_with_version();\n\n        assert_eq!(\n            subcommands(&cmd),\n            vec![\n                (\"test\".to_string(), \"my-cmd test\".to_string()),\n                (\"hello\".to_string(), \"my-cmd hello\".to_string()),\n                (\"help\".to_string(), \"my-cmd help\".to_string()),\n            ]\n        );\n    }\n\n    #[test]\n    fn test_all_subcommands() {\n        let cmd = built_with_version();\n\n        assert_eq!(\n            all_subcommands(&cmd),\n            vec![\n                (\"test\".to_string(), \"my-cmd test\".to_string()),\n                (\"hello\".to_string(), \"my-cmd hello\".to_string()),\n                (\"help\".to_string(), \"my-cmd help\".to_string()),\n                (\"config\".to_string(), \"my-cmd test config\".to_string()),\n                (\"help\".to_string(), \"my-cmd test help\".to_string()),\n                (\"config\".to_string(), \"my-cmd test help config\".to_string()),\n                (\"help\".to_string(), \"my-cmd test help help\".to_string()),\n                (\"test\".to_string(), \"my-cmd help test\".to_string()),\n                (\"hello\".to_string(), \"my-cmd help hello\".to_string()),\n                (\"help\".to_string(), \"my-cmd help help\".to_string()),\n                (\"config\".to_string(), \"my-cmd help test config\".to_string()),\n            ]\n        );\n    }\n\n    #[test]\n    fn test_find_subcommand_with_path() {\n        let cmd = built_with_version();\n        let sc_app = find_subcommand_with_path(&cmd, \"test config\".split(' ').collect());\n\n        assert_eq!(sc_app.get_name(), \"config\");\n    }\n\n    #[test]\n    fn test_flags() {\n        let cmd = built_with_version();\n        let actual_flags = flags(&cmd);\n\n        assert_eq!(actual_flags.len(), 2);\n        assert_eq!(actual_flags[0].get_long(), Some(\"help\"));\n        assert_eq!(actual_flags[1].get_long(), Some(\"version\"));\n\n        let sc_flags = flags(find_subcommand_with_path(&cmd, vec![\"test\"]));\n\n        assert_eq!(sc_flags.len(), 2);\n        assert_eq!(sc_flags[0].get_long(), Some(\"file\"));\n        assert_eq!(sc_flags[1].get_long(), Some(\"help\"));\n    }\n\n    #[test]\n    fn test_flag_subcommand() {\n        let cmd = built();\n        let actual_flags = flags(&cmd);\n\n        assert_eq!(actual_flags.len(), 1);\n        assert_eq!(actual_flags[0].get_long(), Some(\"help\"));\n\n        let sc_flags = flags(find_subcommand_with_path(&cmd, vec![\"test\"]));\n\n        assert_eq!(sc_flags.len(), 2);\n        assert_eq!(sc_flags[0].get_long(), Some(\"file\"));\n        assert_eq!(sc_flags[1].get_long(), Some(\"help\"));\n    }\n\n    #[test]\n    fn test_shorts() {\n        let cmd = built_with_version();\n        let shorts = shorts_and_visible_aliases(&cmd);\n\n        assert_eq!(shorts.len(), 2);\n        assert_eq!(shorts[0], 'h');\n        assert_eq!(shorts[1], 'V');\n\n        let sc_shorts = shorts_and_visible_aliases(find_subcommand_with_path(&cmd, vec![\"test\"]));\n\n        assert_eq!(sc_shorts.len(), 3);\n        assert_eq!(sc_shorts[0], 'p');\n        assert_eq!(sc_shorts[1], 'f');\n        assert_eq!(sc_shorts[2], 'h');\n    }\n\n    #[test]\n    fn test_longs() {\n        let cmd = built_with_version();\n        let longs = longs_and_visible_aliases(&cmd);\n\n        assert_eq!(longs.len(), 2);\n        assert_eq!(longs[0], \"help\");\n        assert_eq!(longs[1], \"version\");\n\n        let sc_longs = longs_and_visible_aliases(find_subcommand_with_path(&cmd, vec![\"test\"]));\n\n        assert_eq!(sc_longs.len(), 3);\n        assert_eq!(sc_longs[0], \"path\");\n        assert_eq!(sc_longs[1], \"file\");\n        assert_eq!(sc_longs[2], \"help\");\n    }\n}\n"
  },
  {
    "path": "clap_complete/src/aot/mod.rs",
    "content": "//! Prebuilt completions\n//!\n//! ## Quick Start\n//!\n//! - For generating at compile-time, see [`generate_to`]\n//! - For generating at runtime, see [`generate`]\n//!\n//! [`Shell`] is a convenience `enum` for an argument value type that implements `Generator`\n//! for each natively-supported shell type.\n//!\n//! To customize completions, see\n//! - [`ValueHint`]\n//! - [`ValueEnum`][clap::ValueEnum]\n//!\n//! ## Example\n//!\n//! ```rust,no_run\n//! use clap::{Command, Arg, ValueHint, value_parser, ArgAction};\n//! use clap_complete::{generate, Generator, Shell};\n//! use std::io;\n//!\n//! fn build_cli() -> Command {\n//!     Command::new(\"example\")\n//!          .arg(Arg::new(\"file\")\n//!              .help(\"some input file\")\n//!                 .value_hint(ValueHint::AnyPath),\n//!         )\n//!        .arg(\n//!            Arg::new(\"generator\")\n//!                .long(\"generate\")\n//!                .action(ArgAction::Set)\n//!                .value_parser(value_parser!(Shell)),\n//!        )\n//! }\n//!\n//! fn print_completions<G: Generator>(generator: G, cmd: &mut Command) {\n//!     generate(generator, cmd, cmd.get_name().to_string(), &mut io::stdout());\n//! }\n//!\n//! let matches = build_cli().get_matches();\n//!\n//! if let Some(generator) = matches.get_one::<Shell>(\"generator\").copied() {\n//!     let mut cmd = build_cli();\n//!     eprintln!(\"Generating completion file for {generator}...\");\n//!     print_completions(generator, &mut cmd);\n//! }\n//! ```\n\nmod generator;\nmod shells;\n\npub use clap::ValueHint;\npub use generator::*;\npub use shells::*;\n"
  },
  {
    "path": "clap_complete/src/aot/shells/bash.rs",
    "content": "use std::{\n    fmt::Write as _,\n    io::{Error, Write},\n};\n\nuse clap::{Arg, Command, ValueHint};\n\nuse crate::generator::{Generator, utils};\n\n/// Generate bash completion file\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct Bash;\n\nimpl Generator for Bash {\n    fn file_name(&self, name: &str) -> String {\n        format!(\"{name}.bash\")\n    }\n\n    fn generate(&self, cmd: &Command, buf: &mut dyn Write) {\n        self.try_generate(cmd, buf)\n            .expect(\"failed to write completion file\");\n    }\n\n    fn try_generate(&self, cmd: &Command, buf: &mut dyn Write) -> Result<(), Error> {\n        let bin_name = cmd\n            .get_bin_name()\n            .expect(\"crate::generate should have set the bin_name\");\n\n        let fn_name = bin_name.replace('-', \"__\");\n\n        write!(\n            buf,\n            \"_{name}() {{\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \\\"${{BASH_VERSINFO[0]}}\\\" -ge 4 ]]; then\n        cur=\\\"$2\\\"\n    else\n        cur=\\\"${{COMP_WORDS[COMP_CWORD]}}\\\"\n    fi\n    prev=\\\"$3\\\"\n    cmd=\\\"\\\"\n    opts=\\\"\\\"\n\n    for i in \\\"${{COMP_WORDS[@]:0:COMP_CWORD}}\\\"\n    do\n        case \\\"${{cmd}},${{i}}\\\" in\n            \\\",$1\\\")\n                cmd=\\\"{cmd}\\\"\n                ;;{subcmds}\n            *)\n                ;;\n        esac\n    done\n\n    case \\\"${{cmd}}\\\" in\n        {cmd})\n            opts=\\\"{name_opts}\\\"\n            if [[ ${{cur}} == -* || ${{COMP_CWORD}} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \\\"${{opts}}\\\" -- \\\"${{cur}}\\\") )\n                return 0\n            fi\n            case \\\"${{prev}}\\\" in{name_opts_details}\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \\\"${{opts}}\\\" -- \\\"${{cur}}\\\") )\n            return 0\n            ;;{subcmd_details}\n    esac\n}}\n\nif [[ \\\"${{BASH_VERSINFO[0]}}\\\" -eq 4 && \\\"${{BASH_VERSINFO[1]}}\\\" -ge 4 || \\\"${{BASH_VERSINFO[0]}}\\\" -gt 4 ]]; then\n    complete -F _{name} -o nosort -o bashdefault -o default {name}\nelse\n    complete -F _{name} -o bashdefault -o default {name}\nfi\n\",\n            name = bin_name,\n            cmd = fn_name,\n            name_opts = all_options_for_path(cmd, bin_name),\n            name_opts_details = option_details_for_path(cmd, bin_name),\n            subcmds = all_subcommands(cmd, &fn_name),\n            subcmd_details = subcommand_details(cmd)\n        )\n    }\n}\n\nfn all_subcommands(cmd: &Command, parent_fn_name: &str) -> String {\n    debug!(\"all_subcommands\");\n\n    fn add_command(\n        parent_fn_name: &str,\n        cmd: &Command,\n        subcmds: &mut Vec<(String, String, String)>,\n    ) {\n        let fn_name = format!(\n            \"{parent_fn_name}__{cmd_name}\",\n            parent_fn_name = parent_fn_name,\n            cmd_name = cmd.get_name().to_string().replace('-', \"__\")\n        );\n        subcmds.push((\n            parent_fn_name.to_string(),\n            cmd.get_name().to_string(),\n            fn_name.clone(),\n        ));\n        for alias in cmd.get_visible_aliases() {\n            subcmds.push((\n                parent_fn_name.to_string(),\n                alias.to_string(),\n                fn_name.clone(),\n            ));\n        }\n        for subcmd in cmd.get_subcommands() {\n            add_command(&fn_name, subcmd, subcmds);\n        }\n    }\n    let mut subcmds = vec![];\n    for subcmd in cmd.get_subcommands() {\n        add_command(parent_fn_name, subcmd, &mut subcmds);\n    }\n    subcmds.sort();\n\n    let mut cases = vec![String::new()];\n    for (parent_fn_name, name, fn_name) in subcmds {\n        cases.push(format!(\n            \"{parent_fn_name},{name})\n                cmd=\\\"{fn_name}\\\"\n                ;;\",\n        ));\n    }\n\n    cases.join(\"\\n            \")\n}\n\nfn subcommand_details(cmd: &Command) -> String {\n    debug!(\"subcommand_details\");\n\n    let mut subcmd_dets = vec![String::new()];\n    let mut scs = utils::all_subcommands(cmd)\n        .iter()\n        .map(|x| x.1.replace(' ', \"__\"))\n        .collect::<Vec<_>>();\n\n    scs.sort();\n    scs.dedup();\n\n    subcmd_dets.extend(scs.iter().map(|sc| {\n        format!(\n            \"{subcmd})\n            opts=\\\"{sc_opts}\\\"\n            if [[ ${{cur}} == -* || ${{COMP_CWORD}} -eq {level} ]] ; then\n                COMPREPLY=( $(compgen -W \\\"${{opts}}\\\" -- \\\"${{cur}}\\\") )\n                return 0\n            fi\n            case \\\"${{prev}}\\\" in{opts_details}\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \\\"${{opts}}\\\" -- \\\"${{cur}}\\\") )\n            return 0\n            ;;\",\n            subcmd = sc.replace('-', \"__\"),\n            sc_opts = all_options_for_path(cmd, sc),\n            level = sc.split(\"__\").map(|_| 1).sum::<u64>(),\n            opts_details = option_details_for_path(cmd, sc)\n        )\n    }));\n\n    subcmd_dets.join(\"\\n        \")\n}\n\nfn option_details_for_path(cmd: &Command, path: &str) -> String {\n    debug!(\"option_details_for_path: path={path}\");\n\n    let p = utils::find_subcommand_with_path(cmd, path.split(\"__\").skip(1).collect());\n    let mut opts = vec![String::new()];\n\n    for o in p.get_opts() {\n        let compopt = match o.get_value_hint() {\n            ValueHint::FilePath => Some(\"compopt -o filenames\"),\n            ValueHint::DirPath => Some(\"compopt -o plusdirs\"),\n            ValueHint::Other => Some(\"compopt -o nospace\"),\n            _ => None,\n        };\n\n        if let Some(longs) = o.get_long_and_visible_aliases() {\n            opts.extend(longs.iter().map(|long| {\n                let mut v = vec![format!(\"--{})\", long)];\n\n                if o.get_value_hint() == ValueHint::FilePath {\n                    v.extend([\n                        \"local oldifs\".to_string(),\n                        r#\"if [ -n \"${IFS+x}\" ]; then\"#.to_string(),\n                        r#\"    oldifs=\"$IFS\"\"#.to_string(),\n                        \"fi\".to_string(),\n                        r#\"IFS=$'\\n'\"#.to_string(),\n                        format!(\"COMPREPLY=({})\", vals_for(o)),\n                        r#\"if [ -n \"${oldifs+x}\" ]; then\"#.to_string(),\n                        r#\"    IFS=\"$oldifs\"\"#.to_string(),\n                        \"fi\".to_string(),\n                    ]);\n                } else {\n                    v.push(format!(\"COMPREPLY=({})\", vals_for(o)));\n                }\n\n                if let Some(copt) = compopt {\n                    v.extend([\n                        r#\"if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\"#.to_string(),\n                        format!(\"    {copt}\"),\n                        \"fi\".to_string(),\n                    ]);\n                }\n\n                v.extend([\"return 0\", \";;\"].iter().map(|s| (*s).to_string()));\n                v.join(\"\\n                    \")\n            }));\n        }\n\n        if let Some(shorts) = o.get_short_and_visible_aliases() {\n            opts.extend(shorts.iter().map(|short| {\n                let mut v = vec![format!(\"-{})\", short)];\n\n                if o.get_value_hint() == ValueHint::FilePath {\n                    v.extend([\n                        \"local oldifs\".to_string(),\n                        r#\"if [ -n \"${IFS+x}\" ]; then\"#.to_string(),\n                        r#\"    oldifs=\"$IFS\"\"#.to_string(),\n                        \"fi\".to_string(),\n                        r#\"IFS=$'\\n'\"#.to_string(),\n                        format!(\"COMPREPLY=({})\", vals_for(o)),\n                        r#\"if [ -n \"${oldifs+x}\" ]; then\"#.to_string(),\n                        r#\"    IFS=\"$oldifs\"\"#.to_string(),\n                        \"fi\".to_string(),\n                    ]);\n                } else {\n                    v.push(format!(\"COMPREPLY=({})\", vals_for(o)));\n                }\n\n                if let Some(copt) = compopt {\n                    v.extend([\n                        r#\"if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\"#.to_string(),\n                        format!(\"    {copt}\"),\n                        \"fi\".to_string(),\n                    ]);\n                }\n\n                v.extend([\"return 0\", \";;\"].iter().map(|s| (*s).to_string()));\n                v.join(\"\\n                    \")\n            }));\n        }\n    }\n\n    opts.join(\"\\n                \")\n}\n\nfn vals_for(o: &Arg) -> String {\n    debug!(\"vals_for: o={}\", o.get_id());\n\n    if let Some(vals) = utils::possible_values(o) {\n        format!(\n            \"$(compgen -W \\\"{}\\\" -- \\\"${{cur}}\\\")\",\n            vals.iter()\n                .filter(|pv| !pv.is_hide_set())\n                .map(|n| n.get_name())\n                .collect::<Vec<_>>()\n                .join(\" \")\n        )\n    } else if o.get_value_hint() == ValueHint::DirPath {\n        String::from(\"\") // should be empty to avoid duplicate candidates\n    } else if o.get_value_hint() == ValueHint::Other {\n        String::from(\"\\\"${cur}\\\"\")\n    } else {\n        String::from(\"$(compgen -f \\\"${cur}\\\")\")\n    }\n}\n\nfn all_options_for_path(cmd: &Command, path: &str) -> String {\n    debug!(\"all_options_for_path: path={path}\");\n\n    let p = utils::find_subcommand_with_path(cmd, path.split(\"__\").skip(1).collect());\n\n    let mut opts = String::new();\n    for short in utils::shorts_and_visible_aliases(p) {\n        write!(&mut opts, \"-{short} \").expect(\"writing to String is infallible\");\n    }\n    for long in utils::longs_and_visible_aliases(p) {\n        write!(&mut opts, \"--{long} \").expect(\"writing to String is infallible\");\n    }\n    for pos in p.get_positionals() {\n        if let Some(vals) = utils::possible_values(pos) {\n            for value in vals {\n                write!(&mut opts, \"{} \", value.get_name())\n                    .expect(\"writing to String is infallible\");\n            }\n        } else {\n            write!(&mut opts, \"{pos} \").expect(\"writing to String is infallible\");\n        }\n    }\n    for (sc, _) in utils::subcommands(p) {\n        write!(&mut opts, \"{sc} \").expect(\"writing to String is infallible\");\n    }\n    opts.pop();\n\n    opts\n}\n"
  },
  {
    "path": "clap_complete/src/aot/shells/elvish.rs",
    "content": "use std::io::{Error, Write};\n\nuse clap::Command;\nuse clap::builder::StyledStr;\n\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::generator::{Generator, utils};\n\n/// Generate elvish completion file\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct Elvish;\n\nimpl Generator for Elvish {\n    fn file_name(&self, name: &str) -> String {\n        format!(\"{name}.elv\")\n    }\n\n    fn generate(&self, cmd: &Command, buf: &mut dyn Write) {\n        self.try_generate(cmd, buf)\n            .expect(\"failed to write completion file\");\n    }\n\n    fn try_generate(&self, cmd: &Command, buf: &mut dyn Write) -> Result<(), Error> {\n        let bin_name = cmd\n            .get_bin_name()\n            .expect(\"crate::generate should have set the bin_name\");\n\n        let subcommands_cases = generate_inner(cmd, \"\");\n\n        write!(\n            buf,\n            r#\"\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[{bin_name}] = {{|@words|\n    fn spaces {{|n|\n        builtin:repeat $n ' ' | str:join ''\n    }}\n    fn cand {{|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }}\n    var command = '{bin_name}'\n    for word $words[1..-1] {{\n        if (str:has-prefix $word '-') {{\n            break\n        }}\n        set command = $command';'$word\n    }}\n    var completions = [{subcommands_cases}\n    ]\n    $completions[$command]\n}}\n\"#,\n        )\n    }\n}\n\n// Escape string inside single quotes\nfn escape_string(string: &str) -> String {\n    string.replace('\\'', \"''\")\n}\n\nfn escape_help<T: ToString>(help: Option<&StyledStr>, data: T) -> String {\n    match help {\n        Some(help) => escape_string(&help.to_string().replace('\\n', \" \")),\n        _ => data.to_string(),\n    }\n}\n\nfn generate_inner(p: &Command, previous_command_name: &str) -> String {\n    debug!(\"generate_inner\");\n\n    let command_names = if previous_command_name.is_empty() {\n        vec![p.get_bin_name().expect(INTERNAL_ERROR_MSG).to_string()]\n    } else {\n        p.get_name_and_visible_aliases()\n            .into_iter()\n            .map(|name| format!(\"{previous_command_name};{name}\"))\n            .collect()\n    };\n\n    let mut completions = String::new();\n    let preamble = String::from(\"\\n            cand \");\n\n    for option in p.get_opts() {\n        if let Some(shorts) = option.get_short_and_visible_aliases() {\n            let tooltip = escape_help(option.get_help(), shorts[0]);\n            for short in shorts {\n                completions.push_str(&preamble);\n                completions.push_str(format!(\"-{short} '{tooltip}'\").as_str());\n            }\n        }\n\n        if let Some(longs) = option.get_long_and_visible_aliases() {\n            let tooltip = escape_help(option.get_help(), longs[0]);\n            for long in longs {\n                completions.push_str(&preamble);\n                completions.push_str(format!(\"--{long} '{tooltip}'\").as_str());\n            }\n        }\n    }\n\n    for flag in utils::flags(p) {\n        if let Some(shorts) = flag.get_short_and_visible_aliases() {\n            let tooltip = escape_help(flag.get_help(), shorts[0]);\n            for short in shorts {\n                completions.push_str(&preamble);\n                completions.push_str(format!(\"-{short} '{tooltip}'\").as_str());\n            }\n        }\n\n        if let Some(longs) = flag.get_long_and_visible_aliases() {\n            let tooltip = escape_help(flag.get_help(), longs[0]);\n            for long in longs {\n                completions.push_str(&preamble);\n                completions.push_str(format!(\"--{long} '{tooltip}'\").as_str());\n            }\n        }\n    }\n\n    for subcommand in p.get_subcommands() {\n        for name in subcommand.get_name_and_visible_aliases() {\n            let tooltip = escape_help(subcommand.get_about(), name);\n\n            completions.push_str(&preamble);\n            completions.push_str(format!(\"{name} '{tooltip}'\").as_str());\n        }\n    }\n\n    let mut subcommands_cases = String::new();\n    for command_name in &command_names {\n        subcommands_cases.push_str(&format!(\n            r\"\n        &'{}'= {{{}\n        }}\",\n            &command_name, completions\n        ));\n    }\n\n    for subcommand in p.get_subcommands() {\n        for command_name in &command_names {\n            let subcommand_subcommands_cases = generate_inner(subcommand, command_name);\n            subcommands_cases.push_str(&subcommand_subcommands_cases);\n        }\n    }\n\n    subcommands_cases\n}\n"
  },
  {
    "path": "clap_complete/src/aot/shells/fish.rs",
    "content": "use std::io::{Error, Write};\n\nuse clap::{Arg, Command, ValueHint, builder};\n\nuse crate::generator::{Generator, utils};\n\n/// Generate fish completion file\n///\n/// Note: The fish generator currently only supports named options (-o/--option), not positional arguments.\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct Fish;\n\nimpl Generator for Fish {\n    fn file_name(&self, name: &str) -> String {\n        format!(\"{name}.fish\")\n    }\n\n    fn generate(&self, cmd: &Command, buf: &mut dyn Write) {\n        self.try_generate(cmd, buf)\n            .expect(\"failed to write completion file\");\n    }\n\n    fn try_generate(&self, cmd: &Command, buf: &mut dyn Write) -> Result<(), Error> {\n        let bin_name = cmd\n            .get_bin_name()\n            .expect(\"crate::generate should have set the bin_name\");\n\n        let name = escape_name(bin_name);\n        let mut needs_fn_name = &format!(\"__fish_{name}_needs_command\")[..];\n        let mut using_fn_name = &format!(\"__fish_{name}_using_subcommand\")[..];\n        // Given `git --git-dir somedir status`, using `__fish_seen_subcommand_from` won't help us\n        // find out `status` is the real subcommand, and not `somedir`. However, when there are no subcommands,\n        // there is no need to use our custom stubs.\n        if cmd.has_subcommands() {\n            gen_subcommand_helpers(&name, cmd, buf, needs_fn_name, using_fn_name);\n        } else {\n            needs_fn_name = \"__fish_use_subcommand\";\n            using_fn_name = \"__fish_seen_subcommand_from\";\n        }\n\n        let mut buffer = String::new();\n        gen_fish_inner(\n            bin_name,\n            &[],\n            cmd,\n            &mut buffer,\n            needs_fn_name,\n            using_fn_name,\n        );\n        write!(buf, \"{buffer}\")\n    }\n}\n\n// Escape string inside single quotes\nfn escape_string(string: &str, escape_comma: bool) -> String {\n    let string = string.replace('\\\\', \"\\\\\\\\\").replace('\\'', \"\\\\'\");\n    if escape_comma {\n        string.replace(',', \"\\\\,\")\n    } else {\n        string\n    }\n}\n\nfn escape_help(help: &builder::StyledStr) -> String {\n    escape_string(&help.to_string().replace('\\n', \" \"), false)\n}\n\nfn escape_name(name: &str) -> String {\n    name.replace('-', \"_\")\n}\n\nfn gen_fish_inner(\n    root_command: &str,\n    parent_commands: &[&str],\n    cmd: &Command,\n    buffer: &mut String,\n    needs_fn_name: &str,\n    using_fn_name: &str,\n) {\n    debug!(\"gen_fish_inner\");\n    // example :\n    //\n    // complete\n    //      -c {command}\n    //      -d \"{description}\"\n    //      -s {short}\n    //      -l {long}\n    //      -a \"{possible_arguments}\"\n    //      -r # if require parameter\n    //      -f # don't use file completion\n    //      -n \"{needs_fn_name}\"            # complete for command \"myprog\"\n    //      -n \"{using_fn_name} subcmd1\"    # complete for command \"myprog subcmd1\"\n\n    let mut basic_template = format!(\"complete -c {root_command}\");\n\n    if parent_commands.is_empty() {\n        if cmd.has_subcommands() {\n            basic_template.push_str(&format!(\" -n \\\"{needs_fn_name}\\\"\"));\n        }\n    } else {\n        let mut out = String::from(using_fn_name);\n        match parent_commands {\n            [] => unreachable!(),\n            [command] => {\n                out.push_str(&format!(\" {command}\"));\n                if cmd.has_subcommands() {\n                    out.push_str(\"; and not __fish_seen_subcommand_from\");\n                }\n                let subcommands = cmd\n                    .get_subcommands()\n                    .flat_map(Command::get_name_and_visible_aliases);\n                for name in subcommands {\n                    out.push_str(&format!(\" {name}\"));\n                }\n            }\n            [command, subcommand] => out.push_str(&format!(\n                \" {command}; and __fish_seen_subcommand_from {subcommand}\"\n            )),\n            // HACK: Assuming subcommands are only nested less than 3 levels as more than that is\n            // unwieldy and takes more effort to support.\n            // For example, `rustup toolchain help install` is the longest valid command line of `rustup`\n            // that uses nested subcommands, and it cannot receive any flags to it.\n            _ => return,\n        }\n        basic_template.push_str(format!(\" -n \\\"{out}\\\"\").as_str());\n    }\n\n    debug!(\"gen_fish_inner: parent_commands={parent_commands:?}\");\n\n    for option in cmd.get_opts() {\n        let mut template = basic_template.clone();\n\n        if let Some(shorts) = option.get_short_and_visible_aliases() {\n            for short in shorts {\n                template.push_str(format!(\" -s {short}\").as_str());\n            }\n        }\n\n        if let Some(longs) = option.get_long_and_visible_aliases() {\n            for long in longs {\n                template.push_str(format!(\" -l {}\", escape_string(long, false)).as_str());\n            }\n        }\n\n        if let Some(data) = option.get_help() {\n            template.push_str(&format!(\" -d '{}'\", escape_help(data)));\n        }\n\n        template.push_str(value_completion(option).as_str());\n\n        buffer.push_str(template.as_str());\n        buffer.push('\\n');\n    }\n\n    for flag in utils::flags(cmd) {\n        let mut template = basic_template.clone();\n\n        if let Some(shorts) = flag.get_short_and_visible_aliases() {\n            for short in shorts {\n                template.push_str(format!(\" -s {short}\").as_str());\n            }\n        }\n\n        if let Some(longs) = flag.get_long_and_visible_aliases() {\n            for long in longs {\n                template.push_str(format!(\" -l {}\", escape_string(long, false)).as_str());\n            }\n        }\n\n        if let Some(data) = flag.get_help() {\n            template.push_str(&format!(\" -d '{}'\", escape_help(data)));\n        }\n\n        buffer.push_str(template.as_str());\n        buffer.push('\\n');\n    }\n\n    let has_positionals = cmd.get_positionals().next().is_some();\n    if !has_positionals {\n        basic_template.push_str(\" -f\");\n    }\n    for subcommand in cmd.get_subcommands() {\n        for subcommand_name in subcommand.get_name_and_visible_aliases() {\n            let mut template = basic_template.clone();\n\n            template.push_str(format!(\" -a \\\"{subcommand_name}\\\"\").as_str());\n\n            if let Some(data) = subcommand.get_about() {\n                template.push_str(format!(\" -d '{}'\", escape_help(data)).as_str());\n            }\n\n            buffer.push_str(template.as_str());\n            buffer.push('\\n');\n        }\n    }\n\n    // generate options of subcommands\n    for subcommand in cmd.get_subcommands() {\n        for subcommand_name in subcommand.get_name_and_visible_aliases() {\n            let mut parent_commands: Vec<_> = parent_commands.into();\n            parent_commands.push(subcommand_name);\n            gen_fish_inner(\n                root_command,\n                &parent_commands,\n                subcommand,\n                buffer,\n                needs_fn_name,\n                using_fn_name,\n            );\n        }\n    }\n}\n\n/// Print fish's helpers for easy handling subcommands.\nfn gen_subcommand_helpers(\n    bin_name: &str,\n    cmd: &Command,\n    buf: &mut dyn Write,\n    needs_fn_name: &str,\n    using_fn_name: &str,\n) {\n    let mut optspecs = String::new();\n    let cmd_opts = cmd.get_arguments().filter(|a| !a.is_positional());\n    for option in cmd_opts {\n        optspecs.push(' ');\n        let mut has_short = false;\n        if let Some(short) = option.get_short() {\n            has_short = true;\n            optspecs.push(short);\n        }\n\n        if let Some(long) = option.get_long() {\n            if has_short {\n                optspecs.push('/');\n            }\n            optspecs.push_str(&escape_string(long, false));\n        }\n\n        let is_an_option = option\n            .get_num_args()\n            .map(|r| r.takes_values())\n            .unwrap_or(true);\n        if is_an_option {\n            optspecs.push('=');\n        }\n    }\n    let optspecs_fn_name = format!(\"__fish_{bin_name}_global_optspecs\");\n    write!(\n        buf,\n        \"\\\n        # Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\\n\\\n        function {optspecs_fn_name}\\n\\\n        \\tstring join \\\\n{optspecs}\\n\\\n        end\\n\\n\\\n        function {needs_fn_name}\\n\\\n        \\t# Figure out if the current invocation already has a command.\\n\\\n        \\tset -l cmd (commandline -opc)\\n\\\n        \\tset -e cmd[1]\\n\\\n        \\targparse -s ({optspecs_fn_name}) -- $cmd 2>/dev/null\\n\\\n        \\tor return\\n\\\n        \\tif set -q argv[1]\\n\\\n        \\t\\t# Also print the command, so this can be used to figure out what it is.\\n\\\n        \\t\\techo $argv[1]\\n\\\n        \\t\\treturn 1\\n\\\n        \\tend\\n\\\n        \\treturn 0\\n\\\n        end\\n\\n\\\n        function {using_fn_name}\\n\\\n        \\tset -l cmd ({needs_fn_name})\\n\\\n        \\ttest -z \\\"$cmd\\\"\\n\\\n        \\tand return 1\\n\\\n        \\tcontains -- $cmd[1] $argv\\n\\\n        end\\n\\n\\\n    \").expect(\"failed to write completion file\");\n}\n\nfn value_completion(option: &Arg) -> String {\n    if !option.get_num_args().expect(\"built\").takes_values() {\n        return \"\".to_string();\n    }\n\n    if let Some(data) = utils::possible_values(option) {\n        // We return the possible values with their own empty description e.g. \"a\\t''\\nb\\t''\"\n        // this makes sure that a and b don't get the description of the option or argument\n        format!(\n            \" -r -f -a \\\"{}\\\"\",\n            data.iter()\n                .filter_map(|value| if value.is_hide_set() {\n                    None\n                } else {\n                    // The help text after \\t is wrapped in '' to make sure that the it is taken literally\n                    // and there is no command substitution or variable expansion resulting in unexpected errors\n                    Some(format!(\n                        \"{}\\\\t'{}'\",\n                        escape_string(value.get_name(), true).as_str(),\n                        escape_help(value.get_help().unwrap_or_default())\n                    ))\n                })\n                .collect::<Vec<_>>()\n                .join(\"\\n\")\n        )\n    } else {\n        // NB! If you change this, please also update the table in `ValueHint` documentation.\n        match option.get_value_hint() {\n            ValueHint::Unknown => \" -r\",\n            // fish has no built-in support to distinguish these\n            ValueHint::AnyPath | ValueHint::FilePath | ValueHint::ExecutablePath => \" -r -F\",\n            ValueHint::DirPath => \" -r -f -a \\\"(__fish_complete_directories)\\\"\",\n            // It seems fish has no built-in support for completing command + arguments as\n            // single string (CommandString). Complete just the command name.\n            ValueHint::CommandString | ValueHint::CommandName => {\n                \" -r -f -a \\\"(__fish_complete_command)\\\"\"\n            }\n            ValueHint::Username => \" -r -f -a \\\"(__fish_complete_users)\\\"\",\n            ValueHint::Hostname => \" -r -f -a \\\"(__fish_print_hostnames)\\\"\",\n            // Disable completion for others\n            _ => \" -r -f\",\n        }\n        .to_string()\n    }\n}\n"
  },
  {
    "path": "clap_complete/src/aot/shells/mod.rs",
    "content": "//! Shell-specific generators\n\nmod bash;\nmod elvish;\nmod fish;\nmod powershell;\nmod shell;\nmod zsh;\n\npub use bash::Bash;\npub use elvish::Elvish;\npub use fish::Fish;\npub use powershell::PowerShell;\npub use shell::Shell;\npub use zsh::Zsh;\n"
  },
  {
    "path": "clap_complete/src/aot/shells/powershell.rs",
    "content": "use std::io::{Error, Write};\n\nuse clap::builder::StyledStr;\nuse clap::{Arg, Command};\n\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::generator::{Generator, utils};\n\n/// Generate powershell completion file\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct PowerShell;\n\nimpl Generator for PowerShell {\n    fn file_name(&self, name: &str) -> String {\n        format!(\"_{name}.ps1\")\n    }\n\n    fn generate(&self, cmd: &Command, buf: &mut dyn Write) {\n        self.try_generate(cmd, buf)\n            .expect(\"failed to write completion file\");\n    }\n\n    fn try_generate(&self, cmd: &Command, buf: &mut dyn Write) -> Result<(), Error> {\n        let bin_name = cmd\n            .get_bin_name()\n            .expect(\"crate::generate should have set the bin_name\");\n\n        let subcommands_cases = generate_inner(cmd, \"\");\n\n        write!(\n            buf,\n            r#\"\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName '{bin_name}' -ScriptBlock {{\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        '{bin_name}'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {{\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {{\n                break\n        }}\n        $element.Value\n    }}) -join ';'\n\n    $completions = @(switch ($command) {{{subcommands_cases}\n    }})\n\n    $completions.Where{{ $_.CompletionText -like \"$wordToComplete*\" }} |\n        Sort-Object -Property ListItemText\n}}\n\"#\n        )\n    }\n}\n\n// Escape string inside single quotes\nfn escape_string(string: &str) -> String {\n    string.replace('\\'', \"''\").replace('’', \"'’\")\n}\n\nfn escape_help<T: ToString>(help: Option<&StyledStr>, data: T) -> String {\n    if let Some(help) = help {\n        let help_str = help.to_string();\n        if !help_str.is_empty() {\n            return escape_string(&help_str.replace('\\n', \" \"));\n        }\n    }\n    data.to_string()\n}\n\nfn generate_inner(p: &Command, previous_command_name: &str) -> String {\n    debug!(\"generate_inner\");\n\n    let command_names = if previous_command_name.is_empty() {\n        vec![p.get_bin_name().expect(INTERNAL_ERROR_MSG).to_string()]\n    } else {\n        p.get_name_and_visible_aliases()\n            .into_iter()\n            .map(|name| format!(\"{previous_command_name};{name}\"))\n            .collect()\n    };\n\n    let mut completions = String::new();\n    let preamble = String::from(\"\\n            [CompletionResult]::new(\");\n\n    for option in p.get_opts() {\n        generate_aliases(&mut completions, &preamble, option);\n    }\n\n    for flag in utils::flags(p) {\n        generate_aliases(&mut completions, &preamble, &flag);\n    }\n\n    for subcommand in p.get_subcommands() {\n        for name in subcommand.get_name_and_visible_aliases() {\n            let tooltip = escape_help(subcommand.get_about(), name);\n            completions.push_str(&preamble);\n            completions.push_str(&format!(\n                \"'{name}', '{name}', [CompletionResultType]::ParameterValue, '{tooltip}')\"\n            ));\n        }\n    }\n\n    let mut subcommands_cases = String::new();\n    for command_name in &command_names {\n        subcommands_cases.push_str(&format!(\n            r\"\n        '{command_name}' {{{completions}\n            break\n        }}\"\n        ));\n    }\n\n    for subcommand in p.get_subcommands() {\n        for command_name in &command_names {\n            let subcommand_subcommands_cases = generate_inner(subcommand, command_name);\n            subcommands_cases.push_str(&subcommand_subcommands_cases);\n        }\n    }\n\n    subcommands_cases\n}\n\nfn generate_aliases(completions: &mut String, preamble: &String, arg: &Arg) {\n    use std::fmt::Write as _;\n\n    if let Some(aliases) = arg.get_short_and_visible_aliases() {\n        let tooltip = escape_help(arg.get_help(), aliases[0]);\n        for alias in aliases {\n            let _ = write!(\n                completions,\n                \"{preamble}'-{alias}', '-{alias}{}', [CompletionResultType]::ParameterName, '{tooltip}')\",\n                // make PowerShell realize there is a difference between `-s` and `-S`\n                if alias.is_uppercase() { \" \" } else { \"\" },\n            );\n        }\n    }\n    if let Some(aliases) = arg.get_long_and_visible_aliases() {\n        let tooltip = escape_help(arg.get_help(), aliases[0]);\n        for alias in aliases {\n            let _ = write!(\n                completions,\n                \"{preamble}'--{alias}', '--{alias}', [CompletionResultType]::ParameterName, '{tooltip}')\"\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "clap_complete/src/aot/shells/shell.rs",
    "content": "use std::fmt::Display;\nuse std::io::Error;\nuse std::path::Path;\nuse std::str::FromStr;\n\nuse clap::ValueEnum;\nuse clap::builder::PossibleValue;\n\nuse crate::Generator;\nuse crate::shells;\n\n/// Shell with auto-generated completion script available.\n#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]\n#[non_exhaustive]\npub enum Shell {\n    /// Bourne Again `SHell` (bash)\n    Bash,\n    /// Elvish shell\n    Elvish,\n    /// Friendly Interactive `SHell` (fish)\n    Fish,\n    /// `PowerShell`\n    PowerShell,\n    /// Z `SHell` (zsh)\n    Zsh,\n}\n\nimpl Display for Shell {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.to_possible_value()\n            .expect(\"no values are skipped\")\n            .get_name()\n            .fmt(f)\n    }\n}\n\nimpl FromStr for Shell {\n    type Err = String;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        for variant in Self::value_variants() {\n            if variant.to_possible_value().unwrap().matches(s, false) {\n                return Ok(*variant);\n            }\n        }\n        Err(format!(\"invalid variant: {s}\"))\n    }\n}\n\n// Hand-rolled so it can work even when `derive` feature is disabled\nimpl ValueEnum for Shell {\n    fn value_variants<'a>() -> &'a [Self] {\n        &[\n            Shell::Bash,\n            Shell::Elvish,\n            Shell::Fish,\n            Shell::PowerShell,\n            Shell::Zsh,\n        ]\n    }\n\n    fn to_possible_value(&self) -> Option<PossibleValue> {\n        Some(match self {\n            Shell::Bash => PossibleValue::new(\"bash\"),\n            Shell::Elvish => PossibleValue::new(\"elvish\"),\n            Shell::Fish => PossibleValue::new(\"fish\"),\n            Shell::PowerShell => PossibleValue::new(\"powershell\"),\n            Shell::Zsh => PossibleValue::new(\"zsh\"),\n        })\n    }\n}\n\nimpl Generator for Shell {\n    fn file_name(&self, name: &str) -> String {\n        match self {\n            Shell::Bash => shells::Bash.file_name(name),\n            Shell::Elvish => shells::Elvish.file_name(name),\n            Shell::Fish => shells::Fish.file_name(name),\n            Shell::PowerShell => shells::PowerShell.file_name(name),\n            Shell::Zsh => shells::Zsh.file_name(name),\n        }\n    }\n\n    fn generate(&self, cmd: &clap::Command, buf: &mut dyn std::io::Write) {\n        self.try_generate(cmd, buf)\n            .expect(\"failed to write completion file\");\n    }\n\n    fn try_generate(&self, cmd: &clap::Command, buf: &mut dyn std::io::Write) -> Result<(), Error> {\n        match self {\n            Shell::Bash => shells::Bash.try_generate(cmd, buf),\n            Shell::Elvish => shells::Elvish.try_generate(cmd, buf),\n            Shell::Fish => shells::Fish.try_generate(cmd, buf),\n            Shell::PowerShell => shells::PowerShell.try_generate(cmd, buf),\n            Shell::Zsh => shells::Zsh.try_generate(cmd, buf),\n        }\n    }\n}\n\nimpl Shell {\n    /// Parse a shell from a path to the executable for the shell\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use clap_complete::shells::Shell;\n    ///\n    /// assert_eq!(Shell::from_shell_path(\"/bin/bash\"), Some(Shell::Bash));\n    /// assert_eq!(Shell::from_shell_path(\"/usr/bin/zsh\"), Some(Shell::Zsh));\n    /// assert_eq!(Shell::from_shell_path(\"/opt/my_custom_shell\"), None);\n    /// ```\n    pub fn from_shell_path<P: AsRef<Path>>(path: P) -> Option<Shell> {\n        parse_shell_from_path(path.as_ref())\n    }\n\n    /// Determine the user's current shell from the environment\n    ///\n    /// This will read the SHELL environment variable and try to determine which shell is in use\n    /// from that.\n    ///\n    /// If SHELL is not set, then on windows, it will default to powershell, and on\n    /// other operating systems it will return `None`.\n    ///\n    /// If SHELL is set, but contains a value that doesn't correspond to one of the supported shell\n    /// types, then return `None`.\n    ///\n    /// # Example:\n    ///\n    /// ```no_run\n    /// # use clap::Command;\n    /// use clap_complete::{generate, shells::Shell};\n    /// # fn build_cli() -> Command {\n    /// #     Command::new(\"compl\")\n    /// # }\n    /// let mut cmd = build_cli();\n    /// generate(Shell::from_env().unwrap_or(Shell::Bash), &mut cmd, \"myapp\", &mut std::io::stdout());\n    /// ```\n    pub fn from_env() -> Option<Shell> {\n        if let Some(env_shell) = std::env::var_os(\"SHELL\") {\n            Shell::from_shell_path(env_shell)\n        } else if cfg!(windows) {\n            Some(Shell::PowerShell)\n        } else {\n            None\n        }\n    }\n}\n\n// use a separate function to avoid having to monomorphize the entire function due\n// to from_shell_path being generic\nfn parse_shell_from_path(path: &Path) -> Option<Shell> {\n    let name = path.file_stem()?.to_str()?;\n    match name {\n        \"bash\" => Some(Shell::Bash),\n        \"zsh\" => Some(Shell::Zsh),\n        \"fish\" => Some(Shell::Fish),\n        \"elvish\" => Some(Shell::Elvish),\n        \"powershell\" | \"powershell_ise\" => Some(Shell::PowerShell),\n        _ => None,\n    }\n}\n"
  },
  {
    "path": "clap_complete/src/aot/shells/zsh.rs",
    "content": "use std::io::{Error, Write};\n\nuse clap::{Arg, ArgAction, Command, ValueHint};\n\nuse crate::INTERNAL_ERROR_MSG;\nuse crate::generator::{Generator, utils};\n\n/// Generate zsh completion file\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct Zsh;\n\nimpl Generator for Zsh {\n    fn file_name(&self, name: &str) -> String {\n        format!(\"_{name}\")\n    }\n\n    fn generate(&self, cmd: &Command, buf: &mut dyn Write) {\n        self.try_generate(cmd, buf)\n            .expect(\"failed to write completion file\");\n    }\n\n    fn try_generate(&self, cmd: &Command, buf: &mut dyn Write) -> Result<(), Error> {\n        let bin_name = cmd\n            .get_bin_name()\n            .expect(\"crate::generate should have set the bin_name\");\n\n        write!(\n            buf,\n            \"#compdef {name}\n\nautoload -U is-at-least\n\n_{name}() {{\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\\\"$curcontext\\\" state line\n    {initial_args}{subcommands}\n}}\n\n{subcommand_details}\n\nif [ \\\"$funcstack[1]\\\" = \\\"_{name}\\\" ]; then\n    _{name} \\\"$@\\\"\nelse\n    compdef _{name} {name}\nfi\n\",\n            name = bin_name,\n            initial_args = get_args_of(cmd, None),\n            subcommands = get_subcommands_of(cmd),\n            subcommand_details = subcommand_details(cmd)\n        )\n    }\n}\n\n// Displays the commands of a subcommand\n// (( $+functions[_[bin_name_underscore]_commands] )) ||\n// _[bin_name_underscore]_commands() {\n//     local commands; commands=(\n//         '[arg_name]:[arg_help]'\n//     )\n//     _describe -t commands '[bin_name] commands' commands \"$@\"\n//\n// Where the following variables are present:\n//    [bin_name_underscore]: The full space delineated bin_name, where spaces have been replaced by\n//                           underscore characters\n//    [arg_name]: The name of the subcommand\n//    [arg_help]: The help message of the subcommand\n//    [bin_name]: The full space delineated bin_name\n//\n// Here's a snippet from rustup:\n//\n// (( $+functions[_rustup_commands] )) ||\n// _rustup_commands() {\n//     local commands; commands=(\n//      'show:Show the active and installed toolchains'\n//      'update:Update Rust toolchains'\n//      # ... snip for brevity\n//      'help:Print this message or the help of the given subcommand(s)'\n//     )\n//     _describe -t commands 'rustup commands' commands \"$@\"\n//\nfn subcommand_details(p: &Command) -> String {\n    debug!(\"subcommand_details\");\n\n    let bin_name = p\n        .get_bin_name()\n        .expect(\"crate::generate should have set the bin_name\");\n\n    let mut ret = vec![];\n\n    // First we do ourself\n    let parent_text = format!(\n        \"\\\n(( $+functions[_{bin_name_underscore}_commands] )) ||\n_{bin_name_underscore}_commands() {{\n    local commands; commands=({subcommands_and_args})\n    _describe -t commands '{bin_name} commands' commands \\\"$@\\\"\n}}\",\n        bin_name_underscore = bin_name.replace(' ', \"__\"),\n        bin_name = bin_name,\n        subcommands_and_args = subcommands_of(p)\n    );\n    ret.push(parent_text);\n\n    // Next we start looping through all the children, grandchildren, etc.\n    let mut all_subcommand_bins: Vec<_> = utils::all_subcommands(p)\n        .into_iter()\n        .map(|(_sc_name, bin_name)| bin_name)\n        .collect();\n\n    all_subcommand_bins.sort();\n    all_subcommand_bins.dedup();\n\n    for bin_name in &all_subcommand_bins {\n        debug!(\"subcommand_details:iter: bin_name={bin_name}\");\n\n        ret.push(format!(\n            \"\\\n(( $+functions[_{bin_name_underscore}_commands] )) ||\n_{bin_name_underscore}_commands() {{\n    local commands; commands=({subcommands_and_args})\n    _describe -t commands '{bin_name} commands' commands \\\"$@\\\"\n}}\",\n            bin_name_underscore = bin_name.replace(' ', \"__\"),\n            bin_name = bin_name,\n            subcommands_and_args =\n                subcommands_of(parser_of(p, bin_name).expect(INTERNAL_ERROR_MSG))\n        ));\n    }\n\n    ret.join(\"\\n\")\n}\n\n// Generates subcommand completions in form of\n//\n//         '[arg_name]:[arg_help]'\n//\n// Where:\n//    [arg_name]: the subcommand's name\n//    [arg_help]: the help message of the subcommand\n//\n// A snippet from rustup:\n//         'show:Show the active and installed toolchains'\n//      'update:Update Rust toolchains'\nfn subcommands_of(p: &Command) -> String {\n    debug!(\"subcommands_of\");\n\n    let mut segments = vec![];\n\n    fn add_subcommands(subcommand: &Command, name: &str, ret: &mut Vec<String>) {\n        debug!(\"add_subcommands\");\n\n        let text = format!(\n            \"'{name}:{help}' \\\\\",\n            name = name,\n            help = escape_help(&subcommand.get_about().unwrap_or_default().to_string())\n        );\n\n        ret.push(text);\n    }\n\n    // The subcommands\n    for command in p.get_subcommands() {\n        debug!(\"subcommands_of:iter: subcommand={}\", command.get_name());\n\n        add_subcommands(command, command.get_name(), &mut segments);\n\n        for alias in command.get_visible_aliases() {\n            add_subcommands(command, alias, &mut segments);\n        }\n    }\n\n    // Surround the text with newlines for proper formatting.\n    // We need this to prevent weirdly formatted `command=(\\n        \\n)` sections.\n    // When there are no (sub-)commands.\n    if !segments.is_empty() {\n        segments.insert(0, \"\".to_string());\n        segments.push(\"    \".to_string());\n    }\n\n    segments.join(\"\\n\")\n}\n\n// Get's the subcommand section of a completion file\n// This looks roughly like:\n//\n// case $state in\n// ([bin_name]_args)\n//     curcontext=\\\"${curcontext%:*:*}:[name_hyphen]-command-$words[1]:\\\"\n//     case $line[1] in\n//\n//         ([name])\n//         _arguments -C -s -S \\\n//             [subcommand_args]\n//         && ret=0\n//\n//         [RECURSIVE_CALLS]\n//\n//         ;;\",\n//\n//         [repeat]\n//\n//     esac\n// ;;\n// esac\",\n//\n// Where the following variables are present:\n//    [name] = The subcommand name in the form of \"install\" for \"rustup toolchain install\"\n//    [bin_name] = The full space delineated bin_name such as \"rustup toolchain install\"\n//    [name_hyphen] = The full space delineated bin_name, but replace spaces with hyphens\n//    [repeat] = From the same recursive calls, but for all subcommands\n//    [subcommand_args] = The same as zsh::get_args_of\nfn get_subcommands_of(parent: &Command) -> String {\n    debug!(\n        \"get_subcommands_of: Has subcommands...{:?}\",\n        parent.has_subcommands()\n    );\n\n    if !parent.has_subcommands() {\n        return String::new();\n    }\n\n    let subcommand_names = utils::subcommands(parent);\n    let mut all_subcommands = vec![];\n\n    for (name, bin_name) in &subcommand_names {\n        debug!(\n            \"get_subcommands_of:iter: parent={}, name={name}, bin_name={bin_name}\",\n            parent.get_name(),\n        );\n        let mut segments = vec![format!(\"({name})\")];\n        let subcommand_args = get_args_of(\n            parser_of(parent, bin_name).expect(INTERNAL_ERROR_MSG),\n            Some(parent),\n        );\n\n        if !subcommand_args.is_empty() {\n            segments.push(subcommand_args);\n        }\n\n        // Get the help text of all child subcommands.\n        let children = get_subcommands_of(parser_of(parent, bin_name).expect(INTERNAL_ERROR_MSG));\n\n        if !children.is_empty() {\n            segments.push(children);\n        }\n\n        segments.push(String::from(\";;\"));\n        all_subcommands.push(segments.join(\"\\n\"));\n    }\n\n    let parent_bin_name = parent\n        .get_bin_name()\n        .expect(\"crate::generate should have set the bin_name\");\n\n    format!(\n        \"\n    case $state in\n    ({name})\n        words=($line[{pos}] \\\"${{words[@]}}\\\")\n        (( CURRENT += 1 ))\n        curcontext=\\\"${{curcontext%:*:*}}:{name_hyphen}-command-$line[{pos}]:\\\"\n        case $line[{pos}] in\n            {subcommands}\n        esac\n    ;;\nesac\",\n        name = parent.get_name(),\n        name_hyphen = parent_bin_name.replace(' ', \"-\"),\n        subcommands = all_subcommands.join(\"\\n\"),\n        pos = parent.get_positionals().count() + 1\n    )\n}\n\n// Get the Command for a given subcommand tree.\n//\n// Given the bin_name \"a b c\" and the Command for \"a\" this returns the \"c\" Command.\n// Given the bin_name \"a b c\" and the Command for \"b\" this returns the \"c\" Command.\nfn parser_of<'cmd>(parent: &'cmd Command, bin_name: &str) -> Option<&'cmd Command> {\n    debug!(\"parser_of: p={}, bin_name={}\", parent.get_name(), bin_name);\n\n    if bin_name == parent.get_bin_name().unwrap_or_default() {\n        return Some(parent);\n    }\n\n    for subcommand in parent.get_subcommands() {\n        if let Some(ret) = parser_of(subcommand, bin_name) {\n            return Some(ret);\n        }\n    }\n\n    None\n}\n\n// Writes out the args section, which ends up being the flags, opts and positionals, and a jump to\n// another ZSH function if there are subcommands.\n// The structure works like this:\n//    ([conflicting_args]) [multiple] arg [takes_value] [[help]] [: :(possible_values)]\n//       ^-- list '-v -h'    ^--'*'          ^--'+'                   ^-- list 'one two three'\n//\n// An example from the rustup command:\n//\n// _arguments -C -s -S \\\n//         '(-h --help --verbose)-v[Enable verbose output]' \\\n//         '(-V -v --version --verbose --help)-h[Print help information]' \\\n//      # ... snip for brevity\n//         ':: :_rustup_commands' \\    # <-- displays subcommands\n//         '*::: :->rustup' \\          # <-- displays subcommand args and child subcommands\n//     && ret=0\n//\n// The args used for _arguments are as follows:\n//    -C: modify the $context internal variable\n//    -s: Allow stacking of short args (i.e. -a -b -c => -abc)\n//    -S: Do not complete anything after '--' and treat those as argument values\nfn get_args_of(parent: &Command, p_global: Option<&Command>) -> String {\n    debug!(\"get_args_of\");\n\n    let mut segments = vec![String::from(\"_arguments \\\"${_arguments_options[@]}\\\" : \\\\\")];\n    let opts = write_opts_of(parent, p_global);\n    let flags = write_flags_of(parent, p_global);\n    let positionals = write_positionals_of(parent);\n\n    if !opts.is_empty() {\n        segments.push(opts);\n    }\n\n    if !flags.is_empty() {\n        segments.push(flags);\n    }\n\n    if !positionals.is_empty() {\n        segments.push(positionals);\n    }\n\n    if parent.has_subcommands() {\n        let parent_bin_name = parent\n            .get_bin_name()\n            .expect(\"crate::generate should have set the bin_name\");\n        let subcommand_bin_name = format!(\n            \"\\\":: :_{name}_commands\\\" \\\\\",\n            name = parent_bin_name.replace(' ', \"__\")\n        );\n        segments.push(subcommand_bin_name);\n\n        let subcommand_text = format!(\"\\\"*::: :->{name}\\\" \\\\\", name = parent.get_name());\n        segments.push(subcommand_text);\n    } else if parent.is_allow_external_subcommands_set() {\n        // If the command has an external subcommand value parser, we need to\n        // add a catch-all for the subcommand. Otherwise there would be no autocompletion whatsoever.\n        segments.push(String::from(\"\\\"*::external_command:_default\\\" \\\\\"));\n    }\n\n    segments.push(String::from(\"&& ret=0\"));\n    segments.join(\"\\n\")\n}\n\n// Uses either `possible_vals` or `value_hint` to give hints about possible argument values\nfn value_completion(arg: &Arg) -> Option<String> {\n    if let Some(values) = utils::possible_values(arg) {\n        if values\n            .iter()\n            .any(|value| !value.is_hide_set() && value.get_help().is_some())\n        {\n            Some(format!(\n                \"(({}))\",\n                values\n                    .iter()\n                    .filter_map(|value| {\n                        if value.is_hide_set() {\n                            None\n                        } else {\n                            Some(format!(\n                                r#\"{name}\\:\"{tooltip}\"\"#,\n                                name = escape_value(value.get_name()),\n                                tooltip =\n                                    escape_help(&value.get_help().unwrap_or_default().to_string()),\n                            ))\n                        }\n                    })\n                    .collect::<Vec<_>>()\n                    .join(\"\\n\")\n            ))\n        } else {\n            Some(format!(\n                \"({})\",\n                values\n                    .iter()\n                    .filter(|pv| !pv.is_hide_set())\n                    .map(|n| n.get_name())\n                    .collect::<Vec<_>>()\n                    .join(\" \")\n            ))\n        }\n    } else {\n        // NB! If you change this, please also update the table in `ValueHint` documentation.\n        Some(\n            match arg.get_value_hint() {\n                ValueHint::Unknown => \"_default\",\n                ValueHint::Other => \"\",\n                ValueHint::AnyPath => \"_files\",\n                ValueHint::FilePath => \"_files\",\n                ValueHint::DirPath => \"_files -/\",\n                ValueHint::ExecutablePath => \"_absolute_command_paths\",\n                ValueHint::CommandName => \"_command_names -e\",\n                ValueHint::CommandString => \"_cmdstring\",\n                ValueHint::CommandWithArguments => \"_cmdambivalent\",\n                ValueHint::Username => \"_users\",\n                ValueHint::Hostname => \"_hosts\",\n                ValueHint::Url => \"_urls\",\n                ValueHint::EmailAddress => \"_email_addresses\",\n                _ => {\n                    return None;\n                }\n            }\n            .to_string(),\n        )\n    }\n}\n\n/// Escape help string inside single quotes and brackets\nfn escape_help(string: &str) -> String {\n    string\n        .replace('\\\\', \"\\\\\\\\\")\n        .replace('\\'', \"'\\\\''\")\n        .replace('[', \"\\\\[\")\n        .replace(']', \"\\\\]\")\n        .replace(':', \"\\\\:\")\n        .replace('$', \"\\\\$\")\n        .replace('`', \"\\\\`\")\n        .replace('\\n', \" \")\n}\n\n/// Escape value string inside single quotes and parentheses\nfn escape_value(string: &str) -> String {\n    string\n        .replace('\\\\', \"\\\\\\\\\")\n        .replace('\\'', \"'\\\\''\")\n        .replace('[', \"\\\\[\")\n        .replace(']', \"\\\\]\")\n        .replace(':', \"\\\\:\")\n        .replace('$', \"\\\\$\")\n        .replace('`', \"\\\\`\")\n        .replace('(', \"\\\\(\")\n        .replace(')', \"\\\\)\")\n        .replace(' ', \"\\\\ \")\n}\n\nfn write_opts_of(p: &Command, p_global: Option<&Command>) -> String {\n    debug!(\"write_opts_of\");\n\n    let mut ret = vec![];\n\n    for o in p.get_opts() {\n        debug!(\"write_opts_of:iter: o={}\", o.get_id());\n\n        let help = escape_help(&o.get_help().unwrap_or_default().to_string());\n        let conflicts = arg_conflicts(p, o, p_global);\n\n        let multiple = if let ArgAction::Count | ArgAction::Append = o.get_action() {\n            \"*\"\n        } else {\n            \"\"\n        };\n\n        let vn = match o.get_value_names() {\n            None => \" \".to_string(),\n            Some(val) => val[0].to_string(),\n        };\n        let vc = match value_completion(o) {\n            Some(val) => format!(\":{vn}:{val}\"),\n            None => format!(\":{vn}: \"),\n        };\n        let vc = match o.get_num_args().expect(\"built\").min_values() {\n            0 => format!(\":{vc}\"),\n            min_value => vc.repeat(min_value),\n        };\n\n        if let Some(shorts) = o.get_short_and_visible_aliases() {\n            for short in shorts {\n                let s = format!(\"'{conflicts}{multiple}-{short}+[{help}]{vc}' \\\\\");\n\n                debug!(\"write_opts_of:iter: Wrote...{}\", &*s);\n                ret.push(s);\n            }\n        }\n        if let Some(longs) = o.get_long_and_visible_aliases() {\n            for long in longs {\n                let l = format!(\"'{conflicts}{multiple}--{long}=[{help}]{vc}' \\\\\");\n\n                debug!(\"write_opts_of:iter: Wrote...{}\", &*l);\n                ret.push(l);\n            }\n        }\n    }\n\n    ret.join(\"\\n\")\n}\n\nfn arg_conflicts(cmd: &Command, arg: &Arg, app_global: Option<&Command>) -> String {\n    fn push_conflicts(conflicts: &[&Arg], res: &mut Vec<String>) {\n        for conflict in conflicts {\n            if let Some(s) = conflict.get_short() {\n                res.push(format!(\"-{s}\"));\n            }\n\n            if let Some(l) = conflict.get_long() {\n                res.push(format!(\"--{l}\"));\n            }\n        }\n    }\n\n    let mut res = vec![];\n    match (app_global, arg.is_global_set()) {\n        (Some(x), true) => {\n            let conflicts = x.get_arg_conflicts_with(arg);\n\n            if conflicts.is_empty() {\n                return String::new();\n            }\n\n            push_conflicts(&conflicts, &mut res);\n        }\n        (_, _) => {\n            let conflicts = cmd.get_arg_conflicts_with(arg);\n\n            if conflicts.is_empty() {\n                return String::new();\n            }\n\n            push_conflicts(&conflicts, &mut res);\n        }\n    };\n\n    format!(\"({})\", res.join(\" \"))\n}\n\nfn write_flags_of(p: &Command, p_global: Option<&Command>) -> String {\n    debug!(\"write_flags_of;\");\n\n    let mut ret = vec![];\n\n    for f in utils::flags(p) {\n        debug!(\"write_flags_of:iter: f={}\", f.get_id());\n\n        let help = escape_help(&f.get_help().unwrap_or_default().to_string());\n        let conflicts = arg_conflicts(p, &f, p_global);\n\n        let multiple = if let ArgAction::Count | ArgAction::Append = f.get_action() {\n            \"*\"\n        } else {\n            \"\"\n        };\n\n        if let Some(short) = f.get_short() {\n            let s = format!(\"'{conflicts}{multiple}-{short}[{help}]' \\\\\");\n\n            debug!(\"write_flags_of:iter: Wrote...{}\", &*s);\n\n            ret.push(s);\n\n            if let Some(short_aliases) = f.get_visible_short_aliases() {\n                for alias in short_aliases {\n                    let s = format!(\"'{conflicts}{multiple}-{alias}[{help}]' \\\\\",);\n\n                    debug!(\"write_flags_of:iter: Wrote...{}\", &*s);\n\n                    ret.push(s);\n                }\n            }\n        }\n\n        if let Some(long) = f.get_long() {\n            let l = format!(\"'{conflicts}{multiple}--{long}[{help}]' \\\\\");\n\n            debug!(\"write_flags_of:iter: Wrote...{}\", &*l);\n\n            ret.push(l);\n\n            if let Some(aliases) = f.get_visible_aliases() {\n                for alias in aliases {\n                    let l = format!(\"'{conflicts}{multiple}--{alias}[{help}]' \\\\\");\n\n                    debug!(\"write_flags_of:iter: Wrote...{}\", &*l);\n\n                    ret.push(l);\n                }\n            }\n        }\n    }\n\n    ret.join(\"\\n\")\n}\n\nfn write_positionals_of(p: &Command) -> String {\n    debug!(\"write_positionals_of;\");\n\n    let mut ret = vec![];\n\n    // Completions for commands that end with two Vec arguments require special care.\n    // - You can have two Vec args separated with a custom value terminator.\n    // - You can have two Vec args with the second one set to last (raw sets last)\n    //   which will require a '--' separator to be used before the second argument\n    //   on the command-line.\n    //\n    // We use the '-S' _arguments option to disable completion after '--'. Thus, the\n    // completion for the second argument in scenario (B) does not need to be emitted\n    // because it is implicitly handled by the '-S' option.\n    // We only need to emit the first catch-all.\n    //\n    // Have we already emitted a catch-all multi-valued positional argument\n    // without a custom value terminator?\n    let mut catch_all_emitted = false;\n\n    for arg in p.get_positionals() {\n        debug!(\"write_positionals_of:iter: arg={}\", arg.get_id());\n\n        let num_args = arg.get_num_args().expect(\"built\");\n        let is_multi_valued = num_args.max_values() > 1;\n\n        if catch_all_emitted && (arg.is_last_set() || is_multi_valued) {\n            // This is the final argument and it also takes multiple arguments.\n            // We've already emitted a catch-all positional argument so we don't need\n            // to emit anything for this argument because it is implicitly handled by\n            // the use of the '-S' _arguments option.\n            continue;\n        }\n\n        let cardinality_value;\n        // If we have any subcommands, we'll emit a catch-all argument, so we shouldn't\n        // emit one here.\n        let cardinality = if is_multi_valued && !p.has_subcommands() {\n            match arg.get_value_terminator() {\n                Some(terminator) => {\n                    cardinality_value = format!(\"*{}:\", escape_value(terminator));\n                    cardinality_value.as_str()\n                }\n                None => {\n                    catch_all_emitted = true;\n                    \"*:\"\n                }\n            }\n        } else if !arg.is_required_set() {\n            \":\"\n        } else {\n            \"\"\n        };\n\n        let a = format!(\n            \"'{cardinality}:{name}{help}:{value_completion}' \\\\\",\n            cardinality = cardinality,\n            name = arg.get_id(),\n            help = arg\n                .get_help()\n                .map(|s| s.to_string())\n                .map(|v| \" -- \".to_owned() + &v)\n                .unwrap_or_else(|| \"\".to_owned())\n                .replace('[', \"\\\\[\")\n                .replace(']', \"\\\\]\")\n                .replace('\\'', \"'\\\\''\")\n                .replace(':', \"\\\\:\"),\n            value_completion = value_completion(arg).unwrap_or_default()\n        );\n\n        debug!(\"write_positionals_of:iter: Wrote...{a}\");\n\n        ret.push(a);\n    }\n\n    ret.join(\"\\n\")\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{escape_help, escape_value};\n\n    #[test]\n    fn test_escape_value() {\n        let raw_string = \"\\\\ [foo]() `bar https://$PATH\";\n        assert_eq!(\n            escape_value(raw_string),\n            \"\\\\\\\\\\\\ \\\\[foo\\\\]\\\\(\\\\)\\\\ \\\\`bar\\\\ https\\\\://\\\\$PATH\"\n        );\n    }\n\n    #[test]\n    fn test_escape_help() {\n        let raw_string = \"\\\\ [foo]() `bar https://$PATH\";\n        assert_eq!(\n            escape_help(raw_string),\n            \"\\\\\\\\ \\\\[foo\\\\]() \\\\`bar https\\\\://\\\\$PATH\"\n        );\n    }\n}\n"
  },
  {
    "path": "clap_complete/src/engine/candidate.rs",
    "content": "use std::ffi::OsStr;\nuse std::ffi::OsString;\n\nuse clap::builder::StyledStr;\n\n/// A shell-agnostic completion candidate\n#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord)]\npub struct CompletionCandidate {\n    value: OsString,\n    help: Option<StyledStr>,\n    id: Option<String>,\n    tag: Option<StyledStr>,\n    display_order: Option<usize>,\n    hidden: bool,\n}\n\nimpl CompletionCandidate {\n    /// Create a new completion candidate\n    pub fn new(value: impl Into<OsString>) -> Self {\n        let value = value.into();\n        Self {\n            value,\n            ..Default::default()\n        }\n    }\n\n    /// Set the help message of the completion candidate\n    pub fn help(mut self, help: Option<StyledStr>) -> Self {\n        self.help = help;\n        self\n    }\n\n    /// Only first for a given Id is shown\n    ///\n    /// To reduce the risk of conflicts, this should likely contain a namespace.\n    pub fn id(mut self, id: Option<String>) -> Self {\n        self.id = id;\n        self\n    }\n\n    /// Group candidates by tag\n    ///\n    /// Future: these may become user-visible\n    pub fn tag(mut self, tag: Option<StyledStr>) -> Self {\n        self.tag = tag;\n        self\n    }\n\n    /// Sort weight within a [`CompletionCandidate::tag`]\n    pub fn display_order(mut self, order: Option<usize>) -> Self {\n        self.display_order = order;\n        self\n    }\n\n    /// Set the visibility of the completion candidate\n    ///\n    /// Only shown when there is no visible candidate for completing the current argument.\n    pub fn hide(mut self, hidden: bool) -> Self {\n        self.hidden = hidden;\n        self\n    }\n\n    /// Add a prefix to the value of completion candidate\n    ///\n    /// This is generally used for post-process by [`complete`][crate::engine::complete()] for\n    /// things like pre-pending flags, merging delimiter-separated values, etc.\n    pub fn add_prefix(mut self, prefix: impl Into<OsString>) -> Self {\n        let suffix = self.value;\n        let mut value = prefix.into();\n        value.push(&suffix);\n        self.value = value;\n        self\n    }\n}\n\n/// Reflection API\nimpl CompletionCandidate {\n    /// Get the literal value being proposed for completion\n    pub fn get_value(&self) -> &OsStr {\n        &self.value\n    }\n\n    /// Get the help message of the completion candidate\n    pub fn get_help(&self) -> Option<&StyledStr> {\n        self.help.as_ref()\n    }\n\n    /// Get the id used for de-duplicating\n    pub fn get_id(&self) -> Option<&String> {\n        self.id.as_ref()\n    }\n\n    /// Get the grouping tag\n    pub fn get_tag(&self) -> Option<&StyledStr> {\n        self.tag.as_ref()\n    }\n\n    /// Get the grouping tag\n    pub fn get_display_order(&self) -> Option<usize> {\n        self.display_order\n    }\n\n    /// Get the visibility of the completion candidate\n    pub fn is_hide_set(&self) -> bool {\n        self.hidden\n    }\n}\n\nimpl<S: Into<OsString>> From<S> for CompletionCandidate {\n    fn from(s: S) -> Self {\n        CompletionCandidate::new(s.into())\n    }\n}\n"
  },
  {
    "path": "clap_complete/src/engine/complete.rs",
    "content": "use std::ffi::OsStr;\nuse std::ffi::OsString;\n\nuse clap_lex::OsStrExt as _;\n\nuse super::ArgValueCandidates;\nuse super::ArgValueCompleter;\nuse super::CompletionCandidate;\nuse super::SubcommandCandidates;\nuse super::custom::complete_path;\n\n/// Complete the given command, shell-agnostic\npub fn complete(\n    cmd: &mut clap::Command,\n    args: Vec<OsString>,\n    arg_index: usize,\n    current_dir: Option<&std::path::Path>,\n) -> Result<Vec<CompletionCandidate>, std::io::Error> {\n    debug!(\"complete: args={args:?}, arg_index={arg_index:?}, current_dir={current_dir:?}\");\n    cmd.build();\n\n    let raw_args = clap_lex::RawArgs::new(args);\n    let mut cursor = raw_args.cursor();\n    let mut target_cursor = raw_args.cursor();\n    raw_args.seek(\n        &mut target_cursor,\n        clap_lex::SeekFrom::Start(arg_index as u64),\n    );\n    // As we loop, `cursor` will always be pointing to the next item\n    raw_args.next_os(&mut target_cursor);\n    debug!(\"complete: target_cursor={target_cursor:?}\");\n\n    // TODO: Multicall support\n    if !cmd.is_no_binary_name_set() {\n        raw_args.next_os(&mut cursor);\n    }\n\n    let mut current_cmd = &*cmd;\n    let mut pos_index = 1;\n    let mut is_escaped = false;\n    let mut next_state = ParseState::ValueDone;\n    while let Some(arg) = raw_args.next(&mut cursor) {\n        let current_state = next_state;\n        next_state = ParseState::ValueDone;\n        debug!(\n            \"complete::next: arg={:?}, current_state={current_state:?}, cursor={cursor:?}\",\n            arg.to_value_os(),\n        );\n        if cursor == target_cursor {\n            return complete_arg(\n                &arg,\n                current_cmd,\n                current_dir,\n                pos_index,\n                is_escaped,\n                current_state,\n            );\n        }\n\n        if let Ok(value) = arg.to_value() {\n            if let Some(next_cmd) = current_cmd.find_subcommand(value) {\n                current_cmd = next_cmd;\n                pos_index = 1;\n                continue;\n            }\n        }\n\n        if is_escaped {\n            (next_state, pos_index) =\n                parse_positional(current_cmd, pos_index, is_escaped, current_state);\n        } else if arg.is_escape() {\n            is_escaped = true;\n        } else if opt_allows_hyphen(&current_state, &arg) {\n            match current_state {\n                ParseState::Opt((opt, count)) => next_state = parse_opt_value(opt, count),\n                _ => unreachable!(\"else branch is only reachable in Opt state\"),\n            }\n        } else if let Some((flag, value)) = arg.to_long() {\n            if let Ok(flag) = flag {\n                let opt = current_cmd.get_arguments().find(|a| {\n                    let longs = a.get_long_and_visible_aliases();\n                    let is_find = longs.map(|v| {\n                        let mut iter = v.into_iter();\n                        let s = iter.find(|s| *s == flag);\n                        s.is_some()\n                    });\n                    is_find.unwrap_or(false)\n                });\n\n                if let Some(opt) = opt {\n                    if opt.get_num_args().expect(\"built\").takes_values() && value.is_none() {\n                        next_state = ParseState::Opt((opt, 1));\n                    };\n                } else if pos_allows_hyphen(current_cmd, pos_index) {\n                    (next_state, pos_index) =\n                        parse_positional(current_cmd, pos_index, is_escaped, current_state);\n                }\n            }\n        } else if let Some(short) = arg.to_short() {\n            let (_, takes_value_opt, mut short) = parse_shortflags(current_cmd, short);\n            if let Some(opt) = takes_value_opt {\n                if short.next_value_os().is_none() {\n                    next_state = ParseState::Opt((opt, 1));\n                }\n            } else if pos_allows_hyphen(current_cmd, pos_index) {\n                (next_state, pos_index) =\n                    parse_positional(current_cmd, pos_index, is_escaped, current_state);\n            }\n        } else {\n            match current_state {\n                ParseState::ValueDone | ParseState::Pos(..) => {\n                    (next_state, pos_index) =\n                        parse_positional(current_cmd, pos_index, is_escaped, current_state);\n                }\n                ParseState::Opt((opt, count)) => next_state = parse_opt_value(opt, count),\n            }\n        }\n    }\n\n    Err(std::io::Error::other(\"no completion generated\"))\n}\n\n#[derive(Debug, PartialEq, Eq, Clone)]\nenum ParseState<'a> {\n    /// Parsing a value done, there is no state to record.\n    ValueDone,\n\n    /// Parsing a positional argument after `--`. `Pos(pos_index`, `takes_num_args`)\n    Pos((usize, usize)),\n\n    /// Parsing a optional flag argument\n    Opt((&'a clap::Arg, usize)),\n}\n\nfn complete_arg(\n    arg: &clap_lex::ParsedArg<'_>,\n    cmd: &clap::Command,\n    current_dir: Option<&std::path::Path>,\n    pos_index: usize,\n    is_escaped: bool,\n    state: ParseState<'_>,\n) -> Result<Vec<CompletionCandidate>, std::io::Error> {\n    debug!(\n        \"complete_arg: arg={:?}, cmd={:?}, current_dir={:?}, pos_index={:?}, state={:?}\",\n        arg,\n        cmd.get_name(),\n        current_dir,\n        pos_index,\n        state\n    );\n    let mut completions = Vec::<CompletionCandidate>::new();\n\n    match state {\n        ParseState::ValueDone => {\n            if let Ok(value) = arg.to_value() {\n                completions.extend(complete_subcommand(value, cmd));\n            }\n\n            if let Some(positional) = cmd\n                .get_positionals()\n                .find(|p| p.get_index() == Some(pos_index))\n            {\n                completions.extend(complete_arg_value(arg.to_value(), positional, current_dir));\n            }\n            if !is_escaped {\n                completions.extend(complete_option(arg, cmd, current_dir));\n            }\n        }\n        ParseState::Pos((_, num_arg)) => {\n            if let Some(positional) = cmd\n                .get_positionals()\n                .find(|p| p.get_index() == Some(pos_index))\n            {\n                completions.extend(complete_arg_value(arg.to_value(), positional, current_dir));\n                if positional\n                    .get_num_args()\n                    .is_some_and(|num_args| num_arg >= num_args.min_values())\n                {\n                    completions.extend(complete_option(arg, cmd, current_dir));\n                }\n            }\n        }\n        ParseState::Opt((opt, count)) => {\n            completions.extend(complete_arg_value(arg.to_value(), opt, current_dir));\n            let min = opt.get_num_args().map(|r| r.min_values()).unwrap_or(0);\n            if count > min {\n                // Also complete this raw_arg as a positional argument, flags, options and subcommand.\n                completions.extend(complete_arg(\n                    arg,\n                    cmd,\n                    current_dir,\n                    pos_index,\n                    is_escaped,\n                    ParseState::ValueDone,\n                )?);\n            }\n        }\n    }\n    if completions.iter().any(|a| !a.is_hide_set()) {\n        completions.retain(|a| !a.is_hide_set());\n    }\n    let mut seen_ids = std::collections::HashSet::new();\n    completions.retain(move |a| {\n        if let Some(id) = a.get_id().cloned() {\n            seen_ids.insert(id)\n        } else {\n            true\n        }\n    });\n\n    let mut tags = Vec::new();\n    for candidate in &completions {\n        let tag = candidate.get_tag().cloned();\n        if !tags.contains(&tag) {\n            tags.push(tag);\n        }\n    }\n    completions.sort_by_key(|c| {\n        (\n            tags.iter().position(|t| c.get_tag() == t.as_ref()),\n            c.get_display_order(),\n        )\n    });\n\n    Ok(completions)\n}\n\nfn complete_option(\n    arg: &clap_lex::ParsedArg<'_>,\n    cmd: &clap::Command,\n    current_dir: Option<&std::path::Path>,\n) -> Vec<CompletionCandidate> {\n    let mut completions = Vec::<CompletionCandidate>::new();\n    if arg.is_empty() {\n        completions.extend(longs_and_visible_aliases(cmd));\n        completions.extend(hidden_longs_aliases(cmd));\n\n        let dash_or_arg = if arg.is_empty() {\n            \"-\".into()\n        } else {\n            arg.to_value_os().to_string_lossy()\n        };\n        completions.extend(\n            shorts_and_visible_aliases(cmd)\n                .into_iter()\n                .map(|comp| comp.add_prefix(dash_or_arg.to_string())),\n        );\n    } else if arg.is_stdio() {\n        // HACK: Assuming knowledge of is_stdio\n        let dash_or_arg = if arg.is_empty() {\n            \"-\".into()\n        } else {\n            arg.to_value_os().to_string_lossy()\n        };\n        completions.extend(\n            shorts_and_visible_aliases(cmd)\n                .into_iter()\n                .map(|comp| comp.add_prefix(dash_or_arg.to_string())),\n        );\n\n        completions.extend(longs_and_visible_aliases(cmd));\n        completions.extend(hidden_longs_aliases(cmd));\n    } else if arg.is_escape() {\n        // HACK: Assuming knowledge of is_escape\n        completions.extend(longs_and_visible_aliases(cmd));\n        completions.extend(hidden_longs_aliases(cmd));\n    } else if let Some((flag, value)) = arg.to_long() {\n        if let Ok(flag) = flag {\n            if let Some(value) = value {\n                if let Some(arg) = cmd.get_arguments().find(|a| a.get_long() == Some(flag)) {\n                    completions.extend(\n                        complete_arg_value(value.to_str().ok_or(value), arg, current_dir)\n                            .into_iter()\n                            .map(|comp| comp.add_prefix(format!(\"--{flag}=\"))),\n                    );\n                }\n            } else {\n                completions.extend(\n                    longs_and_visible_aliases(cmd)\n                        .into_iter()\n                        .filter(|comp| comp.get_value().starts_with(format!(\"--{flag}\").as_str())),\n                );\n                completions.extend(\n                    hidden_longs_aliases(cmd)\n                        .into_iter()\n                        .filter(|comp| comp.get_value().starts_with(format!(\"--{flag}\").as_str())),\n                );\n            }\n        }\n    } else if let Some(short) = arg.to_short() {\n        if !short.is_negative_number() {\n            // Find the first takes_values option.\n            let (leading_flags, takes_value_opt, mut short) = parse_shortflags(cmd, short);\n\n            // Clone `short` to `peek_short` to peek whether the next flag is a `=`.\n            if let Some(opt) = takes_value_opt {\n                let mut peek_short = short.clone();\n                let has_equal = if let Some(Ok('=')) = peek_short.next_flag() {\n                    short.next_flag();\n                    true\n                } else {\n                    false\n                };\n\n                let value = short.next_value_os().unwrap_or(OsStr::new(\"\"));\n                completions.extend(\n                    complete_arg_value(value.to_str().ok_or(value), opt, current_dir)\n                        .into_iter()\n                        .map(|comp| {\n                            let sep = if has_equal { \"=\" } else { \"\" };\n                            comp.add_prefix(format!(\"-{leading_flags}{sep}\"))\n                        }),\n                );\n            } else {\n                completions.extend(\n                    shorts_and_visible_aliases(cmd)\n                        .into_iter()\n                        .map(|comp| comp.add_prefix(format!(\"-{leading_flags}\"))),\n                );\n            }\n        }\n    }\n    completions\n}\n\nfn complete_arg_value(\n    value: Result<&str, &OsStr>,\n    arg: &clap::Arg,\n    current_dir: Option<&std::path::Path>,\n) -> Vec<CompletionCandidate> {\n    let mut values = Vec::new();\n    debug!(\"complete_arg_value: arg={arg:?}, value={value:?}\");\n\n    let (prefix, value) =\n        rsplit_delimiter(value, arg.get_value_delimiter()).unwrap_or((None, value));\n\n    let value_os = match value {\n        Ok(value) => OsStr::new(value),\n        Err(value_os) => value_os,\n    };\n\n    if let Some(completer) = arg.get::<ArgValueCompleter>() {\n        values.extend(completer.complete(value_os));\n    } else if let Some(completer) = arg.get::<ArgValueCandidates>() {\n        values.extend(complete_custom_arg_value(value_os, completer));\n    } else if let Some(possible_values) = possible_values(arg) {\n        if let Ok(value) = value {\n            values.extend(possible_values.into_iter().filter_map(|p| {\n                let name = p.get_name();\n                name.starts_with(value).then(|| {\n                    CompletionCandidate::new(OsString::from(name))\n                        .help(p.get_help().cloned())\n                        .hide(p.is_hide_set())\n                })\n            }));\n        }\n    } else {\n        match arg.get_value_hint() {\n            clap::ValueHint::Unknown | clap::ValueHint::Other => {\n                // Should not complete\n            }\n            clap::ValueHint::AnyPath => {\n                values.extend(complete_path(value_os, current_dir, &|_| true));\n            }\n            clap::ValueHint::FilePath => {\n                values.extend(complete_path(value_os, current_dir, &|p| p.is_file()));\n            }\n            clap::ValueHint::DirPath => {\n                values.extend(complete_path(value_os, current_dir, &|p| p.is_dir()));\n            }\n            clap::ValueHint::ExecutablePath => {\n                use is_executable::IsExecutable;\n                values.extend(complete_path(value_os, current_dir, &|p| p.is_executable()));\n            }\n            clap::ValueHint::CommandName\n            | clap::ValueHint::CommandString\n            | clap::ValueHint::CommandWithArguments\n            | clap::ValueHint::Username\n            | clap::ValueHint::Hostname\n            | clap::ValueHint::Url\n            | clap::ValueHint::EmailAddress => {\n                // No completion implementation\n            }\n            _ => {\n                // Safe-ish fallback\n                values.extend(complete_path(value_os, current_dir, &|_| true));\n            }\n        }\n\n        values.sort();\n    }\n\n    if let Some(prefix) = prefix {\n        values = values\n            .into_iter()\n            .map(|comp| comp.add_prefix(prefix))\n            .collect();\n    }\n    values = values\n        .into_iter()\n        .map(|comp| {\n            if comp.get_tag().is_some() {\n                comp\n            } else {\n                comp.tag(Some(arg.to_string().into()))\n            }\n        })\n        .collect();\n\n    values\n}\n\nfn rsplit_delimiter<'s, 'o>(\n    value: Result<&'s str, &'o OsStr>,\n    delimiter: Option<char>,\n) -> Option<(Option<&'s str>, Result<&'s str, &'o OsStr>)> {\n    let delimiter = delimiter?;\n    let value = value.ok()?;\n    let pos = value.rfind(delimiter)?;\n    let (prefix, value) = value.split_at(pos + delimiter.len_utf8());\n    Some((Some(prefix), Ok(value)))\n}\n\nfn complete_custom_arg_value(\n    value: &OsStr,\n    completer: &ArgValueCandidates,\n) -> Vec<CompletionCandidate> {\n    debug!(\"complete_custom_arg_value: completer={completer:?}, value={value:?}\");\n\n    let mut values = completer.candidates();\n    values.retain(|comp| comp.get_value().starts_with(&value.to_string_lossy()));\n    values\n}\n\nfn complete_subcommand(value: &str, cmd: &clap::Command) -> Vec<CompletionCandidate> {\n    debug!(\n        \"complete_subcommand: cmd={:?}, value={:?}\",\n        cmd.get_name(),\n        value\n    );\n\n    let mut scs: Vec<CompletionCandidate> = subcommands(cmd)\n        .into_iter()\n        .filter(|x| x.get_value().starts_with(value))\n        .collect();\n    if cmd.is_allow_external_subcommands_set() {\n        let external_completer = cmd.get::<SubcommandCandidates>();\n        if let Some(completer) = external_completer {\n            scs.extend(complete_external_subcommand(value, completer));\n        }\n    }\n\n    scs.sort();\n    scs.dedup();\n    scs\n}\n\nfn complete_external_subcommand(\n    value: &str,\n    completer: &SubcommandCandidates,\n) -> Vec<CompletionCandidate> {\n    debug!(\"complete_custom_arg_value: completer={completer:?}, value={value:?}\");\n\n    let mut values = Vec::new();\n    let custom_arg_values = completer.candidates();\n    values.extend(custom_arg_values);\n\n    values.retain(|comp| comp.get_value().starts_with(value));\n\n    values\n}\n\n/// Gets all the long options, their visible aliases and flags of a [`clap::Command`] with formatted `--` prefix.\n/// Includes `help` and `version` depending on the [`clap::Command`] settings.\nfn longs_and_visible_aliases(p: &clap::Command) -> Vec<CompletionCandidate> {\n    debug!(\"longs: name={}\", p.get_name());\n\n    p.get_arguments()\n        .filter_map(|a| {\n            a.get_long_and_visible_aliases().map(|longs| {\n                longs\n                    .into_iter()\n                    .map(|s| populate_arg_candidate(CompletionCandidate::new(format!(\"--{s}\")), a))\n            })\n        })\n        .flatten()\n        .collect()\n}\n\n/// Gets all the long hidden aliases and flags of a [`clap::Command`].\nfn hidden_longs_aliases(p: &clap::Command) -> Vec<CompletionCandidate> {\n    debug!(\"longs: name={}\", p.get_name());\n\n    p.get_arguments()\n        .filter_map(|a| {\n            a.get_aliases().map(|longs| {\n                longs.into_iter().map(|s| {\n                    populate_arg_candidate(CompletionCandidate::new(format!(\"--{s}\")), a).hide(true)\n                })\n            })\n        })\n        .flatten()\n        .collect()\n}\n\n/// Gets all the short options, their visible aliases and flags of a [`clap::Command`].\n/// Includes `h` and `V` depending on the [`clap::Command`] settings.\nfn shorts_and_visible_aliases(p: &clap::Command) -> Vec<CompletionCandidate> {\n    debug!(\"shorts: name={}\", p.get_name());\n\n    p.get_arguments()\n        .filter_map(|a| {\n            a.get_short_and_visible_aliases().map(|shorts| {\n                shorts.into_iter().map(|s| {\n                    populate_arg_candidate(CompletionCandidate::new(s.to_string()), a).help(\n                        a.get_help()\n                            .cloned()\n                            .or_else(|| a.get_long().map(|long| format!(\"--{long}\").into())),\n                    )\n                })\n            })\n        })\n        .flatten()\n        .collect()\n}\n\nfn populate_arg_candidate(candidate: CompletionCandidate, arg: &clap::Arg) -> CompletionCandidate {\n    candidate\n        .help(arg.get_help().cloned())\n        .id(Some(format!(\"arg::{}\", arg.get_id())))\n        .tag(Some(\n            arg.get_help_heading()\n                .unwrap_or(\"Options\")\n                .to_owned()\n                .into(),\n        ))\n        .display_order(Some(arg.get_display_order()))\n        .hide(arg.is_hide_set())\n}\n\n/// Get the possible values for completion\nfn possible_values(a: &clap::Arg) -> Option<Vec<clap::builder::PossibleValue>> {\n    if !a.get_num_args().expect(\"built\").takes_values() {\n        None\n    } else {\n        a.get_value_parser()\n            .possible_values()\n            .map(|pvs| pvs.collect())\n    }\n}\n\n/// Gets subcommands of [`clap::Command`] in the form of `(\"name\", \"bin_name\")`.\n///\n/// Subcommand `rustup toolchain install` would be converted to\n/// `(\"install\", \"rustup toolchain install\")`.\nfn subcommands(p: &clap::Command) -> Vec<CompletionCandidate> {\n    debug!(\"subcommands: name={}\", p.get_name());\n    debug!(\"subcommands: Has subcommands...{:?}\", p.has_subcommands());\n    p.get_subcommands()\n        .flat_map(|sc| {\n            sc.get_name_and_visible_aliases()\n                .into_iter()\n                .map(|s| populate_command_candidate(CompletionCandidate::new(s.to_string()), p, sc))\n                .chain(sc.get_aliases().map(|s| {\n                    populate_command_candidate(CompletionCandidate::new(s.to_string()), p, sc)\n                        .hide(true)\n                }))\n        })\n        .collect()\n}\n\nfn populate_command_candidate(\n    candidate: CompletionCandidate,\n    cmd: &clap::Command,\n    subcommand: &clap::Command,\n) -> CompletionCandidate {\n    candidate\n        .help(subcommand.get_about().cloned())\n        .id(Some(format!(\"command::{}\", subcommand.get_name())))\n        .tag(Some(\n            cmd.get_subcommand_help_heading()\n                .unwrap_or(\"Commands\")\n                .to_owned()\n                .into(),\n        ))\n        .display_order(Some(subcommand.get_display_order()))\n        .hide(subcommand.is_hide_set())\n}\n\n/// Parse the short flags and find the first `takes_values` option.\nfn parse_shortflags<'c, 's>(\n    cmd: &'c clap::Command,\n    mut short: clap_lex::ShortFlags<'s>,\n) -> (String, Option<&'c clap::Arg>, clap_lex::ShortFlags<'s>) {\n    let takes_value_opt;\n    let mut leading_flags = String::new();\n    // Find the first takes_values option.\n    loop {\n        match short.next_flag() {\n            Some(Ok(opt)) => {\n                leading_flags.push(opt);\n                let opt = cmd.get_arguments().find(|a| {\n                    let shorts = a.get_short_and_visible_aliases();\n                    let is_find = shorts.map(|v| {\n                        let mut iter = v.into_iter();\n                        let c = iter.find(|c| *c == opt);\n                        c.is_some()\n                    });\n                    is_find.unwrap_or(false)\n                });\n                if opt\n                    .map(|o| o.get_num_args().expect(\"built\").takes_values())\n                    .unwrap_or(false)\n                {\n                    takes_value_opt = opt;\n                    break;\n                }\n            }\n            Some(Err(_)) | None => {\n                takes_value_opt = None;\n                break;\n            }\n        }\n    }\n\n    (leading_flags, takes_value_opt, short)\n}\n\n/// Parse the positional arguments. Return the new state and the new positional index.\nfn parse_positional<'a>(\n    cmd: &clap::Command,\n    pos_index: usize,\n    is_escaped: bool,\n    state: ParseState<'a>,\n) -> (ParseState<'a>, usize) {\n    let pos_arg = cmd\n        .get_positionals()\n        .find(|p| p.get_index() == Some(pos_index));\n    let num_args = pos_arg\n        .and_then(|a| a.get_num_args().map(|r| r.max_values()))\n        .unwrap_or(1);\n\n    let update_state_with_new_positional = |pos_index| -> (ParseState<'a>, usize) {\n        if num_args > 1 {\n            (ParseState::Pos((pos_index, 1)), pos_index)\n        } else {\n            if is_escaped {\n                (ParseState::Pos((pos_index, 1)), pos_index + 1)\n            } else {\n                (ParseState::ValueDone, pos_index + 1)\n            }\n        }\n    };\n    match state {\n        ParseState::ValueDone => {\n            update_state_with_new_positional(pos_index)\n        },\n        ParseState::Pos((prev_pos_index, num_arg)) => {\n            if prev_pos_index == pos_index {\n                if num_arg + 1 < num_args {\n                    (ParseState::Pos((pos_index, num_arg + 1)), pos_index)\n                } else {\n                    if is_escaped {\n                        (ParseState::Pos((pos_index, 1)), pos_index + 1)\n                    } else {\n                        (ParseState::ValueDone, pos_index + 1)\n                    }\n                }\n            } else {\n                update_state_with_new_positional(pos_index)\n            }\n        }\n        ParseState::Opt(..) => unreachable!(\n            \"This branch won't be hit,\n            because ParseState::Opt should not be seen as a positional argument and passed to this function.\"\n        ),\n    }\n}\n\n/// Parse optional flag argument. Return new state\nfn parse_opt_value(opt: &clap::Arg, count: usize) -> ParseState<'_> {\n    let range = opt.get_num_args().expect(\"built\");\n    let max = range.max_values();\n    if count < max {\n        ParseState::Opt((opt, count + 1))\n    } else {\n        ParseState::ValueDone\n    }\n}\n\nfn pos_allows_hyphen(cmd: &clap::Command, pos_index: usize) -> bool {\n    cmd.get_positionals()\n        .find(|a| a.get_index() == Some(pos_index))\n        .map(|p| p.is_allow_hyphen_values_set())\n        .unwrap_or(false)\n}\n\nfn opt_allows_hyphen(state: &ParseState<'_>, arg: &clap_lex::ParsedArg<'_>) -> bool {\n    let val = arg.to_value_os();\n    if val.starts_with(\"-\") {\n        if let ParseState::Opt((opt, _)) = state {\n            return opt.is_allow_hyphen_values_set();\n        }\n    }\n\n    false\n}\n"
  },
  {
    "path": "clap_complete/src/engine/custom.rs",
    "content": "use std::any::type_name;\nuse std::ffi::OsStr;\nuse std::sync::Arc;\n\nuse clap::builder::ArgExt;\nuse clap::builder::CommandExt;\nuse clap_lex::OsStrExt as _;\n\nuse super::CompletionCandidate;\n\n/// Extend [`Arg`][clap::Arg] with a completer\n///\n/// # Example\n///\n/// ```rust\n/// use clap::Parser;\n/// use clap_complete::engine::{ArgValueCompleter, CompletionCandidate};\n///\n/// fn custom_completer(current: &std::ffi::OsStr) -> Vec<CompletionCandidate> {\n///     let mut completions = vec![];\n///     let Some(current) = current.to_str() else {\n///         return completions;\n///     };\n///\n///     if \"foo\".starts_with(current) {\n///         completions.push(CompletionCandidate::new(\"foo\"));\n///     }\n///     if \"bar\".starts_with(current) {\n///         completions.push(CompletionCandidate::new(\"bar\"));\n///     }\n///     if \"baz\".starts_with(current) {\n///         completions.push(CompletionCandidate::new(\"baz\"));\n///     }\n///     completions\n/// }\n///\n/// #[derive(Debug, Parser)]\n/// struct Cli {\n///     #[arg(long, add = ArgValueCompleter::new(custom_completer))]\n///     custom: Option<String>,\n/// }\n/// ```\n#[derive(Clone)]\npub struct ArgValueCompleter(Arc<dyn ValueCompleter>);\n\nimpl ArgValueCompleter {\n    /// Create a new `ArgValueCompleter` with a custom completer\n    pub fn new<C>(completer: C) -> Self\n    where\n        C: ValueCompleter + 'static,\n    {\n        Self(Arc::new(completer))\n    }\n\n    /// Candidates that match `current`\n    ///\n    /// See [`CompletionCandidate`] for more information.\n    pub fn complete(&self, current: &OsStr) -> Vec<CompletionCandidate> {\n        self.0.complete(current)\n    }\n}\n\nimpl std::fmt::Debug for ArgValueCompleter {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.write_str(type_name::<Self>())\n    }\n}\n\nimpl ArgExt for ArgValueCompleter {}\n\n/// User-provided completion candidates for an [`Arg`][clap::Arg], see [`ArgValueCompleter`]\n///\n/// This is useful when predefined value hints are not enough.\npub trait ValueCompleter: Send + Sync {\n    /// All potential candidates for an argument.\n    ///\n    /// See [`CompletionCandidate`] for more information.\n    fn complete(&self, current: &OsStr) -> Vec<CompletionCandidate>;\n}\n\nimpl<F> ValueCompleter for F\nwhere\n    F: Fn(&OsStr) -> Vec<CompletionCandidate> + Send + Sync,\n{\n    fn complete(&self, current: &OsStr) -> Vec<CompletionCandidate> {\n        self(current)\n    }\n}\n\n/// Extend [`Arg`][clap::Arg] with a [`ValueCandidates`]\n///\n/// # Example\n///\n/// ```rust\n/// use clap::Parser;\n/// use clap_complete::engine::{ArgValueCandidates, CompletionCandidate};\n///\n/// #[derive(Debug, Parser)]\n/// struct Cli {\n///     #[arg(long, add = ArgValueCandidates::new(|| { vec![\n///         CompletionCandidate::new(\"foo\"),\n///         CompletionCandidate::new(\"bar\"),\n///         CompletionCandidate::new(\"baz\")] }))]\n///     custom: Option<String>,\n/// }\n/// ```\n#[derive(Clone)]\npub struct ArgValueCandidates(Arc<dyn ValueCandidates>);\n\nimpl ArgValueCandidates {\n    /// Create a new `ArgValueCandidates` with a custom completer\n    pub fn new<C>(completer: C) -> Self\n    where\n        C: ValueCandidates + 'static,\n    {\n        Self(Arc::new(completer))\n    }\n\n    /// All potential candidates for an argument.\n    ///\n    /// See [`CompletionCandidate`] for more information.\n    pub fn candidates(&self) -> Vec<CompletionCandidate> {\n        self.0.candidates()\n    }\n}\n\nimpl std::fmt::Debug for ArgValueCandidates {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.write_str(type_name::<Self>())\n    }\n}\n\nimpl ArgExt for ArgValueCandidates {}\n\n/// Extend [`Command`][clap::Command] with a [`ValueCandidates`]\n///\n/// # Example\n/// ```rust\n/// use clap::Parser;\n/// use clap_complete::engine::{SubcommandCandidates, CompletionCandidate};\n/// #[derive(Debug, Parser)]\n/// #[clap(name = \"cli\", add = SubcommandCandidates::new(|| { vec![\n///     CompletionCandidate::new(\"foo\"),\n///     CompletionCandidate::new(\"bar\"),\n///     CompletionCandidate::new(\"baz\")] }))]\n/// struct Cli {\n///     #[arg(long)]\n///     input: Option<String>,\n/// }\n/// ```\n#[derive(Clone)]\npub struct SubcommandCandidates(Arc<dyn ValueCandidates>);\n\nimpl SubcommandCandidates {\n    /// Create a new `SubcommandCandidates` with a custom completer\n    pub fn new<C>(completer: C) -> Self\n    where\n        C: ValueCandidates + 'static,\n    {\n        Self(Arc::new(completer))\n    }\n\n    /// All potential candidates for an external subcommand.\n    ///\n    /// See [`CompletionCandidate`] for more information.\n    pub fn candidates(&self) -> Vec<CompletionCandidate> {\n        self.0.candidates()\n    }\n}\n\nimpl std::fmt::Debug for SubcommandCandidates {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.write_str(type_name::<Self>())\n    }\n}\n\nimpl CommandExt for SubcommandCandidates {}\n\n/// User-provided completion candidates for an [`Arg`][clap::Arg], see [`ArgValueCandidates`]\n///\n/// User-provided completion candidates for an [`Subcommand`][clap::Subcommand], see [`SubcommandCandidates`]\n///\n/// This is useful when predefined value hints are not enough.\npub trait ValueCandidates: Send + Sync {\n    /// All potential candidates for an argument.\n    ///\n    /// See [`CompletionCandidate`] for more information.\n    fn candidates(&self) -> Vec<CompletionCandidate>;\n}\n\nimpl<F> ValueCandidates for F\nwhere\n    F: Fn() -> Vec<CompletionCandidate> + Send + Sync,\n{\n    fn candidates(&self) -> Vec<CompletionCandidate> {\n        self()\n    }\n}\n\n/// Complete a value as a [`std::path::Path`]\n///\n/// # Example\n///\n/// ```rust\n/// use clap::Parser;\n/// use clap_complete::engine::{ArgValueCompleter, PathCompleter};\n///\n/// #[derive(Debug, Parser)]\n/// struct Cli {\n///     #[arg(long, add = ArgValueCompleter::new(PathCompleter::file()))]\n///     custom: Option<String>,\n/// }\n/// ```\npub struct PathCompleter {\n    current_dir: Option<std::path::PathBuf>,\n    #[allow(clippy::type_complexity)]\n    filter: Option<Box<dyn Fn(&std::path::Path) -> bool + Send + Sync>>,\n    stdio: bool,\n}\n\nimpl PathCompleter {\n    /// Any path is allowed\n    pub fn any() -> Self {\n        Self {\n            filter: None,\n            current_dir: None,\n            stdio: false,\n        }\n    }\n\n    /// Complete only files\n    pub fn file() -> Self {\n        Self::any().filter(|p| p.is_file())\n    }\n\n    /// Complete only directories\n    pub fn dir() -> Self {\n        Self::any().filter(|p| p.is_dir())\n    }\n\n    /// Include stdio (`-`)\n    pub fn stdio(mut self) -> Self {\n        self.stdio = true;\n        self\n    }\n\n    /// Select which paths should be completed\n    pub fn filter(\n        mut self,\n        filter: impl Fn(&std::path::Path) -> bool + Send + Sync + 'static,\n    ) -> Self {\n        self.filter = Some(Box::new(filter));\n        self\n    }\n\n    /// Override [`std::env::current_dir`]\n    pub fn current_dir(mut self, path: impl Into<std::path::PathBuf>) -> Self {\n        self.current_dir = Some(path.into());\n        self\n    }\n}\n\nimpl Default for PathCompleter {\n    fn default() -> Self {\n        Self::any()\n    }\n}\n\nimpl ValueCompleter for PathCompleter {\n    fn complete(&self, current: &OsStr) -> Vec<CompletionCandidate> {\n        let filter = self.filter.as_deref().unwrap_or(&|_| true);\n        let mut current_dir_actual = None;\n        let current_dir = self.current_dir.as_deref().or_else(|| {\n            current_dir_actual = std::env::current_dir().ok();\n            current_dir_actual.as_deref()\n        });\n        let mut candidates = complete_path(current, current_dir, filter);\n        if self.stdio && current.is_empty() {\n            candidates.push(CompletionCandidate::new(\"-\").help(Some(\"stdio\".into())));\n        }\n        candidates\n    }\n}\n\npub(crate) fn complete_path(\n    value_os: &OsStr,\n    current_dir: Option<&std::path::Path>,\n    is_wanted: &dyn Fn(&std::path::Path) -> bool,\n) -> Vec<CompletionCandidate> {\n    let mut completions = Vec::new();\n    let mut potential = Vec::new();\n\n    let value_path = std::path::Path::new(value_os);\n    let (prefix, current) = split_file_name(value_path);\n    let current = current.to_string_lossy();\n    let search_root = if prefix.is_absolute() {\n        prefix.to_owned()\n    } else if prefix.iter().next() == Some(OsStr::new(\"~\")) {\n        let prefix = prefix.strip_prefix(\"~\").unwrap_or(prefix);\n        let home_dir = match std::env::home_dir() {\n            Some(home_dir) => home_dir,\n            None => {\n                // Can't complete without a `home_dir`\n                return completions;\n            }\n        };\n        home_dir.join(prefix)\n    } else {\n        let current_dir = match current_dir {\n            Some(current_dir) => current_dir,\n            None => {\n                // Can't complete without a `current_dir`\n                return completions;\n            }\n        };\n        current_dir.join(prefix)\n    };\n    debug!(\"complete_path: search_root={search_root:?}, prefix={prefix:?}\");\n\n    if value_os.is_empty() && is_wanted(&search_root) {\n        completions.push(\".\".into());\n    }\n\n    for entry in std::fs::read_dir(&search_root)\n        .ok()\n        .into_iter()\n        .flatten()\n        .filter_map(Result::ok)\n    {\n        let raw_file_name = entry.file_name();\n        if !raw_file_name.starts_with(&current) {\n            continue;\n        }\n\n        if entry.path().is_dir() {\n            let mut suggestion = prefix.join(&raw_file_name);\n            suggestion.push(\"\"); // Ensure trailing `/`\n            let candidate = CompletionCandidate::new(suggestion.as_os_str().to_owned())\n                .hide(is_hidden(&raw_file_name));\n\n            if is_wanted(&entry.path()) {\n                completions.push(candidate);\n            } else {\n                potential.push(candidate);\n            }\n        } else {\n            if is_wanted(&entry.path()) {\n                let suggestion = prefix.join(&raw_file_name);\n                let candidate = CompletionCandidate::new(suggestion.as_os_str().to_owned())\n                    .hide(is_hidden(&raw_file_name));\n                completions.push(candidate);\n            }\n        }\n    }\n    completions.sort();\n    potential.sort();\n    completions.extend(potential);\n\n    completions\n}\n\nfn is_hidden(file_name: &OsStr) -> bool {\n    file_name.starts_with(\".\")\n}\n\nfn split_file_name(path: &std::path::Path) -> (&std::path::Path, &OsStr) {\n    // Workaround that `Path::new(\"name/\").file_name()` reports `\"name\"`\n    if path_has_name(path) {\n        (\n            path.parent().unwrap_or_else(|| std::path::Path::new(\"\")),\n            path.file_name().expect(\"not called with `..`\"),\n        )\n    } else {\n        (path, Default::default())\n    }\n}\n\nfn path_has_name(path: &std::path::Path) -> bool {\n    let path_bytes = path.as_os_str().as_encoded_bytes();\n    let Some(trailing) = path_bytes.last() else {\n        return false;\n    };\n    let trailing = *trailing as char;\n    !std::path::is_separator(trailing) && path.file_name().is_some()\n}\n"
  },
  {
    "path": "clap_complete/src/engine/mod.rs",
    "content": "//! `clap`-native completion system\n//!\n//! See [`complete()`]\n\nmod candidate;\nmod complete;\nmod custom;\n\npub use candidate::CompletionCandidate;\npub use complete::complete;\npub use custom::ArgValueCandidates;\npub use custom::ArgValueCompleter;\npub use custom::PathCompleter;\npub use custom::SubcommandCandidates;\npub use custom::ValueCandidates;\npub use custom::ValueCompleter;\n"
  },
  {
    "path": "clap_complete/src/env/mod.rs",
    "content": "//! [`COMPLETE=$SHELL <bin>`][CompleteEnv] completion integration\n//!\n//! See [`CompleteEnv`]:\n//! ```rust\n//! # use clap_complete::CompleteEnv;\n//! fn cli() -> clap::Command {\n//!     // ...\n//! #   clap::Command::new(\"empty\")\n//! }\n//!\n//! CompleteEnv::with_factory(cli)\n//!     .complete();\n//!\n//! // ... rest of application logic\n//! ```\n//!\n//! To customize completions, see\n//! - [`ValueHint`][crate::ValueHint]\n//! - [`ValueEnum`][clap::ValueEnum]\n//! - [`ArgValueCandidates`][crate::ArgValueCandidates]\n//! - [`ArgValueCompleter`][crate::ArgValueCompleter]\n//!\n//! To source your completions:\n//!\n//! <div class=\"warning\">\n//!\n//! **WARNING:** We recommend re-sourcing your completions on upgrade.\n//! These completions work by generating shell code that calls into `your_program` while completing.\n//! That interface is unstable and a mismatch between the shell code and `your_program` may result\n//! in either invalid completions or no completions being generated.\n//! For this reason, we recommend generating the shell code anew on shell startup so that it is\n//! \"self-correcting\" on shell launch, rather than writing the generated completions to a file.\n//!\n//! </div>\n//!\n//! **Bash**\n//! ```bash\n//! echo \"source <(COMPLETE=bash your_program)\" >> ~/.bashrc\n//! ```\n//!\n//! **Elvish**\n//! ```elvish\n//! echo \"eval (E:COMPLETE=elvish your_program | slurp)\" >> ~/.elvish/rc.elv\n//! ```\n//!\n//! **Fish**\n//! ```fish\n//! echo \"COMPLETE=fish your_program | source\" >> ~/.config/fish/completions/your_program.fish\n//! ```\n//!\n//! **Powershell**\n//! ```powershell\n//! echo '$env:COMPLETE = \"powershell\"; your_program | Out-String | Invoke-Expression; Remove-Item Env:\\COMPLETE' >> $PROFILE\n//! ```\n//! Note that to execute scripts in PowerShell on Windows, including [`$PROFILE`][$Profile],\n//! the [execution policy][ExecutionPolicies] needs to be set to `RemoteSigned` at minimum.\n//!\n//! [$Profile]: https://learn.microsoft.com/en-us/powershell/scripting/learn/shell/creating-profiles\n//! [ExecutionPolicies]: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies\n//!\n//! **Zsh**\n//! ```zsh\n//! echo \"source <(COMPLETE=zsh your_program)\" >> ~/.zshrc\n//! ```\n//!\n//! To disable completions, you can set `COMPLETE=` or `COMPLETE=0`\n\nmod shells;\n\nuse std::ffi::OsString;\nuse std::io::Write as _;\n\npub use shells::*;\n\n/// Environment-activated completions for your CLI\n///\n/// Benefits over a CLI completion argument or subcommand\n/// - Performance: we don't need to generate [`clap::Command`] twice or parse arguments\n/// - Flexibility: there is no concern over it interfering with other CLI logic\n///\n/// **Warning:** `stdout` should not be written to before [`CompleteEnv::complete`] has had a\n/// chance to run.\n///\n/// # Examples\n///\n/// ```rust\n/// # use clap_complete::CompleteEnv;\n/// fn cli() -> clap::Command {\n///     // ...\n/// #   clap::Command::new(\"empty\")\n/// }\n///\n/// CompleteEnv::with_factory(cli)\n///     .complete()\n///\n/// // ... rest of application logic\n/// ```\npub struct CompleteEnv<'s, F> {\n    factory: F,\n    var: &'static str,\n    bin: Option<String>,\n    completer: Option<String>,\n    shells: Shells<'s>,\n}\n\nimpl<'s, F: Fn() -> clap::Command> CompleteEnv<'s, F> {\n    /// Complete a [`clap::Command`]\n    ///\n    /// # Example\n    ///\n    /// Builder:\n    /// ```rust\n    /// # use clap_complete::CompleteEnv;\n    /// fn cli() -> clap::Command {\n    ///     // ...\n    /// #   clap::Command::new(\"empty\")\n    /// }\n    ///\n    /// CompleteEnv::with_factory(cli)\n    ///     .complete()\n    ///\n    /// // ... rest of application logic\n    /// ```\n    ///\n    /// Derive:\n    /// ```\n    /// # use clap::Parser;\n    /// # use clap_complete::CompleteEnv;\n    /// use clap::CommandFactory as _;\n    ///\n    /// #[derive(Debug, Parser)]\n    /// struct Cli {\n    ///     custom: Option<String>,\n    /// }\n    ///\n    /// CompleteEnv::with_factory(Cli::command)\n    ///     .complete()\n    ///\n    /// // ... rest of application logic\n    /// ```\n    pub fn with_factory(factory: F) -> Self {\n        Self {\n            factory,\n            var: \"COMPLETE\",\n            bin: None,\n            completer: None,\n            shells: Shells::builtins(),\n        }\n    }\n\n    /// Override the environment variable used for enabling completions\n    pub fn var(mut self, var: &'static str) -> Self {\n        self.var = var;\n        self\n    }\n\n    /// Override the name of the binary to complete\n    ///\n    /// Default: `Command::get_bin_name`\n    pub fn bin(mut self, bin: impl Into<String>) -> Self {\n        self.bin = Some(bin.into());\n        self\n    }\n\n    /// Override the binary to call to get completions\n    ///\n    /// Default: `args_os()[0]`\n    pub fn completer(mut self, completer: impl Into<String>) -> Self {\n        self.completer = Some(completer.into());\n        self\n    }\n\n    /// Override the shells supported for completions\n    pub fn shells(mut self, shells: Shells<'s>) -> Self {\n        self.shells = shells;\n        self\n    }\n}\n\nimpl<'s, F: Fn() -> clap::Command> CompleteEnv<'s, F> {\n    /// Process the completion request and exit\n    ///\n    /// **Warning:** `stdout` should not be written to before this has had a\n    /// chance to run.\n    pub fn complete(self) {\n        let args = std::env::args_os();\n        let current_dir = std::env::current_dir().ok();\n        if self\n            .try_complete(args, current_dir.as_deref())\n            .unwrap_or_else(|e| e.exit())\n        {\n            std::process::exit(0)\n        }\n    }\n\n    /// Process the completion request\n    ///\n    /// **Warning:** `stdout` should not be written to before or after this has run.\n    ///\n    /// Returns `true` if a command was completed and `false` if this is a regular run of your\n    /// application\n    pub fn try_complete(\n        self,\n        args: impl IntoIterator<Item = impl Into<OsString>>,\n        current_dir: Option<&std::path::Path>,\n    ) -> clap::error::Result<bool> {\n        self.try_complete_(args.into_iter().map(|a| a.into()).collect(), current_dir)\n    }\n\n    fn try_complete_(\n        self,\n        mut args: Vec<OsString>,\n        current_dir: Option<&std::path::Path>,\n    ) -> clap::error::Result<bool> {\n        let Some(name) = std::env::var_os(self.var) else {\n            return Ok(false);\n        };\n        if name.is_empty() || name == \"0\" {\n            return Ok(false);\n        }\n\n        // Ensure any child processes called for custom completers don't activate their own\n        // completion logic.\n        // SAFETY: should only be called during application initialization.  Yeah, this is a weak\n        // argument but the choice is that or staying on the old edition.\n        unsafe {\n            std::env::remove_var(self.var);\n        }\n\n        let shell = self.shell(std::path::Path::new(&name))?;\n\n        let mut cmd = (self.factory)();\n        cmd.build();\n\n        let completer = args.remove(0);\n        let escape_index = args\n            .iter()\n            .position(|a| *a == \"--\")\n            .map(|i| i + 1)\n            .unwrap_or(args.len());\n        args.drain(0..escape_index);\n        if args.is_empty() {\n            let mut buf = Vec::new();\n            self.write_registration(&cmd, current_dir, shell, completer, &mut buf)?;\n            std::io::stdout().write_all(&buf)?;\n        } else {\n            let mut buf = Vec::new();\n            shell.write_complete(&mut cmd, args, current_dir, &mut buf)?;\n            std::io::stdout().write_all(&buf)?;\n        }\n\n        Ok(true)\n    }\n\n    fn shell(&self, name: &std::path::Path) -> Result<&dyn EnvCompleter, std::io::Error> {\n        // Strip off the parent dir in case `$SHELL` was used\n        let name = name.file_stem().unwrap_or(name.as_os_str());\n        // lossy won't match but this will delegate to unknown\n        // error\n        let name = name.to_string_lossy();\n\n        let shell = self.shells.completer(&name).ok_or_else(|| {\n            let shells =\n                self.shells\n                    .names()\n                    .enumerate()\n                    .fold(String::new(), |mut seed, (i, name)| {\n                        use std::fmt::Write as _;\n                        let prefix = if i == 0 { \"\" } else { \", \" };\n                        let _ = write!(&mut seed, \"{prefix}`{name}`\");\n                        seed\n                    });\n            std::io::Error::other(format!(\"unknown shell `{name}`, expected one of {shells}\"))\n        })?;\n        Ok(shell)\n    }\n\n    fn write_registration(\n        &self,\n        cmd: &clap::Command,\n        current_dir: Option<&std::path::Path>,\n        shell: &dyn EnvCompleter,\n        completer: OsString,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let name = cmd.get_name();\n        let bin = self\n            .bin\n            .as_deref()\n            .or_else(|| cmd.get_bin_name())\n            .unwrap_or_else(|| cmd.get_name());\n        let completer = if let Some(completer) = self.completer.as_deref() {\n            completer.to_owned()\n        } else {\n            let mut completer = std::path::PathBuf::from(completer);\n            if let Some(current_dir) = current_dir {\n                if 1 < completer.components().count() {\n                    completer = current_dir.join(completer);\n                }\n            }\n            completer.to_string_lossy().into_owned()\n        };\n\n        shell.write_registration(self.var, name, bin, &completer, buf)?;\n\n        Ok(())\n    }\n}\n\n/// Collection of shell-specific completers\npub struct Shells<'s>(pub &'s [&'s dyn EnvCompleter]);\n\nimpl<'s> Shells<'s> {\n    /// Select all of the built-in shells\n    pub const fn builtins() -> Self {\n        Self(&[&Bash, &Elvish, &Fish, &Powershell, &Zsh])\n    }\n\n    /// Find the specified [`EnvCompleter`]\n    pub fn completer(&self, name: &str) -> Option<&dyn EnvCompleter> {\n        self.0.iter().copied().find(|c| c.is(name))\n    }\n\n    /// Collect all [`EnvCompleter::name`]s\n    pub fn names(&self) -> impl Iterator<Item = &'static str> + 's {\n        self.0.iter().map(|c| c.name())\n    }\n\n    /// Iterate over [`EnvCompleter`]s\n    pub fn iter(&self) -> impl Iterator<Item = &dyn EnvCompleter> {\n        self.0.iter().copied()\n    }\n}\n\n/// Shell-integration for completions\n///\n/// This will generally be called by [`CompleteEnv`].\n///\n/// This handles adapting between the shell and [`completer`][crate::engine::complete()].\n/// A `EnvCompleter` can choose how much of that lives within the registration script or\n/// lives in [`EnvCompleter::write_complete`].\npub trait EnvCompleter {\n    /// Canonical name for this shell\n    ///\n    /// **Post-conditions:**\n    /// ```rust,ignore\n    /// assert!(completer.is(completer.name()));\n    /// ```\n    fn name(&self) -> &'static str;\n    /// Whether the name matches this shell\n    ///\n    /// This should match [`EnvCompleter::name`] and any alternative names, particularly used by\n    /// `$SHELL`.\n    fn is(&self, name: &str) -> bool;\n    /// Register for completions\n    ///\n    /// Write the `buf` the logic needed for calling into `<VAR>=<shell> <cmd> --`, passing needed\n    /// arguments to [`EnvCompleter::write_complete`] through the environment.\n    ///\n    /// - `var`: see [`CompleteEnv::var`]\n    /// - `name`: an identifier to use in the script\n    /// - `bin`: see [`CompleteEnv::bin`]\n    /// - `completer`: see [`CompleteEnv::completer`]\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **WARNING:** There are no stability guarantees between the call to\n    /// [`EnvCompleter::write_complete`] that this generates and actually calling [`EnvCompleter::write_complete`].\n    /// Caching the results of this call may result in invalid or no completions to be generated.\n    ///\n    /// </div>\n    fn write_registration(\n        &self,\n        var: &str,\n        name: &str,\n        bin: &str,\n        completer: &str,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error>;\n    /// Complete the given command\n    ///\n    /// Adapt information from arguments and [`EnvCompleter::write_registration`]-defined env\n    /// variables to what is needed for [`completer`][crate::engine::complete()].\n    ///\n    /// Write out the [`CompletionCandidate`][crate::engine::CompletionCandidate]s in a way the shell will understand.\n    fn write_complete(\n        &self,\n        cmd: &mut clap::Command,\n        args: Vec<OsString>,\n        current_dir: Option<&std::path::Path>,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error>;\n}\n"
  },
  {
    "path": "clap_complete/src/env/shells.rs",
    "content": "use std::ffi::OsString;\nuse std::str::FromStr;\n\nuse super::EnvCompleter;\n\n/// Bash completion adapter\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct Bash;\n\nimpl EnvCompleter for Bash {\n    fn name(&self) -> &'static str {\n        \"bash\"\n    }\n    fn is(&self, name: &str) -> bool {\n        name == \"bash\"\n    }\n    fn write_registration(\n        &self,\n        var: &str,\n        name: &str,\n        bin: &str,\n        completer: &str,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let escaped_name = name.replace('-', \"_\");\n\n        let completer =\n            shlex::try_quote(completer).unwrap_or(std::borrow::Cow::Borrowed(completer));\n\n        let script = r#\"\n_clap_complete_NAME() {\n    local IFS=$'\\013'\n    local _CLAP_COMPLETE_INDEX=${COMP_CWORD}\n    local _CLAP_COMPLETE_COMP_TYPE=${COMP_TYPE}\n    if compopt +o nospace 2> /dev/null; then\n        local _CLAP_COMPLETE_SPACE=false\n    else\n        local _CLAP_COMPLETE_SPACE=true\n    fi\n    local words=(\"${COMP_WORDS[@]}\")\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        words[COMP_CWORD]=\"$2\"\n    fi\n    COMPREPLY=( $( \\\n        _CLAP_IFS=\"$IFS\" \\\n        _CLAP_COMPLETE_INDEX=\"$_CLAP_COMPLETE_INDEX\" \\\n        _CLAP_COMPLETE_COMP_TYPE=\"$_CLAP_COMPLETE_COMP_TYPE\" \\\n        _CLAP_COMPLETE_SPACE=\"$_CLAP_COMPLETE_SPACE\" \\\n        VAR=\"bash\" \\\n        \"COMPLETER\" -- \"${words[@]}\" \\\n    ) )\n    if [[ $? != 0 ]]; then\n        unset COMPREPLY\n    elif [[ $_CLAP_COMPLETE_SPACE == false ]] && [[ \"${COMPREPLY-}\" =~ [=/:]$ ]]; then\n        compopt -o nospace\n    fi\n}\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -o nospace -o bashdefault -o nosort -F _clap_complete_NAME BIN\nelse\n    complete -o nospace -o bashdefault -F _clap_complete_NAME BIN\nfi\n\"#\n        .replace(\"NAME\", &escaped_name)\n        .replace(\"BIN\", bin)\n        .replace(\"COMPLETER\", &completer)\n        .replace(\"VAR\", var);\n\n        writeln!(buf, \"{script}\")?;\n        Ok(())\n    }\n    fn write_complete(\n        &self,\n        cmd: &mut clap::Command,\n        args: Vec<OsString>,\n        current_dir: Option<&std::path::Path>,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let index: usize = std::env::var(\"_CLAP_COMPLETE_INDEX\")\n            .ok()\n            .and_then(|i| i.parse().ok())\n            .unwrap_or_default();\n        let _comp_type: CompType = std::env::var(\"_CLAP_COMPLETE_COMP_TYPE\")\n            .ok()\n            .and_then(|i| i.parse().ok())\n            .unwrap_or_default();\n        let _space: Option<bool> = std::env::var(\"_CLAP_COMPLETE_SPACE\")\n            .ok()\n            .and_then(|i| i.parse().ok());\n        let ifs: Option<String> = std::env::var(\"_CLAP_IFS\").ok().and_then(|i| i.parse().ok());\n        let completions = crate::engine::complete(cmd, args, index, current_dir)?;\n\n        for (i, candidate) in completions.iter().enumerate() {\n            if i != 0 {\n                write!(buf, \"{}\", ifs.as_deref().unwrap_or(\"\\n\"))?;\n            }\n            write!(buf, \"{}\", candidate.get_value().to_string_lossy())?;\n        }\n        Ok(())\n    }\n}\n\n/// Type of completion attempted that caused a completion function to be called\n#[derive(Default, Copy, Clone, Debug, PartialEq, Eq)]\n#[non_exhaustive]\nenum CompType {\n    /// Normal completion\n    #[default]\n    Normal,\n    /// List completions after successive tabs\n    Successive,\n    /// List alternatives on partial word completion\n    Alternatives,\n    /// List completions if the word is not unmodified\n    Unmodified,\n    /// Menu completion\n    Menu,\n}\n\nimpl FromStr for CompType {\n    type Err = String;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            \"9\" => Ok(Self::Normal),\n            \"63\" => Ok(Self::Successive),\n            \"33\" => Ok(Self::Alternatives),\n            \"64\" => Ok(Self::Unmodified),\n            \"37\" => Ok(Self::Menu),\n            _ => Err(format!(\"unsupported COMP_TYPE `{s}`\")),\n        }\n    }\n}\n\n/// Elvish completion adapter\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct Elvish;\n\nimpl EnvCompleter for Elvish {\n    fn name(&self) -> &'static str {\n        \"elvish\"\n    }\n    fn is(&self, name: &str) -> bool {\n        name == \"elvish\"\n    }\n    fn write_registration(\n        &self,\n        var: &str,\n        _name: &str,\n        bin: &str,\n        completer: &str,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let bin = shlex::try_quote(bin).unwrap_or(std::borrow::Cow::Borrowed(bin));\n        let completer =\n            shlex::try_quote(completer).unwrap_or(std::borrow::Cow::Borrowed(completer));\n\n        let script = r#\"\nset edit:completion:arg-completer[BIN] = { |@words|\n    var index = (count $words)\n    set index = (- $index 1)\n\n    put (env _CLAP_IFS=\"\\n\" _CLAP_COMPLETE_INDEX=(to-string $index) VAR=\"elvish\" COMPLETER -- $@words) | to-lines\n}\n\"#\n        .replace(\"COMPLETER\", &completer)\n        .replace(\"BIN\", &bin)\n        .replace(\"VAR\", var);\n\n        writeln!(buf, \"{script}\")?;\n        Ok(())\n    }\n    fn write_complete(\n        &self,\n        cmd: &mut clap::Command,\n        args: Vec<OsString>,\n        current_dir: Option<&std::path::Path>,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let index: usize = std::env::var(\"_CLAP_COMPLETE_INDEX\")\n            .ok()\n            .and_then(|i| i.parse().ok())\n            .unwrap_or_default();\n        let ifs: Option<String> = std::env::var(\"_CLAP_IFS\").ok().and_then(|i| i.parse().ok());\n        let completions = crate::engine::complete(cmd, args, index, current_dir)?;\n\n        for (i, candidate) in completions.iter().enumerate() {\n            if i != 0 {\n                write!(buf, \"{}\", ifs.as_deref().unwrap_or(\"\\n\"))?;\n            }\n            write!(buf, \"{}\", candidate.get_value().to_string_lossy())?;\n        }\n        Ok(())\n    }\n}\n\n/// Fish completion adapter\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct Fish;\n\nimpl EnvCompleter for Fish {\n    fn name(&self) -> &'static str {\n        \"fish\"\n    }\n    fn is(&self, name: &str) -> bool {\n        name == \"fish\"\n    }\n    fn write_registration(\n        &self,\n        var: &str,\n        _name: &str,\n        bin: &str,\n        completer: &str,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let bin = shlex::try_quote(bin).unwrap_or(std::borrow::Cow::Borrowed(bin));\n        let completer =\n            shlex::try_quote(completer).unwrap_or(std::borrow::Cow::Borrowed(completer));\n\n        writeln!(\n            buf,\n            r#\"complete --keep-order --exclusive --command {bin} --arguments \"({var}=fish {completer} -- (commandline --current-process --tokenize --cut-at-cursor) (commandline --current-token))\"\"#\n        )\n    }\n    fn write_complete(\n        &self,\n        cmd: &mut clap::Command,\n        args: Vec<OsString>,\n        current_dir: Option<&std::path::Path>,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let index = args.len() - 1;\n        let completions = crate::engine::complete(cmd, args, index, current_dir)?;\n\n        for candidate in completions {\n            write!(buf, \"{}\", candidate.get_value().to_string_lossy())?;\n            if let Some(help) = candidate.get_help() {\n                write!(\n                    buf,\n                    \"\\t{}\",\n                    help.to_string().lines().next().unwrap_or_default()\n                )?;\n            }\n            writeln!(buf)?;\n        }\n        Ok(())\n    }\n}\n\n/// Powershell completion adapter\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct Powershell;\n\nimpl EnvCompleter for Powershell {\n    fn name(&self) -> &'static str {\n        \"powershell\"\n    }\n    fn is(&self, name: &str) -> bool {\n        name == \"powershell\" || name == \"powershell_ise\"\n    }\n    fn write_registration(\n        &self,\n        var: &str,\n        _name: &str,\n        bin: &str,\n        completer: &str,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let bin = shlex::try_quote(bin).unwrap_or(std::borrow::Cow::Borrowed(bin));\n        let completer =\n            shlex::try_quote(completer).unwrap_or(std::borrow::Cow::Borrowed(completer));\n\n        // `completer` may or may not be surrounded by double quotes, enclosing\n        // the expression in a here-string ensures the whole thing is\n        // interpreted as the first argument to the call operator\n        writeln!(\n            buf,\n            r#\"\nRegister-ArgumentCompleter -Native -CommandName {bin} -ScriptBlock {{\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $prev = $env:{var};\n    $env:{var} = \"powershell\";\n\n    $args = $commandAst.Extent.Text\n    $args = $args.Substring(0, [math]::Min($cursorPosition, $args.Length));\n    if ($wordToComplete -eq \"\") {{\n        $args += \" ''\";\n    }}\n\n    $results = Invoke-Expression @\"\n& {completer} -- $args\n\"@;\n    if ($null -eq $prev) {{\n        Remove-Item Env:\\{var};\n    }} else {{\n        $env:{var} = $prev;\n    }}\n    $results | ForEach-Object {{\n        $split = $_.Split(\"`t\");\n        $cmd = $split[0];\n\n        if ($split.Length -eq 2) {{\n            $help = $split[1];\n        }}\n        else {{\n            $help = $split[0];\n        }}\n\n        [System.Management.Automation.CompletionResult]::new($cmd, $cmd, 'ParameterValue', $help)\n    }}\n}};\n        \"#\n        )\n    }\n\n    fn write_complete(\n        &self,\n        cmd: &mut clap::Command,\n        args: Vec<OsString>,\n        current_dir: Option<&std::path::Path>,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let index = args.len() - 1;\n        let completions = crate::engine::complete(cmd, args, index, current_dir)?;\n\n        for candidate in completions {\n            write!(buf, \"{}\", candidate.get_value().to_string_lossy())?;\n            if let Some(help) = candidate.get_help() {\n                write!(\n                    buf,\n                    \"\\t{}\",\n                    help.to_string().lines().next().unwrap_or_default()\n                )?;\n            }\n            writeln!(buf)?;\n        }\n        Ok(())\n    }\n}\n\n/// Zsh completion adapter\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub struct Zsh;\n\nimpl EnvCompleter for Zsh {\n    fn name(&self) -> &'static str {\n        \"zsh\"\n    }\n    fn is(&self, name: &str) -> bool {\n        name == \"zsh\"\n    }\n    fn write_registration(\n        &self,\n        var: &str,\n        name: &str,\n        bin: &str,\n        completer: &str,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let escaped_name = name.replace('-', \"_\");\n        let bin = shlex::try_quote(bin).unwrap_or(std::borrow::Cow::Borrowed(bin));\n        let completer =\n            shlex::try_quote(completer).unwrap_or(std::borrow::Cow::Borrowed(completer));\n\n        let script = r#\"#compdef BIN\nfunction _clap_dynamic_completer_NAME() {\n    local _CLAP_COMPLETE_INDEX=$(expr $CURRENT - 1)\n    local _CLAP_IFS=$'\\n'\n\n    local completions=(\"${(@f)$( \\\n        _CLAP_IFS=\"$_CLAP_IFS\" \\\n        _CLAP_COMPLETE_INDEX=\"$_CLAP_COMPLETE_INDEX\" \\\n        VAR=\"zsh\" \\\n        COMPLETER -- \"${words[@]}\" 2>/dev/null \\\n    )}\")\n\n    if [[ -n $completions ]]; then\n        local -a dirs=()\n        local -a other=()\n        local completion\n        for completion in $completions; do\n            local value=\"${completion%%:*}\"\n            if [[ \"$value\" == */ ]]; then\n                local dir_no_slash=\"${value%/}\"\n                if [[ \"$completion\" == *:* ]]; then\n                    local desc=\"${completion#*:}\"\n                    dirs+=(\"$dir_no_slash:$desc\")\n                else\n                    dirs+=(\"$dir_no_slash\")\n                fi\n            else\n                other+=(\"$completion\")\n            fi\n        done\n        [[ -n $dirs ]] && _describe 'values' dirs -S '/' -r '/'\n        [[ -n $other ]] && _describe 'values' other\n    fi\n}\n\ncompdef _clap_dynamic_completer_NAME BIN\"#\n            .replace(\"NAME\", &escaped_name)\n            .replace(\"COMPLETER\", &completer)\n            .replace(\"BIN\", &bin)\n            .replace(\"VAR\", var);\n\n        writeln!(buf, \"{script}\")?;\n        Ok(())\n    }\n    fn write_complete(\n        &self,\n        cmd: &mut clap::Command,\n        args: Vec<OsString>,\n        current_dir: Option<&std::path::Path>,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let index: usize = std::env::var(\"_CLAP_COMPLETE_INDEX\")\n            .ok()\n            .and_then(|i| i.parse().ok())\n            .unwrap_or_default();\n        let ifs: Option<String> = std::env::var(\"_CLAP_IFS\").ok().and_then(|i| i.parse().ok());\n\n        // If the current word is empty, add an empty string to the args\n        let mut args = args.clone();\n        if args.len() == index {\n            args.push(\"\".into());\n        }\n        let completions = crate::engine::complete(cmd, args, index, current_dir)?;\n\n        for (i, candidate) in completions.iter().enumerate() {\n            if i != 0 {\n                write!(buf, \"{}\", ifs.as_deref().unwrap_or(\"\\n\"))?;\n            }\n            write!(\n                buf,\n                \"{}\",\n                Self::escape_value(&candidate.get_value().to_string_lossy())\n            )?;\n            if let Some(help) = candidate.get_help() {\n                write!(\n                    buf,\n                    \":{}\",\n                    Self::escape_help(help.to_string().lines().next().unwrap_or_default())\n                )?;\n            }\n        }\n        Ok(())\n    }\n}\n\nimpl Zsh {\n    /// Escape value string\n    fn escape_value(string: &str) -> String {\n        string.replace('\\\\', \"\\\\\\\\\").replace(':', \"\\\\:\")\n    }\n\n    /// Escape help string\n    fn escape_help(string: &str) -> String {\n        string.replace('\\\\', \"\\\\\\\\\")\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use snapbox::assert_data_eq;\n\n    // This test verifies that fish shell path quoting works with or without spaces in the path.\n    #[test]\n    #[cfg(all(unix, feature = \"unstable-dynamic\"))]\n    #[cfg(feature = \"unstable-shell-tests\")]\n    fn fish_env_completer_path_quoting_works() {\n        // Returns the dynamic registration line for the fish shell, for example:\n        // complete --keep-order --exclusive --command my-bin --arguments \"(COMPLETE=fish /path/to/my-bin ... )\"\n        let get_fish_registration = |completer_bin: &str| {\n            let mut buf = Vec::new();\n            let fish = Fish;\n            fish.write_registration(\n                \"IGNORED_VAR\",\n                \"ignored-name\",\n                \"/ignored/bin\",\n                completer_bin,\n                &mut buf,\n            )\n            .expect(\"write_registration failed\");\n            String::from_utf8(buf).expect(\"Invalid UTF-8\")\n        };\n\n        let script = get_fish_registration(\"completer\");\n        assert_data_eq!(\n            script.trim(),\n            snapbox::str![r#\"complete [..] \"([..] completer [..])\"\"#]\n        );\n\n        let script = get_fish_registration(\"/path/completer\");\n        assert_data_eq!(\n            script.trim(),\n            snapbox::str![r#\"complete [..] \"([..] /path/completer [..])\"\"#]\n        );\n\n        let script = get_fish_registration(\"/path with a space/completer\");\n        assert_data_eq!(\n            script.trim(),\n            snapbox::str![r#\"complete [..] \"([..] '/path with a space/completer' [..])\"\"#]\n        );\n    }\n}\n"
  },
  {
    "path": "clap_complete/src/lib.rs",
    "content": "// Copyright ⓒ 2015-2018 Kevin B. Knapp\n//\n// `clap_complete` is distributed under the terms of both the MIT license and the Apache License\n// (Version 2.0).\n// See the [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) files in this repository\n// for more information.\n\n//! ## Quick Start\n//!\n//! - For generating at compile-time, see [`generate_to`]\n//! - For generating at runtime, see [`generate`]\n//!\n//! [`Shell`] is a convenience `enum` for an argument value type that implements `Generator`\n//! for each natively-supported shell type.\n//!\n//! ## Example\n//!\n//! ```rust,no_run\n//! use clap::{Command, Arg, ValueHint, value_parser, ArgAction};\n//! use clap_complete::aot::{generate, Generator, Shell};\n//! use std::io;\n//!\n//! fn build_cli() -> Command {\n//!     Command::new(\"example\")\n//!         .arg(Arg::new(\"file\")\n//!             .help(\"some input file\")\n//!             .value_hint(ValueHint::AnyPath))\n//!         .arg(Arg::new(\"generator\")\n//!             .long(\"generate\")\n//!             .action(ArgAction::Set)\n//!             .value_parser(value_parser!(Shell)))\n//! }\n//!\n//! fn print_completions<G: Generator>(generator: G, cmd: &mut Command) {\n//!     generate(generator, cmd, cmd.get_name().to_string(), &mut io::stdout());\n//! }\n//!\n//! let matches = build_cli().get_matches();\n//!\n//! if let Some(generator) = matches.get_one::<Shell>(\"generator\").copied() {\n//!     let mut cmd = build_cli();\n//!     eprintln!(\"Generating completion file for {generator}...\");\n//!     print_completions(generator, &mut cmd);\n//! }\n//! ```\n\n#![doc(html_logo_url = \"https://raw.githubusercontent.com/clap-rs/clap/master/assets/clap.png\")]\n#![doc = include_str!(\"../README.md\")]\n#![cfg_attr(docsrs, feature(doc_cfg))]\n#![warn(missing_docs)]\n#![allow(clippy::needless_doctest_main)]\n#![warn(clippy::print_stderr)]\n#![warn(clippy::print_stdout)]\n\nconst INTERNAL_ERROR_MSG: &str = \"Fatal internal error. Please consider filing a bug \\\n                                  report at https://github.com/clap-rs/clap/issues\";\n\n#[macro_use]\n#[allow(missing_docs)]\nmod macros;\n\npub mod aot;\n#[cfg(feature = \"unstable-dynamic\")]\npub mod engine;\n#[cfg(feature = \"unstable-dynamic\")]\npub mod env;\n\npub use clap::ValueHint;\n#[doc(inline)]\n#[cfg(feature = \"unstable-dynamic\")]\npub use engine::ArgValueCandidates;\n#[cfg(feature = \"unstable-dynamic\")]\npub use engine::ArgValueCompleter;\n#[doc(inline)]\n#[cfg(feature = \"unstable-dynamic\")]\npub use engine::CompletionCandidate;\n#[cfg(feature = \"unstable-dynamic\")]\npub use engine::PathCompleter;\n#[cfg(feature = \"unstable-dynamic\")]\npub use env::CompleteEnv;\n\n/// Deprecated, see [`aot`]\npub mod generator {\n    pub use crate::aot::Generator;\n    pub use crate::aot::generate;\n    pub use crate::aot::generate_to;\n    pub use crate::aot::utils;\n}\n/// Deprecated, see [`aot`]\npub mod shells {\n    pub use crate::aot::Bash;\n    pub use crate::aot::Elvish;\n    pub use crate::aot::Fish;\n    pub use crate::aot::PowerShell;\n    pub use crate::aot::Shell;\n    pub use crate::aot::Zsh;\n}\n/// Deprecated, see [`aot::Generator`]\npub use aot::Generator;\n/// Deprecated, see [`aot::Shell`]\npub use aot::Shell;\n/// Deprecated, see [`aot::generate`]\npub use aot::generate;\n/// Deprecated, see [`aot::generate_to`]\npub use aot::generate_to;\n\n#[doc = include_str!(\"../README.md\")]\n#[cfg(doctest)]\npub struct ReadmeDoctests;\n"
  },
  {
    "path": "clap_complete/src/macros.rs",
    "content": "#[cfg(feature = \"debug\")]\nmacro_rules! debug {\n    ($($arg:tt)*) => {\n        eprint!(\"[{:>w$}] \\t\", module_path!(), w = 28);\n        eprintln!($($arg)*)\n    }\n}\n\n#[cfg(not(feature = \"debug\"))]\nmacro_rules! debug {\n    ($($arg:tt)*) => {};\n}\n"
  },
  {
    "path": "clap_complete/tests/examples.rs",
    "content": "#[test]\nfn example_tests() {\n    let t = trycmd::TestCases::new();\n    let features: &[&str] = &[\n        #[cfg(feature = \"unstable-dynamic\")]\n        \"unstable-dynamic\",\n    ];\n    let features = features.join(\" \");\n    t.register_bins(trycmd::cargo::compile_examples([\"--features\", &features]).unwrap());\n    t.case(\"examples/**/*.md\");\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/aliases.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-F -f -O -o -h -V --flg --flag --opt --option --help --version [positional]\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --option)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --opt)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -o)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -O)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/aliases.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand -o 'cmd option'\n            cand -O 'cmd option'\n            cand --option 'cmd option'\n            cand --opt 'cmd option'\n            cand -f 'cmd flag'\n            cand -F 'cmd flag'\n            cand --flag 'cmd flag'\n            cand --flg 'cmd flag'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/aliases.fish",
    "content": "complete -c my-app -s o -s O -l option -l opt -d 'cmd option' -r\ncomplete -c my-app -s f -s F -l flag -l flg -d 'cmd flag'\ncomplete -c my-app -s h -l help -d 'Print help'\ncomplete -c my-app -s V -l version -d 'Print version'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/aliases.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('-o', '-o', [CompletionResultType]::ParameterName, 'cmd option')\n            [CompletionResult]::new('-O', '-O ', [CompletionResultType]::ParameterName, 'cmd option')\n            [CompletionResult]::new('--option', '--option', [CompletionResultType]::ParameterName, 'cmd option')\n            [CompletionResult]::new('--opt', '--opt', [CompletionResultType]::ParameterName, 'cmd option')\n            [CompletionResult]::new('-f', '-f', [CompletionResultType]::ParameterName, 'cmd flag')\n            [CompletionResult]::new('-F', '-F ', [CompletionResultType]::ParameterName, 'cmd flag')\n            [CompletionResult]::new('--flag', '--flag', [CompletionResultType]::ParameterName, 'cmd flag')\n            [CompletionResult]::new('--flg', '--flg', [CompletionResultType]::ParameterName, 'cmd flag')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/aliases.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'-o+[cmd option]: :_default' \\\n'-O+[cmd option]: :_default' \\\n'--option=[cmd option]: :_default' \\\n'--opt=[cmd option]: :_default' \\\n'-f[cmd flag]' \\\n'-F[cmd flag]' \\\n'--flag[cmd flag]' \\\n'--flg[cmd flag]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n'::positional:_default' \\\n&& ret=0\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/basic.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            my__app,help)\n                cmd=\"my__app__help\"\n                ;;\n            my__app,test)\n                cmd=\"my__app__test\"\n                ;;\n            my__app__help,help)\n                cmd=\"my__app__help__help\"\n                ;;\n            my__app__help,test)\n                cmd=\"my__app__help__test\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-c -v -h --help test help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help)\n            opts=\"test help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__test)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__test)\n            opts=\"-d -c -h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/basic.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand -c 'c'\n            cand -v 'v'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand test 'Subcommand with a second line'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;test'= {\n            cand -d 'd'\n            cand -c 'c'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;help'= {\n            cand test 'Subcommand with a second line'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;help;test'= {\n        }\n        &'my-app;help;help'= {\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/basic.fish",
    "content": "# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\nfunction __fish_my_app_global_optspecs\n\tstring join \\n c v h/help\nend\n\nfunction __fish_my_app_needs_command\n\t# Figure out if the current invocation already has a command.\n\tset -l cmd (commandline -opc)\n\tset -e cmd[1]\n\targparse -s (__fish_my_app_global_optspecs) -- $cmd 2>/dev/null\n\tor return\n\tif set -q argv[1]\n\t\t# Also print the command, so this can be used to figure out what it is.\n\t\techo $argv[1]\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nfunction __fish_my_app_using_subcommand\n\tset -l cmd (__fish_my_app_needs_command)\n\ttest -z \"$cmd\"\n\tand return 1\n\tcontains -- $cmd[1] $argv\nend\n\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s c\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s v\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"test\" -d 'Subcommand with a second line'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -s d\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -s c\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test help\" -f -a \"test\" -d 'Subcommand with a second line'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/basic.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'c')\n            [CompletionResult]::new('-v', '-v', [CompletionResultType]::ParameterName, 'v')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand with a second line')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;test' {\n            [CompletionResult]::new('-d', '-d', [CompletionResultType]::ParameterName, 'd')\n            [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'c')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;help' {\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand with a second line')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;help;test' {\n            break\n        }\n        'my-app;help;help' {\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/basic.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'-c[]' \\\n'(-c)-v[]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n\":: :_my-app_commands\" \\\n\"*::: :->my-app\" \\\n&& ret=0\n    case $state in\n    (my-app)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-command-$line[1]:\"\n        case $line[1] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n'*-d[]' \\\n'-c[]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-help-command-$line[1]:\"\n        case $line[1] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=(\n'test:Subcommand with a second line' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n(( $+functions[_my-app__help_commands] )) ||\n_my-app__help_commands() {\n    local commands; commands=(\n'test:Subcommand with a second line' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__help_commands] )) ||\n_my-app__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__test_commands] )) ||\n_my-app__help__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help test commands' commands \"$@\"\n}\n(( $+functions[_my-app__test_commands] )) ||\n_my-app__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app test commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/custom_bin_name.bash",
    "content": "_bin-name() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"bin__name\"\n                ;;\n            bin__name,help)\n                cmd=\"bin__name__help\"\n                ;;\n            bin__name,test)\n                cmd=\"bin__name__test\"\n                ;;\n            bin__name__help,help)\n                cmd=\"bin__name__help__help\"\n                ;;\n            bin__name__help,test)\n                cmd=\"bin__name__help__test\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        bin__name)\n            opts=\"-c -v -h --help test help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        bin__name__help)\n            opts=\"test help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        bin__name__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        bin__name__help__test)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        bin__name__test)\n            opts=\"-d -c -h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _bin-name -o nosort -o bashdefault -o default bin-name\nelse\n    complete -F _bin-name -o bashdefault -o default bin-name\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/custom_bin_name.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[bin-name] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'bin-name'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'bin-name'= {\n            cand -c 'c'\n            cand -v 'v'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand test 'Subcommand with a second line'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'bin-name;test'= {\n            cand -d 'd'\n            cand -c 'c'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'bin-name;help'= {\n            cand test 'Subcommand with a second line'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'bin-name;help;test'= {\n        }\n        &'bin-name;help;help'= {\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/custom_bin_name.fish",
    "content": "# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\nfunction __fish_bin_name_global_optspecs\n\tstring join \\n c v h/help\nend\n\nfunction __fish_bin_name_needs_command\n\t# Figure out if the current invocation already has a command.\n\tset -l cmd (commandline -opc)\n\tset -e cmd[1]\n\targparse -s (__fish_bin_name_global_optspecs) -- $cmd 2>/dev/null\n\tor return\n\tif set -q argv[1]\n\t\t# Also print the command, so this can be used to figure out what it is.\n\t\techo $argv[1]\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nfunction __fish_bin_name_using_subcommand\n\tset -l cmd (__fish_bin_name_needs_command)\n\ttest -z \"$cmd\"\n\tand return 1\n\tcontains -- $cmd[1] $argv\nend\n\ncomplete -c bin-name -n \"__fish_bin_name_needs_command\" -s c\ncomplete -c bin-name -n \"__fish_bin_name_needs_command\" -s v\ncomplete -c bin-name -n \"__fish_bin_name_needs_command\" -s h -l help -d 'Print help'\ncomplete -c bin-name -n \"__fish_bin_name_needs_command\" -f -a \"test\" -d 'Subcommand with a second line'\ncomplete -c bin-name -n \"__fish_bin_name_needs_command\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c bin-name -n \"__fish_bin_name_using_subcommand test\" -s d\ncomplete -c bin-name -n \"__fish_bin_name_using_subcommand test\" -s c\ncomplete -c bin-name -n \"__fish_bin_name_using_subcommand test\" -s h -l help -d 'Print help'\ncomplete -c bin-name -n \"__fish_bin_name_using_subcommand help; and not __fish_seen_subcommand_from test help\" -f -a \"test\" -d 'Subcommand with a second line'\ncomplete -c bin-name -n \"__fish_bin_name_using_subcommand help; and not __fish_seen_subcommand_from test help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/custom_bin_name.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'bin-name' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'bin-name'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'bin-name' {\n            [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'c')\n            [CompletionResult]::new('-v', '-v', [CompletionResultType]::ParameterName, 'v')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand with a second line')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'bin-name;test' {\n            [CompletionResult]::new('-d', '-d', [CompletionResultType]::ParameterName, 'd')\n            [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'c')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'bin-name;help' {\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'Subcommand with a second line')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'bin-name;help;test' {\n            break\n        }\n        'bin-name;help;help' {\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/custom_bin_name.zsh",
    "content": "#compdef bin-name\n\nautoload -U is-at-least\n\n_bin-name() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'-c[]' \\\n'(-c)-v[]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n\":: :_bin-name_commands\" \\\n\"*::: :->my-app\" \\\n&& ret=0\n    case $state in\n    (my-app)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:bin-name-command-$line[1]:\"\n        case $line[1] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n'*-d[]' \\\n'-c[]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_bin-name__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:bin-name-help-command-$line[1]:\"\n        case $line[1] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n}\n\n(( $+functions[_bin-name_commands] )) ||\n_bin-name_commands() {\n    local commands; commands=(\n'test:Subcommand with a second line' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'bin-name commands' commands \"$@\"\n}\n(( $+functions[_bin-name__help_commands] )) ||\n_bin-name__help_commands() {\n    local commands; commands=(\n'test:Subcommand with a second line' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'bin-name help commands' commands \"$@\"\n}\n(( $+functions[_bin-name__help__help_commands] )) ||\n_bin-name__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'bin-name help help commands' commands \"$@\"\n}\n(( $+functions[_bin-name__help__test_commands] )) ||\n_bin-name__help__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'bin-name help test commands' commands \"$@\"\n}\n(( $+functions[_bin-name__test_commands] )) ||\n_bin-name__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'bin-name test commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_bin-name\" ]; then\n    _bin-name \"$@\"\nelse\n    compdef _bin-name bin-name\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/external_subcommands.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            my__app,external)\n                cmd=\"my__app__external\"\n                ;;\n            my__app,help)\n                cmd=\"my__app__help\"\n                ;;\n            my__app__help,external)\n                cmd=\"my__app__help__external\"\n                ;;\n            my__app__help,help)\n                cmd=\"my__app__help__help\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-h --help external help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__external)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help)\n            opts=\"external help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__external)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/external_subcommands.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand external 'An external subcommand'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;external'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;help'= {\n            cand external 'An external subcommand'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;help;external'= {\n        }\n        &'my-app;help;help'= {\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/external_subcommands.fish",
    "content": "# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\nfunction __fish_my_app_global_optspecs\n\tstring join \\n h/help\nend\n\nfunction __fish_my_app_needs_command\n\t# Figure out if the current invocation already has a command.\n\tset -l cmd (commandline -opc)\n\tset -e cmd[1]\n\targparse -s (__fish_my_app_global_optspecs) -- $cmd 2>/dev/null\n\tor return\n\tif set -q argv[1]\n\t\t# Also print the command, so this can be used to figure out what it is.\n\t\techo $argv[1]\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nfunction __fish_my_app_using_subcommand\n\tset -l cmd (__fish_my_app_needs_command)\n\ttest -z \"$cmd\"\n\tand return 1\n\tcontains -- $cmd[1] $argv\nend\n\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"external\" -d 'An external subcommand'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand external\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from external help\" -f -a \"external\" -d 'An external subcommand'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from external help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/external_subcommands.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('external', 'external', [CompletionResultType]::ParameterValue, 'An external subcommand')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;external' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;help' {\n            [CompletionResult]::new('external', 'external', [CompletionResultType]::ParameterValue, 'An external subcommand')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;help;external' {\n            break\n        }\n        'my-app;help;help' {\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/external_subcommands.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n\":: :_my-app_commands\" \\\n\"*::: :->my-app\" \\\n&& ret=0\n    case $state in\n    (my-app)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-command-$line[1]:\"\n        case $line[1] in\n            (external)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n\"*::external_command:_default\" \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-help-command-$line[1]:\"\n        case $line[1] in\n            (external)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=(\n'external:An external subcommand' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n(( $+functions[_my-app__external_commands] )) ||\n_my-app__external_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app external commands' commands \"$@\"\n}\n(( $+functions[_my-app__help_commands] )) ||\n_my-app__help_commands() {\n    local commands; commands=(\n'external:An external subcommand' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__external_commands] )) ||\n_my-app__help__external_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help external commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__help_commands] )) ||\n_my-app__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help help commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/feature_sample.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            my__app,help)\n                cmd=\"my__app__help\"\n                ;;\n            my__app,test)\n                cmd=\"my__app__test\"\n                ;;\n            my__app__help,help)\n                cmd=\"my__app__help__help\"\n                ;;\n            my__app__help,test)\n                cmd=\"my__app__help__test\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-C -c -h -V --conf --config --help --version [file] first second test help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help)\n            opts=\"test help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__test)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__test)\n            opts=\"-h -V --case --help --version\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --case)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/feature_sample.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand -c 'some config file'\n            cand -C 'some config file'\n            cand --config 'some config file'\n            cand --conf 'some config file'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n            cand test 'tests things'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;test'= {\n            cand --case 'the case to test'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'my-app;help'= {\n            cand test 'tests things'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;help;test'= {\n        }\n        &'my-app;help;help'= {\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/feature_sample.fish",
    "content": "# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\nfunction __fish_my_app_global_optspecs\n\tstring join \\n c/config h/help V/version\nend\n\nfunction __fish_my_app_needs_command\n\t# Figure out if the current invocation already has a command.\n\tset -l cmd (commandline -opc)\n\tset -e cmd[1]\n\targparse -s (__fish_my_app_global_optspecs) -- $cmd 2>/dev/null\n\tor return\n\tif set -q argv[1]\n\t\t# Also print the command, so this can be used to figure out what it is.\n\t\techo $argv[1]\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nfunction __fish_my_app_using_subcommand\n\tset -l cmd (__fish_my_app_needs_command)\n\ttest -z \"$cmd\"\n\tand return 1\n\tcontains -- $cmd[1] $argv\nend\n\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s c -s C -l config -l conf -d 'some config file'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"test\" -d 'tests things'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -l case -d 'the case to test' -r\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test help\" -f -a \"test\" -d 'tests things'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/feature_sample.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('-C', '-C ', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('--config', '--config', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('--conf', '--conf', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'tests things')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;test' {\n            [CompletionResult]::new('--case', '--case', [CompletionResultType]::ParameterName, 'the case to test')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'my-app;help' {\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'tests things')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;help;test' {\n            break\n        }\n        'my-app;help;help' {\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/feature_sample.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'*-c[some config file]' \\\n'*-C[some config file]' \\\n'*--config[some config file]' \\\n'*--conf[some config file]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n'::file -- some input file:_files' \\\n'::choice:(first second)' \\\n\":: :_my-app_commands\" \\\n\"*::: :->my-app\" \\\n&& ret=0\n    case $state in\n    (my-app)\n        words=($line[3] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-command-$line[3]:\"\n        case $line[3] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n'--case=[the case to test]: :_default' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-help-command-$line[1]:\"\n        case $line[1] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=(\n'test:tests things' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n(( $+functions[_my-app__help_commands] )) ||\n_my-app__help_commands() {\n    local commands; commands=(\n'test:tests things' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__help_commands] )) ||\n_my-app__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__test_commands] )) ||\n_my-app__help__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help test commands' commands \"$@\"\n}\n(( $+functions[_my-app__test_commands] )) ||\n_my-app__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app test commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/.gitignore",
    "content": "# Fish\nconf.d\nfish_variables\nfunctions\n\n# Zsh\n.zcompdump\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/dynamic-env/exhaustive/bash/.bashrc",
    "content": "PS1='% '\n. /etc/bash_completion\n\n_clap_complete_exhaustive() {\n    local IFS=$'\\013'\n    local _CLAP_COMPLETE_INDEX=${COMP_CWORD}\n    local _CLAP_COMPLETE_COMP_TYPE=${COMP_TYPE}\n    if compopt +o nospace 2> /dev/null; then\n        local _CLAP_COMPLETE_SPACE=false\n    else\n        local _CLAP_COMPLETE_SPACE=true\n    fi\n    local words=(\"${COMP_WORDS[@]}\")\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        words[COMP_CWORD]=\"$2\"\n    fi\n    COMPREPLY=( $( \\\n        _CLAP_IFS=\"$IFS\" \\\n        _CLAP_COMPLETE_INDEX=\"$_CLAP_COMPLETE_INDEX\" \\\n        _CLAP_COMPLETE_COMP_TYPE=\"$_CLAP_COMPLETE_COMP_TYPE\" \\\n        _CLAP_COMPLETE_SPACE=\"$_CLAP_COMPLETE_SPACE\" \\\n        COMPLETE=\"bash\" \\\n        \"exhaustive\" -- \"${words[@]}\" \\\n    ) )\n    if [[ $? != 0 ]]; then\n        unset COMPREPLY\n    elif [[ $_CLAP_COMPLETE_SPACE == false ]] && [[ \"${COMPREPLY-}\" =~ [=/:]$ ]]; then\n        compopt -o nospace\n    fi\n}\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -o nospace -o bashdefault -o nosort -F _clap_complete_exhaustive exhaustive\nelse\n    complete -o nospace -o bashdefault -F _clap_complete_exhaustive exhaustive\nfi\n\n\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/dynamic-env/exhaustive/elvish/elvish/rc.elv",
    "content": "set edit:rprompt = (constantly \"\")\nset edit:prompt = (constantly \"% \")\n\nset edit:completion:arg-completer[exhaustive] = { |@words|\n    var index = (count $words)\n    set index = (- $index 1)\n\n    put (env _CLAP_IFS=\"\\n\" _CLAP_COMPLETE_INDEX=(to-string $index) COMPLETE=\"elvish\" exhaustive -- $@words) | to-lines\n}\n\n\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/dynamic-env/exhaustive/fish/fish/completions/exhaustive.fish",
    "content": "complete --keep-order --exclusive --command exhaustive --arguments \"(COMPLETE=fish exhaustive -- (commandline --current-process --tokenize --cut-at-cursor) (commandline --current-token))\"\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/dynamic-env/exhaustive/fish/fish/config.fish",
    "content": "set -U fish_greeting \"\"\nset -U fish_autosuggestion_enabled 0\nfunction fish_title\nend\nfunction fish_prompt\n    printf '%% '\nend;\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/dynamic-env/exhaustive/zsh/.zshenv",
    "content": "fpath=($fpath $ZDOTDIR/zsh)\nautoload -U +X compinit && compinit -u # bypass compaudit security checking\nprecmd_functions=\"\"  # avoid the prompt being overwritten\nPS1='%% '\nPROMPT='%% '\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/dynamic-env/exhaustive/zsh/zsh/_exhaustive",
    "content": "#compdef exhaustive\nfunction _clap_dynamic_completer_exhaustive() {\n    local _CLAP_COMPLETE_INDEX=$(expr $CURRENT - 1)\n    local _CLAP_IFS=$'\\n'\n\n    local completions=(\"${(@f)$( \\\n        _CLAP_IFS=\"$_CLAP_IFS\" \\\n        _CLAP_COMPLETE_INDEX=\"$_CLAP_COMPLETE_INDEX\" \\\n        COMPLETE=\"zsh\" \\\n        exhaustive -- \"${words[@]}\" 2>/dev/null \\\n    )}\")\n\n    if [[ -n $completions ]]; then\n        local -a dirs=()\n        local -a other=()\n        local completion\n        for completion in $completions; do\n            local value=\"${completion%%:*}\"\n            if [[ \"$value\" == */ ]]; then\n                local dir_no_slash=\"${value%/}\"\n                if [[ \"$completion\" == *:* ]]; then\n                    local desc=\"${completion#*:}\"\n                    dirs+=(\"$dir_no_slash:$desc\")\n                else\n                    dirs+=(\"$dir_no_slash\")\n                fi\n            else\n                other+=(\"$completion\")\n            fi\n        done\n        [[ -n $dirs ]] && _describe 'values' dirs -S '/' -r '/'\n        [[ -n $other ]] && _describe 'values' other\n    fi\n}\n\ncompdef _clap_dynamic_completer_exhaustive exhaustive\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/static/exhaustive/bash/.bashrc",
    "content": "PS1='% '\n. /etc/bash_completion\n_exhaustive() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"exhaustive\"\n                ;;\n            exhaustive,action)\n                cmd=\"exhaustive__action\"\n                ;;\n            exhaustive,alias)\n                cmd=\"exhaustive__alias\"\n                ;;\n            exhaustive,empty)\n                cmd=\"exhaustive__empty\"\n                ;;\n            exhaustive,global)\n                cmd=\"exhaustive__global\"\n                ;;\n            exhaustive,help)\n                cmd=\"exhaustive__help\"\n                ;;\n            exhaustive,hint)\n                cmd=\"exhaustive__hint\"\n                ;;\n            exhaustive,last)\n                cmd=\"exhaustive__last\"\n                ;;\n            exhaustive,pacman)\n                cmd=\"exhaustive__pacman\"\n                ;;\n            exhaustive,quote)\n                cmd=\"exhaustive__quote\"\n                ;;\n            exhaustive,value)\n                cmd=\"exhaustive__value\"\n                ;;\n            exhaustive__global,help)\n                cmd=\"exhaustive__global__help\"\n                ;;\n            exhaustive__global,one)\n                cmd=\"exhaustive__global__one\"\n                ;;\n            exhaustive__global,two)\n                cmd=\"exhaustive__global__two\"\n                ;;\n            exhaustive__global__help,help)\n                cmd=\"exhaustive__global__help__help\"\n                ;;\n            exhaustive__global__help,one)\n                cmd=\"exhaustive__global__help__one\"\n                ;;\n            exhaustive__global__help,two)\n                cmd=\"exhaustive__global__help__two\"\n                ;;\n            exhaustive__global__help__one,one-one)\n                cmd=\"exhaustive__global__help__one__one__one\"\n                ;;\n            exhaustive__global__one,help)\n                cmd=\"exhaustive__global__one__help\"\n                ;;\n            exhaustive__global__one,one-one)\n                cmd=\"exhaustive__global__one__one__one\"\n                ;;\n            exhaustive__global__one__help,help)\n                cmd=\"exhaustive__global__one__help__help\"\n                ;;\n            exhaustive__global__one__help,one-one)\n                cmd=\"exhaustive__global__one__help__one__one\"\n                ;;\n            exhaustive__help,action)\n                cmd=\"exhaustive__help__action\"\n                ;;\n            exhaustive__help,alias)\n                cmd=\"exhaustive__help__alias\"\n                ;;\n            exhaustive__help,empty)\n                cmd=\"exhaustive__help__empty\"\n                ;;\n            exhaustive__help,global)\n                cmd=\"exhaustive__help__global\"\n                ;;\n            exhaustive__help,help)\n                cmd=\"exhaustive__help__help\"\n                ;;\n            exhaustive__help,hint)\n                cmd=\"exhaustive__help__hint\"\n                ;;\n            exhaustive__help,last)\n                cmd=\"exhaustive__help__last\"\n                ;;\n            exhaustive__help,pacman)\n                cmd=\"exhaustive__help__pacman\"\n                ;;\n            exhaustive__help,quote)\n                cmd=\"exhaustive__help__quote\"\n                ;;\n            exhaustive__help,value)\n                cmd=\"exhaustive__help__value\"\n                ;;\n            exhaustive__help__global,one)\n                cmd=\"exhaustive__help__global__one\"\n                ;;\n            exhaustive__help__global,two)\n                cmd=\"exhaustive__help__global__two\"\n                ;;\n            exhaustive__help__global__one,one-one)\n                cmd=\"exhaustive__help__global__one__one__one\"\n                ;;\n            exhaustive__help__pacman,one)\n                cmd=\"exhaustive__help__pacman__one\"\n                ;;\n            exhaustive__help__pacman,two)\n                cmd=\"exhaustive__help__pacman__two\"\n                ;;\n            exhaustive__help__quote,cmd-backslash)\n                cmd=\"exhaustive__help__quote__cmd__backslash\"\n                ;;\n            exhaustive__help__quote,cmd-backticks)\n                cmd=\"exhaustive__help__quote__cmd__backticks\"\n                ;;\n            exhaustive__help__quote,cmd-brackets)\n                cmd=\"exhaustive__help__quote__cmd__brackets\"\n                ;;\n            exhaustive__help__quote,cmd-double-quotes)\n                cmd=\"exhaustive__help__quote__cmd__double__quotes\"\n                ;;\n            exhaustive__help__quote,cmd-expansions)\n                cmd=\"exhaustive__help__quote__cmd__expansions\"\n                ;;\n            exhaustive__help__quote,cmd-single-quotes)\n                cmd=\"exhaustive__help__quote__cmd__single__quotes\"\n                ;;\n            exhaustive__help__quote,escape-help)\n                cmd=\"exhaustive__help__quote__escape__help\"\n                ;;\n            exhaustive__pacman,help)\n                cmd=\"exhaustive__pacman__help\"\n                ;;\n            exhaustive__pacman,one)\n                cmd=\"exhaustive__pacman__one\"\n                ;;\n            exhaustive__pacman,two)\n                cmd=\"exhaustive__pacman__two\"\n                ;;\n            exhaustive__pacman__help,help)\n                cmd=\"exhaustive__pacman__help__help\"\n                ;;\n            exhaustive__pacman__help,one)\n                cmd=\"exhaustive__pacman__help__one\"\n                ;;\n            exhaustive__pacman__help,two)\n                cmd=\"exhaustive__pacman__help__two\"\n                ;;\n            exhaustive__quote,cmd-backslash)\n                cmd=\"exhaustive__quote__cmd__backslash\"\n                ;;\n            exhaustive__quote,cmd-backticks)\n                cmd=\"exhaustive__quote__cmd__backticks\"\n                ;;\n            exhaustive__quote,cmd-brackets)\n                cmd=\"exhaustive__quote__cmd__brackets\"\n                ;;\n            exhaustive__quote,cmd-double-quotes)\n                cmd=\"exhaustive__quote__cmd__double__quotes\"\n                ;;\n            exhaustive__quote,cmd-expansions)\n                cmd=\"exhaustive__quote__cmd__expansions\"\n                ;;\n            exhaustive__quote,cmd-single-quotes)\n                cmd=\"exhaustive__quote__cmd__single__quotes\"\n                ;;\n            exhaustive__quote,escape-help)\n                cmd=\"exhaustive__quote__escape__help\"\n                ;;\n            exhaustive__quote,help)\n                cmd=\"exhaustive__quote__help\"\n                ;;\n            exhaustive__quote__help,cmd-backslash)\n                cmd=\"exhaustive__quote__help__cmd__backslash\"\n                ;;\n            exhaustive__quote__help,cmd-backticks)\n                cmd=\"exhaustive__quote__help__cmd__backticks\"\n                ;;\n            exhaustive__quote__help,cmd-brackets)\n                cmd=\"exhaustive__quote__help__cmd__brackets\"\n                ;;\n            exhaustive__quote__help,cmd-double-quotes)\n                cmd=\"exhaustive__quote__help__cmd__double__quotes\"\n                ;;\n            exhaustive__quote__help,cmd-expansions)\n                cmd=\"exhaustive__quote__help__cmd__expansions\"\n                ;;\n            exhaustive__quote__help,cmd-single-quotes)\n                cmd=\"exhaustive__quote__help__cmd__single__quotes\"\n                ;;\n            exhaustive__quote__help,escape-help)\n                cmd=\"exhaustive__quote__help__escape__help\"\n                ;;\n            exhaustive__quote__help,help)\n                cmd=\"exhaustive__quote__help__help\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        exhaustive)\n            opts=\"-h --generate --empty-choice --help empty global action quote value pacman last alias hint help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --generate)\n                    COMPREPLY=($(compgen -W \"bash elvish fish powershell zsh\" -- \"${cur}\"))\n                    return 0\n                    ;;\n                --empty-choice)\n                    COMPREPLY=($(compgen -W \"\" -- \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__action)\n            opts=\"-h --set-true --set --count --choice --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --set)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --choice)\n                    COMPREPLY=($(compgen -W \"first second\" -- \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__alias)\n            opts=\"-F -f -O -o -h --flg --flag --opt --option --help [positional]\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --option)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --opt)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -o)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -O)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__empty)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global)\n            opts=\"-h -V --global --help --version one two help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__help)\n            opts=\"one two help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__help__one)\n            opts=\"one-one\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__help__one__one__one)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 5 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__help__two)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__one)\n            opts=\"-h -V --global --help --version one-one help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__one__help)\n            opts=\"one-one help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__one__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 5 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__one__help__one__one)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 5 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__one__one__one)\n            opts=\"-h -V --global --help --version\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__global__two)\n            opts=\"-h -V --global --help --version\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help)\n            opts=\"empty global action quote value pacman last alias hint help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__action)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__alias)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__empty)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__global)\n            opts=\"one two\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__global__one)\n            opts=\"one-one\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__global__one__one__one)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 5 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__global__two)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__hint)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__last)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__pacman)\n            opts=\"one two\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__pacman__one)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__pacman__two)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__quote)\n            opts=\"cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__quote__cmd__backslash)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__quote__cmd__backticks)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__quote__cmd__brackets)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__quote__cmd__double__quotes)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__quote__cmd__expansions)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__quote__cmd__single__quotes)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__quote__escape__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__help__value)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__hint)\n            opts=\"-p -f -d -e -c -u -H -h --choice --unknown --other --path --file --dir --exe --cmd-name --cmd --user --host --url --email --help [command_with_args]...\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --choice)\n                    COMPREPLY=($(compgen -W \"bash fish zsh\" -- \"${cur}\"))\n                    return 0\n                    ;;\n                --unknown)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --other)\n                    COMPREPLY=(\"${cur}\")\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o nospace\n                    fi\n                    return 0\n                    ;;\n                --path)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -p)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --file)\n                    local oldifs\n                    if [ -n \"${IFS+x}\" ]; then\n                        oldifs=\"$IFS\"\n                    fi\n                    IFS=$'\\n'\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    if [ -n \"${oldifs+x}\" ]; then\n                        IFS=\"$oldifs\"\n                    fi\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o filenames\n                    fi\n                    return 0\n                    ;;\n                -f)\n                    local oldifs\n                    if [ -n \"${IFS+x}\" ]; then\n                        oldifs=\"$IFS\"\n                    fi\n                    IFS=$'\\n'\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    if [ -n \"${oldifs+x}\" ]; then\n                        IFS=\"$oldifs\"\n                    fi\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o filenames\n                    fi\n                    return 0\n                    ;;\n                --dir)\n                    COMPREPLY=()\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o plusdirs\n                    fi\n                    return 0\n                    ;;\n                -d)\n                    COMPREPLY=()\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o plusdirs\n                    fi\n                    return 0\n                    ;;\n                --exe)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -e)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --cmd-name)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --cmd)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -c)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --user)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -u)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --host)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -H)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --url)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --email)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__last)\n            opts=\"-h --help [first] [free]\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__pacman)\n            opts=\"-h --help one two help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__pacman__help)\n            opts=\"one two help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__pacman__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__pacman__help__one)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__pacman__help__two)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__pacman__one)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__pacman__two)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote)\n            opts=\"-h --single-quotes --double-quotes --backticks --backslash --brackets --expansions --choice --help cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --choice)\n                    COMPREPLY=($(compgen -W \"another shell bash fish zsh\" -- \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__cmd__backslash)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__cmd__backticks)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__cmd__brackets)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__cmd__double__quotes)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__cmd__expansions)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__cmd__single__quotes)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__escape__help)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__help)\n            opts=\"cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__help__cmd__backslash)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__help__cmd__backticks)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__help__cmd__brackets)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__help__cmd__double__quotes)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__help__cmd__expansions)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__help__cmd__single__quotes)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__help__escape__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__quote__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        exhaustive__value)\n            opts=\"-h --delim --tuple --require-eq --help [term]...\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --delim)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --tuple)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --require-eq)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _exhaustive -o nosort -o bashdefault -o default exhaustive\nelse\n    complete -F _exhaustive -o bashdefault -o default exhaustive\nfi\n\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/static/exhaustive/bash/.inputrc",
    "content": "# expected empty file to disable loading ~/.inputrc\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/static/exhaustive/elvish/elvish/rc.elv",
    "content": "set edit:rprompt = (constantly \"\")\nset edit:prompt = (constantly \"% \")\n\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[exhaustive] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'exhaustive'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'exhaustive'= {\n            cand --generate 'generate'\n            cand --empty-choice 'empty-choice'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand empty 'empty'\n            cand global 'global'\n            cand action 'action'\n            cand quote 'quote'\n            cand value 'value'\n            cand pacman 'pacman'\n            cand last 'last'\n            cand alias 'alias'\n            cand hint 'hint'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;empty'= {\n        }\n        &'exhaustive;global'= {\n            cand --global 'everywhere'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n            cand one 'one'\n            cand two 'two'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;global;one'= {\n            cand --global 'everywhere'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n            cand one-one 'one-one'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;global;one;one-one'= {\n            cand --global 'everywhere'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'exhaustive;global;one;help'= {\n            cand one-one 'one-one'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;global;one;help;one-one'= {\n        }\n        &'exhaustive;global;one;help;help'= {\n        }\n        &'exhaustive;global;two'= {\n            cand --global 'everywhere'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'exhaustive;global;help'= {\n            cand one 'one'\n            cand two 'two'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;global;help;one'= {\n            cand one-one 'one-one'\n        }\n        &'exhaustive;global;help;one;one-one'= {\n        }\n        &'exhaustive;global;help;two'= {\n        }\n        &'exhaustive;global;help;help'= {\n        }\n        &'exhaustive;action'= {\n            cand --set 'value'\n            cand --choice 'enum'\n            cand --set-true 'bool'\n            cand --count 'number'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;quote'= {\n            cand --choice 'choice'\n            cand --single-quotes 'Can be ''always'', ''auto'', or ''never'''\n            cand --double-quotes 'Can be \"always\", \"auto\", or \"never\"'\n            cand --backticks 'For more information see `echo test`'\n            cand --backslash 'Avoid ''\\n'''\n            cand --brackets 'List packages [filter]'\n            cand --expansions 'Execute the shell command with $SHELL'\n            cand -h 'Print help (see more with ''--help'')'\n            cand --help 'Print help (see more with ''--help'')'\n            cand cmd-single-quotes 'Can be ''always'', ''auto'', or ''never'''\n            cand cmd-double-quotes 'Can be \"always\", \"auto\", or \"never\"'\n            cand cmd-backticks 'For more information see `echo test`'\n            cand cmd-backslash 'Avoid ''\\n'''\n            cand cmd-brackets 'List packages [filter]'\n            cand cmd-expansions 'Execute the shell command with $SHELL'\n            cand escape-help '\\tab\t\"'' New Line'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;quote;cmd-single-quotes'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;quote;cmd-double-quotes'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;quote;cmd-backticks'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;quote;cmd-backslash'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;quote;cmd-brackets'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;quote;cmd-expansions'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;quote;escape-help'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;quote;help'= {\n            cand cmd-single-quotes 'Can be ''always'', ''auto'', or ''never'''\n            cand cmd-double-quotes 'Can be \"always\", \"auto\", or \"never\"'\n            cand cmd-backticks 'For more information see `echo test`'\n            cand cmd-backslash 'Avoid ''\\n'''\n            cand cmd-brackets 'List packages [filter]'\n            cand cmd-expansions 'Execute the shell command with $SHELL'\n            cand escape-help '\\tab\t\"'' New Line'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;quote;help;cmd-single-quotes'= {\n        }\n        &'exhaustive;quote;help;cmd-double-quotes'= {\n        }\n        &'exhaustive;quote;help;cmd-backticks'= {\n        }\n        &'exhaustive;quote;help;cmd-backslash'= {\n        }\n        &'exhaustive;quote;help;cmd-brackets'= {\n        }\n        &'exhaustive;quote;help;cmd-expansions'= {\n        }\n        &'exhaustive;quote;help;escape-help'= {\n        }\n        &'exhaustive;quote;help;help'= {\n        }\n        &'exhaustive;value'= {\n            cand --delim 'delim'\n            cand --tuple 'tuple'\n            cand --require-eq 'require-eq'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;pacman'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand one 'one'\n            cand two 'two'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;pacman;one'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;pacman;two'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;pacman;help'= {\n            cand one 'one'\n            cand two 'two'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;pacman;help;one'= {\n        }\n        &'exhaustive;pacman;help;two'= {\n        }\n        &'exhaustive;pacman;help;help'= {\n        }\n        &'exhaustive;last'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;alias'= {\n            cand -o 'cmd option'\n            cand -O 'cmd option'\n            cand --option 'cmd option'\n            cand --opt 'cmd option'\n            cand -f 'cmd flag'\n            cand -F 'cmd flag'\n            cand --flag 'cmd flag'\n            cand --flg 'cmd flag'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;hint'= {\n            cand --choice 'choice'\n            cand --unknown 'unknown'\n            cand --other 'other'\n            cand -p 'p'\n            cand --path 'path'\n            cand -f 'f'\n            cand --file 'file'\n            cand -d 'd'\n            cand --dir 'dir'\n            cand -e 'e'\n            cand --exe 'exe'\n            cand --cmd-name 'cmd-name'\n            cand -c 'c'\n            cand --cmd 'cmd'\n            cand -u 'u'\n            cand --user 'user'\n            cand -H 'H'\n            cand --host 'host'\n            cand --url 'url'\n            cand --email 'email'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'exhaustive;help'= {\n            cand empty 'empty'\n            cand global 'global'\n            cand action 'action'\n            cand quote 'quote'\n            cand value 'value'\n            cand pacman 'pacman'\n            cand last 'last'\n            cand alias 'alias'\n            cand hint 'hint'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'exhaustive;help;empty'= {\n        }\n        &'exhaustive;help;global'= {\n            cand one 'one'\n            cand two 'two'\n        }\n        &'exhaustive;help;global;one'= {\n            cand one-one 'one-one'\n        }\n        &'exhaustive;help;global;one;one-one'= {\n        }\n        &'exhaustive;help;global;two'= {\n        }\n        &'exhaustive;help;action'= {\n        }\n        &'exhaustive;help;quote'= {\n            cand cmd-single-quotes 'Can be ''always'', ''auto'', or ''never'''\n            cand cmd-double-quotes 'Can be \"always\", \"auto\", or \"never\"'\n            cand cmd-backticks 'For more information see `echo test`'\n            cand cmd-backslash 'Avoid ''\\n'''\n            cand cmd-brackets 'List packages [filter]'\n            cand cmd-expansions 'Execute the shell command with $SHELL'\n            cand escape-help '\\tab\t\"'' New Line'\n        }\n        &'exhaustive;help;quote;cmd-single-quotes'= {\n        }\n        &'exhaustive;help;quote;cmd-double-quotes'= {\n        }\n        &'exhaustive;help;quote;cmd-backticks'= {\n        }\n        &'exhaustive;help;quote;cmd-backslash'= {\n        }\n        &'exhaustive;help;quote;cmd-brackets'= {\n        }\n        &'exhaustive;help;quote;cmd-expansions'= {\n        }\n        &'exhaustive;help;quote;escape-help'= {\n        }\n        &'exhaustive;help;value'= {\n        }\n        &'exhaustive;help;pacman'= {\n            cand one 'one'\n            cand two 'two'\n        }\n        &'exhaustive;help;pacman;one'= {\n        }\n        &'exhaustive;help;pacman;two'= {\n        }\n        &'exhaustive;help;last'= {\n        }\n        &'exhaustive;help;alias'= {\n        }\n        &'exhaustive;help;hint'= {\n        }\n        &'exhaustive;help;help'= {\n        }\n    ]\n    $completions[$command]\n}\n\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/static/exhaustive/fish/fish/completions/exhaustive.fish",
    "content": "# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\nfunction __fish_exhaustive_global_optspecs\n\tstring join \\n generate= empty-choice= h/help\nend\n\nfunction __fish_exhaustive_needs_command\n\t# Figure out if the current invocation already has a command.\n\tset -l cmd (commandline -opc)\n\tset -e cmd[1]\n\targparse -s (__fish_exhaustive_global_optspecs) -- $cmd 2>/dev/null\n\tor return\n\tif set -q argv[1]\n\t\t# Also print the command, so this can be used to figure out what it is.\n\t\techo $argv[1]\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nfunction __fish_exhaustive_using_subcommand\n\tset -l cmd (__fish_exhaustive_needs_command)\n\ttest -z \"$cmd\"\n\tand return 1\n\tcontains -- $cmd[1] $argv\nend\n\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -l generate -d 'generate' -r -f -a \"bash\\t''\nelvish\\t''\nfish\\t''\npowershell\\t''\nzsh\\t''\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -l empty-choice -r -f -a \"\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"empty\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"global\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"action\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"quote\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"value\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"pacman\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"last\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"alias\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"hint\"\ncomplete -c exhaustive -n \"__fish_exhaustive_needs_command\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and not __fish_seen_subcommand_from one two help\" -l global -d 'everywhere'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and not __fish_seen_subcommand_from one two help\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and not __fish_seen_subcommand_from one two help\" -s V -l version -d 'Print version'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and not __fish_seen_subcommand_from one two help\" -f -a \"one\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and not __fish_seen_subcommand_from one two help\" -f -a \"two\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and not __fish_seen_subcommand_from one two help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from one\" -l global -d 'everywhere'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from one\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from one\" -s V -l version -d 'Print version'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from one\" -f -a \"one-one\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from one\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from two\" -l global -d 'everywhere'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from two\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from two\" -s V -l version -d 'Print version'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from help\" -f -a \"one\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from help\" -f -a \"two\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand global; and __fish_seen_subcommand_from help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand action\" -l set -d 'value' -r\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand action\" -l choice -d 'enum' -r -f -a \"first\\t''\nsecond\\t''\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand action\" -l set-true -d 'bool'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand action\" -l count -d 'number'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand action\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -l choice -r -f -a \"another shell\\t'something with a space'\nbash\\t'bash (shell)'\nfish\\t'fish shell'\nzsh\\t'zsh shell'\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -l single-quotes -d 'Can be \\'always\\', \\'auto\\', or \\'never\\''\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -l double-quotes -d 'Can be \"always\", \"auto\", or \"never\"'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -l backticks -d 'For more information see `echo test`'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -l backslash -d 'Avoid \\'\\\\n\\''\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -l brackets -d 'List packages [filter]'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -l expansions -d 'Execute the shell command with $SHELL'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -s h -l help -d 'Print help (see more with \\'--help\\')'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -f -a \"cmd-single-quotes\" -d 'Can be \\'always\\', \\'auto\\', or \\'never\\''\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -f -a \"cmd-double-quotes\" -d 'Can be \"always\", \"auto\", or \"never\"'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -f -a \"cmd-backticks\" -d 'For more information see `echo test`'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -f -a \"cmd-backslash\" -d 'Avoid \\'\\\\n\\''\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -f -a \"cmd-brackets\" -d 'List packages [filter]'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -f -a \"cmd-expansions\" -d 'Execute the shell command with $SHELL'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -f -a \"escape-help\" -d '\\\\tab\t\"\\' New Line'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions escape-help help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from cmd-single-quotes\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from cmd-double-quotes\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from cmd-backticks\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from cmd-backslash\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from cmd-brackets\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from cmd-expansions\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from escape-help\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from help\" -f -a \"cmd-single-quotes\" -d 'Can be \\'always\\', \\'auto\\', or \\'never\\''\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from help\" -f -a \"cmd-double-quotes\" -d 'Can be \"always\", \"auto\", or \"never\"'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from help\" -f -a \"cmd-backticks\" -d 'For more information see `echo test`'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from help\" -f -a \"cmd-backslash\" -d 'Avoid \\'\\\\n\\''\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from help\" -f -a \"cmd-brackets\" -d 'List packages [filter]'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from help\" -f -a \"cmd-expansions\" -d 'Execute the shell command with $SHELL'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from help\" -f -a \"escape-help\" -d '\\\\tab\t\"\\' New Line'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand quote; and __fish_seen_subcommand_from help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand value\" -l delim -r\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand value\" -l tuple -r\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand value\" -l require-eq -r\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand value\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand pacman; and not __fish_seen_subcommand_from one two help\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand pacman; and not __fish_seen_subcommand_from one two help\" -f -a \"one\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand pacman; and not __fish_seen_subcommand_from one two help\" -f -a \"two\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand pacman; and not __fish_seen_subcommand_from one two help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand pacman; and __fish_seen_subcommand_from one\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand pacman; and __fish_seen_subcommand_from two\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand pacman; and __fish_seen_subcommand_from help\" -f -a \"one\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand pacman; and __fish_seen_subcommand_from help\" -f -a \"two\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand pacman; and __fish_seen_subcommand_from help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand last\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand alias\" -s o -s O -l option -l opt -d 'cmd option' -r\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand alias\" -s f -s F -l flag -l flg -d 'cmd flag'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand alias\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -l choice -r -f -a \"bash\\t''\nfish\\t''\nzsh\\t''\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -l unknown -r\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -l other -r -f\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -s p -l path -r -F\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -s f -l file -r -F\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -s d -l dir -r -f -a \"(__fish_complete_directories)\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -s e -l exe -r -F\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -l cmd-name -r -f -a \"(__fish_complete_command)\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -s c -l cmd -r -f -a \"(__fish_complete_command)\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -s u -l user -r -f -a \"(__fish_complete_users)\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -s H -l host -r -f -a \"(__fish_print_hostnames)\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -l url -r -f\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -l email -r -f\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand hint\" -s h -l help -d 'Print help'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"empty\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"global\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"action\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"quote\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"value\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"pacman\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"last\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"alias\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"hint\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and not __fish_seen_subcommand_from empty global action quote value pacman last alias hint help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from global\" -f -a \"one\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from global\" -f -a \"two\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from quote\" -f -a \"cmd-single-quotes\" -d 'Can be \\'always\\', \\'auto\\', or \\'never\\''\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from quote\" -f -a \"cmd-double-quotes\" -d 'Can be \"always\", \"auto\", or \"never\"'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from quote\" -f -a \"cmd-backticks\" -d 'For more information see `echo test`'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from quote\" -f -a \"cmd-backslash\" -d 'Avoid \\'\\\\n\\''\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from quote\" -f -a \"cmd-brackets\" -d 'List packages [filter]'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from quote\" -f -a \"cmd-expansions\" -d 'Execute the shell command with $SHELL'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from quote\" -f -a \"escape-help\" -d '\\\\tab\t\"\\' New Line'\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from pacman\" -f -a \"one\"\ncomplete -c exhaustive -n \"__fish_exhaustive_using_subcommand help; and __fish_seen_subcommand_from pacman\" -f -a \"two\"\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/static/exhaustive/fish/fish/config.fish",
    "content": "set -U fish_greeting \"\"\nset -U fish_autosuggestion_enabled 0\nfunction fish_title\nend\nfunction fish_prompt\n    printf '%% '\nend;\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/static/exhaustive/powershell/powershell/Microsoft.PowerShell_profile.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'exhaustive' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'exhaustive'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'exhaustive' {\n            [CompletionResult]::new('--generate', 'generate', [CompletionResultType]::ParameterName, 'generate')\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('action', 'action', [CompletionResultType]::ParameterValue, 'action')\n            [CompletionResult]::new('quote', 'quote', [CompletionResultType]::ParameterValue, 'quote')\n            [CompletionResult]::new('value', 'value', [CompletionResultType]::ParameterValue, 'value')\n            [CompletionResult]::new('pacman', 'pacman', [CompletionResultType]::ParameterValue, 'pacman')\n            [CompletionResult]::new('last', 'last', [CompletionResultType]::ParameterValue, 'last')\n            [CompletionResult]::new('alias', 'alias', [CompletionResultType]::ParameterValue, 'alias')\n            [CompletionResult]::new('hint', 'hint', [CompletionResultType]::ParameterValue, 'hint')\n            [CompletionResult]::new('complete', 'complete', [CompletionResultType]::ParameterValue, 'Register shell completions for this program')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'exhaustive;action' {\n            [CompletionResult]::new('--set', 'set', [CompletionResultType]::ParameterName, 'value')\n            [CompletionResult]::new('--choice', 'choice', [CompletionResultType]::ParameterName, 'enum')\n            [CompletionResult]::new('--set-true', 'set-true', [CompletionResultType]::ParameterName, 'bool')\n            [CompletionResult]::new('--count', 'count', [CompletionResultType]::ParameterName, 'number')\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;quote' {\n            [CompletionResult]::new('--choice', 'choice', [CompletionResultType]::ParameterName, 'choice')\n            [CompletionResult]::new('--single-quotes', 'single-quotes', [CompletionResultType]::ParameterName, 'Can be ''always'', ''auto'', or ''never''')\n            [CompletionResult]::new('--double-quotes', 'double-quotes', [CompletionResultType]::ParameterName, 'Can be \"always\", \"auto\", or \"never\"')\n            [CompletionResult]::new('--backticks', 'backticks', [CompletionResultType]::ParameterName, 'For more information see `echo test`')\n            [CompletionResult]::new('--backslash', 'backslash', [CompletionResultType]::ParameterName, 'Avoid ''\\n''')\n            [CompletionResult]::new('--brackets', 'brackets', [CompletionResultType]::ParameterName, 'List packages [filter]')\n            [CompletionResult]::new('--expansions', 'expansions', [CompletionResultType]::ParameterName, 'Execute the shell command with $SHELL')\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('cmd-single-quotes', 'cmd-single-quotes', [CompletionResultType]::ParameterValue, 'Can be ''always'', ''auto'', or ''never''')\n            [CompletionResult]::new('cmd-double-quotes', 'cmd-double-quotes', [CompletionResultType]::ParameterValue, 'Can be \"always\", \"auto\", or \"never\"')\n            [CompletionResult]::new('cmd-backticks', 'cmd-backticks', [CompletionResultType]::ParameterValue, 'For more information see `echo test`')\n            [CompletionResult]::new('cmd-backslash', 'cmd-backslash', [CompletionResultType]::ParameterValue, 'Avoid ''\\n''')\n            [CompletionResult]::new('cmd-brackets', 'cmd-brackets', [CompletionResultType]::ParameterValue, 'List packages [filter]')\n            [CompletionResult]::new('cmd-expansions', 'cmd-expansions', [CompletionResultType]::ParameterValue, 'Execute the shell command with $SHELL')\n            [CompletionResult]::new('escape-help', 'escape-help', [CompletionResultType]::ParameterValue, '\\tab\t\"'' New Line')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'exhaustive;quote;cmd-single-quotes' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;quote;cmd-double-quotes' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;quote;cmd-backticks' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;quote;cmd-backslash' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;quote;cmd-brackets' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;quote;cmd-expansions' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;quote;escape-help' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;quote;help' {\n            [CompletionResult]::new('cmd-single-quotes', 'cmd-single-quotes', [CompletionResultType]::ParameterValue, 'Can be ''always'', ''auto'', or ''never''')\n            [CompletionResult]::new('cmd-double-quotes', 'cmd-double-quotes', [CompletionResultType]::ParameterValue, 'Can be \"always\", \"auto\", or \"never\"')\n            [CompletionResult]::new('cmd-backticks', 'cmd-backticks', [CompletionResultType]::ParameterValue, 'For more information see `echo test`')\n            [CompletionResult]::new('cmd-backslash', 'cmd-backslash', [CompletionResultType]::ParameterValue, 'Avoid ''\\n''')\n            [CompletionResult]::new('cmd-brackets', 'cmd-brackets', [CompletionResultType]::ParameterValue, 'List packages [filter]')\n            [CompletionResult]::new('cmd-expansions', 'cmd-expansions', [CompletionResultType]::ParameterValue, 'Execute the shell command with $SHELL')\n            [CompletionResult]::new('escape-help', 'escape-help', [CompletionResultType]::ParameterValue, '\\tab\t\"'' New Line')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'exhaustive;quote;help;cmd-single-quotes' {\n            break\n        }\n        'exhaustive;quote;help;cmd-double-quotes' {\n            break\n        }\n        'exhaustive;quote;help;cmd-backticks' {\n            break\n        }\n        'exhaustive;quote;help;cmd-backslash' {\n            break\n        }\n        'exhaustive;quote;help;cmd-brackets' {\n            break\n        }\n        'exhaustive;quote;help;cmd-expansions' {\n            break\n        }\n        'exhaustive;quote;help;escape-help' {\n            break\n        }\n        'exhaustive;quote;help;help' {\n            break\n        }\n        'exhaustive;value' {\n            [CompletionResult]::new('--delim', 'delim', [CompletionResultType]::ParameterName, 'delim')\n            [CompletionResult]::new('--tuple', 'tuple', [CompletionResultType]::ParameterName, 'tuple')\n            [CompletionResult]::new('--require-eq', 'require-eq', [CompletionResultType]::ParameterName, 'require-eq')\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;pacman' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('one', 'one', [CompletionResultType]::ParameterValue, 'one')\n            [CompletionResult]::new('two', 'two', [CompletionResultType]::ParameterValue, 'two')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'exhaustive;pacman;one' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;pacman;two' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;pacman;help' {\n            [CompletionResult]::new('one', 'one', [CompletionResultType]::ParameterValue, 'one')\n            [CompletionResult]::new('two', 'two', [CompletionResultType]::ParameterValue, 'two')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'exhaustive;pacman;help;one' {\n            break\n        }\n        'exhaustive;pacman;help;two' {\n            break\n        }\n        'exhaustive;pacman;help;help' {\n            break\n        }\n        'exhaustive;last' {\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;alias' {\n            [CompletionResult]::new('-o', 'o', [CompletionResultType]::ParameterName, 'cmd option')\n            [CompletionResult]::new('-O', 'O ', [CompletionResultType]::ParameterName, 'cmd option')\n            [CompletionResult]::new('--option', 'option', [CompletionResultType]::ParameterName, 'cmd option')\n            [CompletionResult]::new('--opt', 'opt', [CompletionResultType]::ParameterName, 'cmd option')\n            [CompletionResult]::new('-f', 'f', [CompletionResultType]::ParameterName, 'cmd flag')\n            [CompletionResult]::new('-F', 'F ', [CompletionResultType]::ParameterName, 'cmd flag')\n            [CompletionResult]::new('--flag', 'flag', [CompletionResultType]::ParameterName, 'cmd flag')\n            [CompletionResult]::new('--flg', 'flg', [CompletionResultType]::ParameterName, 'cmd flag')\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;hint' {\n            [CompletionResult]::new('--choice', 'choice', [CompletionResultType]::ParameterName, 'choice')\n            [CompletionResult]::new('--unknown', 'unknown', [CompletionResultType]::ParameterName, 'unknown')\n            [CompletionResult]::new('--other', 'other', [CompletionResultType]::ParameterName, 'other')\n            [CompletionResult]::new('-p', 'p', [CompletionResultType]::ParameterName, 'p')\n            [CompletionResult]::new('--path', 'path', [CompletionResultType]::ParameterName, 'path')\n            [CompletionResult]::new('-f', 'f', [CompletionResultType]::ParameterName, 'f')\n            [CompletionResult]::new('--file', 'file', [CompletionResultType]::ParameterName, 'file')\n            [CompletionResult]::new('-d', 'd', [CompletionResultType]::ParameterName, 'd')\n            [CompletionResult]::new('--dir', 'dir', [CompletionResultType]::ParameterName, 'dir')\n            [CompletionResult]::new('-e', 'e', [CompletionResultType]::ParameterName, 'e')\n            [CompletionResult]::new('--exe', 'exe', [CompletionResultType]::ParameterName, 'exe')\n            [CompletionResult]::new('--cmd-name', 'cmd-name', [CompletionResultType]::ParameterName, 'cmd-name')\n            [CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'c')\n            [CompletionResult]::new('--cmd', 'cmd', [CompletionResultType]::ParameterName, 'cmd')\n            [CompletionResult]::new('-u', 'u', [CompletionResultType]::ParameterName, 'u')\n            [CompletionResult]::new('--user', 'user', [CompletionResultType]::ParameterName, 'user')\n            [CompletionResult]::new('-H', 'H ', [CompletionResultType]::ParameterName, 'H')\n            [CompletionResult]::new('--host', 'host', [CompletionResultType]::ParameterName, 'host')\n            [CompletionResult]::new('--url', 'url', [CompletionResultType]::ParameterName, 'url')\n            [CompletionResult]::new('--email', 'email', [CompletionResultType]::ParameterName, 'email')\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;complete' {\n            [CompletionResult]::new('--shell', 'shell', [CompletionResultType]::ParameterName, 'Specify shell to complete for')\n            [CompletionResult]::new('--register', 'register', [CompletionResultType]::ParameterName, 'Path to write completion-registration to')\n            [CompletionResult]::new('--global', 'global', [CompletionResultType]::ParameterName, 'everywhere')\n            [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')\n            [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')\n            [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'exhaustive;help' {\n            [CompletionResult]::new('action', 'action', [CompletionResultType]::ParameterValue, 'action')\n            [CompletionResult]::new('quote', 'quote', [CompletionResultType]::ParameterValue, 'quote')\n            [CompletionResult]::new('value', 'value', [CompletionResultType]::ParameterValue, 'value')\n            [CompletionResult]::new('pacman', 'pacman', [CompletionResultType]::ParameterValue, 'pacman')\n            [CompletionResult]::new('last', 'last', [CompletionResultType]::ParameterValue, 'last')\n            [CompletionResult]::new('alias', 'alias', [CompletionResultType]::ParameterValue, 'alias')\n            [CompletionResult]::new('hint', 'hint', [CompletionResultType]::ParameterValue, 'hint')\n            [CompletionResult]::new('complete', 'complete', [CompletionResultType]::ParameterValue, 'Register shell completions for this program')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'exhaustive;help;action' {\n            break\n        }\n        'exhaustive;help;quote' {\n            [CompletionResult]::new('cmd-single-quotes', 'cmd-single-quotes', [CompletionResultType]::ParameterValue, 'Can be ''always'', ''auto'', or ''never''')\n            [CompletionResult]::new('cmd-double-quotes', 'cmd-double-quotes', [CompletionResultType]::ParameterValue, 'Can be \"always\", \"auto\", or \"never\"')\n            [CompletionResult]::new('cmd-backticks', 'cmd-backticks', [CompletionResultType]::ParameterValue, 'For more information see `echo test`')\n            [CompletionResult]::new('cmd-backslash', 'cmd-backslash', [CompletionResultType]::ParameterValue, 'Avoid ''\\n''')\n            [CompletionResult]::new('cmd-brackets', 'cmd-brackets', [CompletionResultType]::ParameterValue, 'List packages [filter]')\n            [CompletionResult]::new('cmd-expansions', 'cmd-expansions', [CompletionResultType]::ParameterValue, 'Execute the shell command with $SHELL')\n            [CompletionResult]::new('escape-help', 'escape-help', [CompletionResultType]::ParameterValue, '\\tab\t\"'' New Line')\n            break\n        }\n        'exhaustive;help;quote;cmd-single-quotes' {\n            break\n        }\n        'exhaustive;help;quote;cmd-double-quotes' {\n            break\n        }\n        'exhaustive;help;quote;cmd-backticks' {\n            break\n        }\n        'exhaustive;help;quote;cmd-backslash' {\n            break\n        }\n        'exhaustive;help;quote;cmd-brackets' {\n            break\n        }\n        'exhaustive;help;quote;cmd-expansions' {\n            break\n        }\n        'exhaustive;help;quote;escape-help' {\n            break\n        }\n        'exhaustive;help;value' {\n            break\n        }\n        'exhaustive;help;pacman' {\n            [CompletionResult]::new('one', 'one', [CompletionResultType]::ParameterValue, 'one')\n            [CompletionResult]::new('two', 'two', [CompletionResultType]::ParameterValue, 'two')\n            break\n        }\n        'exhaustive;help;pacman;one' {\n            break\n        }\n        'exhaustive;help;pacman;two' {\n            break\n        }\n        'exhaustive;help;last' {\n            break\n        }\n        'exhaustive;help;alias' {\n            break\n        }\n        'exhaustive;help;hint' {\n            break\n        }\n        'exhaustive;help;complete' {\n            break\n        }\n        'exhaustive;help;help' {\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\nfunction prompt {\n    '% '\n}\nSet-PSReadLineOption -PredictionSource None"
  },
  {
    "path": "clap_complete/tests/snapshots/home/static/exhaustive/zsh/.zshenv",
    "content": "fpath=($fpath $ZDOTDIR/zsh)\nautoload -U +X compinit && compinit -u # bypass compaudit security checking\nprecmd_functions=\"\"  # avoid the prompt being overwritten\nPS1='%% '\nPROMPT='%% '\n"
  },
  {
    "path": "clap_complete/tests/snapshots/home/static/exhaustive/zsh/zsh/_exhaustive",
    "content": "#compdef exhaustive\n\nautoload -U is-at-least\n\n_exhaustive() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'--generate=[generate]:SHELL:(bash elvish fish powershell zsh)' \\\n'--empty-choice=[]: :()' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n\":: :_exhaustive_commands\" \\\n\"*::: :->exhaustive\" \\\n&& ret=0\n    case $state in\n    (exhaustive)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-command-$line[1]:\"\n        case $line[1] in\n            (empty)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(global)\n_arguments \"${_arguments_options[@]}\" : \\\n'--global[everywhere]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n\":: :_exhaustive__global_commands\" \\\n\"*::: :->global\" \\\n&& ret=0\n\n    case $state in\n    (global)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-global-command-$line[1]:\"\n        case $line[1] in\n            (one)\n_arguments \"${_arguments_options[@]}\" : \\\n'--global[everywhere]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n\":: :_exhaustive__global__one_commands\" \\\n\"*::: :->one\" \\\n&& ret=0\n\n    case $state in\n    (one)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-global-one-command-$line[1]:\"\n        case $line[1] in\n            (one-one)\n_arguments \"${_arguments_options[@]}\" : \\\n'--global[everywhere]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__global__one__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-global-one-help-command-$line[1]:\"\n        case $line[1] in\n            (one-one)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n;;\n(two)\n_arguments \"${_arguments_options[@]}\" : \\\n'--global[everywhere]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__global__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-global-help-command-$line[1]:\"\n        case $line[1] in\n            (one)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__global__help__one_commands\" \\\n\"*::: :->one\" \\\n&& ret=0\n\n    case $state in\n    (one)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-global-help-one-command-$line[1]:\"\n        case $line[1] in\n            (one-one)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n(two)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n;;\n(action)\n_arguments \"${_arguments_options[@]}\" : \\\n'--set=[value]: :_default' \\\n'--choice=[enum]: :(first second)' \\\n'--set-true[bool]' \\\n'*--count[number]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(quote)\n_arguments \"${_arguments_options[@]}\" : \\\n'--choice=[]: :((another\\ shell\\:\"something with a space\"\nbash\\:\"bash (shell)\"\nfish\\:\"fish shell\"\nzsh\\:\"zsh shell\"))' \\\n'--single-quotes[Can be '\\''always'\\'', '\\''auto'\\'', or '\\''never'\\'']' \\\n'--double-quotes[Can be \"always\", \"auto\", or \"never\"]' \\\n'--backticks[For more information see \\`echo test\\`]' \\\n'--backslash[Avoid '\\''\\\\n'\\'']' \\\n'--brackets[List packages \\[filter\\]]' \\\n'--expansions[Execute the shell command with \\$SHELL]' \\\n'-h[Print help (see more with '\\''--help'\\'')]' \\\n'--help[Print help (see more with '\\''--help'\\'')]' \\\n\":: :_exhaustive__quote_commands\" \\\n\"*::: :->quote\" \\\n&& ret=0\n\n    case $state in\n    (quote)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-quote-command-$line[1]:\"\n        case $line[1] in\n            (cmd-single-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-double-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-backticks)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-backslash)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-brackets)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-expansions)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(escape-help)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__quote__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-quote-help-command-$line[1]:\"\n        case $line[1] in\n            (cmd-single-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-double-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-backticks)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-backslash)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-brackets)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-expansions)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(escape-help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n;;\n(value)\n_arguments \"${_arguments_options[@]}\" : \\\n'--delim=[]: :_default' \\\n'--tuple=[]: :_default: :_default' \\\n'--require-eq=[]: :_default' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'*;::term:_default' \\\n&& ret=0\n;;\n(pacman)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n\":: :_exhaustive__pacman_commands\" \\\n\"*::: :->pacman\" \\\n&& ret=0\n\n    case $state in\n    (pacman)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-pacman-command-$line[1]:\"\n        case $line[1] in\n            (one)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(two)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__pacman__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-pacman-help-command-$line[1]:\"\n        case $line[1] in\n            (one)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(two)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n;;\n(last)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'::first:_default' \\\n'::free:_default' \\\n&& ret=0\n;;\n(alias)\n_arguments \"${_arguments_options[@]}\" : \\\n'-o+[cmd option]: :_default' \\\n'-O+[cmd option]: :_default' \\\n'--option=[cmd option]: :_default' \\\n'--opt=[cmd option]: :_default' \\\n'-f[cmd flag]' \\\n'-F[cmd flag]' \\\n'--flag[cmd flag]' \\\n'--flg[cmd flag]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'::positional:_default' \\\n&& ret=0\n;;\n(hint)\n_arguments \"${_arguments_options[@]}\" : \\\n'--choice=[]: :(bash fish zsh)' \\\n'--unknown=[]: :_default' \\\n'--other=[]: :' \\\n'-p+[]: :_files' \\\n'--path=[]: :_files' \\\n'-f+[]: :_files' \\\n'--file=[]: :_files' \\\n'-d+[]: :_files -/' \\\n'--dir=[]: :_files -/' \\\n'-e+[]: :_absolute_command_paths' \\\n'--exe=[]: :_absolute_command_paths' \\\n'--cmd-name=[]: :_command_names -e' \\\n'-c+[]: :_cmdstring' \\\n'--cmd=[]: :_cmdstring' \\\n'-u+[]: :_users' \\\n'--user=[]: :_users' \\\n'-H+[]: :_hosts' \\\n'--host=[]: :_hosts' \\\n'--url=[]: :_urls' \\\n'--email=[]: :_email_addresses' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'*::command_with_args:_cmdambivalent' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-help-command-$line[1]:\"\n        case $line[1] in\n            (empty)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(global)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__help__global_commands\" \\\n\"*::: :->global\" \\\n&& ret=0\n\n    case $state in\n    (global)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-help-global-command-$line[1]:\"\n        case $line[1] in\n            (one)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__help__global__one_commands\" \\\n\"*::: :->one\" \\\n&& ret=0\n\n    case $state in\n    (one)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-help-global-one-command-$line[1]:\"\n        case $line[1] in\n            (one-one)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n(two)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n(action)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(quote)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__help__quote_commands\" \\\n\"*::: :->quote\" \\\n&& ret=0\n\n    case $state in\n    (quote)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-help-quote-command-$line[1]:\"\n        case $line[1] in\n            (cmd-single-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-double-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-backticks)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-backslash)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-brackets)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-expansions)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(escape-help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n(value)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(pacman)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_exhaustive__help__pacman_commands\" \\\n\"*::: :->pacman\" \\\n&& ret=0\n\n    case $state in\n    (pacman)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:exhaustive-help-pacman-command-$line[1]:\"\n        case $line[1] in\n            (one)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(two)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n(last)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(alias)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(hint)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n}\n\n(( $+functions[_exhaustive_commands] )) ||\n_exhaustive_commands() {\n    local commands; commands=(\n'empty:' \\\n'global:' \\\n'action:' \\\n'quote:' \\\n'value:' \\\n'pacman:' \\\n'last:' \\\n'alias:' \\\n'hint:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__action_commands] )) ||\n_exhaustive__action_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive action commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__alias_commands] )) ||\n_exhaustive__alias_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive alias commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__empty_commands] )) ||\n_exhaustive__empty_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive empty commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global_commands] )) ||\n_exhaustive__global_commands() {\n    local commands; commands=(\n'one:' \\\n'two:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive global commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__help_commands] )) ||\n_exhaustive__global__help_commands() {\n    local commands; commands=(\n'one:' \\\n'two:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive global help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__help__help_commands] )) ||\n_exhaustive__global__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive global help help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__help__one_commands] )) ||\n_exhaustive__global__help__one_commands() {\n    local commands; commands=(\n'one-one:' \\\n    )\n    _describe -t commands 'exhaustive global help one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__help__one__one-one_commands] )) ||\n_exhaustive__global__help__one__one-one_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive global help one one-one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__help__two_commands] )) ||\n_exhaustive__global__help__two_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive global help two commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__one_commands] )) ||\n_exhaustive__global__one_commands() {\n    local commands; commands=(\n'one-one:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive global one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__one__help_commands] )) ||\n_exhaustive__global__one__help_commands() {\n    local commands; commands=(\n'one-one:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive global one help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__one__help__help_commands] )) ||\n_exhaustive__global__one__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive global one help help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__one__help__one-one_commands] )) ||\n_exhaustive__global__one__help__one-one_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive global one help one-one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__one__one-one_commands] )) ||\n_exhaustive__global__one__one-one_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive global one one-one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__global__two_commands] )) ||\n_exhaustive__global__two_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive global two commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help_commands] )) ||\n_exhaustive__help_commands() {\n    local commands; commands=(\n'empty:' \\\n'global:' \\\n'action:' \\\n'quote:' \\\n'value:' \\\n'pacman:' \\\n'last:' \\\n'alias:' \\\n'hint:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__action_commands] )) ||\n_exhaustive__help__action_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help action commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__alias_commands] )) ||\n_exhaustive__help__alias_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help alias commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__empty_commands] )) ||\n_exhaustive__help__empty_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help empty commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__global_commands] )) ||\n_exhaustive__help__global_commands() {\n    local commands; commands=(\n'one:' \\\n'two:' \\\n    )\n    _describe -t commands 'exhaustive help global commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__global__one_commands] )) ||\n_exhaustive__help__global__one_commands() {\n    local commands; commands=(\n'one-one:' \\\n    )\n    _describe -t commands 'exhaustive help global one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__global__one__one-one_commands] )) ||\n_exhaustive__help__global__one__one-one_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help global one one-one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__global__two_commands] )) ||\n_exhaustive__help__global__two_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help global two commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__help_commands] )) ||\n_exhaustive__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__hint_commands] )) ||\n_exhaustive__help__hint_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help hint commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__last_commands] )) ||\n_exhaustive__help__last_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help last commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__pacman_commands] )) ||\n_exhaustive__help__pacman_commands() {\n    local commands; commands=(\n'one:' \\\n'two:' \\\n    )\n    _describe -t commands 'exhaustive help pacman commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__pacman__one_commands] )) ||\n_exhaustive__help__pacman__one_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help pacman one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__pacman__two_commands] )) ||\n_exhaustive__help__pacman__two_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help pacman two commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__quote_commands] )) ||\n_exhaustive__help__quote_commands() {\n    local commands; commands=(\n'cmd-single-quotes:Can be '\\''always'\\'', '\\''auto'\\'', or '\\''never'\\''' \\\n'cmd-double-quotes:Can be \"always\", \"auto\", or \"never\"' \\\n'cmd-backticks:For more information see \\`echo test\\`' \\\n'cmd-backslash:Avoid '\\''\\\\n'\\''' \\\n'cmd-brackets:List packages \\[filter\\]' \\\n'cmd-expansions:Execute the shell command with \\$SHELL' \\\n'escape-help:\\\\tab\t\"'\\'' New Line' \\\n    )\n    _describe -t commands 'exhaustive help quote commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__quote__cmd-backslash_commands] )) ||\n_exhaustive__help__quote__cmd-backslash_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help quote cmd-backslash commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__quote__cmd-backticks_commands] )) ||\n_exhaustive__help__quote__cmd-backticks_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help quote cmd-backticks commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__quote__cmd-brackets_commands] )) ||\n_exhaustive__help__quote__cmd-brackets_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help quote cmd-brackets commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__quote__cmd-double-quotes_commands] )) ||\n_exhaustive__help__quote__cmd-double-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help quote cmd-double-quotes commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__quote__cmd-expansions_commands] )) ||\n_exhaustive__help__quote__cmd-expansions_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help quote cmd-expansions commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__quote__cmd-single-quotes_commands] )) ||\n_exhaustive__help__quote__cmd-single-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help quote cmd-single-quotes commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__quote__escape-help_commands] )) ||\n_exhaustive__help__quote__escape-help_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help quote escape-help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__help__value_commands] )) ||\n_exhaustive__help__value_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive help value commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__hint_commands] )) ||\n_exhaustive__hint_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive hint commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__last_commands] )) ||\n_exhaustive__last_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive last commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__pacman_commands] )) ||\n_exhaustive__pacman_commands() {\n    local commands; commands=(\n'one:' \\\n'two:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive pacman commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__pacman__help_commands] )) ||\n_exhaustive__pacman__help_commands() {\n    local commands; commands=(\n'one:' \\\n'two:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive pacman help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__pacman__help__help_commands] )) ||\n_exhaustive__pacman__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive pacman help help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__pacman__help__one_commands] )) ||\n_exhaustive__pacman__help__one_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive pacman help one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__pacman__help__two_commands] )) ||\n_exhaustive__pacman__help__two_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive pacman help two commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__pacman__one_commands] )) ||\n_exhaustive__pacman__one_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive pacman one commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__pacman__two_commands] )) ||\n_exhaustive__pacman__two_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive pacman two commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote_commands] )) ||\n_exhaustive__quote_commands() {\n    local commands; commands=(\n'cmd-single-quotes:Can be '\\''always'\\'', '\\''auto'\\'', or '\\''never'\\''' \\\n'cmd-double-quotes:Can be \"always\", \"auto\", or \"never\"' \\\n'cmd-backticks:For more information see \\`echo test\\`' \\\n'cmd-backslash:Avoid '\\''\\\\n'\\''' \\\n'cmd-brackets:List packages \\[filter\\]' \\\n'cmd-expansions:Execute the shell command with \\$SHELL' \\\n'escape-help:\\\\tab\t\"'\\'' New Line' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive quote commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__cmd-backslash_commands] )) ||\n_exhaustive__quote__cmd-backslash_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote cmd-backslash commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__cmd-backticks_commands] )) ||\n_exhaustive__quote__cmd-backticks_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote cmd-backticks commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__cmd-brackets_commands] )) ||\n_exhaustive__quote__cmd-brackets_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote cmd-brackets commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__cmd-double-quotes_commands] )) ||\n_exhaustive__quote__cmd-double-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote cmd-double-quotes commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__cmd-expansions_commands] )) ||\n_exhaustive__quote__cmd-expansions_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote cmd-expansions commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__cmd-single-quotes_commands] )) ||\n_exhaustive__quote__cmd-single-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote cmd-single-quotes commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__escape-help_commands] )) ||\n_exhaustive__quote__escape-help_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote escape-help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__help_commands] )) ||\n_exhaustive__quote__help_commands() {\n    local commands; commands=(\n'cmd-single-quotes:Can be '\\''always'\\'', '\\''auto'\\'', or '\\''never'\\''' \\\n'cmd-double-quotes:Can be \"always\", \"auto\", or \"never\"' \\\n'cmd-backticks:For more information see \\`echo test\\`' \\\n'cmd-backslash:Avoid '\\''\\\\n'\\''' \\\n'cmd-brackets:List packages \\[filter\\]' \\\n'cmd-expansions:Execute the shell command with \\$SHELL' \\\n'escape-help:\\\\tab\t\"'\\'' New Line' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'exhaustive quote help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__help__cmd-backslash_commands] )) ||\n_exhaustive__quote__help__cmd-backslash_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote help cmd-backslash commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__help__cmd-backticks_commands] )) ||\n_exhaustive__quote__help__cmd-backticks_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote help cmd-backticks commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__help__cmd-brackets_commands] )) ||\n_exhaustive__quote__help__cmd-brackets_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote help cmd-brackets commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__help__cmd-double-quotes_commands] )) ||\n_exhaustive__quote__help__cmd-double-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote help cmd-double-quotes commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__help__cmd-expansions_commands] )) ||\n_exhaustive__quote__help__cmd-expansions_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote help cmd-expansions commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__help__cmd-single-quotes_commands] )) ||\n_exhaustive__quote__help__cmd-single-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote help cmd-single-quotes commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__help__escape-help_commands] )) ||\n_exhaustive__quote__help__escape-help_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote help escape-help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__quote__help__help_commands] )) ||\n_exhaustive__quote__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive quote help help commands' commands \"$@\"\n}\n(( $+functions[_exhaustive__value_commands] )) ||\n_exhaustive__value_commands() {\n    local commands; commands=()\n    _describe -t commands 'exhaustive value commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_exhaustive\" ]; then\n    _exhaustive \"$@\"\nelse\n    compdef _exhaustive exhaustive\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/multi_value_option.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-h --options --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --options)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/multi_value_option.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand --options 'multi-valued option'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/multi_value_option.fish",
    "content": "complete -c my-app -l options -d 'multi-valued option' -r\ncomplete -c my-app -s h -l help -d 'Print help'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/multi_value_option.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('--options', '--options', [CompletionResultType]::ParameterName, 'multi-valued option')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/multi_value_option.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'--options=[multi-valued option]: :_default: :_default: :_default: :_default' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_multi_value_option.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-h --options --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --options)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_multi_value_option.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand --options 'optional multi-value option'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_multi_value_option.fish",
    "content": "complete -c my-app -l options -d 'optional multi-value option' -r\ncomplete -c my-app -s h -l help -d 'Print help'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_multi_value_option.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('--options', '--options', [CompletionResultType]::ParameterName, 'optional multi-value option')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_multi_value_option.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'--options=[optional multi-value option]:: :_default' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_value_option.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-h --options --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --options)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_value_option.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand --options 'optional value option'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_value_option.fish",
    "content": "complete -c my-app -l options -d 'optional value option' -r\ncomplete -c my-app -s h -l help -d 'Print help'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_value_option.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('--options', '--options', [CompletionResultType]::ParameterName, 'optional value option')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/optional_value_option.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'--options=[optional value option]:: :_default' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/quoting.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            my__app,cmd-backslash)\n                cmd=\"my__app__cmd__backslash\"\n                ;;\n            my__app,cmd-backticks)\n                cmd=\"my__app__cmd__backticks\"\n                ;;\n            my__app,cmd-brackets)\n                cmd=\"my__app__cmd__brackets\"\n                ;;\n            my__app,cmd-double-quotes)\n                cmd=\"my__app__cmd__double__quotes\"\n                ;;\n            my__app,cmd-expansions)\n                cmd=\"my__app__cmd__expansions\"\n                ;;\n            my__app,cmd-single-quotes)\n                cmd=\"my__app__cmd__single__quotes\"\n                ;;\n            my__app,help)\n                cmd=\"my__app__help\"\n                ;;\n            my__app__help,cmd-backslash)\n                cmd=\"my__app__help__cmd__backslash\"\n                ;;\n            my__app__help,cmd-backticks)\n                cmd=\"my__app__help__cmd__backticks\"\n                ;;\n            my__app__help,cmd-brackets)\n                cmd=\"my__app__help__cmd__brackets\"\n                ;;\n            my__app__help,cmd-double-quotes)\n                cmd=\"my__app__help__cmd__double__quotes\"\n                ;;\n            my__app__help,cmd-expansions)\n                cmd=\"my__app__help__cmd__expansions\"\n                ;;\n            my__app__help,cmd-single-quotes)\n                cmd=\"my__app__help__cmd__single__quotes\"\n                ;;\n            my__app__help,help)\n                cmd=\"my__app__help__help\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-h -V --single-quotes --double-quotes --backticks --backslash --brackets --expansions --help --version cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__cmd__backslash)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__cmd__backticks)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__cmd__brackets)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__cmd__double__quotes)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__cmd__expansions)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__cmd__single__quotes)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help)\n            opts=\"cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__cmd__backslash)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__cmd__backticks)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__cmd__brackets)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__cmd__double__quotes)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__cmd__expansions)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__cmd__single__quotes)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/quoting.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand --single-quotes 'Can be ''always'', ''auto'', or ''never'''\n            cand --double-quotes 'Can be \"always\", \"auto\", or \"never\"'\n            cand --backticks 'For more information see `echo test`'\n            cand --backslash 'Avoid ''\\n'''\n            cand --brackets 'List packages [filter]'\n            cand --expansions 'Execute the shell command with $SHELL'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n            cand cmd-single-quotes 'Can be ''always'', ''auto'', or ''never'''\n            cand cmd-double-quotes 'Can be \"always\", \"auto\", or \"never\"'\n            cand cmd-backticks 'For more information see `echo test`'\n            cand cmd-backslash 'Avoid ''\\n'''\n            cand cmd-brackets 'List packages [filter]'\n            cand cmd-expansions 'Execute the shell command with $SHELL'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;cmd-single-quotes'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;cmd-double-quotes'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;cmd-backticks'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;cmd-backslash'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;cmd-brackets'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;cmd-expansions'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;help'= {\n            cand cmd-single-quotes 'Can be ''always'', ''auto'', or ''never'''\n            cand cmd-double-quotes 'Can be \"always\", \"auto\", or \"never\"'\n            cand cmd-backticks 'For more information see `echo test`'\n            cand cmd-backslash 'Avoid ''\\n'''\n            cand cmd-brackets 'List packages [filter]'\n            cand cmd-expansions 'Execute the shell command with $SHELL'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;help;cmd-single-quotes'= {\n        }\n        &'my-app;help;cmd-double-quotes'= {\n        }\n        &'my-app;help;cmd-backticks'= {\n        }\n        &'my-app;help;cmd-backslash'= {\n        }\n        &'my-app;help;cmd-brackets'= {\n        }\n        &'my-app;help;cmd-expansions'= {\n        }\n        &'my-app;help;help'= {\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/quoting.fish",
    "content": "# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\nfunction __fish_my_app_global_optspecs\n\tstring join \\n single-quotes double-quotes backticks backslash brackets expansions h/help V/version\nend\n\nfunction __fish_my_app_needs_command\n\t# Figure out if the current invocation already has a command.\n\tset -l cmd (commandline -opc)\n\tset -e cmd[1]\n\targparse -s (__fish_my_app_global_optspecs) -- $cmd 2>/dev/null\n\tor return\n\tif set -q argv[1]\n\t\t# Also print the command, so this can be used to figure out what it is.\n\t\techo $argv[1]\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nfunction __fish_my_app_using_subcommand\n\tset -l cmd (__fish_my_app_needs_command)\n\ttest -z \"$cmd\"\n\tand return 1\n\tcontains -- $cmd[1] $argv\nend\n\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -l single-quotes -d 'Can be \\'always\\', \\'auto\\', or \\'never\\''\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -l double-quotes -d 'Can be \"always\", \"auto\", or \"never\"'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -l backticks -d 'For more information see `echo test`'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -l backslash -d 'Avoid \\'\\\\n\\''\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -l brackets -d 'List packages [filter]'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -l expansions -d 'Execute the shell command with $SHELL'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"cmd-single-quotes\" -d 'Can be \\'always\\', \\'auto\\', or \\'never\\''\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"cmd-double-quotes\" -d 'Can be \"always\", \"auto\", or \"never\"'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"cmd-backticks\" -d 'For more information see `echo test`'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"cmd-backslash\" -d 'Avoid \\'\\\\n\\''\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"cmd-brackets\" -d 'List packages [filter]'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"cmd-expansions\" -d 'Execute the shell command with $SHELL'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand cmd-single-quotes\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand cmd-double-quotes\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand cmd-backticks\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand cmd-backslash\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand cmd-brackets\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand cmd-expansions\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions help\" -f -a \"cmd-single-quotes\" -d 'Can be \\'always\\', \\'auto\\', or \\'never\\''\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions help\" -f -a \"cmd-double-quotes\" -d 'Can be \"always\", \"auto\", or \"never\"'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions help\" -f -a \"cmd-backticks\" -d 'For more information see `echo test`'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions help\" -f -a \"cmd-backslash\" -d 'Avoid \\'\\\\n\\''\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions help\" -f -a \"cmd-brackets\" -d 'List packages [filter]'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions help\" -f -a \"cmd-expansions\" -d 'Execute the shell command with $SHELL'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from cmd-single-quotes cmd-double-quotes cmd-backticks cmd-backslash cmd-brackets cmd-expansions help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/quoting.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('--single-quotes', '--single-quotes', [CompletionResultType]::ParameterName, 'Can be ''always'', ''auto'', or ''never''')\n            [CompletionResult]::new('--double-quotes', '--double-quotes', [CompletionResultType]::ParameterName, 'Can be \"always\", \"auto\", or \"never\"')\n            [CompletionResult]::new('--backticks', '--backticks', [CompletionResultType]::ParameterName, 'For more information see `echo test`')\n            [CompletionResult]::new('--backslash', '--backslash', [CompletionResultType]::ParameterName, 'Avoid ''\\n''')\n            [CompletionResult]::new('--brackets', '--brackets', [CompletionResultType]::ParameterName, 'List packages [filter]')\n            [CompletionResult]::new('--expansions', '--expansions', [CompletionResultType]::ParameterName, 'Execute the shell command with $SHELL')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('cmd-single-quotes', 'cmd-single-quotes', [CompletionResultType]::ParameterValue, 'Can be ''always'', ''auto'', or ''never''')\n            [CompletionResult]::new('cmd-double-quotes', 'cmd-double-quotes', [CompletionResultType]::ParameterValue, 'Can be \"always\", \"auto\", or \"never\"')\n            [CompletionResult]::new('cmd-backticks', 'cmd-backticks', [CompletionResultType]::ParameterValue, 'For more information see `echo test`')\n            [CompletionResult]::new('cmd-backslash', 'cmd-backslash', [CompletionResultType]::ParameterValue, 'Avoid ''\\n''')\n            [CompletionResult]::new('cmd-brackets', 'cmd-brackets', [CompletionResultType]::ParameterValue, 'List packages [filter]')\n            [CompletionResult]::new('cmd-expansions', 'cmd-expansions', [CompletionResultType]::ParameterValue, 'Execute the shell command with $SHELL')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;cmd-single-quotes' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;cmd-double-quotes' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;cmd-backticks' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;cmd-backslash' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;cmd-brackets' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;cmd-expansions' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;help' {\n            [CompletionResult]::new('cmd-single-quotes', 'cmd-single-quotes', [CompletionResultType]::ParameterValue, 'Can be ''always'', ''auto'', or ''never''')\n            [CompletionResult]::new('cmd-double-quotes', 'cmd-double-quotes', [CompletionResultType]::ParameterValue, 'Can be \"always\", \"auto\", or \"never\"')\n            [CompletionResult]::new('cmd-backticks', 'cmd-backticks', [CompletionResultType]::ParameterValue, 'For more information see `echo test`')\n            [CompletionResult]::new('cmd-backslash', 'cmd-backslash', [CompletionResultType]::ParameterValue, 'Avoid ''\\n''')\n            [CompletionResult]::new('cmd-brackets', 'cmd-brackets', [CompletionResultType]::ParameterValue, 'List packages [filter]')\n            [CompletionResult]::new('cmd-expansions', 'cmd-expansions', [CompletionResultType]::ParameterValue, 'Execute the shell command with $SHELL')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;help;cmd-single-quotes' {\n            break\n        }\n        'my-app;help;cmd-double-quotes' {\n            break\n        }\n        'my-app;help;cmd-backticks' {\n            break\n        }\n        'my-app;help;cmd-backslash' {\n            break\n        }\n        'my-app;help;cmd-brackets' {\n            break\n        }\n        'my-app;help;cmd-expansions' {\n            break\n        }\n        'my-app;help;help' {\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/quoting.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'--single-quotes[Can be '\\''always'\\'', '\\''auto'\\'', or '\\''never'\\'']' \\\n'--double-quotes[Can be \"always\", \"auto\", or \"never\"]' \\\n'--backticks[For more information see \\`echo test\\`]' \\\n'--backslash[Avoid '\\''\\\\n'\\'']' \\\n'--brackets[List packages \\[filter\\]]' \\\n'--expansions[Execute the shell command with \\$SHELL]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n\":: :_my-app_commands\" \\\n\"*::: :->my-app\" \\\n&& ret=0\n    case $state in\n    (my-app)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-command-$line[1]:\"\n        case $line[1] in\n            (cmd-single-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-double-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-backticks)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-backslash)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-brackets)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(cmd-expansions)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-help-command-$line[1]:\"\n        case $line[1] in\n            (cmd-single-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-double-quotes)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-backticks)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-backslash)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-brackets)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(cmd-expansions)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=(\n'cmd-single-quotes:Can be '\\''always'\\'', '\\''auto'\\'', or '\\''never'\\''' \\\n'cmd-double-quotes:Can be \"always\", \"auto\", or \"never\"' \\\n'cmd-backticks:For more information see \\`echo test\\`' \\\n'cmd-backslash:Avoid '\\''\\\\n'\\''' \\\n'cmd-brackets:List packages \\[filter\\]' \\\n'cmd-expansions:Execute the shell command with \\$SHELL' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n(( $+functions[_my-app__cmd-backslash_commands] )) ||\n_my-app__cmd-backslash_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app cmd-backslash commands' commands \"$@\"\n}\n(( $+functions[_my-app__cmd-backticks_commands] )) ||\n_my-app__cmd-backticks_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app cmd-backticks commands' commands \"$@\"\n}\n(( $+functions[_my-app__cmd-brackets_commands] )) ||\n_my-app__cmd-brackets_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app cmd-brackets commands' commands \"$@\"\n}\n(( $+functions[_my-app__cmd-double-quotes_commands] )) ||\n_my-app__cmd-double-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app cmd-double-quotes commands' commands \"$@\"\n}\n(( $+functions[_my-app__cmd-expansions_commands] )) ||\n_my-app__cmd-expansions_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app cmd-expansions commands' commands \"$@\"\n}\n(( $+functions[_my-app__cmd-single-quotes_commands] )) ||\n_my-app__cmd-single-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app cmd-single-quotes commands' commands \"$@\"\n}\n(( $+functions[_my-app__help_commands] )) ||\n_my-app__help_commands() {\n    local commands; commands=(\n'cmd-single-quotes:Can be '\\''always'\\'', '\\''auto'\\'', or '\\''never'\\''' \\\n'cmd-double-quotes:Can be \"always\", \"auto\", or \"never\"' \\\n'cmd-backticks:For more information see \\`echo test\\`' \\\n'cmd-backslash:Avoid '\\''\\\\n'\\''' \\\n'cmd-brackets:List packages \\[filter\\]' \\\n'cmd-expansions:Execute the shell command with \\$SHELL' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__cmd-backslash_commands] )) ||\n_my-app__help__cmd-backslash_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help cmd-backslash commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__cmd-backticks_commands] )) ||\n_my-app__help__cmd-backticks_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help cmd-backticks commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__cmd-brackets_commands] )) ||\n_my-app__help__cmd-brackets_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help cmd-brackets commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__cmd-double-quotes_commands] )) ||\n_my-app__help__cmd-double-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help cmd-double-quotes commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__cmd-expansions_commands] )) ||\n_my-app__help__cmd-expansions_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help cmd-expansions commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__cmd-single-quotes_commands] )) ||\n_my-app__help__cmd-single-quotes_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help cmd-single-quotes commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__help_commands] )) ||\n_my-app__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help help commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/register_dynamic.fish",
    "content": "complete -x -c my-app -a 'my-app'\" complete --shell fish -- (commandline --current-process --tokenize --cut-at-cursor) (commandline --current-token)\"\n"
  },
  {
    "path": "clap_complete/tests/snapshots/register_minimal.bash",
    "content": "\n_clap_complete_my_app() {\n    local IFS=$'/013'\n    local _CLAP_COMPLETE_INDEX=${COMP_CWORD}\n    local _CLAP_COMPLETE_COMP_TYPE=${COMP_TYPE}\n    if compopt +o nospace 2> /dev/null; then\n        local _CLAP_COMPLETE_SPACE=false\n    else\n        local _CLAP_COMPLETE_SPACE=true\n    fi\n    COMPREPLY=( $( /\n        IFS=\"$IFS\" /\n        _CLAP_COMPLETE_INDEX=\"$_CLAP_COMPLETE_INDEX\" /\n        _CLAP_COMPLETE_COMP_TYPE=\"$_CLAP_COMPLETE_COMP_TYPE\" /\n        _CLAP_COMPLETE_SPACE=\"$_CLAP_COMPLETE_SPACE\" /\n        \"my-app\" complete bash -- \"${COMP_WORDS[@]}\" /\n    ) )\n    if [[ $? != 0 ]]; then\n        unset COMPREPLY\n    elif [[ $_CLAP_COMPLETE_SPACE == false ]] && [[ \"${COMPREPLY-}\" =~ [=/:]$ ]]; then\n        compopt -o nospace\n    fi\n}\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -o nospace -o bashdefault -o nosort -F _clap_complete_my_app my-app\nelse\n    complete -o nospace -o bashdefault -F _clap_complete_my_app my-app\nfi\n\n"
  },
  {
    "path": "clap_complete/tests/snapshots/special_commands.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            my__app,help)\n                cmd=\"my__app__help\"\n                ;;\n            my__app,some-cmd-with-hyphens)\n                cmd=\"my__app__some__cmd__with__hyphens\"\n                ;;\n            my__app,some-hidden-cmd)\n                cmd=\"my__app__some__hidden__cmd\"\n                ;;\n            my__app,some_cmd)\n                cmd=\"my__app__some_cmd\"\n                ;;\n            my__app,test)\n                cmd=\"my__app__test\"\n                ;;\n            my__app__help,help)\n                cmd=\"my__app__help__help\"\n                ;;\n            my__app__help,some-cmd-with-hyphens)\n                cmd=\"my__app__help__some__cmd__with__hyphens\"\n                ;;\n            my__app__help,some-hidden-cmd)\n                cmd=\"my__app__help__some__hidden__cmd\"\n                ;;\n            my__app__help,some_cmd)\n                cmd=\"my__app__help__some_cmd\"\n                ;;\n            my__app__help,test)\n                cmd=\"my__app__help__test\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-C -c -h -V --conf --config --help --version [file] first second test some_cmd some-cmd-with-hyphens some-hidden-cmd help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help)\n            opts=\"test some_cmd some-cmd-with-hyphens some-hidden-cmd help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__some__cmd__with__hyphens)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__some__hidden__cmd)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__some_cmd)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__test)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__some__cmd__with__hyphens)\n            opts=\"-h -V --help --version\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__some__hidden__cmd)\n            opts=\"-h -V --help --version\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__some_cmd)\n            opts=\"-h -V --config --help --version [path]...\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --config)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__test)\n            opts=\"-h -V --case --help --version\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --case)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/special_commands.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand -c 'some config file'\n            cand -C 'some config file'\n            cand --config 'some config file'\n            cand --conf 'some config file'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n            cand test 'tests things'\n            cand some_cmd 'tests other things'\n            cand some-cmd-with-hyphens 'some-cmd-with-hyphens'\n            cand some-hidden-cmd 'some-hidden-cmd'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;test'= {\n            cand --case 'the case to test'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'my-app;some_cmd'= {\n            cand --config 'the other case to test'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'my-app;some-cmd-with-hyphens'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'my-app;some-hidden-cmd'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'my-app;help'= {\n            cand test 'tests things'\n            cand some_cmd 'tests other things'\n            cand some-cmd-with-hyphens 'some-cmd-with-hyphens'\n            cand some-hidden-cmd 'some-hidden-cmd'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;help;test'= {\n        }\n        &'my-app;help;some_cmd'= {\n        }\n        &'my-app;help;some-cmd-with-hyphens'= {\n        }\n        &'my-app;help;some-hidden-cmd'= {\n        }\n        &'my-app;help;help'= {\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/special_commands.fish",
    "content": "# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\nfunction __fish_my_app_global_optspecs\n\tstring join \\n c/config h/help V/version\nend\n\nfunction __fish_my_app_needs_command\n\t# Figure out if the current invocation already has a command.\n\tset -l cmd (commandline -opc)\n\tset -e cmd[1]\n\targparse -s (__fish_my_app_global_optspecs) -- $cmd 2>/dev/null\n\tor return\n\tif set -q argv[1]\n\t\t# Also print the command, so this can be used to figure out what it is.\n\t\techo $argv[1]\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nfunction __fish_my_app_using_subcommand\n\tset -l cmd (__fish_my_app_needs_command)\n\ttest -z \"$cmd\"\n\tand return 1\n\tcontains -- $cmd[1] $argv\nend\n\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s c -s C -l config -l conf -d 'some config file'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"test\" -d 'tests things'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"some_cmd\" -d 'tests other things'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"some-cmd-with-hyphens\"\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"some-hidden-cmd\"\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -l case -d 'the case to test' -r\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd\" -l config -d 'the other case to test' -r\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some-cmd-with-hyphens\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some-cmd-with-hyphens\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some-hidden-cmd\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some-hidden-cmd\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test some_cmd some-cmd-with-hyphens some-hidden-cmd help\" -f -a \"test\" -d 'tests things'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test some_cmd some-cmd-with-hyphens some-hidden-cmd help\" -f -a \"some_cmd\" -d 'tests other things'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test some_cmd some-cmd-with-hyphens some-hidden-cmd help\" -f -a \"some-cmd-with-hyphens\"\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test some_cmd some-cmd-with-hyphens some-hidden-cmd help\" -f -a \"some-hidden-cmd\"\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test some_cmd some-cmd-with-hyphens some-hidden-cmd help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/special_commands.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('-C', '-C ', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('--config', '--config', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('--conf', '--conf', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'tests things')\n            [CompletionResult]::new('some_cmd', 'some_cmd', [CompletionResultType]::ParameterValue, 'tests other things')\n            [CompletionResult]::new('some-cmd-with-hyphens', 'some-cmd-with-hyphens', [CompletionResultType]::ParameterValue, 'some-cmd-with-hyphens')\n            [CompletionResult]::new('some-hidden-cmd', 'some-hidden-cmd', [CompletionResultType]::ParameterValue, 'some-hidden-cmd')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;test' {\n            [CompletionResult]::new('--case', '--case', [CompletionResultType]::ParameterName, 'the case to test')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'my-app;some_cmd' {\n            [CompletionResult]::new('--config', '--config', [CompletionResultType]::ParameterName, 'the other case to test')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'my-app;some-cmd-with-hyphens' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'my-app;some-hidden-cmd' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'my-app;help' {\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'tests things')\n            [CompletionResult]::new('some_cmd', 'some_cmd', [CompletionResultType]::ParameterValue, 'tests other things')\n            [CompletionResult]::new('some-cmd-with-hyphens', 'some-cmd-with-hyphens', [CompletionResultType]::ParameterValue, 'some-cmd-with-hyphens')\n            [CompletionResult]::new('some-hidden-cmd', 'some-hidden-cmd', [CompletionResultType]::ParameterValue, 'some-hidden-cmd')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;help;test' {\n            break\n        }\n        'my-app;help;some_cmd' {\n            break\n        }\n        'my-app;help;some-cmd-with-hyphens' {\n            break\n        }\n        'my-app;help;some-hidden-cmd' {\n            break\n        }\n        'my-app;help;help' {\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/special_commands.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'*-c[some config file]' \\\n'*-C[some config file]' \\\n'*--config[some config file]' \\\n'*--conf[some config file]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n'::file -- some input file:_files' \\\n'::choice:(first second)' \\\n\":: :_my-app_commands\" \\\n\"*::: :->my-app\" \\\n&& ret=0\n    case $state in\n    (my-app)\n        words=($line[3] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-command-$line[3]:\"\n        case $line[3] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n'--case=[the case to test]: :_default' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n&& ret=0\n;;\n(some_cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n'--config=[the other case to test]: :_default' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n'*::path:_default' \\\n&& ret=0\n;;\n(some-cmd-with-hyphens)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n&& ret=0\n;;\n(some-hidden-cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-help-command-$line[1]:\"\n        case $line[1] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(some_cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(some-cmd-with-hyphens)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(some-hidden-cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=(\n'test:tests things' \\\n'some_cmd:tests other things' \\\n'some-cmd-with-hyphens:' \\\n'some-hidden-cmd:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n(( $+functions[_my-app__help_commands] )) ||\n_my-app__help_commands() {\n    local commands; commands=(\n'test:tests things' \\\n'some_cmd:tests other things' \\\n'some-cmd-with-hyphens:' \\\n'some-hidden-cmd:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__help_commands] )) ||\n_my-app__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__some-cmd-with-hyphens_commands] )) ||\n_my-app__help__some-cmd-with-hyphens_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help some-cmd-with-hyphens commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__some-hidden-cmd_commands] )) ||\n_my-app__help__some-hidden-cmd_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help some-hidden-cmd commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__some_cmd_commands] )) ||\n_my-app__help__some_cmd_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help some_cmd commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__test_commands] )) ||\n_my-app__help__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help test commands' commands \"$@\"\n}\n(( $+functions[_my-app__some-cmd-with-hyphens_commands] )) ||\n_my-app__some-cmd-with-hyphens_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app some-cmd-with-hyphens commands' commands \"$@\"\n}\n(( $+functions[_my-app__some-hidden-cmd_commands] )) ||\n_my-app__some-hidden-cmd_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app some-hidden-cmd commands' commands \"$@\"\n}\n(( $+functions[_my-app__some_cmd_commands] )) ||\n_my-app__some_cmd_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app some_cmd commands' commands \"$@\"\n}\n(( $+functions[_my-app__test_commands] )) ||\n_my-app__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app test commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/sub_subcommands.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            my__app,help)\n                cmd=\"my__app__help\"\n                ;;\n            my__app,some_cmd)\n                cmd=\"my__app__some_cmd\"\n                ;;\n            my__app,some_cmd_alias)\n                cmd=\"my__app__some_cmd\"\n                ;;\n            my__app,test)\n                cmd=\"my__app__test\"\n                ;;\n            my__app__help,help)\n                cmd=\"my__app__help__help\"\n                ;;\n            my__app__help,some_cmd)\n                cmd=\"my__app__help__some_cmd\"\n                ;;\n            my__app__help,test)\n                cmd=\"my__app__help__test\"\n                ;;\n            my__app__help__some_cmd,sub_cmd)\n                cmd=\"my__app__help__some_cmd__sub_cmd\"\n                ;;\n            my__app__some_cmd,help)\n                cmd=\"my__app__some_cmd__help\"\n                ;;\n            my__app__some_cmd,sub_cmd)\n                cmd=\"my__app__some_cmd__sub_cmd\"\n                ;;\n            my__app__some_cmd__help,help)\n                cmd=\"my__app__some_cmd__help__help\"\n                ;;\n            my__app__some_cmd__help,sub_cmd)\n                cmd=\"my__app__some_cmd__help__sub_cmd\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-C -c -h -V --conf --config --help --version [file] first second test some_cmd some_cmd_alias help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help)\n            opts=\"test some_cmd help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__some_cmd)\n            opts=\"sub_cmd\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__some_cmd__sub_cmd)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__test)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__some_cmd)\n            opts=\"-h -V --help --version sub_cmd help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__some_cmd__help)\n            opts=\"sub_cmd help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__some_cmd__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__some_cmd__help__sub_cmd)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__some_cmd__sub_cmd)\n            opts=\"-h -V --config --help --version\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --config)\n                    COMPREPLY=($(compgen -W \"Lest quotes, aren't escaped. Second to trigger display of options\" -- \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__test)\n            opts=\"-h -V --case --help --version\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --case)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/sub_subcommands.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand -c 'some config file'\n            cand -C 'some config file'\n            cand --config 'some config file'\n            cand --conf 'some config file'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n            cand test 'tests things'\n            cand some_cmd 'top level subcommand'\n            cand some_cmd_alias 'top level subcommand'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;test'= {\n            cand --case 'the case to test'\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'my-app;some_cmd'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n            cand sub_cmd 'sub-subcommand'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;some_cmd_alias'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand -V 'Print version'\n            cand --version 'Print version'\n            cand sub_cmd 'sub-subcommand'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;some_cmd;sub_cmd'= {\n            cand --config 'the other case to test'\n            cand -h 'Print help (see more with ''--help'')'\n            cand --help 'Print help (see more with ''--help'')'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'my-app;some_cmd_alias;sub_cmd'= {\n            cand --config 'the other case to test'\n            cand -h 'Print help (see more with ''--help'')'\n            cand --help 'Print help (see more with ''--help'')'\n            cand -V 'Print version'\n            cand --version 'Print version'\n        }\n        &'my-app;some_cmd;help'= {\n            cand sub_cmd 'sub-subcommand'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;some_cmd;help;sub_cmd'= {\n        }\n        &'my-app;some_cmd;help;help'= {\n        }\n        &'my-app;some_cmd_alias;help'= {\n            cand sub_cmd 'sub-subcommand'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;some_cmd_alias;help;sub_cmd'= {\n        }\n        &'my-app;some_cmd_alias;help;help'= {\n        }\n        &'my-app;help'= {\n            cand test 'tests things'\n            cand some_cmd 'top level subcommand'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;help;test'= {\n        }\n        &'my-app;help;some_cmd'= {\n            cand sub_cmd 'sub-subcommand'\n        }\n        &'my-app;help;some_cmd;sub_cmd'= {\n        }\n        &'my-app;help;help'= {\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/sub_subcommands.fish",
    "content": "# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\nfunction __fish_my_app_global_optspecs\n\tstring join \\n c/config h/help V/version\nend\n\nfunction __fish_my_app_needs_command\n\t# Figure out if the current invocation already has a command.\n\tset -l cmd (commandline -opc)\n\tset -e cmd[1]\n\targparse -s (__fish_my_app_global_optspecs) -- $cmd 2>/dev/null\n\tor return\n\tif set -q argv[1]\n\t\t# Also print the command, so this can be used to figure out what it is.\n\t\techo $argv[1]\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nfunction __fish_my_app_using_subcommand\n\tset -l cmd (__fish_my_app_needs_command)\n\ttest -z \"$cmd\"\n\tand return 1\n\tcontains -- $cmd[1] $argv\nend\n\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s c -s C -l config -l conf -d 'some config file'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"test\" -d 'tests things'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"some_cmd\" -d 'top level subcommand'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"some_cmd_alias\" -d 'top level subcommand'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -l case -d 'the case to test' -r\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand test\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd; and not __fish_seen_subcommand_from sub_cmd help\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd; and not __fish_seen_subcommand_from sub_cmd help\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd; and not __fish_seen_subcommand_from sub_cmd help\" -f -a \"sub_cmd\" -d 'sub-subcommand'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd; and not __fish_seen_subcommand_from sub_cmd help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd; and __fish_seen_subcommand_from sub_cmd\" -l config -d 'the other case to test' -r -f -a \"Lest quotes\\, aren\\'t escaped.\\t'help,with,comma'\nSecond to trigger display of options\\t''\"\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd; and __fish_seen_subcommand_from sub_cmd\" -s h -l help -d 'Print help (see more with \\'--help\\')'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd; and __fish_seen_subcommand_from sub_cmd\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd; and __fish_seen_subcommand_from help\" -f -a \"sub_cmd\" -d 'sub-subcommand'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd; and __fish_seen_subcommand_from help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd_alias; and not __fish_seen_subcommand_from sub_cmd help\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd_alias; and not __fish_seen_subcommand_from sub_cmd help\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd_alias; and not __fish_seen_subcommand_from sub_cmd help\" -f -a \"sub_cmd\" -d 'sub-subcommand'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd_alias; and not __fish_seen_subcommand_from sub_cmd help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd_alias; and __fish_seen_subcommand_from sub_cmd\" -l config -d 'the other case to test' -r -f -a \"Lest quotes\\, aren\\'t escaped.\\t'help,with,comma'\nSecond to trigger display of options\\t''\"\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd_alias; and __fish_seen_subcommand_from sub_cmd\" -s h -l help -d 'Print help (see more with \\'--help\\')'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd_alias; and __fish_seen_subcommand_from sub_cmd\" -s V -l version -d 'Print version'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd_alias; and __fish_seen_subcommand_from help\" -f -a \"sub_cmd\" -d 'sub-subcommand'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand some_cmd_alias; and __fish_seen_subcommand_from help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test some_cmd help\" -f -a \"test\" -d 'tests things'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test some_cmd help\" -f -a \"some_cmd\" -d 'top level subcommand'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from test some_cmd help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and __fish_seen_subcommand_from some_cmd\" -f -a \"sub_cmd\" -d 'sub-subcommand'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/sub_subcommands.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('-C', '-C ', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('--config', '--config', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('--conf', '--conf', [CompletionResultType]::ParameterName, 'some config file')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'tests things')\n            [CompletionResult]::new('some_cmd', 'some_cmd', [CompletionResultType]::ParameterValue, 'top level subcommand')\n            [CompletionResult]::new('some_cmd_alias', 'some_cmd_alias', [CompletionResultType]::ParameterValue, 'top level subcommand')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;test' {\n            [CompletionResult]::new('--case', '--case', [CompletionResultType]::ParameterName, 'the case to test')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'my-app;some_cmd' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('sub_cmd', 'sub_cmd', [CompletionResultType]::ParameterValue, 'sub-subcommand')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;some_cmd_alias' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('sub_cmd', 'sub_cmd', [CompletionResultType]::ParameterValue, 'sub-subcommand')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;some_cmd;sub_cmd' {\n            [CompletionResult]::new('--config', '--config', [CompletionResultType]::ParameterName, 'the other case to test')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'my-app;some_cmd_alias;sub_cmd' {\n            [CompletionResult]::new('--config', '--config', [CompletionResultType]::ParameterName, 'the other case to test')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')\n            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')\n            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')\n            break\n        }\n        'my-app;some_cmd;help' {\n            [CompletionResult]::new('sub_cmd', 'sub_cmd', [CompletionResultType]::ParameterValue, 'sub-subcommand')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;some_cmd;help;sub_cmd' {\n            break\n        }\n        'my-app;some_cmd;help;help' {\n            break\n        }\n        'my-app;some_cmd_alias;help' {\n            [CompletionResult]::new('sub_cmd', 'sub_cmd', [CompletionResultType]::ParameterValue, 'sub-subcommand')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;some_cmd_alias;help;sub_cmd' {\n            break\n        }\n        'my-app;some_cmd_alias;help;help' {\n            break\n        }\n        'my-app;help' {\n            [CompletionResult]::new('test', 'test', [CompletionResultType]::ParameterValue, 'tests things')\n            [CompletionResult]::new('some_cmd', 'some_cmd', [CompletionResultType]::ParameterValue, 'top level subcommand')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;help;test' {\n            break\n        }\n        'my-app;help;some_cmd' {\n            [CompletionResult]::new('sub_cmd', 'sub_cmd', [CompletionResultType]::ParameterValue, 'sub-subcommand')\n            break\n        }\n        'my-app;help;some_cmd;sub_cmd' {\n            break\n        }\n        'my-app;help;help' {\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/sub_subcommands.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'*-c[some config file]' \\\n'*-C[some config file]' \\\n'*--config[some config file]' \\\n'*--conf[some config file]' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n'::file -- some input file:_files' \\\n'::choice:(first second)' \\\n\":: :_my-app_commands\" \\\n\"*::: :->my-app\" \\\n&& ret=0\n    case $state in\n    (my-app)\n        words=($line[3] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-command-$line[3]:\"\n        case $line[3] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n'--case=[the case to test]: :_default' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n&& ret=0\n;;\n(some_cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n\":: :_my-app__some_cmd_commands\" \\\n\"*::: :->some_cmd\" \\\n&& ret=0\n\n    case $state in\n    (some_cmd)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-some_cmd-command-$line[1]:\"\n        case $line[1] in\n            (sub_cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n'--config=[the other case to test]: :((Lest\\ quotes,\\ aren'\\''t\\ escaped.\\:\"help,with,comma\"\nSecond\\ to\\ trigger\\ display\\ of\\ options\\:\"\"))' \\\n'-h[Print help (see more with '\\''--help'\\'')]' \\\n'--help[Print help (see more with '\\''--help'\\'')]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__some_cmd__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-some_cmd-help-command-$line[1]:\"\n        case $line[1] in\n            (sub_cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n;;\n(some_cmd_alias)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n\":: :_my-app__some_cmd_commands\" \\\n\"*::: :->some_cmd\" \\\n&& ret=0\n\n    case $state in\n    (some_cmd)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-some_cmd-command-$line[1]:\"\n        case $line[1] in\n            (sub_cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n'--config=[the other case to test]: :((Lest\\ quotes,\\ aren'\\''t\\ escaped.\\:\"help,with,comma\"\nSecond\\ to\\ trigger\\ display\\ of\\ options\\:\"\"))' \\\n'-h[Print help (see more with '\\''--help'\\'')]' \\\n'--help[Print help (see more with '\\''--help'\\'')]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__some_cmd__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-some_cmd-help-command-$line[1]:\"\n        case $line[1] in\n            (sub_cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-help-command-$line[1]:\"\n        case $line[1] in\n            (test)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(some_cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__help__some_cmd_commands\" \\\n\"*::: :->some_cmd\" \\\n&& ret=0\n\n    case $state in\n    (some_cmd)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-help-some_cmd-command-$line[1]:\"\n        case $line[1] in\n            (sub_cmd)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=(\n'test:tests things' \\\n'some_cmd:top level subcommand' \\\n'some_cmd_alias:top level subcommand' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n(( $+functions[_my-app__help_commands] )) ||\n_my-app__help_commands() {\n    local commands; commands=(\n'test:tests things' \\\n'some_cmd:top level subcommand' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__help_commands] )) ||\n_my-app__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__some_cmd_commands] )) ||\n_my-app__help__some_cmd_commands() {\n    local commands; commands=(\n'sub_cmd:sub-subcommand' \\\n    )\n    _describe -t commands 'my-app help some_cmd commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__some_cmd__sub_cmd_commands] )) ||\n_my-app__help__some_cmd__sub_cmd_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help some_cmd sub_cmd commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__test_commands] )) ||\n_my-app__help__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help test commands' commands \"$@\"\n}\n(( $+functions[_my-app__some_cmd_commands] )) ||\n_my-app__some_cmd_commands() {\n    local commands; commands=(\n'sub_cmd:sub-subcommand' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app some_cmd commands' commands \"$@\"\n}\n(( $+functions[_my-app__some_cmd__help_commands] )) ||\n_my-app__some_cmd__help_commands() {\n    local commands; commands=(\n'sub_cmd:sub-subcommand' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app some_cmd help commands' commands \"$@\"\n}\n(( $+functions[_my-app__some_cmd__help__help_commands] )) ||\n_my-app__some_cmd__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app some_cmd help help commands' commands \"$@\"\n}\n(( $+functions[_my-app__some_cmd__help__sub_cmd_commands] )) ||\n_my-app__some_cmd__help__sub_cmd_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app some_cmd help sub_cmd commands' commands \"$@\"\n}\n(( $+functions[_my-app__some_cmd__sub_cmd_commands] )) ||\n_my-app__some_cmd__sub_cmd_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app some_cmd sub_cmd commands' commands \"$@\"\n}\n(( $+functions[_my-app__test_commands] )) ||\n_my-app__test_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app test commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/subcommand_last.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            my__app,bar)\n                cmd=\"my__app__bar\"\n                ;;\n            my__app,foo)\n                cmd=\"my__app__foo\"\n                ;;\n            my__app,help)\n                cmd=\"my__app__help\"\n                ;;\n            my__app__help,bar)\n                cmd=\"my__app__help__bar\"\n                ;;\n            my__app__help,foo)\n                cmd=\"my__app__help__foo\"\n                ;;\n            my__app__help,help)\n                cmd=\"my__app__help__help\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-h --help [free] foo bar help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__bar)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__foo)\n            opts=\"-h --help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help)\n            opts=\"foo bar help\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__bar)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__foo)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n        my__app__help__help)\n            opts=\"\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/subcommand_last.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n            cand foo 'foo'\n            cand bar 'bar'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;foo'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;bar'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n        &'my-app;help'= {\n            cand foo 'foo'\n            cand bar 'bar'\n            cand help 'Print this message or the help of the given subcommand(s)'\n        }\n        &'my-app;help;foo'= {\n        }\n        &'my-app;help;bar'= {\n        }\n        &'my-app;help;help'= {\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/subcommand_last.fish",
    "content": "# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.\nfunction __fish_my_app_global_optspecs\n\tstring join \\n h/help\nend\n\nfunction __fish_my_app_needs_command\n\t# Figure out if the current invocation already has a command.\n\tset -l cmd (commandline -opc)\n\tset -e cmd[1]\n\targparse -s (__fish_my_app_global_optspecs) -- $cmd 2>/dev/null\n\tor return\n\tif set -q argv[1]\n\t\t# Also print the command, so this can be used to figure out what it is.\n\t\techo $argv[1]\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nfunction __fish_my_app_using_subcommand\n\tset -l cmd (__fish_my_app_needs_command)\n\ttest -z \"$cmd\"\n\tand return 1\n\tcontains -- $cmd[1] $argv\nend\n\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"foo\"\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"bar\"\ncomplete -c my-app -n \"__fish_my_app_needs_command\" -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand foo\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand bar\" -s h -l help -d 'Print help'\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from foo bar help\" -f -a \"foo\"\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from foo bar help\" -f -a \"bar\"\ncomplete -c my-app -n \"__fish_my_app_using_subcommand help; and not __fish_seen_subcommand_from foo bar help\" -f -a \"help\" -d 'Print this message or the help of the given subcommand(s)'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/subcommand_last.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('foo', 'foo', [CompletionResultType]::ParameterValue, 'foo')\n            [CompletionResult]::new('bar', 'bar', [CompletionResultType]::ParameterValue, 'bar')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;foo' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;bar' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n        'my-app;help' {\n            [CompletionResult]::new('foo', 'foo', [CompletionResultType]::ParameterValue, 'foo')\n            [CompletionResult]::new('bar', 'bar', [CompletionResultType]::ParameterValue, 'bar')\n            [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)')\n            break\n        }\n        'my-app;help;foo' {\n            break\n        }\n        'my-app;help;bar' {\n            break\n        }\n        'my-app;help;help' {\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/subcommand_last.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'::free:_default' \\\n\":: :_my-app_commands\" \\\n\"*::: :->my-app\" \\\n&& ret=0\n    case $state in\n    (my-app)\n        words=($line[2] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-command-$line[2]:\"\n        case $line[2] in\n            (foo)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(bar)\n_arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n\":: :_my-app__help_commands\" \\\n\"*::: :->help\" \\\n&& ret=0\n\n    case $state in\n    (help)\n        words=($line[1] \"${words[@]}\")\n        (( CURRENT += 1 ))\n        curcontext=\"${curcontext%:*:*}:my-app-help-command-$line[1]:\"\n        case $line[1] in\n            (foo)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(bar)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n(help)\n_arguments \"${_arguments_options[@]}\" : \\\n&& ret=0\n;;\n        esac\n    ;;\nesac\n;;\n        esac\n    ;;\nesac\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=(\n'foo:' \\\n'bar:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n(( $+functions[_my-app__bar_commands] )) ||\n_my-app__bar_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app bar commands' commands \"$@\"\n}\n(( $+functions[_my-app__foo_commands] )) ||\n_my-app__foo_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app foo commands' commands \"$@\"\n}\n(( $+functions[_my-app__help_commands] )) ||\n_my-app__help_commands() {\n    local commands; commands=(\n'foo:' \\\n'bar:' \\\n'help:Print this message or the help of the given subcommand(s)' \\\n    )\n    _describe -t commands 'my-app help commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__bar_commands] )) ||\n_my-app__help__bar_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help bar commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__foo_commands] )) ||\n_my-app__help__foo_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help foo commands' commands \"$@\"\n}\n(( $+functions[_my-app__help__help_commands] )) ||\n_my-app__help__help_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app help help commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/two_multi_valued_arguments.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-h --help [first]... [second]...\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/two_multi_valued_arguments.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/two_multi_valued_arguments.fish",
    "content": "complete -c my-app -s h -l help -d 'Print help'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/two_multi_valued_arguments.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/two_multi_valued_arguments.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'*::first -- first multi-valued argument:_default' \\\n&& ret=0\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_hint.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-p -f -d -e -c -u -H -h --choice --unknown --other --path --file --dir --exe --cmd-name --cmd --user --host --url --email --help [command_with_args]...\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --choice)\n                    COMPREPLY=($(compgen -W \"bash fish zsh\" -- \"${cur}\"))\n                    return 0\n                    ;;\n                --unknown)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --other)\n                    COMPREPLY=(\"${cur}\")\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o nospace\n                    fi\n                    return 0\n                    ;;\n                --path)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -p)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --file)\n                    local oldifs\n                    if [ -n \"${IFS+x}\" ]; then\n                        oldifs=\"$IFS\"\n                    fi\n                    IFS=$'\\n'\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    if [ -n \"${oldifs+x}\" ]; then\n                        IFS=\"$oldifs\"\n                    fi\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o filenames\n                    fi\n                    return 0\n                    ;;\n                -f)\n                    local oldifs\n                    if [ -n \"${IFS+x}\" ]; then\n                        oldifs=\"$IFS\"\n                    fi\n                    IFS=$'\\n'\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    if [ -n \"${oldifs+x}\" ]; then\n                        IFS=\"$oldifs\"\n                    fi\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o filenames\n                    fi\n                    return 0\n                    ;;\n                --dir)\n                    COMPREPLY=()\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o plusdirs\n                    fi\n                    return 0\n                    ;;\n                -d)\n                    COMPREPLY=()\n                    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n                        compopt -o plusdirs\n                    fi\n                    return 0\n                    ;;\n                --exe)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -e)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --cmd-name)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --cmd)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -c)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --user)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -u)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --host)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -H)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --url)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --email)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_hint.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand --choice 'choice'\n            cand --unknown 'unknown'\n            cand --other 'other'\n            cand -p 'p'\n            cand --path 'path'\n            cand -f 'f'\n            cand --file 'file'\n            cand -d 'd'\n            cand --dir 'dir'\n            cand -e 'e'\n            cand --exe 'exe'\n            cand --cmd-name 'cmd-name'\n            cand -c 'c'\n            cand --cmd 'cmd'\n            cand -u 'u'\n            cand --user 'user'\n            cand -H 'H'\n            cand --host 'host'\n            cand --url 'url'\n            cand --email 'email'\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_hint.fish",
    "content": "complete -c my-app -l choice -r -f -a \"bash\\t''\nfish\\t''\nzsh\\t''\"\ncomplete -c my-app -l unknown -r\ncomplete -c my-app -l other -r -f\ncomplete -c my-app -s p -l path -r -F\ncomplete -c my-app -s f -l file -r -F\ncomplete -c my-app -s d -l dir -r -f -a \"(__fish_complete_directories)\"\ncomplete -c my-app -s e -l exe -r -F\ncomplete -c my-app -l cmd-name -r -f -a \"(__fish_complete_command)\"\ncomplete -c my-app -s c -l cmd -r -f -a \"(__fish_complete_command)\"\ncomplete -c my-app -s u -l user -r -f -a \"(__fish_complete_users)\"\ncomplete -c my-app -s H -l host -r -f -a \"(__fish_print_hostnames)\"\ncomplete -c my-app -l url -r -f\ncomplete -c my-app -l email -r -f\ncomplete -c my-app -s h -l help -d 'Print help'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_hint.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('--choice', '--choice', [CompletionResultType]::ParameterName, 'choice')\n            [CompletionResult]::new('--unknown', '--unknown', [CompletionResultType]::ParameterName, 'unknown')\n            [CompletionResult]::new('--other', '--other', [CompletionResultType]::ParameterName, 'other')\n            [CompletionResult]::new('-p', '-p', [CompletionResultType]::ParameterName, 'p')\n            [CompletionResult]::new('--path', '--path', [CompletionResultType]::ParameterName, 'path')\n            [CompletionResult]::new('-f', '-f', [CompletionResultType]::ParameterName, 'f')\n            [CompletionResult]::new('--file', '--file', [CompletionResultType]::ParameterName, 'file')\n            [CompletionResult]::new('-d', '-d', [CompletionResultType]::ParameterName, 'd')\n            [CompletionResult]::new('--dir', '--dir', [CompletionResultType]::ParameterName, 'dir')\n            [CompletionResult]::new('-e', '-e', [CompletionResultType]::ParameterName, 'e')\n            [CompletionResult]::new('--exe', '--exe', [CompletionResultType]::ParameterName, 'exe')\n            [CompletionResult]::new('--cmd-name', '--cmd-name', [CompletionResultType]::ParameterName, 'cmd-name')\n            [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'c')\n            [CompletionResult]::new('--cmd', '--cmd', [CompletionResultType]::ParameterName, 'cmd')\n            [CompletionResult]::new('-u', '-u', [CompletionResultType]::ParameterName, 'u')\n            [CompletionResult]::new('--user', '--user', [CompletionResultType]::ParameterName, 'user')\n            [CompletionResult]::new('-H', '-H ', [CompletionResultType]::ParameterName, 'H')\n            [CompletionResult]::new('--host', '--host', [CompletionResultType]::ParameterName, 'host')\n            [CompletionResult]::new('--url', '--url', [CompletionResultType]::ParameterName, 'url')\n            [CompletionResult]::new('--email', '--email', [CompletionResultType]::ParameterName, 'email')\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_hint.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'--choice=[]: :(bash fish zsh)' \\\n'--unknown=[]: :_default' \\\n'--other=[]: :' \\\n'-p+[]: :_files' \\\n'--path=[]: :_files' \\\n'-f+[]: :_files' \\\n'--file=[]: :_files' \\\n'-d+[]: :_files -/' \\\n'--dir=[]: :_files -/' \\\n'-e+[]: :_absolute_command_paths' \\\n'--exe=[]: :_absolute_command_paths' \\\n'--cmd-name=[]: :_command_names -e' \\\n'-c+[]: :_cmdstring' \\\n'--cmd=[]: :_cmdstring' \\\n'-u+[]: :_users' \\\n'--user=[]: :_users' \\\n'-H+[]: :_hosts' \\\n'--host=[]: :_hosts' \\\n'--url=[]: :_urls' \\\n'--email=[]: :_email_addresses' \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'*::command_with_args:_cmdambivalent' \\\n&& ret=0\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_terminator.bash",
    "content": "_my-app() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"my__app\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        my__app)\n            opts=\"-h --help [arguments]...\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _my-app -o nosort -o bashdefault -o default my-app\nelse\n    complete -F _my-app -o bashdefault -o default my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_terminator.elvish",
    "content": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[my-app] = {|@words|\n    fn spaces {|n|\n        builtin:repeat $n ' ' | str:join ''\n    }\n    fn cand {|text desc|\n        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc\n    }\n    var command = 'my-app'\n    for word $words[1..-1] {\n        if (str:has-prefix $word '-') {\n            break\n        }\n        set command = $command';'$word\n    }\n    var completions = [\n        &'my-app'= {\n            cand -h 'Print help'\n            cand --help 'Print help'\n        }\n    ]\n    $completions[$command]\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_terminator.fish",
    "content": "complete -c my-app -s h -l help -d 'Print help'\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_terminator.ps1",
    "content": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'my-app' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'my-app'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value.StartsWith('-') -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch ($command) {\n        'my-app' {\n            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')\n            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')\n            break\n        }\n    })\n\n    $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property ListItemText\n}\n"
  },
  {
    "path": "clap_complete/tests/snapshots/value_terminator.zsh",
    "content": "#compdef my-app\n\nautoload -U is-at-least\n\n_my-app() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'-h[Print help]' \\\n'--help[Print help]' \\\n'*;::arguments -- multi-valued argument with a value terminator:_default' \\\n&& ret=0\n}\n\n(( $+functions[_my-app_commands] )) ||\n_my-app_commands() {\n    local commands; commands=()\n    _describe -t commands 'my-app commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_my-app\" ]; then\n    _my-app \"$@\"\nelse\n    compdef _my-app my-app\nfi\n"
  },
  {
    "path": "clap_complete/tests/testsuite/bash.rs",
    "content": "#[allow(unused_imports)]\nuse snapbox::assert_data_eq;\n\nuse crate::common;\n\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nconst CMD: &str = \"bash\";\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\ntype RuntimeBuilder = completest_pty::BashRuntimeBuilder;\n\n#[test]\nfn basic() {\n    let name = \"my-app\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/basic.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn feature_sample() {\n    let name = \"my-app\";\n    let cmd = common::feature_sample_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/feature_sample.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn special_commands() {\n    let name = \"my-app\";\n    let cmd = common::special_commands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/special_commands.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn quoting() {\n    let name = \"my-app\";\n    let cmd = common::quoting_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/quoting.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn aliases() {\n    let name = \"my-app\";\n    let cmd = common::aliases_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/aliases.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn sub_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::sub_subcommands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/sub_subcommands.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn external_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::external_subcommand(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/external_subcommands.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn custom_bin_name() {\n    let name = \"my-app\";\n    let bin_name = \"bin-name\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/custom_bin_name.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        bin_name,\n    );\n}\n\n#[test]\nfn value_hint() {\n    let name = \"my-app\";\n    let cmd = common::value_hint_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_hint.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn value_terminator() {\n    let name = \"my-app\";\n    let cmd = common::value_terminator_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_terminator.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/multi_value_option.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_value_option.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_multi_value_option.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn two_multi_valued_arguments() {\n    let name = \"my-app\";\n    let cmd = common::two_multi_valued_arguments_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/two_multi_valued_arguments.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn subcommand_last() {\n    let name = \"my-app\";\n    let cmd = common::subcommand_last(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/subcommand_last.bash\"],\n        clap_complete::shells::Bash,\n        cmd,\n        name,\n    );\n}\n\n#[test]\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn register_completion() {\n    common::register_example::<RuntimeBuilder>(\"static\", \"exhaustive\");\n}\n\n#[test]\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"static\", \"exhaustive\");\n\n    let input = \"exhaustive \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% \n-h              --empty-choice  empty           action          value           last            hint\n--generate      --help          global          quote           pacman          alias           help\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive empty \\t\";\n    let expected = snapbox::str![\"[..]% exhaustive empty \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive --empty=\\t\";\n    let expected = snapbox::str![\"[..]% exhaustive --empty=\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    // Issue 5239 (https://github.com/clap-rs/clap/issues/5239)\n    let input = \"exhaustive hint --file test\\t\";\n    let expected = snapbox::str![\"[..]% exhaustive hint --file tests/\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive quote --choice 'b\\t\";\n    let expected = snapbox::str![\"[..]% exhaustive quote --choice 'bash' \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    // Type in \"bx\", press left arrow, then trigger completion\n    let input = \"exhaustive quote --choice bx\\x1b[D\\t\";\n    let expected = snapbox::str![\"[..]% exhaustive quote --choice bashx\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    // Trigger completion from empty space\n    let input = \"exhaustive quote --choice  b\\x1b[D\\x1b[D\\t\\t\";\n    let expected = snapbox::str![[r#\"\n% \nanother  shell    bash     fish     zsh      \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    // Trigger completion immediately after \"--\"\n    let input = \"exhaustive -- hint\\x1b[D\\x1b[D\\x1b[D\\x1b[D\\x1b[D\\t\\t\";\n    let expected = snapbox::str![[r#\"\n% \n--generate      --empty-choice  --help          \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    {\n        use std::fs::File;\n        use std::path::Path;\n\n        let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n        let testdir_path = testdir.path().unwrap();\n\n        File::create(Path::new(testdir_path).join(\"a_file\")).unwrap();\n        File::create(Path::new(testdir_path).join(\"b_file\")).unwrap();\n        std::fs::create_dir_all(Path::new(testdir_path).join(\"c_dir\")).unwrap();\n        std::fs::create_dir_all(Path::new(testdir_path).join(\"d_dir\")).unwrap();\n\n        let input = format!(\n            \"exhaustive hint --file {}/\\t\\t\",\n            testdir_path.to_string_lossy()\n        );\n        let actual = runtime.complete(input.as_str(), &term).unwrap();\n        assert!(\n            actual.contains(\"a_file\")\n                && actual.contains(\"b_file\")\n                && actual.contains(\"c_dir\")\n                && actual.contains(\"d_dir\"),\n            \"Actual output:\\n{actual}\"\n        );\n\n        let input = format!(\n            \"exhaustive hint --dir {}/\\t\\t\",\n            testdir_path.to_string_lossy()\n        );\n        let actual = runtime.complete(input.as_str(), &term).unwrap();\n        assert!(\n            !actual.contains(\"a_file\")\n                && !actual.contains(\"b_file\")\n                && actual.contains(\"c_dir\")\n                && actual.contains(\"d_dir\"),\n            \"Actual output:\\n{actual}\"\n        );\n    }\n\n    {\n        use std::fs::File;\n        use std::path::Path;\n\n        let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n        let testdir_path = testdir.path().unwrap();\n\n        File::create(Path::new(testdir_path).join(\"foo bar.txt\")).unwrap();\n        File::create(Path::new(testdir_path).join(\"baz\\tqux.txt\")).unwrap();\n\n        let input = format!(\n            \"exhaustive hint --file {}/b\\t\",\n            testdir_path.to_string_lossy()\n        );\n        let actual = runtime.complete(input.as_str(), &term).unwrap();\n        assert!(!actual.contains(\"foo\"), \"Actual output:\\n{actual}\");\n    }\n\n    let input = \"exhaustive hint --other \\t\";\n    let expected = snapbox::str![\"exhaustive hint --other         % exhaustive hint --other \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn register_dynamic_env() {\n    common::register_example::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_toplevel() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% \nempty           action          value           last            hint            --generate      --help\nglobal          quote           pacman          alias           help            --empty-choice  \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_quoted_help() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive quote \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% \ncmd-single-quotes  cmd-backslash      escape-help        --double-quotes    --brackets         --help\ncmd-double-quotes  cmd-brackets       help               --backticks        --expansions       \ncmd-backticks      cmd-expansions     --single-quotes    --backslash        --choice           \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_option_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive action --choice=\\t\\t\";\n    let expected = snapbox::str![\n        r#\"\n% \nfirst   second  \n\"#\n    ];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive action --choice=f\\t\";\n    let expected = snapbox::str![\"exhaustive action --choice=f    % exhaustive action --choice=f\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_quoted_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive quote --choice \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% \nanother shell  bash           fish           zsh            \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive quote --choice an\\t\";\n    let expected =\n        snapbox::str![\"exhaustive quote --choice an    % exhaustive quote --choice another shell \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_empty_subcommand() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive empty \\t\";\n    let expected = snapbox::str![\"exhaustive empty[..]\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_empty_option_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive --empty=\\t\";\n    let expected = snapbox::str![\"exhaustive --empty=[..]\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_quoted_word() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive quote --choice 'b\\t\";\n    let expected =\n        snapbox::str![\"exhaustive quote --choice 'b    % exhaustive quote --choice 'bash' \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_middle_of_word() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    // Type in \"bx\", press left arrow, then trigger completion\n    let input = \"exhaustive quote --choice bx\\x1b[D\\t\";\n    let expected =\n        snapbox::str![\"exhaustive quote --choice bx^[[D        % exhaustive quote --choice bashx\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    // Trigger completion from empty space\n    let input = \"exhaustive quote --choice  b\\x1b[D\\x1b[D\\t\\t\";\n    let expected = snapbox::str![[r#\"\n% \nanother shell  bash           fish           zsh            \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    // Trigger completion immediately after \"--\"\n    let input = \"exhaustive -- hint\\x1b[D\\x1b[D\\x1b[D\\x1b[D\\x1b[D\\t\\t\";\n    let expected = snapbox::str![[r#\"\n% \n--generate      --empty-choice  --help          \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_dir_no_trailing_space() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive hint --file test\\t\";\n    let expected = snapbox::str![\"exhaustive hint --file test[..]\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n"
  },
  {
    "path": "clap_complete/tests/testsuite/common.rs",
    "content": "use clap::builder::PossibleValue;\nuse snapbox::prelude::*;\n\npub(crate) fn basic_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(\n            clap::Arg::new(\"config\")\n                .short('c')\n                .global(true)\n                .action(clap::ArgAction::SetTrue),\n        )\n        .arg(\n            clap::Arg::new(\"v\")\n                .short('v')\n                .conflicts_with(\"config\")\n                .action(clap::ArgAction::SetTrue),\n        )\n        .subcommand(\n            clap::Command::new(\"test\")\n                .about(\"Subcommand\\nwith a second line\")\n                .arg(\n                    clap::Arg::new(\"debug\")\n                        .short('d')\n                        .action(clap::ArgAction::Count),\n                ),\n        )\n}\n\npub(crate) fn feature_sample_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .version(\"3.0\")\n        .propagate_version(true)\n        .about(\"Tests completions\")\n        .arg(\n            clap::Arg::new(\"file\")\n                .value_hint(clap::ValueHint::FilePath)\n                .help(\"some input file\"),\n        )\n        .arg(\n            clap::Arg::new(\"config\")\n                .action(clap::ArgAction::Count)\n                .help(\"some config file\")\n                .short('c')\n                .visible_short_alias('C')\n                .long(\"config\")\n                .visible_alias(\"conf\"),\n        )\n        .arg(clap::Arg::new(\"choice\").value_parser([\"first\", \"second\"]))\n        .subcommand(\n            clap::Command::new(\"test\").about(\"tests things\").arg(\n                clap::Arg::new(\"case\")\n                    .long(\"case\")\n                    .action(clap::ArgAction::Set)\n                    .help(\"the case to test\"),\n            ),\n        )\n}\n\npub(crate) fn special_commands_command(name: &'static str) -> clap::Command {\n    feature_sample_command(name)\n        .subcommand(\n            clap::Command::new(\"some_cmd\")\n                .about(\"tests other things\")\n                .arg(\n                    clap::Arg::new(\"config\")\n                        .long(\"config\")\n                        .hide(true)\n                        .action(clap::ArgAction::Set)\n                        .require_equals(true)\n                        .help(\"the other case to test\"),\n                )\n                .arg(clap::Arg::new(\"path\").num_args(1..)),\n        )\n        .subcommand(clap::Command::new(\"some-cmd-with-hyphens\").alias(\"hyphen\"))\n        .subcommand(clap::Command::new(\"some-hidden-cmd\").hide(true))\n}\n\npub(crate) fn external_subcommand(name: &'static str) -> clap::Command {\n\tclap::Command::new(name)\n\t\t.subcommand(\n\t\t\tclap::Command::new(\"external\")\n\t\t\t\t.allow_external_subcommands(true)\n\t\t\t\t.about(\"An external subcommand\")\n\t\t)\n}\n\npub(crate) fn quoting_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .version(\"3.0\")\n        .arg(\n            clap::Arg::new(\"single-quotes\")\n                .long(\"single-quotes\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"Can be 'always', 'auto', or 'never'\"),\n        )\n        .arg(\n            clap::Arg::new(\"double-quotes\")\n                .long(\"double-quotes\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n        )\n        .arg(\n            clap::Arg::new(\"backticks\")\n                .long(\"backticks\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"For more information see `echo test`\"),\n        )\n        .arg(\n            clap::Arg::new(\"backslash\")\n                .long(\"backslash\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"Avoid '\\\\n'\"),\n        )\n        .arg(\n            clap::Arg::new(\"brackets\")\n                .long(\"brackets\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"List packages [filter]\"),\n        )\n        .arg(\n            clap::Arg::new(\"expansions\")\n                .long(\"expansions\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"Execute the shell command with $SHELL\"),\n        )\n        .subcommands([\n            clap::Command::new(\"cmd-single-quotes\").about(\"Can be 'always', 'auto', or 'never'\"),\n            clap::Command::new(\"cmd-double-quotes\")\n                .about(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n            clap::Command::new(\"cmd-backticks\").about(\"For more information see `echo test`\"),\n            clap::Command::new(\"cmd-backslash\").about(\"Avoid '\\\\n'\"),\n            clap::Command::new(\"cmd-brackets\").about(\"List packages [filter]\"),\n            clap::Command::new(\"cmd-expansions\").about(\"Execute the shell command with $SHELL\"),\n        ])\n}\n\npub(crate) fn aliases_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .version(\"3.0\")\n        .about(\"testing bash completions\")\n        .arg(\n            clap::Arg::new(\"flag\")\n                .short('f')\n                .visible_short_alias('F')\n                .long(\"flag\")\n                .action(clap::ArgAction::SetTrue)\n                .visible_alias(\"flg\")\n                .help(\"cmd flag\"),\n        )\n        .arg(\n            clap::Arg::new(\"option\")\n                .short('o')\n                .visible_short_alias('O')\n                .long(\"option\")\n                .visible_alias(\"opt\")\n                .help(\"cmd option\")\n                .action(clap::ArgAction::Set),\n        )\n        .arg(clap::Arg::new(\"positional\"))\n}\n\npub(crate) fn sub_subcommands_command(name: &'static str) -> clap::Command {\n    feature_sample_command(name).subcommand(\n        clap::Command::new(\"some_cmd\")\n            .about(\"top level subcommand\")\n            .visible_alias(\"some_cmd_alias\")\n            .subcommand(\n                clap::Command::new(\"sub_cmd\").about(\"sub-subcommand\").arg(\n                    clap::Arg::new(\"config\")\n                        .long(\"config\")\n                        .action(clap::ArgAction::Set)\n                        .value_parser([\n                            PossibleValue::new(\"Lest quotes, aren't escaped.\")\n                                .help(\"help,with,comma\"),\n                            PossibleValue::new(\"Second to trigger display of options\"),\n                        ])\n                        .help(\"the other case to test\"),\n                ),\n            ),\n    )\n}\n\npub(crate) fn value_hint_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(\n            clap::Arg::new(\"choice\")\n                .long(\"choice\")\n                .action(clap::ArgAction::Set)\n                .value_parser([\"bash\", \"fish\", \"zsh\"]),\n        )\n        .arg(\n            clap::Arg::new(\"unknown\")\n                .long(\"unknown\")\n                .value_hint(clap::ValueHint::Unknown),\n        )\n        .arg(\n            clap::Arg::new(\"other\")\n                .long(\"other\")\n                .value_hint(clap::ValueHint::Other),\n        )\n        .arg(\n            clap::Arg::new(\"path\")\n                .long(\"path\")\n                .short('p')\n                .value_hint(clap::ValueHint::AnyPath),\n        )\n        .arg(\n            clap::Arg::new(\"file\")\n                .long(\"file\")\n                .short('f')\n                .value_hint(clap::ValueHint::FilePath),\n        )\n        .arg(\n            clap::Arg::new(\"dir\")\n                .long(\"dir\")\n                .short('d')\n                .value_hint(clap::ValueHint::DirPath),\n        )\n        .arg(\n            clap::Arg::new(\"exe\")\n                .long(\"exe\")\n                .short('e')\n                .value_hint(clap::ValueHint::ExecutablePath),\n        )\n        .arg(\n            clap::Arg::new(\"cmd_name\")\n                .long(\"cmd-name\")\n                .value_hint(clap::ValueHint::CommandName),\n        )\n        .arg(\n            clap::Arg::new(\"cmd\")\n                .long(\"cmd\")\n                .short('c')\n                .value_hint(clap::ValueHint::CommandString),\n        )\n        .arg(\n            clap::Arg::new(\"command_with_args\")\n                .action(clap::ArgAction::Set)\n                .num_args(1..)\n                .trailing_var_arg(true)\n                .value_hint(clap::ValueHint::CommandWithArguments),\n        )\n        .arg(\n            clap::Arg::new(\"user\")\n                .short('u')\n                .long(\"user\")\n                .value_hint(clap::ValueHint::Username),\n        )\n        .arg(\n            clap::Arg::new(\"host\")\n                .short('H')\n                .long(\"host\")\n                .value_hint(clap::ValueHint::Hostname),\n        )\n        .arg(\n            clap::Arg::new(\"url\")\n                .long(\"url\")\n                .value_hint(clap::ValueHint::Url),\n        )\n        .arg(\n            clap::Arg::new(\"email\")\n                .long(\"email\")\n                .value_hint(clap::ValueHint::EmailAddress),\n        )\n}\n\npub(crate) fn value_terminator_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"arguments\")\n            .help(\"multi-valued argument with a value terminator\")\n            .num_args(1..)\n            .value_terminator(\";\"),\n    )\n}\n\npub(crate) fn multi_value_option_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"options\")\n            .long(\"options\")\n            .help(\"multi-valued option\")\n            .num_args(4..),\n    )\n}\n\npub(crate) fn optional_value_option_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"options\")\n            .long(\"options\")\n            .help(\"optional value option\")\n            .num_args(0..=1),\n    )\n}\n\npub(crate) fn optional_multi_value_option_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"options\")\n            .long(\"options\")\n            .help(\"optional multi-value option\")\n            .num_args(0..),\n    )\n}\n\npub(crate) fn two_multi_valued_arguments_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(\n            clap::Arg::new(\"first\")\n                .help(\"first multi-valued argument\")\n                .num_args(1..),\n        )\n        .arg(\n            clap::Arg::new(\"second\")\n                .help(\"second multi-valued argument\")\n                .raw(true),\n        )\n}\n\npub(crate) fn subcommand_last(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(clap::Arg::new(\"free\").last(true))\n        .subcommands([clap::Command::new(\"foo\"), clap::Command::new(\"bar\")])\n}\n\npub(crate) fn assert_matches(\n    expected: impl IntoData,\n    generator: impl clap_complete::Generator,\n    mut cmd: clap::Command,\n    name: &'static str,\n) {\n    let mut buf = vec![];\n    clap_complete::generate(generator, &mut cmd, name, &mut buf);\n\n    snapbox::Assert::new()\n        .action_env(snapbox::assert::DEFAULT_ACTION_ENV)\n        .normalize_paths(false)\n        .eq(buf, expected);\n}\n\n#[cfg(feature = \"unstable-shell-tests\")]\npub(crate) fn register_example<R: completest::RuntimeBuilder>(context: &str, name: &str) {\n    use completest::Runtime as _;\n\n    let scratch = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let scratch_path = scratch.path().unwrap();\n\n    let shell_name = R::name();\n    let home = std::path::Path::new(env!(\"CARGO_MANIFEST_DIR\"))\n        .join(\"tests/snapshots/home\")\n        .join(context)\n        .join(name)\n        .join(shell_name);\n    println!(\"Compiling\");\n    let manifest_path = std::path::Path::new(env!(\"CARGO_MANIFEST_DIR\")).join(\"Cargo.toml\");\n    let bin_path = snapbox::cmd::compile_example(\n        name,\n        [\n            \"--manifest-path\",\n            manifest_path.to_str().unwrap(),\n            // Unconditionally include to avoid completion file tests failing based on the how\n            // `cargo test` is invoked\n            \"--features=unstable-dynamic\",\n        ],\n    )\n    .unwrap();\n    println!(\"Compiled\");\n    let bin_root = bin_path.parent().unwrap().to_owned();\n\n    let mut registration = std::process::Command::new(&bin_path);\n    match context {\n        \"static\" => registration.args([format!(\"--generate={shell_name}\")]),\n        \"dynamic-command\" => registration.args([\"complete\", shell_name]),\n        \"dynamic-env\" => registration.env(\"COMPLETE\", shell_name),\n        _ => unreachable!(\"unsupported context {}\", context),\n    };\n    let registration = registration.output().unwrap();\n    assert!(\n        registration.status.success(),\n        \"{}\",\n        String::from_utf8_lossy(&registration.stderr)\n    );\n    let registration = std::str::from_utf8(&registration.stdout).unwrap();\n    assert!(!registration.is_empty());\n\n    let mut runtime = R::new(bin_root, scratch_path.to_owned()).unwrap();\n\n    runtime.register(name, registration).unwrap();\n\n    snapbox::assert_subset_eq(home, scratch_path);\n\n    scratch.close().unwrap();\n}\n\n#[cfg(feature = \"unstable-shell-tests\")]\npub(crate) fn load_runtime<R: completest::RuntimeBuilder>(\n    context: &str,\n    name: &str,\n) -> Box<dyn completest::Runtime>\nwhere\n    <R as completest::RuntimeBuilder>::Runtime: 'static,\n{\n    let shell_name = R::name();\n    let home = std::path::Path::new(env!(\"CARGO_MANIFEST_DIR\"))\n        .join(\"tests/snapshots/home\")\n        .join(context)\n        .join(name)\n        .join(shell_name);\n    let scratch = snapbox::dir::DirRoot::mutable_temp()\n        .unwrap()\n        .with_template(&home)\n        .unwrap();\n    let home = scratch.path().unwrap().to_owned();\n    println!(\"Compiling\");\n    let manifest_path = std::path::Path::new(env!(\"CARGO_MANIFEST_DIR\")).join(\"Cargo.toml\");\n    let bin_path = snapbox::cmd::compile_example(\n        name,\n        [\n            \"--manifest-path\",\n            manifest_path.to_str().unwrap(),\n            // Unconditionally include to avoid completion file tests failing based on the how\n            // `cargo test` is invoked\n            \"--features=unstable-dynamic\",\n        ],\n    )\n    .unwrap();\n    println!(\"Compiled\");\n    let bin_root = bin_path.parent().unwrap().to_owned();\n\n    let runtime = R::with_home(bin_root, home).unwrap();\n\n    Box::new(ScratchRuntime {\n        _scratch: scratch,\n        runtime: Box::new(runtime),\n    })\n}\n\n#[cfg(feature = \"unstable-shell-tests\")]\n#[derive(Debug)]\nstruct ScratchRuntime {\n    _scratch: snapbox::dir::DirRoot,\n    runtime: Box<dyn completest::Runtime>,\n}\n\n#[cfg(feature = \"unstable-shell-tests\")]\nimpl completest::Runtime for ScratchRuntime {\n    fn home(&self) -> &std::path::Path {\n        self.runtime.home()\n    }\n\n    fn register(&mut self, name: &str, content: &str) -> std::io::Result<()> {\n        self.runtime.register(name, content)\n    }\n\n    fn complete(&mut self, input: &str, term: &completest::Term) -> std::io::Result<String> {\n        let output = self.runtime.complete(input, term)?;\n        // HACK: elvish prints and clears this message when a completer takes too long which is\n        // dependent on a lot of factors, making this show up or no sometimes (especially if we\n        // aren't clearing the screen properly for fish)\n        let output = output.replace(\"\\nCOMPLETING argument\\n\", \"\\n\");\n        Ok(output)\n    }\n}\n\n#[cfg(feature = \"unstable-shell-tests\")]\npub(crate) fn has_command(command: &str) -> bool {\n    let output = match std::process::Command::new(command)\n        .arg(\"--version\")\n        .output()\n    {\n        Ok(output) => output,\n        Err(e) => {\n            // CI is expected to support all of the commands\n            if is_ci() && cfg!(target_os = \"linux\") {\n                panic!(\"expected command `{command}` to be somewhere in PATH: {e}\");\n            }\n            return false;\n        }\n    };\n    if !output.status.success() {\n        panic!(\n            \"expected command `{}` to be runnable, got error {}:\\n\\\n            stderr:{}\\n\\\n            stdout:{}\\n\",\n            command,\n            output.status,\n            String::from_utf8_lossy(&output.stderr),\n            String::from_utf8_lossy(&output.stdout)\n        );\n    }\n    let stdout = String::from_utf8_lossy(&output.stdout);\n    println!(\n        \"$ {command} --version\n{stdout}\"\n    );\n    if cfg!(target_os = \"macos\") && stdout.starts_with(\"GNU bash, version 3\") {\n        return false;\n    }\n    if cfg!(target_os = \"macos\") && command == \"zsh\" {\n        // HACK: At least on CI, the prompt override is not working\n        return false;\n    }\n\n    true\n}\n\n/// Whether or not this running in a Continuous Integration environment.\n#[cfg(feature = \"unstable-shell-tests\")]\nfn is_ci() -> bool {\n    // Consider using `tracked_env` instead of option_env! when it is stabilized.\n    // `tracked_env` will handle changes, but not require rebuilding the macro\n    // itself like option_env does.\n    option_env!(\"CI\").is_some() || option_env!(\"TF_BUILD\").is_some()\n}\n"
  },
  {
    "path": "clap_complete/tests/testsuite/elvish.rs",
    "content": "use crate::common;\n#[allow(unused_imports)]\nuse snapbox::assert_data_eq;\n\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nconst CMD: &str = \"elvish\";\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\ntype RuntimeBuilder = completest_pty::ElvishRuntimeBuilder;\n\n#[test]\nfn basic() {\n    let name = \"my-app\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/basic.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn feature_sample() {\n    let name = \"my-app\";\n    let cmd = common::feature_sample_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/feature_sample.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn special_commands() {\n    let name = \"my-app\";\n    let cmd = common::special_commands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/special_commands.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn quoting() {\n    let name = \"my-app\";\n    let cmd = common::quoting_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/quoting.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn aliases() {\n    let name = \"my-app\";\n    let cmd = common::aliases_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/aliases.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn sub_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::sub_subcommands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/sub_subcommands.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn external_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::external_subcommand(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/external_subcommands.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn custom_bin_name() {\n    let name = \"my-app\";\n    let bin_name = \"bin-name\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/custom_bin_name.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        bin_name,\n    );\n}\n\n#[test]\nfn value_hint() {\n    let name = \"my-app\";\n    let cmd = common::value_hint_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_hint.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn value_terminator() {\n    let name = \"my-app\";\n    let cmd = common::value_terminator_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_terminator.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/multi_value_option.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_value_option.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_multi_value_option.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn two_multi_valued_arguments() {\n    let name = \"my-app\";\n    let cmd = common::two_multi_valued_arguments_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/two_multi_valued_arguments.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn subcommand_last() {\n    let name = \"my-app\";\n    let cmd = common::subcommand_last(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/subcommand_last.elvish\"],\n        clap_complete::shells::Elvish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn register_completion() {\n    common::register_example::<RuntimeBuilder>(\"static\", \"exhaustive\");\n}\n\n#[test]\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"static\", \"exhaustive\");\n\n    let input = \"exhaustive \\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive --empty-choice\n COMPLETING argument  \n--empty-choice empty-choice                                             \n--generate     generate                                                 \n--help         Print help                                               \n-h             Print help                                               \naction         action                                                   \nalias          alias                                                    \nempty          empty                                                    \nglobal         global                                                   \nhelp           Print this message or the help of the given subcommand(s)\nhint           hint                                                     \nlast           last                                                     \npacman         pacman                                                   \nquote          quote                                                    \nvalue          value                                                    \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive empty \\t\";\n    let expected = snapbox::str![[r#\"\nerror: no candidates\n% exhaustive empty \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive --empty=\\t\";\n    let expected = snapbox::str![[r#\"\nerror: no candidates\n% exhaustive --empty=\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn register_dynamic_env() {\n    common::register_example::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_toplevel() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive \\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive --empty-choice\n COMPLETING argument  \n--empty-choice  --help  alias  global  hint  pacman  value\n--generate      action  empty  help    last  quote \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_quoted_help() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive quote \\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive quote --backslash\n COMPLETING argument  \n--backslash  --choice         --help           cmd-backticks      cmd-expansions     help\n--backticks  --double-quotes  --single-quotes  cmd-brackets       cmd-single-quotes\n--brackets   --expansions     cmd-backslash    cmd-double-quotes  escape-help      \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_option_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive action --choice=\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive action '--choice=first'\n COMPLETING argument  \n--choice=first  --choice=second\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive action --choice=f\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive action '--choice=first'\n COMPLETING argument  \n--choice=first\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_quoted_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive quote --choice \\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive quote --choice 'another shell'\n COMPLETING argument  \nanother shell  bash  fish  zsh\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive quote --choice an\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive quote --choice 'another shell'\n COMPLETING argument  \nanother shell\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_empty_subcommand() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive empty \\t\\t\";\n    let expected = snapbox::str![[r#\"\nerror: no candidates\nerror: no candidates\n% exhaustive empty \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_empty_option_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive --empty=\\t\";\n    let expected = snapbox::str![[r#\"\nerror: no candidates\n% exhaustive --empty=\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n"
  },
  {
    "path": "clap_complete/tests/testsuite/engine.rs",
    "content": "#![cfg(feature = \"unstable-dynamic\")]\n\nuse std::fs;\nuse std::path::Path;\n\nuse clap::{builder::PossibleValue, Command};\nuse clap_complete::engine::{\n    ArgValueCandidates, ArgValueCompleter, CompletionCandidate, PathCompleter, SubcommandCandidates,\n};\nuse snapbox::assert_data_eq;\n\nmacro_rules! complete {\n    ($cmd:expr, $input:expr$(, current_dir = $current_dir:expr)? $(,)?) => {\n        {\n            #[allow(unused)]\n            let current_dir: Option<&Path> = None;\n            $(let current_dir = $current_dir;)?\n            complete(&mut $cmd, $input, current_dir)\n        }\n    }\n}\n\n#[test]\nfn suggest_subcommand_subset() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .subcommand(Command::new(\"hello-world\"))\n        .subcommand(Command::new(\"hello-moon\"))\n        .subcommand(Command::new(\"goodbye-world\"));\n\n    assert_data_eq!(\n        complete!(cmd, \"he\"),\n        snapbox::str![[r#\"\nhello-world\nhello-moon\nhelp\tPrint this message or the help of the given subcommand(s)\n\"#]],\n    );\n}\n\n#[test]\nfn suggest_hidden_long_flags() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .arg(clap::Arg::new(\"hello-world-visible\").long(\"hello-world-visible\"))\n        .arg(\n            clap::Arg::new(\"hello-world-hidden\")\n                .long(\"hello-world-hidden\")\n                .hide(true),\n        );\n\n    assert_data_eq!(\n        complete!(cmd, \"--hello-world\"),\n        snapbox::str![\"--hello-world-visible\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--hello-world-h\"),\n        snapbox::str![\"--hello-world-hidden\"]\n    );\n}\n\n#[test]\nfn suggest_hidden_subcommand_and_aliases() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .subcommand(\n            Command::new(\"test_visible\")\n                .visible_alias(\"test_visible-alias_visible\")\n                .alias(\"test_visible-alias_hidden\"),\n        )\n        .subcommand(\n            Command::new(\"test_hidden\")\n                .visible_alias(\"test_hidden-alias_visible\")\n                .alias(\"test_hidden-alias_hidden\")\n                .hide(true),\n        );\n\n    assert_data_eq!(complete!(cmd, \"test\"), snapbox::str![\"test_visible\"]);\n\n    assert_data_eq!(complete!(cmd, \"test_h\"), snapbox::str![\"test_hidden\"]);\n\n    assert_data_eq!(\n        complete!(cmd, \"test_hidden-alias_h\"),\n        snapbox::str![\"test_hidden-alias_hidden\"]\n    );\n}\n\n#[test]\nfn suggest_subcommand_aliases() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .subcommand(\n            Command::new(\"hello-world\")\n                .visible_alias(\"hello-world-foo\")\n                .alias(\"hidden-world\"),\n        )\n        .subcommand(\n            Command::new(\"hello-moon\")\n                .visible_alias(\"hello-moon-foo\")\n                .alias(\"hidden-moon\"),\n        )\n        .subcommand(\n            Command::new(\"goodbye-world\")\n                .visible_alias(\"goodbye-world-foo\")\n                .alias(\"hidden-goodbye\"),\n        );\n\n    assert_data_eq!(\n        complete!(cmd, \"hello\"),\n        snapbox::str![[r#\"\nhello-world\nhello-moon\n\"#]],\n    );\n}\n\n#[test]\nfn suggest_hidden_possible_value() {\n    let mut cmd = Command::new(\"exhaustive\").arg(\n        clap::Arg::new(\"possible_value\").long(\"test\").value_parser([\n            PossibleValue::new(\"test-visible\").help(\"Say hello to the world\"),\n            PossibleValue::new(\"test-hidden\")\n                .help(\"Say hello to the moon\")\n                .hide(true),\n        ]),\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--test=test\"),\n        snapbox::str![\"--test=test-visible\tSay hello to the world\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--test=test-h\"),\n        snapbox::str![\"--test=test-hidden\tSay hello to the moon\"]\n    );\n}\n\n#[test]\nfn suggest_hidden_long_flag_aliases() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .arg(\n            clap::Arg::new(\"test_visible\")\n                .long(\"test_visible\")\n                .visible_alias(\"test_visible-alias_visible\")\n                .alias(\"test_visible-alias_hidden\"),\n        )\n        .arg(\n            clap::Arg::new(\"test_hidden\")\n                .long(\"test_hidden\")\n                .visible_alias(\"test_hidden-alias_visible\")\n                .alias(\"test_hidden-alias_hidden\")\n                .hide(true),\n        );\n\n    assert_data_eq!(complete!(cmd, \"--test\"), snapbox::str![\"--test_visible\"]);\n\n    assert_data_eq!(complete!(cmd, \"--test_h\"), snapbox::str![\"--test_hidden\"]);\n\n    assert_data_eq!(\n        complete!(cmd, \"--test_visible-alias_h\"),\n        snapbox::str![\"--test_visible-alias_hidden\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--test_hidden-alias_h\"),\n        snapbox::str![\"--test_hidden-alias_hidden\"]\n    );\n}\n\n#[test]\nfn suggest_long_flag_subset() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .arg(\n            clap::Arg::new(\"hello-world\")\n                .long(\"hello-world\")\n                .action(clap::ArgAction::Count),\n        )\n        .arg(\n            clap::Arg::new(\"hello-moon\")\n                .long(\"hello-moon\")\n                .action(clap::ArgAction::Count),\n        )\n        .arg(\n            clap::Arg::new(\"goodbye-world\")\n                .long(\"goodbye-world\")\n                .action(clap::ArgAction::Count),\n        );\n\n    assert_data_eq!(\n        complete!(cmd, \"--he\"),\n        snapbox::str![[r#\"\n--hello-world\n--hello-moon\n--help\tPrint help\n\"#]],\n    );\n}\n\n#[test]\nfn suggest_possible_value_subset() {\n    let name = \"exhaustive\";\n    let mut cmd = Command::new(name).arg(clap::Arg::new(\"hello-world\").value_parser([\n        PossibleValue::new(\"hello-world\").help(\"Say hello to the world\"),\n        \"hello-moon\".into(),\n        \"goodbye-world\".into(),\n    ]));\n\n    assert_data_eq!(\n        complete!(cmd, \"hello\"),\n        snapbox::str![[r#\"\nhello-world\tSay hello to the world\nhello-moon\n\"#]],\n    );\n}\n\n#[test]\nfn suggest_additional_short_flags() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .arg(\n            clap::Arg::new(\"a\")\n                .short('a')\n                .action(clap::ArgAction::Count),\n        )\n        .arg(\n            clap::Arg::new(\"b\")\n                .short('b')\n                .action(clap::ArgAction::Count),\n        )\n        .arg(\n            clap::Arg::new(\"c\")\n                .short('c')\n                .action(clap::ArgAction::Count),\n        );\n\n    assert_data_eq!(\n        complete!(cmd, \"-a\"),\n        snapbox::str![[r#\"\n-aa\n-ab\n-ac\n-ah\tPrint help\n\"#]],\n    );\n}\n\n#[test]\nfn suggest_subcommand_positional() {\n    let mut cmd = Command::new(\"exhaustive\").subcommand(Command::new(\"hello-world\").arg(\n        clap::Arg::new(\"hello-world\").value_parser([\n            PossibleValue::new(\"hello-world\").help(\"Say hello to the world\"),\n            \"hello-moon\".into(),\n            \"goodbye-world\".into(),\n        ]),\n    ));\n\n    assert_data_eq!(\n        complete!(cmd, \"hello-world [TAB]\"),\n        snapbox::str![[r#\"\nhello-world\tSay hello to the world\nhello-moon\ngoodbye-world\n--help\tPrint help (see more with '--help')\n\"#]],\n    );\n}\n\n#[test]\nfn suggest_subcommand_positional_after_escape() {\n    let mut cmd = Command::new(\"exhaustive\").subcommand(Command::new(\"hello-world\").arg(\n        clap::Arg::new(\"hello-world\").value_parser([\n            PossibleValue::new(\"hello-world\").help(\"Say hello to the world\"),\n            \"hello-moon\".into(),\n            \"goodbye-world\".into(),\n        ]),\n    ));\n\n    assert_data_eq!(\n        complete!(cmd, \"hello-world -- [TAB]\"),\n        snapbox::str![[r#\"\nhello-world\tSay hello to the world\nhello-moon\ngoodbye-world\n\"#]],\n    );\n}\n\n#[test]\nfn suggest_argument_value() {\n    let mut cmd = Command::new(\"dynamic\")\n        .arg(\n            clap::Arg::new(\"format\")\n                .long(\"format\")\n                .short('F')\n                .value_parser([\"json\", \"yaml\", \"toml\"]),\n        )\n        .arg(\n            clap::Arg::new(\"stream\")\n                .long(\"stream\")\n                .short('S')\n                .value_parser([\"stdout\", \"stderr\"]),\n        )\n        .arg(\n            clap::Arg::new(\"count\")\n                .long(\"count\")\n                .short('c')\n                .action(clap::ArgAction::Count),\n        )\n        .arg(clap::Arg::new(\"positional\").value_parser([\"pos_a\", \"pos_b\", \"pos_c\"]))\n        .args_conflicts_with_subcommands(true);\n\n    assert_data_eq!(\n        complete!(cmd, \"--format [TAB]\"),\n        snapbox::str![[r#\"\njson\nyaml\ntoml\n\"#]],\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-F [TAB]\"),\n        snapbox::str![[r#\"\njson\nyaml\ntoml\n\"#]],\n    );\n\n    assert_data_eq!(complete!(cmd, \"--format j[TAB]\"), snapbox::str![\"json\"],);\n\n    assert_data_eq!(complete!(cmd, \"-F j[TAB]\"), snapbox::str![\"json\"],);\n\n    assert_data_eq!(complete!(cmd, \"--format t[TAB]\"), snapbox::str![\"toml\"],);\n\n    assert_data_eq!(complete!(cmd, \"-F t[TAB]\"), snapbox::str![\"toml\"],);\n\n    assert_data_eq!(\n        complete!(cmd, \"-cccF [TAB]\"),\n        snapbox::str![[r#\"\njson\nyaml\ntoml\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format toml [TAB]\"),\n        snapbox::str![[r#\"\npos_a\npos_b\npos_c\n--format\n--stream\n--count\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-cS[TAB]\"),\n        snapbox::str![[r#\"\n-cSstdout\n-cSstderr\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-cS=[TAB]\"),\n        snapbox::str![[r#\"\n-cS=stdout\n-cS=stderr\n\"#]]\n    );\n\n    assert_data_eq!(complete!(cmd, \"-cS=stdo[TAB]\"), snapbox::str![\"-cS=stdout\"]);\n\n    assert_data_eq!(complete!(cmd, \"-cSF[TAB]\"), snapbox::str![]);\n\n    assert_data_eq!(complete!(cmd, \"-cSF=[TAB]\"), snapbox::str![]);\n}\n\n#[test]\nfn suggest_argument_multi_values() {\n    let mut cmd = Command::new(\"dynamic\")\n        .arg(\n            clap::Arg::new(\"certain-num\")\n                .long(\"certain-num\")\n                .short('Y')\n                .value_parser([\"val1\", \"val2\", \"val3\"])\n                .num_args(3),\n        )\n        .arg(\n            clap::Arg::new(\"uncertain-num\")\n                .long(\"uncertain-num\")\n                .short('N')\n                .value_parser([\"val1\", \"val2\", \"val3\"])\n                .num_args(1..=3),\n        );\n\n    assert_data_eq!(\n        complete!(cmd, \"--certain-num [TAB]\"),\n        snapbox::str![[r#\"\nval1\nval2\nval3\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--certain-num val1 [TAB]\"),\n        snapbox::str![[r#\"\nval1\nval2\nval3\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--certain-num val1 val2 val3 [TAB]\"),\n        snapbox::str![[r#\"\n--certain-num\n--uncertain-num\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--uncertain-num [TAB]\"),\n        snapbox::str![[r#\"\nval1\nval2\nval3\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--uncertain-num val1 [TAB]\"),\n        snapbox::str![[r#\"\nval1\nval2\nval3\n--certain-num\n--uncertain-num\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--uncertain-num val1 val2 val3 [TAB]\"),\n        snapbox::str![[r#\"\n--certain-num\n--uncertain-num\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-Y [TAB]\"),\n        snapbox::str![[r#\"\nval1\nval2\nval3\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-Y val1 [TAB]\"),\n        snapbox::str![[r#\"\nval1\nval2\nval3\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-Y val1 val2 val3 [TAB]\"),\n        snapbox::str![[r#\"\n--certain-num\n--uncertain-num\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-N [TAB]\"),\n        snapbox::str![[r#\"\nval1\nval2\nval3\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-N val1 [TAB]\"),\n        snapbox::str![[r#\"\nval1\nval2\nval3\n--certain-num\n--uncertain-num\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-N val1 val2 val3 [TAB]\"),\n        snapbox::str![[r#\"\n--certain-num\n--uncertain-num\n--help\tPrint help\n\"#]]\n    );\n}\n\n#[test]\nfn suggest_value_hint_file_path() {\n    let mut cmd = Command::new(\"dynamic\")\n        .arg(\n            clap::Arg::new(\"input\")\n                .long(\"input\")\n                .short('i')\n                .value_hint(clap::ValueHint::FilePath),\n        )\n        .args_conflicts_with_subcommands(true);\n\n    let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let testdir_path = testdir.path().unwrap();\n\n    fs::write(testdir_path.join(\"a_file\"), \"\").unwrap();\n    fs::write(testdir_path.join(\".a_file\"), \"\").unwrap();\n    fs::write(testdir_path.join(\"b_file\"), \"\").unwrap();\n    fs::write(testdir_path.join(\".b_file\"), \"\").unwrap();\n    fs::create_dir_all(testdir_path.join(\"c_dir\")).unwrap();\n    fs::create_dir_all(testdir_path.join(\".c_dir\")).unwrap();\n    fs::create_dir_all(testdir_path.join(\"d_dir\")).unwrap();\n    fs::create_dir_all(testdir_path.join(\".d_dir\")).unwrap();\n\n    assert_data_eq!(\n        complete!(cmd, \"--input [TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\na_file\nb_file\nc_dir/\nd_dir/\n\"#]],\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--input a[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![\"a_file\"],\n    );\n    assert_data_eq!(\n        complete!(cmd, \"--input .[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\n./a_file\n./b_file\n./c_dir/\n./d_dir/\n\"#]],\n    );\n    assert_data_eq!(\n        complete!(cmd, \"--input .a[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![\".a_file\"],\n    );\n}\n\n#[test]\nfn suggest_value_path_file() {\n    let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let testdir_path = testdir.path().unwrap();\n\n    fs::write(testdir_path.join(\"a_file\"), \"\").unwrap();\n    fs::write(testdir_path.join(\".a_file\"), \"\").unwrap();\n    fs::write(testdir_path.join(\"b_file\"), \"\").unwrap();\n    fs::write(testdir_path.join(\".b_file\"), \"\").unwrap();\n    fs::create_dir_all(testdir_path.join(\"c_dir\")).unwrap();\n    fs::create_dir_all(testdir_path.join(\".c_dir\")).unwrap();\n    fs::create_dir_all(testdir_path.join(\"d_dir\")).unwrap();\n    fs::create_dir_all(testdir_path.join(\".d_dir\")).unwrap();\n\n    let mut cmd = Command::new(\"dynamic\")\n        .arg(\n            clap::Arg::new(\"input\")\n                .long(\"input\")\n                .short('i')\n                .add(ArgValueCompleter::new(\n                    PathCompleter::file()\n                        .stdio()\n                        .current_dir(testdir_path.to_owned()),\n                )),\n        )\n        .args_conflicts_with_subcommands(true);\n\n    assert_data_eq!(\n        complete!(cmd, \"--input [TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\na_file\nb_file\nc_dir/\nd_dir/\n-\tstdio\n\"#]],\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--input a[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![\"a_file\"],\n    );\n    assert_data_eq!(\n        complete!(cmd, \"--input .[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\n./a_file\n./b_file\n./c_dir/\n./d_dir/\n\"#]],\n    );\n    assert_data_eq!(\n        complete!(cmd, \"--input .a[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![\".a_file\"],\n    );\n}\n\n#[test]\nfn suggest_value_path_dir() {\n    let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let testdir_path = testdir.path().unwrap();\n\n    fs::write(testdir_path.join(\"a_file\"), \"\").unwrap();\n    fs::write(testdir_path.join(\".a_file\"), \"\").unwrap();\n    fs::write(testdir_path.join(\"b_file\"), \"\").unwrap();\n    fs::write(testdir_path.join(\".b_file\"), \"\").unwrap();\n    fs::create_dir_all(testdir_path.join(\"c_dir\")).unwrap();\n    fs::create_dir_all(testdir_path.join(\".c_dir\")).unwrap();\n    fs::create_dir_all(testdir_path.join(\"d_dir\")).unwrap();\n    fs::create_dir_all(testdir_path.join(\".d_dir\")).unwrap();\n\n    let mut cmd = Command::new(\"dynamic\")\n        .arg(\n            clap::Arg::new(\"input\")\n                .long(\"input\")\n                .short('i')\n                .add(ArgValueCompleter::new(\n                    PathCompleter::dir().current_dir(testdir_path.to_owned()),\n                )),\n        )\n        .args_conflicts_with_subcommands(true);\n\n    assert_data_eq!(\n        complete!(cmd, \"--input [TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\n.\nc_dir/\nd_dir/\n\"#]],\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--input c[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![\"c_dir/\"],\n    );\n    assert_data_eq!(\n        complete!(cmd, \"--input .[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\n./c_dir/\n./d_dir/\n\"#]],\n    );\n    assert_data_eq!(\n        complete!(cmd, \"--input .c[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![\".c_dir/\"],\n    );\n}\n\n#[cfg(unix)]\n#[test]\nfn suggest_value_hint_file_path_symlink_to_dir() {\n    use std::os::unix::fs::symlink;\n\n    let mut cmd = Command::new(\"dynamic\").arg(\n        clap::Arg::new(\"input\")\n            .long(\"input\")\n            .short('i')\n            .value_hint(clap::ValueHint::FilePath),\n    );\n\n    let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let testdir_path = testdir.path().unwrap();\n\n    fs::create_dir_all(testdir_path.join(\"real_dir\")).unwrap();\n    fs::write(testdir_path.join(\"real_dir/file.txt\"), \"\").unwrap();\n    symlink(\"real_dir\", testdir_path.join(\"link_dir\")).unwrap();\n\n    // Symlink to directory should appear with trailing slash\n    assert_data_eq!(\n        complete!(cmd, \"--input [TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\nlink_dir/\nreal_dir/\n\"#]],\n    );\n\n    // Should be able to complete through the symlink\n    assert_data_eq!(\n        complete!(cmd, \"--input link_dir/[TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![\"link_dir/file.txt\"],\n    );\n}\n\n#[cfg(unix)]\n#[test]\nfn suggest_value_hint_file_path_symlink_to_file() {\n    use std::os::unix::fs::symlink;\n\n    let mut cmd = Command::new(\"dynamic\").arg(\n        clap::Arg::new(\"input\")\n            .long(\"input\")\n            .short('i')\n            .value_hint(clap::ValueHint::FilePath),\n    );\n\n    let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let testdir_path = testdir.path().unwrap();\n\n    fs::write(testdir_path.join(\"real_file.txt\"), \"\").unwrap();\n    symlink(\"real_file.txt\", testdir_path.join(\"link_file.txt\")).unwrap();\n\n    // Symlink to file should appear without trailing slash\n    assert_data_eq!(\n        complete!(cmd, \"--input [TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\nlink_file.txt\nreal_file.txt\n\"#]],\n    );\n}\n\n#[cfg(unix)]\n#[test]\nfn suggest_value_hint_dir_path_symlink() {\n    use std::os::unix::fs::symlink;\n\n    let mut cmd = Command::new(\"dynamic\").arg(\n        clap::Arg::new(\"input\")\n            .long(\"input\")\n            .short('i')\n            .value_hint(clap::ValueHint::DirPath),\n    );\n\n    let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let testdir_path = testdir.path().unwrap();\n\n    fs::create_dir_all(testdir_path.join(\"real_dir\")).unwrap();\n    fs::write(testdir_path.join(\"real_file.txt\"), \"\").unwrap();\n    symlink(\"real_dir\", testdir_path.join(\"link_dir\")).unwrap();\n    symlink(\"real_file.txt\", testdir_path.join(\"link_file.txt\")).unwrap();\n\n    // Symlink to directory should have trailing slash\n    assert_data_eq!(\n        complete!(cmd, \"--input [TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\n.\nlink_dir/\nreal_dir/\n\"#]],\n    );\n}\n\n#[cfg(unix)]\n#[test]\nfn suggest_value_hint_file_path_broken_symlink() {\n    use std::os::unix::fs::symlink;\n\n    let mut cmd = Command::new(\"dynamic\").arg(\n        clap::Arg::new(\"input\")\n            .long(\"input\")\n            .short('i')\n            .value_hint(clap::ValueHint::FilePath),\n    );\n\n    let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let testdir_path = testdir.path().unwrap();\n\n    fs::write(testdir_path.join(\"real_file.txt\"), \"\").unwrap();\n    symlink(\"nonexistent\", testdir_path.join(\"broken_link\")).unwrap();\n\n    // Broken symlink should not appear for FilePath (target doesn't exist)\n    // but should not cause a crash\n    assert_data_eq!(\n        complete!(cmd, \"--input [TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![\"real_file.txt\"],\n    );\n}\n\n#[cfg(unix)]\n#[test]\nfn suggest_value_hint_any_path_broken_symlink() {\n    use std::os::unix::fs::symlink;\n\n    let mut cmd = Command::new(\"dynamic\").arg(\n        clap::Arg::new(\"input\")\n            .long(\"input\")\n            .short('i')\n            .value_hint(clap::ValueHint::AnyPath),\n    );\n\n    let testdir = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let testdir_path = testdir.path().unwrap();\n\n    fs::write(testdir_path.join(\"real_file.txt\"), \"\").unwrap();\n    symlink(\"nonexistent\", testdir_path.join(\"broken_link\")).unwrap();\n\n    // Broken symlink should appear for AnyPath since filter is |_| true\n    assert_data_eq!(\n        complete!(cmd, \"--input [TAB]\", current_dir = Some(testdir_path)),\n        snapbox::str![[r#\"\n.\nbroken_link\nreal_file.txt\n\"#]],\n    );\n}\n\n#[test]\nfn suggest_custom_arg_value() {\n    fn custom_completer() -> Vec<CompletionCandidate> {\n        vec![\n            CompletionCandidate::new(\"foo\"),\n            CompletionCandidate::new(\"bar\"),\n            CompletionCandidate::new(\"baz\"),\n        ]\n    }\n\n    let mut cmd = Command::new(\"dynamic\").arg(\n        clap::Arg::new(\"custom\")\n            .long(\"custom\")\n            .add(ArgValueCandidates::new(custom_completer)),\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--custom [TAB]\"),\n        snapbox::str![[r#\"\nfoo\nbar\nbaz\n\"#]],\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--custom b[TAB]\"),\n        snapbox::str![[r#\"\nbar\nbaz\n\"#]],\n    );\n}\n\n#[test]\nfn suggest_custom_arg_completer() {\n    fn custom_completer(current: &std::ffi::OsStr) -> Vec<CompletionCandidate> {\n        let mut completions = vec![];\n        let Some(current) = current.to_str() else {\n            return completions;\n        };\n\n        if \"foo\".starts_with(current) {\n            completions.push(CompletionCandidate::new(\"foo\"));\n        }\n        if \"bar\".starts_with(current) {\n            completions.push(CompletionCandidate::new(\"bar\"));\n        }\n        if \"baz\".starts_with(current) {\n            completions.push(CompletionCandidate::new(\"baz\"));\n        }\n        completions\n    }\n\n    let mut cmd = Command::new(\"dynamic\").arg(\n        clap::Arg::new(\"custom\")\n            .long(\"custom\")\n            .add(ArgValueCompleter::new(custom_completer)),\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--custom [TAB]\"),\n        snapbox::str![[r#\"\nfoo\nbar\nbaz\n\"#]]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"--custom b[TAB]\"),\n        snapbox::str![[r#\"\nbar\nbaz\n\"#]]\n    );\n}\n\n#[test]\nfn suggest_multi_positional() {\n    let mut cmd = Command::new(\"dynamic\")\n        .arg(clap::Arg::new(\"positional-1\").value_parser([\"pos_1_a\", \"pos_1_b\", \"pos_1_c\"]))\n        .arg(\n            clap::Arg::new(\"positional-2\")\n                .value_parser([\"pos_2_a\", \"pos_2_b\", \"pos_2_c\"])\n                .num_args(3),\n        )\n        .arg(\n            clap::Arg::new(\"--format\")\n                .long(\"format\")\n                .short('F')\n                .value_parser([\"json\", \"yaml\", \"toml\"]),\n        );\n\n    assert_data_eq!(\n        complete!(cmd, \"pos_1_a pos_2_a [TAB]\"),\n        snapbox::str![[r#\"\npos_2_a\npos_2_b\npos_2_c\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"pos_1_a pos_2_a pos_2_b [TAB]\"),\n        snapbox::str![[r#\"\npos_2_a\npos_2_b\npos_2_c\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format json pos_1_a [TAB]\"),\n        snapbox::str![[r#\"\npos_2_a\npos_2_b\npos_2_c\n--format\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format json pos_1_a pos_2_a [TAB]\"),\n        snapbox::str![[r#\"\npos_2_a\npos_2_b\npos_2_c\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format json pos_1_a pos_2_a pos_2_b pos_2_c [TAB]\"),\n        snapbox::str![[r#\"\n--format\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format json -- pos_1_a pos_2_a [TAB]\"),\n        snapbox::str![[r#\"\npos_2_a\npos_2_b\npos_2_c\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format json -- pos_1_a pos_2_a pos_2_b [TAB]\"),\n        snapbox::str![[r#\"\npos_2_a\npos_2_b\npos_2_c\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(\n            cmd,\n            \"--format json -- pos_1_a pos_2_a pos_2_b pos_2_c [TAB]\"\n        ),\n        snapbox::str![]\n    );\n}\n\n#[test]\nfn suggest_multi_positional_unbounded() {\n    let mut cmd = Command::new(\"dynamic\")\n        .arg(\n            clap::Arg::new(\"positional-1\")\n                .value_parser([\"pos_1_a\", \"pos_1_b\", \"pos_1_c\"])\n                .num_args(2..),\n        )\n        .arg(\n            clap::Arg::new(\"--format\")\n                .long(\"format\")\n                .short('F')\n                .value_parser([\"json\", \"yaml\", \"toml\"]),\n        );\n\n    assert_data_eq!(\n        complete!(cmd, \"pos_1_a [TAB]\"),\n        snapbox::str![[r#\"\npos_1_a\npos_1_b\npos_1_c\n\"#]]\n    );\n    assert_data_eq!(complete!(cmd, \"pos_1_a --[TAB]\"), snapbox::str![\"\"]);\n    assert_data_eq!(\n        complete!(cmd, \"pos_1_a --format [TAB]\"),\n        snapbox::str![[r#\"\njson\nyaml\ntoml\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"pos_1_a --format json [TAB]\"),\n        snapbox::str![[r#\"\npos_1_a\npos_1_b\npos_1_c\n--format\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"pos_1_a pos_1_b [TAB]\"),\n        snapbox::str![[r#\"\npos_1_a\npos_1_b\npos_1_c\n--format\n--help\tPrint help\n\"#]]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"pos_1_a pos_1_b --[TAB]\"),\n        snapbox::str![[r#\"\n--format\n--help\tPrint help\n\"#]]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"pos_1_a pos_1_b --format [TAB]\"),\n        snapbox::str![[r#\"\njson\nyaml\ntoml\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"pos_1_a pos_1_b --format json [TAB]\"),\n        snapbox::str![[r#\"\npos_1_a\npos_1_b\npos_1_c\n--format\n--help\tPrint help\n\"#]]\n    );\n}\n\n#[test]\nfn suggest_delimiter_values() {\n    let mut cmd = Command::new(\"delimiter\")\n        .arg(\n            clap::Arg::new(\"delimiter\")\n                .long(\"delimiter\")\n                .short('D')\n                .value_parser([\n                    PossibleValue::new(\"comma\"),\n                    PossibleValue::new(\"space\"),\n                    PossibleValue::new(\"tab\"),\n                ])\n                .value_delimiter(','),\n        )\n        .arg(\n            clap::Arg::new(\"pos\")\n                .value_parser([\"a_pos\", \"b_pos\", \"c_pos\"])\n                .value_delimiter(','),\n        );\n\n    assert_data_eq!(\n        complete!(cmd, \"--delimiter [TAB]\"),\n        snapbox::str![[r#\"\ncomma\nspace\ntab\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--delimiter=[TAB]\"),\n        snapbox::str![[r#\"\n--delimiter=comma\n--delimiter=space\n--delimiter=tab\n\"#]]\n    );\n\n    assert_data_eq!(complete!(cmd, \"--delimiter c[TAB]\"), snapbox::str![\"comma\"]);\n\n    assert_data_eq!(\n        complete!(cmd, \"--delimiter=c[TAB]\"),\n        snapbox::str![\"--delimiter=comma\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--delimiter comma,[TAB]\"),\n        snapbox::str![[r#\"\ncomma,comma\ncomma,space\ncomma,tab\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--delimiter=comma,[TAB]\"),\n        snapbox::str![[r#\"\n--delimiter=comma,a_pos\n--delimiter=comma,b_pos\n--delimiter=comma,c_pos\n--delimiter=comma,comma\n--delimiter=comma,space\n--delimiter=comma,tab\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--delimiter comma,s[TAB]\"),\n        snapbox::str![\"comma,space\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--delimiter=comma,s[TAB]\"),\n        snapbox::str![\"--delimiter=comma,space\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-D [TAB]\"),\n        snapbox::str![[r#\"\ncomma\nspace\ntab\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-D=[TAB]\"),\n        snapbox::str![[r#\"\n-D=comma\n-D=space\n-D=tab\n\"#]]\n    );\n\n    assert_data_eq!(complete!(cmd, \"-D c[TAB]\"), snapbox::str![\"comma\"]);\n\n    assert_data_eq!(complete!(cmd, \"-D=c[TAB]\"), snapbox::str![\"-D=comma\"]);\n\n    assert_data_eq!(\n        complete!(cmd, \"-D comma,[TAB]\"),\n        snapbox::str![[r#\"\ncomma,comma\ncomma,space\ncomma,tab\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-D=comma,[TAB]\"),\n        snapbox::str![[r#\"\n-D=comma,a_pos\n-D=comma,b_pos\n-D=comma,c_pos\n-D=comma,comma\n-D=comma,space\n-D=comma,tab\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-D comma,s[TAB]\"),\n        snapbox::str![\"comma,space\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-D=comma,s[TAB]\"),\n        snapbox::str![\"-D=comma,space\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-- [TAB]\"),\n        snapbox::str![[r#\"\na_pos\nb_pos\nc_pos\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \" -- a_pos,[TAB]\"),\n        snapbox::str![[r#\"\na_pos,a_pos\na_pos,b_pos\na_pos,c_pos\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-- a_pos,b[TAB]\"),\n        snapbox::str![\"a_pos,b_pos\"]\n    );\n}\n\n#[test]\nfn suggest_allow_hyphen() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .arg(\n            clap::Arg::new(\"format\")\n                .long(\"format\")\n                .short('F')\n                .allow_hyphen_values(true)\n                .value_parser([\"--json\", \"--toml\", \"--yaml\"]),\n        )\n        .arg(clap::Arg::new(\"json\").long(\"json\"));\n\n    assert_data_eq!(complete!(cmd, \"--format --j[TAB]\"), snapbox::str![\"--json\"]);\n    assert_data_eq!(complete!(cmd, \"-F --j[TAB]\"), snapbox::str![\"--json\"]);\n    assert_data_eq!(complete!(cmd, \"--format --t[TAB]\"), snapbox::str![\"--toml\"]);\n    assert_data_eq!(complete!(cmd, \"-F --t[TAB]\"), snapbox::str![\"--toml\"]);\n\n    assert_data_eq!(\n        complete!(cmd, \"--format --[TAB]\"),\n        snapbox::str![[r#\"\n--json\n--toml\n--yaml\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-F --[TAB]\"),\n        snapbox::str![[r#\"\n--json\n--toml\n--yaml\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format --json --j[TAB]\"),\n        snapbox::str![\"--json\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"-F --json --j[TAB]\"),\n        snapbox::str![\"--json\"]\n    );\n}\n\n#[test]\nfn suggest_positional_long_allow_hyphen() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .arg(\n            clap::Arg::new(\"format\")\n                .long(\"format\")\n                .short('F')\n                .allow_hyphen_values(true)\n                .value_parser([\"--json\", \"--toml\", \"--yaml\"]),\n        )\n        .arg(\n            clap::Arg::new(\"positional_a\")\n                .value_parser([\"--pos_a\"])\n                .allow_hyphen_values(true),\n        )\n        .arg(clap::Arg::new(\"positional_b\").value_parser([\"pos_b\"]));\n\n    assert_data_eq!(\n        complete!(cmd, \"--format --json --pos[TAB]\"),\n        snapbox::str![\"--pos_a\"]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"-F --json --pos[TAB]\"),\n        snapbox::str![\"--pos_a\"]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format --json --pos_a [TAB]\"),\n        snapbox::str![[r#\"\npos_b\n--format\n--help\tPrint help\n\"#]]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"-F --json --pos_a [TAB]\"),\n        snapbox::str![[r#\"\npos_b\n--format\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format --json --pos_a p[TAB]\"),\n        snapbox::str![\"pos_b\"]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"-F --json --pos_a p[TAB]\"),\n        snapbox::str![\"pos_b\"]\n    );\n}\n\n#[test]\nfn suggest_positional_short_allow_hyphen() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .arg(\n            clap::Arg::new(\"format\")\n                .long(\"format\")\n                .short('F')\n                .allow_hyphen_values(true)\n                .value_parser([\"--json\", \"--toml\", \"--yaml\"]),\n        )\n        .arg(\n            clap::Arg::new(\"positional_a\")\n                .value_parser([\"-a\"])\n                .allow_hyphen_values(true),\n        )\n        .arg(clap::Arg::new(\"positional_b\").value_parser([\"pos_b\"]));\n\n    assert_data_eq!(\n        complete!(cmd, \"--format --json -a [TAB]\"),\n        snapbox::str![[r#\"\npos_b\n--format\n--help\tPrint help\n\"#]]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"-F --json -a [TAB]\"),\n        snapbox::str![[r#\"\npos_b\n--format\n--help\tPrint help\n\"#]]\n    );\n\n    assert_data_eq!(\n        complete!(cmd, \"--format --json -a p[TAB]\"),\n        snapbox::str![\"pos_b\"]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"-F --json -a p[TAB]\"),\n        snapbox::str![\"pos_b\"]\n    );\n}\n\n#[test]\nfn suggest_external_subcommand() {\n    let mut cmd = Command::new(\"dynamic\")\n        .allow_external_subcommands(true)\n        .add(SubcommandCandidates::new(|| {\n            vec![CompletionCandidate::new(\"external\")]\n        }))\n        .arg(clap::Arg::new(\"positional\").value_parser([\"pos1\", \"pos2\", \"pos3\"]));\n\n    assert_data_eq!(\n        complete!(cmd, \" [TAB]\"),\n        snapbox::str![\n            \"external\npos1\npos2\npos3\n--help\\tPrint help\n\"\n        ]\n    );\n\n    assert_data_eq!(complete!(cmd, \"e[TAB]\"), snapbox::str![\"external\"]);\n}\n\n#[test]\nfn sort_and_filter() {\n    let mut cmd = Command::new(\"exhaustive\")\n        .args([\n            clap::Arg::new(\"required-flag\")\n                .long(\"required-flag\")\n                .visible_alias(\"required-flag2\")\n                .short('r')\n                .required(true),\n            clap::Arg::new(\"optional-flag\")\n                .long(\"optional-flag\")\n                .visible_alias(\"2optional-flag\")\n                .short('o'),\n            clap::Arg::new(\"long-flag\").long(\"long-flag\"),\n            clap::Arg::new(\"short-flag\").short('s'),\n            clap::Arg::new(\"positional\").value_parser([\"pos-a\", \"pos-b\", \"pos-c\"]),\n        ])\n        .subcommands([Command::new(\"sub\")]);\n\n    assert_data_eq!(\n        complete!(cmd, \" [TAB]\"),\n        snapbox::str![[r#\"\nsub\nhelp\tPrint this message or the help of the given subcommand(s)\npos-a\npos-b\npos-c\n--required-flag\n--optional-flag\n--long-flag\n-s\n--help\tPrint help\n\"#]]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"-[TAB]\"),\n        snapbox::str![[r#\"\n-r\t--required-flag\n-o\t--optional-flag\n--long-flag\n-s\n-h\tPrint help\n\"#]]\n    );\n    assert_data_eq!(\n        complete!(cmd, \"--[TAB]\"),\n        snapbox::str![[r#\"\n--required-flag\n--optional-flag\n--long-flag\n--help\tPrint help\n\"#]]\n    );\n}\n\nfn complete(cmd: &mut Command, args: impl AsRef<str>, current_dir: Option<&Path>) -> String {\n    let input = args.as_ref();\n    let mut args = vec![std::ffi::OsString::from(cmd.get_name())];\n    let arg_index;\n\n    if let Some((prior, after)) = input.split_once(\"[TAB]\") {\n        args.extend(prior.split_whitespace().map(From::from));\n        if prior.ends_with(char::is_whitespace) {\n            args.push(std::ffi::OsString::default());\n        }\n        arg_index = args.len() - 1;\n        // HACK: this cannot handle in-word '[TAB]'\n        args.extend(after.split_whitespace().map(From::from));\n    } else {\n        args.extend(input.split_whitespace().map(From::from));\n        if input.ends_with(char::is_whitespace) {\n            args.push(std::ffi::OsString::default());\n        }\n        arg_index = args.len() - 1;\n    }\n\n    clap_complete::engine::complete(cmd, args, arg_index, current_dir)\n        .unwrap()\n        .into_iter()\n        .map(|candidate| {\n            let compl = candidate.get_value().to_str().unwrap();\n            if let Some(help) = candidate.get_help() {\n                format!(\"{compl}\\t{help}\")\n            } else {\n                compl.to_owned()\n            }\n        })\n        .collect::<Vec<_>>()\n        .join(\"\\n\")\n}\n"
  },
  {
    "path": "clap_complete/tests/testsuite/fish.rs",
    "content": "use crate::common;\n#[allow(unused_imports)]\nuse snapbox::assert_data_eq;\n\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nconst CMD: &str = \"fish\";\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\ntype RuntimeBuilder = completest_pty::FishRuntimeBuilder;\n\n#[test]\nfn basic() {\n    let name = \"my-app\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/basic.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn feature_sample() {\n    let name = \"my-app\";\n    let cmd = common::feature_sample_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/feature_sample.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn special_commands() {\n    let name = \"my-app\";\n    let cmd = common::special_commands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/special_commands.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn quoting() {\n    let name = \"my-app\";\n    let cmd = common::quoting_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/quoting.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn aliases() {\n    let name = \"my-app\";\n    let cmd = common::aliases_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/aliases.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn sub_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::sub_subcommands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/sub_subcommands.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn external_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::external_subcommand(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/external_subcommands.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn custom_bin_name() {\n    let name = \"my-app\";\n    let bin_name = \"bin-name\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/custom_bin_name.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        bin_name,\n    );\n}\n\n#[test]\nfn value_hint() {\n    let name = \"my-app\";\n    let cmd = common::value_hint_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_hint.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn value_terminator() {\n    let name = \"my-app\";\n    let cmd = common::value_terminator_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_terminator.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/multi_value_option.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_value_option.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_multi_value_option.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn two_multi_valued_arguments() {\n    let name = \"my-app\";\n    let cmd = common::two_multi_valued_arguments_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/two_multi_valued_arguments.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn subcommand_last() {\n    let name = \"my-app\";\n    let cmd = common::subcommand_last(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/subcommand_last.fish\"],\n        clap_complete::shells::Fish,\n        cmd,\n        name,\n    );\n}\n\n#[test]\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn register_completion() {\n    common::register_example::<RuntimeBuilder>(\"static\", \"exhaustive\");\n}\n\n#[test]\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"static\", \"exhaustive\");\n\n    let input = \"exhaustive \\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive \naction  empty   help  (Print this message or the help of the given subcommand(s))  last    quote\nalias   global  hint                                                               pacman  value\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive empty \\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive empty \nCargo.toml    CONTRIBUTING.md  LICENSE-APACHE  README.md  tests/\nCHANGELOG.md  examples/        LICENSE-MIT     src/       \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive --empty=\\t\";\n    let expected = snapbox::str![\"% exhaustive --empty=\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive quote --choice \\t\";\n    let actual = runtime.complete(input, &term).unwrap();\n    let expected = snapbox::str![[r#\"\n% exhaustive quote --choice \nanother  bash  (bash (shell))  fish  (fish shell)  shell  (something with a space)  zsh  (zsh shell)\n\"#]];\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn register_dynamic_env() {\n    common::register_example::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_toplevel() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive empty \nempty   quote   last   help  (Print this message or the help of the given subcommand(s))  --help  (Print help)\nglobal  value   alias  --generate                                             (generate)  \naction  pacman  hint   --empty-choice                                                     \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_quoted_help() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive quote \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive quote cmd-single-quotes \ncmd-single-quotes           (Can be 'always', 'auto', or 'never')\ncmd-double-quotes           (Can be \"always\", \"auto\", or \"never\")\ncmd-backticks              (For more information see `echo test`)\ncmd-backslash                                        (Avoid '/n')\ncmd-brackets                             (List packages [filter])\ncmd-expansions            (Execute the shell command with $SHELL)\nescape-help                                             (/tab \"')\nhelp  (Print this message or the help of the given subcommand(s))\n--single-quotes             (Can be 'always', 'auto', or 'never')\n--double-quotes             (Can be \"always\", \"auto\", or \"never\")\n--backticks                (For more information see `echo test`)\n--backslash                                          (Avoid '/n')\n--brackets                               (List packages [filter])\n--expansions              (Execute the shell command with $SHELL)\n--choice                                                         \n--help                      (Print help (see more with '--help'))\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_option_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive action --choice=\\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive action --choice=first \n--choice=first  --choice=second\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive action --choice=f\\t\";\n    let expected = snapbox::str![\"% exhaustive action --choice=first \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_quoted_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive quote --choice \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive quote --choice another/ shell \nanother shell  (something with a space)  bash  (bash (shell))  fish  (fish shell)  zsh  (zsh shell)\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive quote --choice an\\t\";\n    let expected = snapbox::str![\"% exhaustive quote --choice another/ shell \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_empty_subcommand() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive empty \\t\\t\";\n    let expected = snapbox::str![\"% exhaustive empty \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_empty_option_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive --empty=\\t\";\n    let expected = snapbox::str![\"% exhaustive --empty=\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n"
  },
  {
    "path": "clap_complete/tests/testsuite/general.rs",
    "content": "#[test]\nfn infer_value_hint_for_path_buf() {\n    let mut cmd = clap::Command::new(\"completer\")\n        .arg(clap::Arg::new(\"input\").value_parser(clap::value_parser!(std::path::PathBuf)));\n    cmd.build();\n    let input = cmd\n        .get_arguments()\n        .find(|arg| arg.get_id() == \"input\")\n        .unwrap();\n    assert_eq!(input.get_value_hint(), clap::builder::ValueHint::AnyPath);\n}\n"
  },
  {
    "path": "clap_complete/tests/testsuite/main.rs",
    "content": "automod::dir!(\"tests/testsuite\");\n"
  },
  {
    "path": "clap_complete/tests/testsuite/powershell.rs",
    "content": "use crate::common;\n\n#[test]\nfn basic() {\n    let name = \"my-app\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/basic.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn feature_sample() {\n    let name = \"my-app\";\n    let cmd = common::feature_sample_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/feature_sample.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn special_commands() {\n    let name = \"my-app\";\n    let cmd = common::special_commands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/special_commands.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn quoting() {\n    let name = \"my-app\";\n    let cmd = common::quoting_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/quoting.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn aliases() {\n    let name = \"my-app\";\n    let cmd = common::aliases_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/aliases.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn sub_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::sub_subcommands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/sub_subcommands.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn external_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::external_subcommand(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/external_subcommands.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn custom_bin_name() {\n    let name = \"my-app\";\n    let bin_name = \"bin-name\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/custom_bin_name.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        bin_name,\n    );\n}\n\n#[test]\nfn value_hint() {\n    let name = \"my-app\";\n    let cmd = common::value_hint_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_hint.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn value_terminator() {\n    let name = \"my-app\";\n    let cmd = common::value_terminator_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_terminator.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/multi_value_option.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_value_option.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_multi_value_option.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn two_multi_valued_arguments() {\n    let name = \"my-app\";\n    let cmd = common::two_multi_valued_arguments_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/two_multi_valued_arguments.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn subcommand_last() {\n    let name = \"my-app\";\n    let cmd = common::subcommand_last(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/subcommand_last.ps1\"],\n        clap_complete::shells::PowerShell,\n        cmd,\n        name,\n    );\n}\n"
  },
  {
    "path": "clap_complete/tests/testsuite/zsh.rs",
    "content": "#[allow(unused_imports)]\nuse snapbox::assert_data_eq;\n\nuse crate::common;\n\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nconst CMD: &str = \"zsh\";\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\ntype RuntimeBuilder = completest_pty::ZshRuntimeBuilder;\n\n#[test]\nfn basic() {\n    let name = \"my-app\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/basic.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn feature_sample() {\n    let name = \"my-app\";\n    let cmd = common::feature_sample_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/feature_sample.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn special_commands() {\n    let name = \"my-app\";\n    let cmd = common::special_commands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/special_commands.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn quoting() {\n    let name = \"my-app\";\n    let cmd = common::quoting_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/quoting.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn aliases() {\n    let name = \"my-app\";\n    let cmd = common::aliases_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/aliases.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn sub_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::sub_subcommands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/sub_subcommands.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn external_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::external_subcommand(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/external_subcommands.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn custom_bin_name() {\n    let name = \"my-app\";\n    let bin_name = \"bin-name\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/custom_bin_name.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        bin_name,\n    );\n}\n\n#[test]\nfn value_hint() {\n    let name = \"my-app\";\n    let cmd = common::value_hint_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_hint.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn value_terminator() {\n    let name = \"my-app\";\n    let cmd = common::value_terminator_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_terminator.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/multi_value_option.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_value_option.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn optional_multi_value_option() {\n    let name = \"my-app\";\n    let cmd = common::optional_multi_value_option_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_multi_value_option.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn two_multi_valued_arguments() {\n    let name = \"my-app\";\n    let cmd = common::two_multi_valued_arguments_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/two_multi_valued_arguments.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn subcommand_last() {\n    let name = \"my-app\";\n    let cmd = common::subcommand_last(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/subcommand_last.zsh\"],\n        clap_complete::shells::Zsh,\n        cmd,\n        name,\n    );\n}\n\n#[test]\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn register_completion() {\n    common::register_example::<RuntimeBuilder>(\"static\", \"exhaustive\");\n}\n\n#[test]\n#[cfg(unix)]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"static\", \"exhaustive\");\n\n    let input = \"exhaustive \\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive\nhelp                                                      -- Print this message or the help of the given subcommand(s)\nhint                                                      \npacman  action  global  alias  value  quote  empty  last  --                                                          \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive empty \\t\";\n    let expected = snapbox::str![\"% exhaustive empty \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive --empty=\\t\";\n    let expected = snapbox::str![\"% exhaustive --empty=\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn register_dynamic_env() {\n    common::register_example::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_toplevel() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive\n--generate      -- generate\n--help          -- Print help\nhelp            -- Print this message or the help of the given subcommand(s)\n--empty-choice  alias           global          last            quote           \naction          empty           hint            pacman          value           \n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_quoted_help() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive quote \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive quote\n--help                              -- Print help (see more with '--help')                                            \ncmd-backslash      --backslash      -- Avoid '/n'                                                                     \ncmd-backticks      --backticks      -- For more information see `echo test`                                           \ncmd-brackets       --brackets       -- List packages [filter]                                                         \ncmd-double-quotes  --double-quotes  -- Can be \"always\", \"auto\", or \"never\"                                            \ncmd-expansions     --expansions     -- Execute the shell command with $SHELL                                          \ncmd-single-quotes  --single-quotes  -- Can be 'always', 'auto', or 'never'                                            \nescape-help                         -- /tab/t\"'                                                                       \nhelp                                -- Print this message or the help of the given subcommand(s)                      \n--choice\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_option_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive action --choice=\\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive action --choice=\n--choice=first   --choice=second\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive action --choice=f\\t\\t\";\n    let expected = snapbox::str![\"% exhaustive action --choice=first \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_env_quoted_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive quote --choice \\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive quote --choice\nanother shell  -- something with a space\nbash           -- bash (shell)\nfish           -- fish shell\nzsh            -- zsh shell\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"exhaustive quote --choice an\\t\\t\";\n    let expected = snapbox::str![\"% exhaustive quote --choice another/ shell \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_empty_subcommand() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive empty \\t\\t\";\n    let expected = snapbox::str![\"% exhaustive empty \"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_empty_option_value() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    let input = \"exhaustive --empty=\\t\";\n    let expected = snapbox::str![\"% exhaustive --empty=\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_empty_space() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    // Press left arrow twice to place cursor between the two spaces\n    let input = \"exhaustive quote  -\\x1b[D\\x1b[D\\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive quote  -\n--help                              -- Print help (see more with '--help')                                            \ncmd-backslash      --backslash      -- Avoid '/n'                                                                     \ncmd-backticks      --backticks      -- For more information see `echo test`                                           \ncmd-brackets       --brackets       -- List packages [filter]                                                         \ncmd-double-quotes  --double-quotes  -- Can be \"always\", \"auto\", or \"never\"                                            \ncmd-expansions     --expansions     -- Execute the shell command with $SHELL                                          \ncmd-single-quotes  --single-quotes  -- Can be 'always', 'auto', or 'never'                                            \nescape-help                         -- /tab/t\"'                                                                       \nhelp                                -- Print this message or the help of the given subcommand(s)                      \n--choice\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\n#[cfg(all(unix, feature = \"unstable-dynamic\"))]\n#[cfg(feature = \"unstable-shell-tests\")]\nfn complete_dynamic_dir_no_trailing_space() {\n    if !common::has_command(CMD) {\n        return;\n    }\n\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<RuntimeBuilder>(\"dynamic-env\", \"exhaustive\");\n\n    // First, complete to the directory name with slash.\n    // A trailing slash should not be added after the slash.\n    let input = \"exhaustive hint --file tes\\t\\t\";\n    let expected = snapbox::str![\"% exhaustive hint --file tests/\"];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    // Verify hitting tab again shows the directory contents.\n    // This only works if there is no trailing space after the slash.\n    let input = \"exhaustive hint --file tests/\\t\\t\";\n    let expected = snapbox::str![[r#\"\n% exhaustive hint --file tests/\ntests/examples.rs  tests/snapshots    tests/testsuite\n\"#]];\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n"
  },
  {
    "path": "clap_complete_nushell/CHANGELOG.md",
    "content": "# Change Log\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/)\nand this project adheres to [Semantic Versioning](https://semver.org/).\n\n<!-- next-header -->\n## [Unreleased] - ReleaseDate\n\n## [4.6.0] - 2026-03-12\n\n### Compatibility\n\n- Update MSRV to 1.85\n\n## [4.5.11] - 2026-03-12\n\n### Internal\n\n- Update dependencies\n\n## [4.5.10] - 2025-10-31\n\n### Fixes\n\n- Fix the order of positional arguments\n\n## [4.5.9] - 2025-10-13\n\n## [4.5.8] - 2025-07-09\n\n## [4.5.7] - 2025-06-09\n\n## [4.5.6] - 2025-05-27\n\n## [4.5.5] - 2025-01-02\n\n### Features\n\n- Respect `ValueHint` for paths\n\n## [4.5.4] - 2024-10-08\n\n## [4.5.3] - 2024-07-25\n\n## [4.5.2] - 2024-06-06\n\n## [4.5.1] - 2024-02-16\n\n### Fixes\n\n- Correctly handle completion descriptions with newlines\n\n## [4.5.0] - 2024-02-08\n\n### Compatibility\n\n- Update MSRV to 1.74\n\n## [4.4.2] - 2023-10-24\n\n## [4.4.1] - 2023-09-11\n\n### Features\n\n- Allow completions to be used with `use` and `overlay use`\n\n## [4.4.0] - 2023-08-24\n\n### Compatibility\n\n- Update MSRV to 1.70.0\n\n## [4.3.2] - 2023-08-08\n\n## [4.3.1] - 2023-06-02\n\n## [4.3.0] - 2023-05-24\n\n<!-- next-url -->\n[Unreleased]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.6.0...HEAD\n[4.6.0]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.11...clap_complete_nushell-v4.6.0\n[4.5.11]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.10...clap_complete_nushell-v4.5.11\n[4.5.10]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.9...clap_complete_nushell-v4.5.10\n[4.5.9]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.8...clap_complete_nushell-v4.5.9\n[4.5.8]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.7...clap_complete_nushell-v4.5.8\n[4.5.7]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.6...clap_complete_nushell-v4.5.7\n[4.5.6]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.5...clap_complete_nushell-v4.5.6\n[4.5.5]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.4...clap_complete_nushell-v4.5.5\n[4.5.4]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.3...clap_complete_nushell-v4.5.4\n[4.5.3]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.2...clap_complete_nushell-v4.5.3\n[4.5.2]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.1...clap_complete_nushell-v4.5.2\n[4.5.1]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.5.0...clap_complete_nushell-v4.5.1\n[4.5.0]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.4.2...clap_complete_nushell-v4.5.0\n[4.4.2]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.4.1...clap_complete_nushell-v4.4.2\n[4.4.1]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.4.0...clap_complete_nushell-v4.4.1\n[4.4.0]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.3.2...clap_complete_nushell-v4.4.0\n[4.3.2]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.3.1...clap_complete_nushell-v4.3.2\n[4.3.1]: https://github.com/clap-rs/clap/compare/clap_complete_nushell-v4.3.0...clap_complete_nushell-v4.3.1\n[4.3.0]: https://github.com/clap-rs/clap/compare/bd163098e122bb65e053a61b773931c8f36d2e7d...clap_complete_nushell-v4.3.0\n"
  },
  {
    "path": "clap_complete_nushell/Cargo.toml",
    "content": "[package]\nname = \"clap_complete_nushell\"\nversion = \"4.6.0\"\ndescription = \"A generator library used with clap for Nushell completion scripts\"\ncategories = [\"command-line-interface\"]\nkeywords = [\n  \"clap\",\n  \"cli\",\n  \"completion\",\n  \"nushell\"\n]\nrepository.workspace = true\nlicense.workspace = true\nedition.workspace = true\nrust-version.workspace = true\ninclude.workspace = true\n\n[package.metadata.docs.rs]\ntargets = [\"x86_64-unknown-linux-gnu\"]\nrustdoc-args = [\"--generate-link-to-definition\"]\n\n[package.metadata.release]\npre-release-replacements = [\n  {file=\"CHANGELOG.md\", search=\"Unreleased\", replace=\"{{version}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"\\\\.\\\\.\\\\.HEAD\", replace=\"...{{tag_name}}\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"ReleaseDate\", replace=\"{{date}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-header -->\", replace=\"<!-- next-header -->\\n## [Unreleased] - ReleaseDate\\n\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-url -->\", replace=\"<!-- next-url -->\\n[Unreleased]: https://github.com/clap-rs/clap/compare/{{tag_name}}...HEAD\", exactly=1},\n]\n\n[lib]\nbench = false\n\n[dependencies]\nclap = { path = \"../\", version = \"4.0.0\", default-features = false, features = [\"std\"] }\nclap_complete = { path = \"../clap_complete\", version = \"4.5.51\" }\ncompletest = { version = \"1.0.0\", optional = true }\ncompletest-nu = { version = \"1.0.0\", optional = true }\n\n[dev-dependencies]\nsnapbox = { version = \"1.1.0\", features = [\"diff\", \"examples\", \"dir\"] }\nclap = { path = \"../\", version = \"4.0.0\", default-features = false, features = [\"std\", \"help\"] }\n\n[features]\ndefault = []\nunstable-shell-tests = [\"dep:completest\", \"dep:completest-nu\"]\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "clap_complete_nushell/README.md",
    "content": "# clap_complete_nushell\n\nGenerates [Nushell](https://github.com/nushell/nushell) completions for [`clap`](https://github.com/clap-rs/clap) based CLIs\n\n[![Crates.io](https://img.shields.io/crates/v/clap_complete_nushell)](https://crates.io/crates/clap_complete_nushell)\n[![Crates.io](https://img.shields.io/crates/d/clap_complete_nushell)](https://crates.io/crates/clap_complete_nushell)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE-APACHE)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE-MIT)\n[![docs.rs](https://img.shields.io/docsrs/clap_complete_nushell)](https://docs.rs/clap_complete_nushell)\n\n- [Questions & Discussions](https://github.com/clap-rs/clap/discussions)\n- [CONTRIBUTING](../CONTRIBUTING.md)\n\n## Examples\n\n### myapp.rs\n\n```rust\nuse clap::{builder::PossibleValue, Arg, ArgAction, Command, ValueHint};\nuse clap_complete::generate;\nuse clap_complete_nushell::Nushell;\nuse std::io;\n\nfn main() {\n    let mut cmd = Command::new(\"myapp\")\n        .version(\"3.0\")\n        .propagate_version(true)\n        .about(\"Tests completions\")\n        .arg(\n            Arg::new(\"file\")\n                .value_hint(ValueHint::FilePath)\n                .help(\"some input file\"),\n        )\n        .arg(\n            Arg::new(\"config\")\n                .action(ArgAction::Count)\n                .help(\"some config file\")\n                .short('c')\n                .visible_short_alias('C')\n                .long(\"config\")\n                .visible_alias(\"conf\"),\n        )\n        .arg(Arg::new(\"choice\").value_parser([\"first\", \"second\"]))\n        .subcommand(\n            Command::new(\"test\").about(\"tests things\").arg(\n                Arg::new(\"case\")\n                    .long(\"case\")\n                    .action(ArgAction::Set)\n                    .help(\"the case to test\"),\n            ),\n        )\n        .subcommand(\n            Command::new(\"some_cmd\")\n                .about(\"top level subcommand\")\n                .subcommand(\n                    Command::new(\"sub_cmd\").about(\"sub-subcommand\").arg(\n                        Arg::new(\"config\")\n                            .long(\"config\")\n                            .action(ArgAction::Set)\n                            .value_parser([PossibleValue::new(\"Lest quotes aren't escaped.\")])\n                            .help(\"the other case to test\"),\n                    ),\n                ),\n        );\n\n    generate(Nushell, &mut cmd, \"myapp\", &mut io::stdout());\n}\n\n```\n\n### myapp.nu\n\n```nu\nmodule completions {\n\n  def \"nu-complete myapp choice\" [] {\n    [ \"first\" \"second\" ]\n  }\n\n  # Tests completions\n  export extern myapp [\n    file?: string             # some input file\n    --config(-c)              # some config file\n    --conf                    # some config file\n    -C                        # some config file\n    choice?: string@\"nu-complete myapp choice\"\n    --version(-V)             # Print version\n  ]\n\n  # tests things\n  export extern \"myapp test\" [\n    --case: string            # the case to test\n    --version(-V)             # Print version\n  ]\n\n  # top level subcommand\n  export extern \"myapp some_cmd\" [\n    --version(-V)             # Print version\n  ]\n\n  def \"nu-complete myapp some_cmd sub_cmd config\" [] {\n    [ \"\\\"Lest quotes aren't escaped.\\\"\" ]\n  }\n\n  # sub-subcommand\n  export extern \"myapp some_cmd sub_cmd\" [\n    --config: string@\"nu-complete myapp some_cmd sub_cmd config\" # the other case to test\n    --version(-V)             # Print version\n  ]\n\n}\n\nuse completions *\n```\n"
  },
  {
    "path": "clap_complete_nushell/examples/nushell_completion.rs",
    "content": "use clap::Command;\nuse clap_complete::generate;\nuse clap_complete_nushell::Nushell;\nuse std::io;\n\nfn main() {\n    let mut cmd = Command::new(\"myapp\")\n        .subcommand(Command::new(\"test\").subcommand(Command::new(\"config\")))\n        .subcommand(Command::new(\"hello\"));\n\n    generate(Nushell, &mut cmd, \"myapp\", &mut io::stdout());\n}\n"
  },
  {
    "path": "clap_complete_nushell/examples/sub_subcommands.rs",
    "content": "use clap::{Arg, ArgAction, Command, ValueHint, builder::PossibleValue};\nuse clap_complete::generate;\nuse clap_complete_nushell::Nushell;\nuse std::io;\n\nfn main() {\n    let mut cmd = Command::new(\"myapp\")\n        .version(\"3.0\")\n        .propagate_version(true)\n        .about(\"Tests completions\")\n        .arg(\n            Arg::new(\"file\")\n                .value_hint(ValueHint::FilePath)\n                .help(\"some input file\"),\n        )\n        .arg(\n            Arg::new(\"config\")\n                .action(ArgAction::Count)\n                .help(\"some config file\")\n                .short('c')\n                .visible_short_alias('C')\n                .long(\"config\")\n                .visible_alias(\"conf\"),\n        )\n        .arg(Arg::new(\"choice\").value_parser([\"first\", \"second\"]))\n        .subcommand(\n            Command::new(\"test\").about(\"tests things\").arg(\n                Arg::new(\"case\")\n                    .long(\"case\")\n                    .action(ArgAction::Set)\n                    .help(\"the case to test\"),\n            ),\n        )\n        .subcommand(\n            Command::new(\"some_cmd\")\n                .about(\"top level subcommand\")\n                .subcommand(\n                    Command::new(\"sub_cmd\").about(\"sub-subcommand\").arg(\n                        Arg::new(\"config\")\n                            .long(\"config\")\n                            .action(ArgAction::Set)\n                            .value_parser([PossibleValue::new(\"Lest quotes aren't escaped.\")])\n                            .help(\"the other case to test\"),\n                    ),\n                ),\n        );\n\n    generate(Nushell, &mut cmd, \"myapp\", &mut io::stdout());\n}\n"
  },
  {
    "path": "clap_complete_nushell/examples/test.rs",
    "content": "use clap_complete::generate;\nuse clap_complete_nushell::Nushell;\n\nfn main() {\n    let matches = cli().get_matches();\n    if matches.contains_id(\"generate\") {\n        let mut cmd = cli();\n        generate(Nushell, &mut cmd, \"test\", &mut std::io::stdout());\n    } else {\n        println!(\"{matches:?}\");\n    }\n}\n\nfn cli() -> clap::Command {\n    clap::Command::new(\"test\")\n        .version(\"3.0\")\n        .propagate_version(true)\n        .args([\n            clap::Arg::new(\"global\")\n                .long(\"global\")\n                .global(true)\n                .action(clap::ArgAction::SetTrue)\n                .help(\"everywhere\"),\n            clap::Arg::new(\"generate\").long(\"generate\").help(\"generate\"),\n        ])\n        .subcommands([\n            clap::Command::new(\"action\").args([\n                clap::Arg::new(\"set-true\")\n                    .long(\"set-true\")\n                    .action(clap::ArgAction::SetTrue)\n                    .help(\"bool\"),\n                clap::Arg::new(\"set\")\n                    .long(\"set\")\n                    .action(clap::ArgAction::Set)\n                    .help(\"value\"),\n                clap::Arg::new(\"count\")\n                    .long(\"count\")\n                    .action(clap::ArgAction::Count)\n                    .help(\"number\"),\n                clap::Arg::new(\"choice\")\n                    .long(\"choice\")\n                    .value_parser([\"first\", \"second\"])\n                    .help(\"enum\"),\n            ]),\n            clap::Command::new(\"quote\")\n                .args([\n                    clap::Arg::new(\"single-quotes\")\n                        .long(\"single-quotes\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"Can be 'always', 'auto', or 'never'\"),\n                    clap::Arg::new(\"double-quotes\")\n                        .long(\"double-quotes\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n                    clap::Arg::new(\"backticks\")\n                        .long(\"backticks\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"For more information see `echo test`\"),\n                    clap::Arg::new(\"backslash\")\n                        .long(\"backslash\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"Avoid '\\\\n'\"),\n                    clap::Arg::new(\"brackets\")\n                        .long(\"brackets\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"List packages [filter]\"),\n                    clap::Arg::new(\"expansions\")\n                        .long(\"expansions\")\n                        .action(clap::ArgAction::SetTrue)\n                        .help(\"Execute the shell command with $SHELL\"),\n                ])\n                .subcommands([\n                    clap::Command::new(\"cmd-single-quotes\")\n                        .about(\"Can be 'always', 'auto', or 'never'\"),\n                    clap::Command::new(\"cmd-double-quotes\")\n                        .about(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n                    clap::Command::new(\"cmd-backticks\")\n                        .about(\"For more information see `echo test`\"),\n                    clap::Command::new(\"cmd-backslash\").about(\"Avoid '\\\\n'\"),\n                    clap::Command::new(\"cmd-brackets\").about(\"List packages [filter]\"),\n                    clap::Command::new(\"cmd-expansions\")\n                        .about(\"Execute the shell command with $SHELL\"),\n                ]),\n            clap::Command::new(\"value\").args([\n                clap::Arg::new(\"delim\").long(\"delim\").value_delimiter(','),\n                clap::Arg::new(\"tuple\").long(\"tuple\").num_args(2),\n                clap::Arg::new(\"require-eq\")\n                    .long(\"require-eq\")\n                    .require_equals(true),\n                clap::Arg::new(\"term\").num_args(1..).value_terminator(\";\"),\n            ]),\n            clap::Command::new(\"pacman\").subcommands([\n                clap::Command::new(\"one\").long_flag(\"one\").short_flag('o'),\n                clap::Command::new(\"two\").long_flag(\"two\").short_flag('t'),\n            ]),\n            clap::Command::new(\"last\")\n                .args([clap::Arg::new(\"first\"), clap::Arg::new(\"free\").last(true)]),\n            clap::Command::new(\"alias\").args([\n                clap::Arg::new(\"flag\")\n                    .short('f')\n                    .visible_short_alias('F')\n                    .long(\"flag\")\n                    .action(clap::ArgAction::SetTrue)\n                    .visible_alias(\"flg\")\n                    .help(\"cmd flag\"),\n                clap::Arg::new(\"option\")\n                    .short('o')\n                    .visible_short_alias('O')\n                    .long(\"option\")\n                    .visible_alias(\"opt\")\n                    .help(\"cmd option\")\n                    .action(clap::ArgAction::Set),\n                clap::Arg::new(\"positional\"),\n            ]),\n            clap::Command::new(\"hint\").args([\n                clap::Arg::new(\"choice\")\n                    .long(\"choice\")\n                    .action(clap::ArgAction::Set)\n                    .value_parser([\"bash\", \"fish\", \"zsh\"]),\n                clap::Arg::new(\"unknown\")\n                    .long(\"unknown\")\n                    .value_hint(clap::ValueHint::Unknown),\n                clap::Arg::new(\"other\")\n                    .long(\"other\")\n                    .value_hint(clap::ValueHint::Other),\n                clap::Arg::new(\"path\")\n                    .long(\"path\")\n                    .short('p')\n                    .value_hint(clap::ValueHint::AnyPath),\n                clap::Arg::new(\"file\")\n                    .long(\"file\")\n                    .short('f')\n                    .value_hint(clap::ValueHint::FilePath),\n                clap::Arg::new(\"dir\")\n                    .long(\"dir\")\n                    .short('d')\n                    .value_hint(clap::ValueHint::DirPath),\n                clap::Arg::new(\"exe\")\n                    .long(\"exe\")\n                    .short('e')\n                    .value_hint(clap::ValueHint::ExecutablePath),\n                clap::Arg::new(\"cmd_name\")\n                    .long(\"cmd-name\")\n                    .value_hint(clap::ValueHint::CommandName),\n                clap::Arg::new(\"cmd\")\n                    .long(\"cmd\")\n                    .short('c')\n                    .value_hint(clap::ValueHint::CommandString),\n                clap::Arg::new(\"command_with_args\")\n                    .action(clap::ArgAction::Set)\n                    .num_args(1..)\n                    .trailing_var_arg(true)\n                    .value_hint(clap::ValueHint::CommandWithArguments),\n                clap::Arg::new(\"user\")\n                    .short('u')\n                    .long(\"user\")\n                    .value_hint(clap::ValueHint::Username),\n                clap::Arg::new(\"host\")\n                    .short('H')\n                    .long(\"host\")\n                    .value_hint(clap::ValueHint::Hostname),\n                clap::Arg::new(\"url\")\n                    .long(\"url\")\n                    .value_hint(clap::ValueHint::Url),\n                clap::Arg::new(\"email\")\n                    .long(\"email\")\n                    .value_hint(clap::ValueHint::EmailAddress),\n            ]),\n        ])\n}\n"
  },
  {
    "path": "clap_complete_nushell/src/lib.rs",
    "content": "//! Generates [Nushell](https://github.com/nushell/nushell) completions for [`clap`](https://github.com/clap-rs/clap) based CLIs\n//!\n//! ## Example\n//!\n//! ```\n//! use clap::Command;\n//! use clap_complete::generate;\n//! use clap_complete_nushell::Nushell;\n//! use std::io;\n//!\n//! let mut cmd = Command::new(\"myapp\")\n//!     .subcommand(Command::new(\"test\").subcommand(Command::new(\"config\")))\n//!     .subcommand(Command::new(\"hello\"));\n//!\n//! generate(Nushell, &mut cmd, \"myapp\", &mut io::stdout());\n//! ```\n\n#![doc(html_logo_url = \"https://raw.githubusercontent.com/clap-rs/clap/master/assets/clap.png\")]\n#![cfg_attr(docsrs, feature(doc_cfg))]\n#![forbid(unsafe_code)]\n#![warn(missing_docs)]\n#![warn(clippy::print_stderr)]\n#![warn(clippy::print_stdout)]\n\nuse clap::ValueHint;\nuse clap::builder::StyledStr;\nuse clap::{Arg, ArgAction, Command, builder::PossibleValue};\nuse clap_complete::Generator;\n\n/// Generate Nushell complete file\npub struct Nushell;\n\nimpl Generator for Nushell {\n    fn file_name(&self, name: &str) -> String {\n        format!(\"{name}.nu\")\n    }\n\n    fn generate(&self, cmd: &Command, buf: &mut dyn std::io::Write) {\n        self.try_generate(cmd, buf)\n            .expect(\"failed to write completion file\");\n    }\n\n    fn try_generate(\n        &self,\n        cmd: &Command,\n        buf: &mut dyn std::io::Write,\n    ) -> Result<(), std::io::Error> {\n        let mut completions = String::new();\n\n        completions.push_str(\"module completions {\\n\\n\");\n\n        generate_completion(&mut completions, cmd, false);\n\n        for sub in cmd.get_subcommands() {\n            generate_completion(&mut completions, sub, true);\n        }\n\n        completions.push_str(\"}\\n\\n\");\n        completions.push_str(\"export use completions *\\n\");\n\n        buf.write_all(completions.as_bytes())\n    }\n}\n\nfn append_value_completion_and_help(\n    arg: &Arg,\n    name: &str,\n    possible_values: &[PossibleValue],\n    s: &mut String,\n) {\n    let takes_values = arg\n        .get_num_args()\n        .map(|r| r.takes_values())\n        .unwrap_or(false);\n\n    if takes_values {\n        let nu_type = match arg.get_value_hint() {\n            ValueHint::Unknown => \"string\",\n            ValueHint::Other => \"string\",\n            ValueHint::AnyPath => \"path\",\n            ValueHint::FilePath => \"path\",\n            ValueHint::DirPath => \"path\",\n            ValueHint::ExecutablePath => \"path\",\n            ValueHint::CommandName => \"string\",\n            ValueHint::CommandString => \"string\",\n            ValueHint::CommandWithArguments => \"string\",\n            ValueHint::Username => \"string\",\n            ValueHint::Hostname => \"string\",\n            ValueHint::Url => \"string\",\n            ValueHint::EmailAddress => \"string\",\n            _ => \"string\",\n        };\n        s.push_str(format!(\": {nu_type}\").as_str());\n\n        if !possible_values.is_empty() {\n            s.push_str(format!(r#\"@\"nu-complete {} {}\"\"#, name, arg.get_id()).as_str());\n        }\n    }\n\n    if let Some(help) = arg.get_help() {\n        let indent: usize = 30;\n        let width = match s.lines().last() {\n            Some(line) => indent.saturating_sub(line.len()),\n            None => 0,\n        };\n\n        s.push_str(format!(\"{:>width$}# {}\", ' ', single_line_styled_str(help)).as_str());\n    }\n\n    s.push('\\n');\n}\n\nfn append_value_completion_defs(arg: &Arg, name: &str, s: &mut String) {\n    let possible_values = arg.get_possible_values();\n    if possible_values.is_empty() {\n        return;\n    }\n\n    s.push_str(format!(r#\"  def \"nu-complete {} {}\" [] {{\"#, name, arg.get_id()).as_str());\n    s.push_str(\"\\n    [\");\n\n    for value in possible_values {\n        let vname = value.get_name();\n        if vname.contains(|c: char| c.is_whitespace()) {\n            s.push_str(format!(r#\" \"\\\"{vname}\\\"\"\"#).as_str());\n        } else {\n            s.push_str(format!(r#\" \"{vname}\"\"#).as_str());\n        }\n    }\n\n    s.push_str(\" ]\\n  }\\n\\n\");\n}\n\nfn append_argument(arg: &Arg, name: &str, s: &mut String) {\n    let possible_values = arg.get_possible_values();\n\n    if arg.is_positional() {\n        // rest arguments\n        if matches!(arg.get_action(), ArgAction::Append) {\n            s.push_str(format!(\"    ...{}\", arg.get_id()).as_str());\n        } else {\n            s.push_str(format!(\"    {}\", arg.get_id()).as_str());\n\n            if !arg.is_required_set() {\n                s.push('?');\n            }\n        }\n\n        append_value_completion_and_help(arg, name, &possible_values, s);\n\n        return;\n    }\n\n    let shorts = arg.get_short_and_visible_aliases();\n    let longs = arg.get_long_and_visible_aliases();\n\n    match shorts {\n        Some(shorts) => match longs {\n            Some(longs) => {\n                // short options and long options\n                s.push_str(\n                    format!(\n                        \"    --{}(-{})\",\n                        longs.first().expect(\"At least one long option expected\"),\n                        shorts.first().expect(\"At lease one short option expected\")\n                    )\n                    .as_str(),\n                );\n                append_value_completion_and_help(arg, name, &possible_values, s);\n\n                // long alias\n                for long in longs.iter().skip(1) {\n                    s.push_str(format!(\"    --{long}\").as_str());\n                    append_value_completion_and_help(arg, name, &possible_values, s);\n                }\n\n                // short alias\n                for short in shorts.iter().skip(1) {\n                    s.push_str(format!(\"    -{short}\").as_str());\n                    append_value_completion_and_help(arg, name, &possible_values, s);\n                }\n            }\n            None => {\n                // short options only\n                for short in shorts {\n                    s.push_str(format!(\"    -{short}\").as_str());\n                    append_value_completion_and_help(arg, name, &possible_values, s);\n                }\n            }\n        },\n        None => match longs {\n            Some(longs) => {\n                // long options only\n                for long in longs {\n                    s.push_str(format!(\"    --{long}\").as_str());\n                    append_value_completion_and_help(arg, name, &possible_values, s);\n                }\n            }\n            None => unreachable!(\"No short or long options found\"),\n        },\n    }\n}\n\nfn generate_completion(completions: &mut String, cmd: &Command, is_subcommand: bool) {\n    let name = cmd.get_bin_name().expect(\"Failed to get bin name\");\n\n    for arg in cmd.get_arguments() {\n        append_value_completion_defs(arg, name, completions);\n    }\n\n    if let Some(about) = cmd.get_about() {\n        let about = single_line_styled_str(about);\n        completions.push_str(format!(\"  # {about}\\n\").as_str());\n    }\n\n    if is_subcommand {\n        completions.push_str(format!(\"  export extern \\\"{name}\\\" [\\n\").as_str());\n    } else {\n        completions.push_str(format!(\"  export extern {name} [\\n\").as_str());\n    }\n\n    let flags: Vec<_> = cmd.get_arguments().filter(|a| !a.is_positional()).collect();\n    let mut positionals: Vec<_> = cmd.get_positionals().collect();\n\n    positionals.sort_by_key(|arg| arg.get_index());\n\n    for arg in flags {\n        append_argument(arg, name, completions);\n    }\n\n    for arg in positionals {\n        append_argument(arg, name, completions);\n    }\n\n    completions.push_str(\"  ]\\n\\n\");\n\n    if is_subcommand {\n        for sub in cmd.get_subcommands() {\n            generate_completion(completions, sub, true);\n        }\n    }\n}\n\nfn single_line_styled_str(text: &StyledStr) -> String {\n    text.to_string().replace('\\n', \" \")\n}\n\n#[doc = include_str!(\"../README.md\")]\n#[cfg(doctest)]\npub struct ReadmeDoctests;\n"
  },
  {
    "path": "clap_complete_nushell/tests/common.rs",
    "content": "#![allow(dead_code)] // shared with other test modules\n\nuse clap::{Arg, ArgAction, Command, ValueHint, builder::PossibleValue};\nuse snapbox::prelude::*;\n\npub(crate) fn basic_command(name: &'static str) -> Command {\n    Command::new(name)\n        .arg(\n            Arg::new(\"config\")\n                .short('c')\n                .global(true)\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"v\")\n                .short('v')\n                .conflicts_with(\"config\")\n                .action(ArgAction::SetTrue),\n        )\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"Subcommand\\nwith a second line\")\n                .arg(Arg::new(\"debug\").short('d').action(ArgAction::Count)),\n        )\n}\n\npub(crate) fn feature_sample_command(name: &'static str) -> Command {\n    Command::new(name)\n        .version(\"3.0\")\n        .propagate_version(true)\n        .about(\"Tests completions\")\n        .arg(\n            Arg::new(\"file\")\n                .value_hint(ValueHint::FilePath)\n                .help(\"some input file\"),\n        )\n        .arg(\n            Arg::new(\"config\")\n                .action(ArgAction::Count)\n                .help(\"some config file\\nwith another line\")\n                .short('c')\n                .visible_short_alias('C')\n                .long(\"config\")\n                .visible_alias(\"conf\"),\n        )\n        .arg(Arg::new(\"choice\").value_parser([\"first\", \"second\"]))\n        .subcommand(\n            Command::new(\"test\").about(\"tests things\").arg(\n                Arg::new(\"case\")\n                    .long(\"case\")\n                    .action(ArgAction::Set)\n                    .help(\"the case to test\"),\n            ),\n        )\n}\n\npub(crate) fn special_commands_command(name: &'static str) -> Command {\n    feature_sample_command(name)\n        .subcommand(\n            Command::new(\"some_cmd\")\n                .about(\"tests other things\")\n                .arg(\n                    Arg::new(\"config\")\n                        .long(\"config\")\n                        .hide(true)\n                        .action(ArgAction::Set)\n                        .require_equals(true)\n                        .help(\"the other case to test\"),\n                )\n                .arg(Arg::new(\"path\").num_args(1..)),\n        )\n        .subcommand(Command::new(\"some-cmd-with-hyphens\").alias(\"hyphen\"))\n        .subcommand(Command::new(\"some-hidden-cmd\").hide(true))\n}\n\npub(crate) fn quoting_command(name: &'static str) -> Command {\n    Command::new(name)\n        .version(\"3.0\")\n        .arg(\n            Arg::new(\"single-quotes\")\n                .long(\"single-quotes\")\n                .action(ArgAction::SetTrue)\n                .help(\"Can be 'always', 'auto', or 'never'\"),\n        )\n        .arg(\n            Arg::new(\"double-quotes\")\n                .long(\"double-quotes\")\n                .action(ArgAction::SetTrue)\n                .help(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n        )\n        .arg(\n            Arg::new(\"backticks\")\n                .long(\"backticks\")\n                .action(ArgAction::SetTrue)\n                .help(\"For more information see `echo test`\"),\n        )\n        .arg(\n            Arg::new(\"backslash\")\n                .long(\"backslash\")\n                .action(ArgAction::SetTrue)\n                .help(\"Avoid '\\\\n'\"),\n        )\n        .arg(\n            Arg::new(\"brackets\")\n                .long(\"brackets\")\n                .action(ArgAction::SetTrue)\n                .help(\"List packages [filter]\"),\n        )\n        .arg(\n            Arg::new(\"expansions\")\n                .long(\"expansions\")\n                .action(ArgAction::SetTrue)\n                .help(\"Execute the shell command with $SHELL\"),\n        )\n        .subcommands([\n            Command::new(\"cmd-single-quotes\").about(\"Can be 'always', 'auto', or 'never'\"),\n            Command::new(\"cmd-double-quotes\").about(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n            Command::new(\"cmd-backticks\").about(\"For more information see `echo test`\"),\n            Command::new(\"cmd-backslash\").about(\"Avoid '\\\\n'\"),\n            Command::new(\"cmd-brackets\").about(\"List packages [filter]\"),\n            Command::new(\"cmd-expansions\").about(\"Execute the shell command with $SHELL\"),\n        ])\n}\n\npub(crate) fn aliases_command(name: &'static str) -> Command {\n    Command::new(name)\n        .version(\"3.0\")\n        .about(\"testing nushell completions\")\n        .arg(\n            Arg::new(\"flag\")\n                .short('f')\n                .visible_short_alias('F')\n                .long(\"flag\")\n                .action(ArgAction::SetTrue)\n                .visible_alias(\"flg\")\n                .help(\"cmd flag\"),\n        )\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .visible_short_alias('O')\n                .long(\"option\")\n                .visible_alias(\"opt\")\n                .help(\"cmd option\")\n                .action(ArgAction::Set),\n        )\n        .arg(Arg::new(\"positional\"))\n}\n\npub(crate) fn sub_subcommands_command(name: &'static str) -> Command {\n    feature_sample_command(name).subcommand(\n        Command::new(\"some_cmd\")\n            .about(\"top level subcommand\")\n            .visible_alias(\"some_cmd_alias\")\n            .subcommand(\n                Command::new(\"sub_cmd\").about(\"sub-subcommand\").arg(\n                    Arg::new(\"config\")\n                        .long(\"config\")\n                        .action(ArgAction::Set)\n                        .value_parser([\n                            PossibleValue::new(\"Lest quotes, aren't escaped.\")\n                                .help(\"help,with,comma\"),\n                            PossibleValue::new(\"Second to trigger display of options\"),\n                        ])\n                        .help(\"the other case to test\"),\n                ),\n            ),\n    )\n}\n\npub(crate) fn positional_index_command(name: &'static str) -> Command {\n    Command::new(name)\n        .version(\"3.0\")\n        .about(\"Tests positional argument index ordering\")\n        .arg(\n            Arg::new(\"flag\")\n                .short('f')\n                .long(\"flag\")\n                .action(ArgAction::SetTrue)\n                .help(\"some flag\"),\n        )\n        .arg(Arg::new(\"third\").index(3).help(\"third positional\"))\n        .arg(Arg::new(\"first\").index(1).help(\"first positional\"))\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .help(\"some option\"),\n        )\n        .arg(Arg::new(\"second\").index(2).help(\"second positional\"))\n}\n\npub(crate) fn value_hint_command(name: &'static str) -> Command {\n    Command::new(name)\n        .arg(\n            Arg::new(\"choice\")\n                .long(\"choice\")\n                .action(ArgAction::Set)\n                .value_parser([\"bash\", \"fish\", \"zsh\"]),\n        )\n        .arg(\n            Arg::new(\"unknown\")\n                .long(\"unknown\")\n                .value_hint(ValueHint::Unknown),\n        )\n        .arg(Arg::new(\"other\").long(\"other\").value_hint(ValueHint::Other))\n        .arg(\n            Arg::new(\"path\")\n                .long(\"path\")\n                .short('p')\n                .value_hint(ValueHint::AnyPath),\n        )\n        .arg(\n            Arg::new(\"file\")\n                .long(\"file\")\n                .short('f')\n                .value_hint(ValueHint::FilePath),\n        )\n        .arg(\n            Arg::new(\"dir\")\n                .long(\"dir\")\n                .short('d')\n                .value_hint(ValueHint::DirPath),\n        )\n        .arg(\n            Arg::new(\"exe\")\n                .long(\"exe\")\n                .short('e')\n                .value_hint(ValueHint::ExecutablePath),\n        )\n        .arg(\n            Arg::new(\"cmd_name\")\n                .long(\"cmd-name\")\n                .value_hint(ValueHint::CommandName),\n        )\n        .arg(\n            Arg::new(\"cmd\")\n                .long(\"cmd\")\n                .short('c')\n                .value_hint(ValueHint::CommandString),\n        )\n        .arg(\n            Arg::new(\"command_with_args\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .trailing_var_arg(true)\n                .value_hint(ValueHint::CommandWithArguments),\n        )\n        .arg(\n            Arg::new(\"user\")\n                .short('u')\n                .long(\"user\")\n                .value_hint(ValueHint::Username),\n        )\n        .arg(\n            Arg::new(\"host\")\n                .short('H')\n                .long(\"host\")\n                .value_hint(ValueHint::Hostname),\n        )\n        .arg(Arg::new(\"url\").long(\"url\").value_hint(ValueHint::Url))\n        .arg(\n            Arg::new(\"email\")\n                .long(\"email\")\n                .value_hint(ValueHint::EmailAddress),\n        )\n}\n\npub(crate) fn assert_matches(\n    expected: impl IntoData,\n    generator: impl clap_complete::Generator,\n    mut cmd: Command,\n    name: &'static str,\n) {\n    let mut buf = vec![];\n    clap_complete::generate(generator, &mut cmd, name, &mut buf);\n\n    snapbox::Assert::new()\n        .action_env(snapbox::assert::DEFAULT_ACTION_ENV)\n        .normalize_paths(false)\n        .eq(buf, expected);\n}\n\n#[cfg(feature = \"unstable-shell-tests\")]\npub(crate) fn register_example<R: completest::RuntimeBuilder>(context: &str, name: &str) {\n    use completest::Runtime as _;\n\n    let scratch = snapbox::dir::DirRoot::mutable_temp().unwrap();\n    let scratch_path = scratch.path().unwrap();\n\n    let shell_name = R::name();\n    let home = std::path::Path::new(env!(\"CARGO_MANIFEST_DIR\"))\n        .join(\"tests/snapshots/home\")\n        .join(context)\n        .join(name)\n        .join(shell_name);\n    println!(\"Compiling\");\n    let manifest_path = std::path::Path::new(env!(\"CARGO_MANIFEST_DIR\")).join(\"Cargo.toml\");\n    let bin_path =\n        snapbox::cmd::compile_example(name, [\"--manifest-path\", manifest_path.to_str().unwrap()])\n            .unwrap();\n    println!(\"Compiled\");\n    let bin_root = bin_path.parent().unwrap().to_owned();\n\n    let mut registration = std::process::Command::new(&bin_path);\n    match context {\n        \"static\" => registration.args([format!(\"--generate={shell_name}\")]),\n        \"dynamic\" => registration.args([\n            \"complete\".to_owned(),\n            \"--register=-\".to_owned(),\n            format!(\"--shell={shell_name}\"),\n        ]),\n        _ => unreachable!(\"unsupported context {}\", context),\n    };\n    let registration = registration.output().unwrap();\n    assert!(\n        registration.status.success(),\n        \"{}\",\n        String::from_utf8_lossy(&registration.stderr)\n    );\n    let registration = std::str::from_utf8(&registration.stdout).unwrap();\n    assert!(!registration.is_empty());\n\n    let mut runtime = R::new(bin_root, scratch_path.to_owned()).unwrap();\n\n    runtime.register(name, registration).unwrap();\n\n    snapbox::assert_subset_eq(home, scratch_path);\n\n    scratch.close().unwrap();\n}\n\n#[cfg(feature = \"unstable-shell-tests\")]\npub(crate) fn load_runtime<R: completest::RuntimeBuilder>(\n    context: &str,\n    name: &str,\n) -> Box<dyn completest::Runtime>\nwhere\n    <R as completest::RuntimeBuilder>::Runtime: 'static,\n{\n    let shell_name = R::name();\n    let home = std::path::Path::new(env!(\"CARGO_MANIFEST_DIR\"))\n        .join(\"tests/snapshots/home\")\n        .join(context)\n        .join(name)\n        .join(shell_name);\n    let scratch = snapbox::dir::DirRoot::mutable_temp()\n        .unwrap()\n        .with_template(&home)\n        .unwrap();\n    let home = scratch.path().unwrap().to_owned();\n    println!(\"Compiling\");\n    let manifest_path = std::path::Path::new(env!(\"CARGO_MANIFEST_DIR\")).join(\"Cargo.toml\");\n    let bin_path =\n        snapbox::cmd::compile_example(name, [\"--manifest-path\", manifest_path.to_str().unwrap()])\n            .unwrap();\n    println!(\"Compiled\");\n    let bin_root = bin_path.parent().unwrap().to_owned();\n\n    let runtime = R::with_home(bin_root, home).unwrap();\n\n    Box::new(ScratchRuntime {\n        _scratch: scratch,\n        runtime: Box::new(runtime),\n    })\n}\n\n#[derive(Debug)]\n#[cfg(feature = \"unstable-shell-tests\")]\nstruct ScratchRuntime {\n    _scratch: snapbox::dir::DirRoot,\n    runtime: Box<dyn completest::Runtime>,\n}\n\n#[cfg(feature = \"unstable-shell-tests\")]\nimpl completest::Runtime for ScratchRuntime {\n    fn home(&self) -> &std::path::Path {\n        self.runtime.home()\n    }\n\n    fn register(&mut self, name: &str, content: &str) -> std::io::Result<()> {\n        self.runtime.register(name, content)\n    }\n\n    fn complete(&mut self, input: &str, term: &completest::Term) -> std::io::Result<String> {\n        let output = self.runtime.complete(input, term)?;\n        // HACK: elvish prints and clears this message when a completer takes too long which is\n        // dependent on a lot of factors, making this show up or no sometimes (especially if we\n        // aren't clearing the screen properly for fish)\n        let output = output.replace(\"\\nCOMPLETING argument\\n\", \"\\n\");\n        Ok(output)\n    }\n}\n\n#[cfg(feature = \"unstable-shell-tests\")]\npub(crate) fn has_command(command: &str) -> bool {\n    let output = match std::process::Command::new(command)\n        .arg(\"--version\")\n        .output()\n    {\n        Ok(output) => output,\n        Err(e) => {\n            // CI is expected to support all of the commands\n            if is_ci() && cfg!(target_os = \"linux\") {\n                panic!(\"expected command `{command}` to be somewhere in PATH: {e}\");\n            }\n            return false;\n        }\n    };\n    if !output.status.success() {\n        panic!(\n            \"expected command `{}` to be runnable, got error {}:\\n\\\n            stderr:{}\\n\\\n            stdout:{}\\n\",\n            command,\n            output.status,\n            String::from_utf8_lossy(&output.stderr),\n            String::from_utf8_lossy(&output.stdout)\n        );\n    }\n    let stdout = String::from_utf8_lossy(&output.stdout);\n    println!(\n        \"$ {command} --version\n{stdout}\"\n    );\n    if cfg!(target_os = \"macos\") && stdout.starts_with(\"GNU bash, version 3\") {\n        return false;\n    }\n    if cfg!(target_os = \"macos\") && command == \"zsh\" {\n        // HACK: At least on CI, the prompt override is not working\n        return false;\n    }\n\n    true\n}\n\n/// Whether or not this running in a Continuous Integration environment.\n#[cfg(feature = \"unstable-shell-tests\")]\nfn is_ci() -> bool {\n    // Consider using `tracked_env` instead of option_env! when it is stabilized.\n    // `tracked_env` will handle changes, but not require rebuilding the macro\n    // itself like option_env does.\n    option_env!(\"CI\").is_some() || option_env!(\"TF_BUILD\").is_some()\n}\n"
  },
  {
    "path": "clap_complete_nushell/tests/completion.rs",
    "content": "#![cfg(feature = \"unstable-shell-tests\")]\n\nmod common;\n\nuse snapbox::assert_data_eq;\n\n#[test]\nfn register_completion() {\n    common::register_example::<completest_nu::NuRuntimeBuilder>(\"static\", \"test\");\n}\n\n#[test]\nfn completion() {\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<completest_nu::NuRuntimeBuilder>(\"static\", \"test\");\n\n    let input = \"test -\\t\";\n    let expected = r#\"% test -\n--generate    generate\n--global    everywhere\n--help    Print help\n--version    Print version\n-V    Print version\n-h    Print help\n\"#;\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"test action -\\t\";\n    let expected = r#\"% test action -\n--choice    enum\n--count    number\n--global    everywhere\n--help    Print help\n--set    value\n--set-true    bool\n--version    Print version\n-V    Print version\n-h    Print help\n\"#;\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n\n#[test]\nfn completion_value_hint() {\n    let term = completest::Term::new();\n    let mut runtime = common::load_runtime::<completest_nu::NuRuntimeBuilder>(\"static\", \"test\");\n\n    let input = \"test hint -\\t\";\n    let expected = r#\"% test hint -\n--choice\n--cmd\n--cmd-name\n--dir\n--email\n--exe\n--file\n--global    everywhere\n--help    Print help\n--host\n--other\n--path\n--unknown\n--url\n--user\n--version    Print version\n-H\n-V    Print version\n-c\n-d\n-e\n-f\n-h    Print help\n-p\n-u\n\"#;\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n\n    let input = \"test hint --choice \\t\";\n    let expected = r#\"% test hint --choice \nbash\nfish\nzsh\n\"#;\n    let actual = runtime.complete(input, &term).unwrap();\n    assert_data_eq!(actual, expected);\n}\n"
  },
  {
    "path": "clap_complete_nushell/tests/nushell.rs",
    "content": "mod common;\n\n#[test]\nfn basic() {\n    let name = \"my-app\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(\n        snapbox::file![\"snapshots/basic.nu\"],\n        clap_complete_nushell::Nushell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn feature_sample() {\n    let name = \"my-app\";\n    let cmd = common::feature_sample_command(name);\n    common::assert_matches(\n        snapbox::file![\"snapshots/feature_sample.nu\"],\n        clap_complete_nushell::Nushell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn special_commands() {\n    let name = \"my-app\";\n    let cmd = common::special_commands_command(name);\n    common::assert_matches(\n        snapbox::file![\"snapshots/special_commands.nu\"],\n        clap_complete_nushell::Nushell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn quoting() {\n    let name = \"my-app\";\n    let cmd = common::quoting_command(name);\n    common::assert_matches(\n        snapbox::file![\"snapshots/quoting.nu\"],\n        clap_complete_nushell::Nushell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn aliases() {\n    let name = \"my-app\";\n    let cmd = common::aliases_command(name);\n    common::assert_matches(\n        snapbox::file![\"snapshots/aliases.nu\"],\n        clap_complete_nushell::Nushell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn sub_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::sub_subcommands_command(name);\n    common::assert_matches(\n        snapbox::file![\"snapshots/sub_subcommands.nu\"],\n        clap_complete_nushell::Nushell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn value_hint() {\n    let name = \"my-app\";\n    let cmd = common::value_hint_command(name);\n    common::assert_matches(\n        snapbox::file![\"snapshots/value_hint.nu\"],\n        clap_complete_nushell::Nushell,\n        cmd,\n        name,\n    );\n}\n\n#[test]\nfn positional_index() {\n    let name = \"my-app\";\n    let cmd = common::positional_index_command(name);\n    common::assert_matches(\n        snapbox::file![\"snapshots/positional_index.nu\"],\n        clap_complete_nushell::Nushell,\n        cmd,\n        name,\n    );\n}\n"
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/aliases.nu",
    "content": "module completions {\n\n  # testing nushell completions\n  export extern my-app [\n    --flag(-f)                # cmd flag\n    --flg                     # cmd flag\n    -F                        # cmd flag\n    --option(-o): string      # cmd option\n    --opt: string             # cmd option\n    -O: string                # cmd option\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    positional?: string\n  ]\n\n}\n\nexport use completions *\n"
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/basic.nu",
    "content": "module completions {\n\n  export extern my-app [\n    -c\n    -v\n    --help(-h)                # Print help\n  ]\n\n  # Subcommand with a second line\n  export extern \"my-app test\" [\n    -d\n    -c\n    --help(-h)                # Print help\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help\" [\n  ]\n\n  # Subcommand with a second line\n  export extern \"my-app help test\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help help\" [\n  ]\n\n}\n\nexport use completions *\n"
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/feature_sample.nu",
    "content": "module completions {\n\n  def \"nu-complete my-app choice\" [] {\n    [ \"first\" \"second\" ]\n  }\n\n  # Tests completions\n  export extern my-app [\n    --config(-c)              # some config file with another line\n    --conf                    # some config file with another line\n    -C                        # some config file with another line\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    file?: path               # some input file\n    choice?: string@\"nu-complete my-app choice\"\n  ]\n\n  # tests things\n  export extern \"my-app test\" [\n    --case: string            # the case to test\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help\" [\n  ]\n\n  # tests things\n  export extern \"my-app help test\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help help\" [\n  ]\n\n}\n\nexport use completions *\n"
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/home/static/test/nu/.config/nushell/completions/test.nu",
    "content": "module completions {\n\n  export extern test [\n    --global                  # everywhere\n    --generate: string        # generate\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  def \"nu-complete test action choice\" [] {\n    [ \"first\" \"second\" ]\n  }\n\n  export extern \"test action\" [\n    --set-true                # bool\n    --set: string             # value\n    --count                   # number\n    --choice: string@\"nu-complete test action choice\" # enum\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  export extern \"test quote\" [\n    --single-quotes           # Can be 'always', 'auto', or 'never'\n    --double-quotes           # Can be \"always\", \"auto\", or \"never\"\n    --backticks               # For more information see `echo test`\n    --backslash               # Avoid '\\n'\n    --brackets                # List packages [filter]\n    --expansions              # Execute the shell command with $SHELL\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # Can be 'always', 'auto', or 'never'\n  export extern \"test quote cmd-single-quotes\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # Can be \"always\", \"auto\", or \"never\"\n  export extern \"test quote cmd-double-quotes\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # For more information see `echo test`\n  export extern \"test quote cmd-backticks\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # Avoid '\\n'\n  export extern \"test quote cmd-backslash\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # List packages [filter]\n  export extern \"test quote cmd-brackets\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # Execute the shell command with $SHELL\n  export extern \"test quote cmd-expansions\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"test quote help\" [\n  ]\n\n  # Can be 'always', 'auto', or 'never'\n  export extern \"test quote help cmd-single-quotes\" [\n  ]\n\n  # Can be \"always\", \"auto\", or \"never\"\n  export extern \"test quote help cmd-double-quotes\" [\n  ]\n\n  # For more information see `echo test`\n  export extern \"test quote help cmd-backticks\" [\n  ]\n\n  # Avoid '\\n'\n  export extern \"test quote help cmd-backslash\" [\n  ]\n\n  # List packages [filter]\n  export extern \"test quote help cmd-brackets\" [\n  ]\n\n  # Execute the shell command with $SHELL\n  export extern \"test quote help cmd-expansions\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"test quote help help\" [\n  ]\n\n  export extern \"test value\" [\n    --delim: string\n    --tuple: string\n    --require-eq: string\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    ...term: string\n  ]\n\n  export extern \"test pacman\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  export extern \"test pacman one\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  export extern \"test pacman two\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"test pacman help\" [\n  ]\n\n  export extern \"test pacman help one\" [\n  ]\n\n  export extern \"test pacman help two\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"test pacman help help\" [\n  ]\n\n  export extern \"test last\" [\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    first?: string\n    free?: string\n  ]\n\n  export extern \"test alias\" [\n    --flag(-f)                # cmd flag\n    --flg                     # cmd flag\n    -F                        # cmd flag\n    --option(-o): string      # cmd option\n    --opt: string             # cmd option\n    -O: string                # cmd option\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    positional?: string\n  ]\n\n  def \"nu-complete test hint choice\" [] {\n    [ \"bash\" \"fish\" \"zsh\" ]\n  }\n\n  export extern \"test hint\" [\n    --choice: string@\"nu-complete test hint choice\"\n    --unknown: string\n    --other: string\n    --path(-p): path\n    --file(-f): path\n    --dir(-d): path\n    --exe(-e): path\n    --cmd-name: string\n    --cmd(-c): string\n    --user(-u): string\n    --host(-H): string\n    --url: string\n    --email: string\n    --global                  # everywhere\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    command_with_args?: string\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"test help\" [\n  ]\n\n  export extern \"test help action\" [\n  ]\n\n  export extern \"test help quote\" [\n  ]\n\n  # Can be 'always', 'auto', or 'never'\n  export extern \"test help quote cmd-single-quotes\" [\n  ]\n\n  # Can be \"always\", \"auto\", or \"never\"\n  export extern \"test help quote cmd-double-quotes\" [\n  ]\n\n  # For more information see `echo test`\n  export extern \"test help quote cmd-backticks\" [\n  ]\n\n  # Avoid '\\n'\n  export extern \"test help quote cmd-backslash\" [\n  ]\n\n  # List packages [filter]\n  export extern \"test help quote cmd-brackets\" [\n  ]\n\n  # Execute the shell command with $SHELL\n  export extern \"test help quote cmd-expansions\" [\n  ]\n\n  export extern \"test help value\" [\n  ]\n\n  export extern \"test help pacman\" [\n  ]\n\n  export extern \"test help pacman one\" [\n  ]\n\n  export extern \"test help pacman two\" [\n  ]\n\n  export extern \"test help last\" [\n  ]\n\n  export extern \"test help alias\" [\n  ]\n\n  export extern \"test help hint\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"test help help\" [\n  ]\n\n}\n\nexport use completions *\n"
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/home/static/test/nu/.config/nushell/config.nu",
    "content": ""
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/positional_index.nu",
    "content": "module completions {\n\n  # Tests positional argument index ordering\n  export extern my-app [\n    --flag(-f)                # some flag\n    --option(-o): string      # some option\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    first?: string            # first positional\n    second?: string           # second positional\n    third?: string            # third positional\n  ]\n\n}\n\nexport use completions *\n"
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/quoting.nu",
    "content": "module completions {\n\n  export extern my-app [\n    --single-quotes           # Can be 'always', 'auto', or 'never'\n    --double-quotes           # Can be \"always\", \"auto\", or \"never\"\n    --backticks               # For more information see `echo test`\n    --backslash               # Avoid '\\n'\n    --brackets                # List packages [filter]\n    --expansions              # Execute the shell command with $SHELL\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # Can be 'always', 'auto', or 'never'\n  export extern \"my-app cmd-single-quotes\" [\n    --help(-h)                # Print help\n  ]\n\n  # Can be \"always\", \"auto\", or \"never\"\n  export extern \"my-app cmd-double-quotes\" [\n    --help(-h)                # Print help\n  ]\n\n  # For more information see `echo test`\n  export extern \"my-app cmd-backticks\" [\n    --help(-h)                # Print help\n  ]\n\n  # Avoid '\\n'\n  export extern \"my-app cmd-backslash\" [\n    --help(-h)                # Print help\n  ]\n\n  # List packages [filter]\n  export extern \"my-app cmd-brackets\" [\n    --help(-h)                # Print help\n  ]\n\n  # Execute the shell command with $SHELL\n  export extern \"my-app cmd-expansions\" [\n    --help(-h)                # Print help\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help\" [\n  ]\n\n  # Can be 'always', 'auto', or 'never'\n  export extern \"my-app help cmd-single-quotes\" [\n  ]\n\n  # Can be \"always\", \"auto\", or \"never\"\n  export extern \"my-app help cmd-double-quotes\" [\n  ]\n\n  # For more information see `echo test`\n  export extern \"my-app help cmd-backticks\" [\n  ]\n\n  # Avoid '\\n'\n  export extern \"my-app help cmd-backslash\" [\n  ]\n\n  # List packages [filter]\n  export extern \"my-app help cmd-brackets\" [\n  ]\n\n  # Execute the shell command with $SHELL\n  export extern \"my-app help cmd-expansions\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help help\" [\n  ]\n\n}\n\nexport use completions *\n"
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/special_commands.nu",
    "content": "module completions {\n\n  def \"nu-complete my-app choice\" [] {\n    [ \"first\" \"second\" ]\n  }\n\n  # Tests completions\n  export extern my-app [\n    --config(-c)              # some config file with another line\n    --conf                    # some config file with another line\n    -C                        # some config file with another line\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    file?: path               # some input file\n    choice?: string@\"nu-complete my-app choice\"\n  ]\n\n  # tests things\n  export extern \"my-app test\" [\n    --case: string            # the case to test\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # tests other things\n  export extern \"my-app some_cmd\" [\n    --config: string          # the other case to test\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    ...path: string\n  ]\n\n  export extern \"my-app some-cmd-with-hyphens\" [\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  export extern \"my-app some-hidden-cmd\" [\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help\" [\n  ]\n\n  # tests things\n  export extern \"my-app help test\" [\n  ]\n\n  # tests other things\n  export extern \"my-app help some_cmd\" [\n  ]\n\n  export extern \"my-app help some-cmd-with-hyphens\" [\n  ]\n\n  export extern \"my-app help some-hidden-cmd\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help help\" [\n  ]\n\n}\n\nexport use completions *\n"
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/sub_subcommands.nu",
    "content": "module completions {\n\n  def \"nu-complete my-app choice\" [] {\n    [ \"first\" \"second\" ]\n  }\n\n  # Tests completions\n  export extern my-app [\n    --config(-c)              # some config file with another line\n    --conf                    # some config file with another line\n    -C                        # some config file with another line\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n    file?: path               # some input file\n    choice?: string@\"nu-complete my-app choice\"\n  ]\n\n  # tests things\n  export extern \"my-app test\" [\n    --case: string            # the case to test\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  # top level subcommand\n  export extern \"my-app some_cmd\" [\n    --help(-h)                # Print help\n    --version(-V)             # Print version\n  ]\n\n  def \"nu-complete my-app some_cmd sub_cmd config\" [] {\n    [ \"\\\"Lest quotes, aren't escaped.\\\"\" \"\\\"Second to trigger display of options\\\"\" ]\n  }\n\n  # sub-subcommand\n  export extern \"my-app some_cmd sub_cmd\" [\n    --config: string@\"nu-complete my-app some_cmd sub_cmd config\" # the other case to test\n    --help(-h)                # Print help (see more with '--help')\n    --version(-V)             # Print version\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app some_cmd help\" [\n  ]\n\n  # sub-subcommand\n  export extern \"my-app some_cmd help sub_cmd\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app some_cmd help help\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help\" [\n  ]\n\n  # tests things\n  export extern \"my-app help test\" [\n  ]\n\n  # top level subcommand\n  export extern \"my-app help some_cmd\" [\n  ]\n\n  # sub-subcommand\n  export extern \"my-app help some_cmd sub_cmd\" [\n  ]\n\n  # Print this message or the help of the given subcommand(s)\n  export extern \"my-app help help\" [\n  ]\n\n}\n\nexport use completions *\n"
  },
  {
    "path": "clap_complete_nushell/tests/snapshots/value_hint.nu",
    "content": "module completions {\n\n  def \"nu-complete my-app choice\" [] {\n    [ \"bash\" \"fish\" \"zsh\" ]\n  }\n\n  export extern my-app [\n    --choice: string@\"nu-complete my-app choice\"\n    --unknown: string\n    --other: string\n    --path(-p): path\n    --file(-f): path\n    --dir(-d): path\n    --exe(-e): path\n    --cmd-name: string\n    --cmd(-c): string\n    --user(-u): string\n    --host(-H): string\n    --url: string\n    --email: string\n    --help(-h)                # Print help\n    command_with_args?: string\n  ]\n\n}\n\nexport use completions *\n"
  },
  {
    "path": "clap_derive/CONTRIBUTING.md",
    "content": "# How to Contribute\n\nSee the [clap-wide CONTRIBUTING.md](../CONTRIBUTING.md).  This will contain `clap_derive` specific notes.\n\n## Derive Gotchas\n\n- Always prefix generated variables with `__clap_` to minimize clashes with the user's variables, see [#2934](https://github.com/clap-rs/clap/issues/2934).\n- Prefer the path `clap` over `::clap` to allow users to re-export clap, see [#2258](https://github.com/clap-rs/clap/pull/2258).\n- Prefer substituting variable names to avoid problems with `macro_rules`, see [#2823](https://github.com/clap-rs/clap/pull/2823).\n- Prefer `::std::result::Result` and `::std::option::Option`, see [#3092](https://github.com/clap-rs/clap/pull/3092).\n- Put whitespace between `#quoted #variables`.\n- New \"magic\" attributes must be documented in the [derive reference](../src/_derive.rs)\n  - If there is no related builder method, a `#![doc(alias = \"\")]` should also be added, see [#4984](https://github.com/clap-rs/clap/pull/4984)\n"
  },
  {
    "path": "clap_derive/Cargo.toml",
    "content": "[package]\nname = \"clap_derive\"\nversion = \"4.6.0\"\ndescription = \"Parse command line argument by defining a struct, derive crate.\"\ncategories = [\"command-line-interface\", \"development-tools::procedural-macro-helpers\"]\nkeywords = [\n  \"clap\",\n  \"cli\",\n  \"parse\",\n  \"derive\",\n  \"proc_macro\"\n]\nrepository.workspace = true\nlicense.workspace = true\nedition.workspace = true\nrust-version.workspace = true\ninclude.workspace = true\n\n[package.metadata.docs.rs]\ntargets = [\"x86_64-unknown-linux-gnu\"]\nrustdoc-args = [\"--generate-link-to-definition\"]\n\n[package.metadata.release]\nshared-version = true\ndependent-version = \"upgrade\"\ntag-name = \"v{{version}}\"\n\n[lib]\nproc-macro = true\nbench = false\n\n[dependencies]\nsyn = { version = \"2.0.117\", features = [\"full\"] }\nquote = \"1.0.45\"\nproc-macro2 = \"1.0.106\"\nheck = \"0.5.0\"\npulldown-cmark = { version = \"0.13.1\", default-features = false, optional = true}\nanstyle = {version =\"1.0.13\", optional = true}\n\n[features]\ndefault = []\ndebug = []\nunstable-v5 = [\"deprecated\"]\ndeprecated = []\nraw-deprecated = [\"deprecated\"]\nunstable-markdown = [\"dep:pulldown-cmark\", \"dep:anstyle\"]\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "clap_derive/README.md",
    "content": "# `clap_derive`\n\nMacro implementation for clap's derives.\n\n[docs.rs](https://docs.rs/clap)\n- [Derive Tutorial](https://docs.rs/clap/latest/clap/_derive/_tutorial/index.html)\n- [Derive Reference](https://docs.rs/clap/latest/clap/_derive/index.html)\n\n## License\n\nLicensed under either of\n\n* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or <https://www.apache.org/licenses/LICENSE-2.0>)\n* MIT license ([LICENSE-MIT](LICENSE-MIT) or <https://opensource.org/license/mit>)\n\nat your option.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally\nsubmitted for inclusion in the work by you, as defined in the Apache-2.0\nlicense, shall be dual-licensed as above, without any additional terms or\nconditions.\n\nSee [CONTRIBUTING](CONTRIBUTING.md) for more details.\n"
  },
  {
    "path": "clap_derive/src/attr.rs",
    "content": "use std::iter::FromIterator;\n\nuse proc_macro2::TokenStream;\nuse quote::ToTokens;\nuse quote::quote;\nuse syn::spanned::Spanned;\nuse syn::{\n    Attribute, Expr, Ident, LitStr, Token, parenthesized,\n    parse::{Parse, ParseStream},\n    punctuated::Punctuated,\n};\n\nuse crate::utils::Sp;\n\n#[derive(Clone)]\npub(crate) struct ClapAttr {\n    pub(crate) kind: Sp<AttrKind>,\n    pub(crate) name: Ident,\n    pub(crate) magic: Option<MagicAttrName>,\n    pub(crate) value: Option<AttrValue>,\n}\n\nimpl ClapAttr {\n    pub(crate) fn parse_all(all_attrs: &[Attribute]) -> Result<Vec<Self>, syn::Error> {\n        let mut parsed = Vec::new();\n        for attr in all_attrs {\n            let kind = if attr.path().is_ident(\"clap\") {\n                Sp::new(AttrKind::Clap, attr.path().span())\n            } else if attr.path().is_ident(\"structopt\") {\n                Sp::new(AttrKind::StructOpt, attr.path().span())\n            } else if attr.path().is_ident(\"command\") {\n                Sp::new(AttrKind::Command, attr.path().span())\n            } else if attr.path().is_ident(\"group\") {\n                Sp::new(AttrKind::Group, attr.path().span())\n            } else if attr.path().is_ident(\"arg\") {\n                Sp::new(AttrKind::Arg, attr.path().span())\n            } else if attr.path().is_ident(\"value\") {\n                Sp::new(AttrKind::Value, attr.path().span())\n            } else {\n                continue;\n            };\n            for mut attr in\n                attr.parse_args_with(Punctuated::<ClapAttr, Token![,]>::parse_terminated)?\n            {\n                attr.kind = kind;\n                parsed.push(attr);\n            }\n        }\n        Ok(parsed)\n    }\n\n    pub(crate) fn value_or_abort(&self) -> Result<&AttrValue, syn::Error> {\n        self.value\n            .as_ref()\n            .ok_or_else(|| format_err!(self.name, \"attribute `{}` requires a value\", self.name))\n    }\n\n    pub(crate) fn lit_str_or_abort(&self) -> Result<&LitStr, syn::Error> {\n        let value = self.value_or_abort()?;\n        match value {\n            AttrValue::LitStr(tokens) => Ok(tokens),\n            AttrValue::Expr(_) | AttrValue::Call(_) => {\n                abort!(\n                    self.name,\n                    \"attribute `{}` can only accept string literals\",\n                    self.name\n                )\n            }\n        }\n    }\n}\n\nimpl Parse for ClapAttr {\n    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {\n        let name: Ident = input.parse()?;\n        let name_str = name.to_string();\n\n        let magic = match name_str.as_str() {\n            \"rename_all\" => Some(MagicAttrName::RenameAll),\n            \"rename_all_env\" => Some(MagicAttrName::RenameAllEnv),\n            \"skip\" => Some(MagicAttrName::Skip),\n            \"next_display_order\" => Some(MagicAttrName::NextDisplayOrder),\n            \"next_help_heading\" => Some(MagicAttrName::NextHelpHeading),\n            \"default_value_t\" => Some(MagicAttrName::DefaultValueT),\n            \"default_values_t\" => Some(MagicAttrName::DefaultValuesT),\n            \"default_value_os_t\" => Some(MagicAttrName::DefaultValueOsT),\n            \"default_values_os_t\" => Some(MagicAttrName::DefaultValuesOsT),\n            \"long\" => Some(MagicAttrName::Long),\n            \"short\" => Some(MagicAttrName::Short),\n            \"value_parser\" => Some(MagicAttrName::ValueParser),\n            \"action\" => Some(MagicAttrName::Action),\n            \"env\" => Some(MagicAttrName::Env),\n            \"flatten\" => Some(MagicAttrName::Flatten),\n            \"value_enum\" => Some(MagicAttrName::ValueEnum),\n            \"from_global\" => Some(MagicAttrName::FromGlobal),\n            \"subcommand\" => Some(MagicAttrName::Subcommand),\n            \"external_subcommand\" => Some(MagicAttrName::ExternalSubcommand),\n            \"verbatim_doc_comment\" => Some(MagicAttrName::VerbatimDocComment),\n            \"about\" => Some(MagicAttrName::About),\n            \"long_about\" => Some(MagicAttrName::LongAbout),\n            \"long_help\" => Some(MagicAttrName::LongHelp),\n            \"author\" => Some(MagicAttrName::Author),\n            \"version\" => Some(MagicAttrName::Version),\n            _ => None,\n        };\n\n        let value = if input.peek(Token![=]) {\n            // `name = value` attributes.\n            let assign_token = input.parse::<Token![=]>()?; // skip '='\n            if input.peek(LitStr) {\n                let lit: LitStr = input.parse()?;\n                Some(AttrValue::LitStr(lit))\n            } else {\n                match input.parse::<Expr>() {\n                    Ok(expr) => Some(AttrValue::Expr(expr)),\n\n                    Err(_) => abort! {\n                        assign_token,\n                        \"expected `string literal` or `expression` after `=`\"\n                    },\n                }\n            }\n        } else if input.peek(syn::token::Paren) {\n            // `name(...)` attributes.\n            let nested;\n            parenthesized!(nested in input);\n\n            let method_args: Punctuated<_, _> = nested.parse_terminated(Expr::parse, Token![,])?;\n            Some(AttrValue::Call(Vec::from_iter(method_args)))\n        } else {\n            None\n        };\n\n        Ok(Self {\n            kind: Sp::new(AttrKind::Clap, name.span()),\n            name,\n            magic,\n            value,\n        })\n    }\n}\n\n#[derive(Copy, Clone, PartialEq, Eq)]\npub(crate) enum MagicAttrName {\n    Short,\n    Long,\n    ValueParser,\n    Action,\n    Env,\n    Flatten,\n    ValueEnum,\n    FromGlobal,\n    Subcommand,\n    VerbatimDocComment,\n    ExternalSubcommand,\n    About,\n    LongAbout,\n    LongHelp,\n    Author,\n    Version,\n    RenameAllEnv,\n    RenameAll,\n    Skip,\n    DefaultValueT,\n    DefaultValuesT,\n    DefaultValueOsT,\n    DefaultValuesOsT,\n    NextDisplayOrder,\n    NextHelpHeading,\n}\n\n#[derive(Clone)]\n#[allow(clippy::large_enum_variant)]\npub(crate) enum AttrValue {\n    LitStr(LitStr),\n    Expr(Expr),\n    Call(Vec<Expr>),\n}\n\nimpl ToTokens for AttrValue {\n    fn to_tokens(&self, tokens: &mut TokenStream) {\n        match self {\n            Self::LitStr(t) => t.to_tokens(tokens),\n            Self::Expr(t) => t.to_tokens(tokens),\n            Self::Call(t) => {\n                let t = quote!(#(#t),*);\n                t.to_tokens(tokens);\n            }\n        }\n    }\n}\n\n#[derive(Copy, Clone, PartialEq, Eq)]\npub(crate) enum AttrKind {\n    Clap,\n    StructOpt,\n    Command,\n    Group,\n    Arg,\n    Value,\n}\n\nimpl AttrKind {\n    pub(crate) fn as_str(&self) -> &'static str {\n        match self {\n            Self::Clap => \"clap\",\n            Self::StructOpt => \"structopt\",\n            Self::Command => \"command\",\n            Self::Group => \"group\",\n            Self::Arg => \"arg\",\n            Self::Value => \"value\",\n        }\n    }\n}\n"
  },
  {
    "path": "clap_derive/src/derives/args.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse proc_macro2::{Ident, Span, TokenStream};\nuse quote::{format_ident, quote, quote_spanned};\nuse syn::{\n    Data, DataStruct, DeriveInput, Field, Fields, FieldsNamed, Generics, punctuated::Punctuated,\n    spanned::Spanned, token::Comma,\n};\n\nuse crate::item::{Item, Kind, Name};\nuse crate::utils::{Sp, Ty, inner_type, sub_type};\n\npub(crate) fn derive_args(input: &DeriveInput) -> Result<TokenStream, syn::Error> {\n    let ident = &input.ident;\n\n    match input.data {\n        Data::Struct(DataStruct {\n            fields: Fields::Named(ref fields),\n            ..\n        }) => {\n            let name = Name::Derived(ident.clone());\n            let item = Item::from_args_struct(input, name)?;\n            let fields = collect_args_fields(&item, fields)?;\n            gen_for_struct(&item, ident, &input.generics, &fields)\n        }\n        Data::Struct(DataStruct {\n            fields: Fields::Unit,\n            ..\n        }) => {\n            let name = Name::Derived(ident.clone());\n            let item = Item::from_args_struct(input, name)?;\n            let fields = Punctuated::<Field, Comma>::new();\n            let fields = fields\n                .iter()\n                .map(|field| {\n                    let item = Item::from_args_field(field, item.casing(), item.env_casing())?;\n                    Ok((field, item))\n                })\n                .collect::<Result<Vec<_>, syn::Error>>()?;\n            gen_for_struct(&item, ident, &input.generics, &fields)\n        }\n        _ => abort_call_site!(\"`#[derive(Args)]` only supports non-tuple structs\"),\n    }\n}\n\npub(crate) fn gen_for_struct(\n    item: &Item,\n    item_name: &Ident,\n    generics: &Generics,\n    fields: &[(&Field, Item)],\n) -> Result<TokenStream, syn::Error> {\n    if !matches!(&*item.kind(), Kind::Command(_)) {\n        abort! { item.kind().span(),\n            \"`{}` cannot be used with `#[command]`\",\n            item.kind().name(),\n        }\n    }\n\n    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();\n\n    let constructor = gen_constructor(fields)?;\n    let updater = gen_updater(fields, true)?;\n    let raw_deprecated = raw_deprecated();\n\n    let app_var = Ident::new(\"__clap_app\", Span::call_site());\n    let augmentation = gen_augment(fields, &app_var, item, false)?;\n    let augmentation_update = gen_augment(fields, &app_var, item, true)?;\n\n    let group_id = if item.skip_group() {\n        quote!(None)\n    } else {\n        let group_id = item.group_id();\n        quote!(Some(clap::Id::from(#group_id)))\n    };\n\n    Ok(quote! {\n        #[allow(\n            dead_code,\n            unreachable_code,\n            unused_variables,\n            unused_braces,\n            unused_qualifications,\n        )]\n        #[allow(\n            clippy::style,\n            clippy::complexity,\n            clippy::pedantic,\n            clippy::restriction,\n            clippy::perf,\n            clippy::deprecated,\n            clippy::nursery,\n            clippy::cargo,\n            clippy::suspicious_else_formatting,\n            clippy::almost_swapped,\n            clippy::redundant_locals,\n        )]\n        #[automatically_derived]\n        impl #impl_generics clap::FromArgMatches for #item_name #ty_generics #where_clause {\n            fn from_arg_matches(__clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {\n                Self::from_arg_matches_mut(&mut __clap_arg_matches.clone())\n            }\n\n            fn from_arg_matches_mut(__clap_arg_matches: &mut clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {\n                #raw_deprecated\n                let v = #item_name #constructor;\n                ::std::result::Result::Ok(v)\n            }\n\n            fn update_from_arg_matches(&mut self, __clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<(), clap::Error> {\n                self.update_from_arg_matches_mut(&mut __clap_arg_matches.clone())\n            }\n\n            fn update_from_arg_matches_mut(&mut self, __clap_arg_matches: &mut clap::ArgMatches) -> ::std::result::Result<(), clap::Error> {\n                #raw_deprecated\n                #updater\n                ::std::result::Result::Ok(())\n            }\n        }\n\n        #[allow(\n            dead_code,\n            unreachable_code,\n            unused_variables,\n            unused_braces,\n            unused_qualifications,\n        )]\n        #[allow(\n            clippy::style,\n            clippy::complexity,\n            clippy::pedantic,\n            clippy::restriction,\n            clippy::perf,\n            clippy::deprecated,\n            clippy::nursery,\n            clippy::cargo,\n            clippy::suspicious_else_formatting,\n            clippy::almost_swapped,\n            clippy::redundant_locals,\n        )]\n        #[automatically_derived]\n        impl #impl_generics clap::Args for #item_name #ty_generics #where_clause {\n            fn group_id() -> Option<clap::Id> {\n                #group_id\n            }\n            fn augment_args<'b>(#app_var: clap::Command) -> clap::Command {\n                #augmentation\n            }\n            fn augment_args_for_update<'b>(#app_var: clap::Command) -> clap::Command {\n                #augmentation_update\n            }\n        }\n    })\n}\n\n/// Generate a block of code to add arguments/subcommands corresponding to\n/// the `fields` to an cmd.\npub(crate) fn gen_augment(\n    fields: &[(&Field, Item)],\n    app_var: &Ident,\n    parent_item: &Item,\n    override_required: bool,\n) -> Result<TokenStream, syn::Error> {\n    let mut subcommand_specified = false;\n    let mut args = Vec::new();\n    for (field, item) in fields {\n        let kind = item.kind();\n        let genned = match &*kind {\n            Kind::Command(_)\n            | Kind::Value\n            | Kind::Skip(_, _)\n            | Kind::FromGlobal(_)\n            | Kind::ExternalSubcommand => None,\n            Kind::Subcommand(ty) => {\n                if subcommand_specified {\n                    abort!(\n                        field.span(),\n                        \"`#[command(subcommand)]` can only be used once per container\"\n                    );\n                }\n                subcommand_specified = true;\n\n                let subcmd_type = match (**ty, sub_type(&field.ty)) {\n                    (Ty::Option, Some(sub_type)) => sub_type,\n                    _ => &field.ty,\n                };\n                let implicit_methods = if **ty == Ty::Option {\n                    quote!()\n                } else {\n                    quote_spanned! { kind.span()=>\n                        .subcommand_required(true)\n                        .arg_required_else_help(true)\n                    }\n                };\n\n                let override_methods = if override_required {\n                    quote_spanned! { kind.span()=>\n                        .subcommand_required(false)\n                        .arg_required_else_help(false)\n                    }\n                } else {\n                    quote!()\n                };\n\n                Some(quote! {\n                    let #app_var = <#subcmd_type as clap::Subcommand>::augment_subcommands( #app_var );\n                    let #app_var = #app_var\n                        #implicit_methods\n                        #override_methods;\n                })\n            }\n            Kind::Flatten(ty) => {\n                let inner_type = match (**ty, sub_type(&field.ty)) {\n                    (Ty::Option, Some(sub_type)) => sub_type,\n                    _ => &field.ty,\n                };\n\n                let next_help_heading = item.next_help_heading();\n                let next_display_order = item.next_display_order();\n                let flatten_group_assert = if matches!(**ty, Ty::Option) {\n                    quote_spanned! { kind.span()=>\n                        <#inner_type as clap::Args>::group_id().expect(\"cannot `#[flatten]` an `Option<Args>` with `#[group(skip)]`\");\n                    }\n                } else {\n                    quote! {}\n                };\n                if override_required {\n                    Some(quote_spanned! { kind.span()=>\n                        #flatten_group_assert\n                        let #app_var = #app_var\n                            #next_help_heading\n                            #next_display_order;\n                        let #app_var = <#inner_type as clap::Args>::augment_args_for_update(#app_var);\n                    })\n                } else {\n                    Some(quote_spanned! { kind.span()=>\n                        #flatten_group_assert\n                        let #app_var = #app_var\n                            #next_help_heading\n                            #next_display_order;\n                        let #app_var = <#inner_type as clap::Args>::augment_args(#app_var);\n                    })\n                }\n            }\n            Kind::Arg(ty) => {\n                let value_parser = item.value_parser(&field.ty);\n                let action = item.action(&field.ty);\n                let value_name = item.value_name();\n\n                let implicit_methods = match **ty {\n                    Ty::Unit => {\n                        // Leaving out `value_parser` as it will always fail\n                        quote_spanned! { ty.span()=>\n                            .value_name(#value_name)\n                            #action\n                        }\n                    }\n                    Ty::Option => {\n                        quote_spanned! { ty.span()=>\n                            .value_name(#value_name)\n                            #value_parser\n                            #action\n                        }\n                    }\n\n                    Ty::OptionOption => quote_spanned! { ty.span()=>\n                        .value_name(#value_name)\n                        .num_args(0..=1)\n                        #value_parser\n                        #action\n                    },\n\n                    Ty::OptionVec => {\n                        if item.is_positional() {\n                            quote_spanned! { ty.span()=>\n                                .value_name(#value_name)\n                                .num_args(1..)  // action won't be sufficient for getting multiple\n                                #value_parser\n                                #action\n                            }\n                        } else {\n                            quote_spanned! { ty.span()=>\n                                .value_name(#value_name)\n                                #value_parser\n                                #action\n                            }\n                        }\n                    }\n\n                    Ty::Vec => {\n                        if item.is_positional() {\n                            quote_spanned! { ty.span()=>\n                                .value_name(#value_name)\n                                .num_args(1..)  // action won't be sufficient for getting multiple\n                                #value_parser\n                                #action\n                            }\n                        } else {\n                            quote_spanned! { ty.span()=>\n                                .value_name(#value_name)\n                                #value_parser\n                                #action\n                            }\n                        }\n                    }\n\n                    Ty::VecVec | Ty::OptionVecVec => {\n                        quote_spanned! { ty.span() =>\n                            .value_name(#value_name)\n                            #value_parser\n                            #action\n                        }\n                    }\n\n                    Ty::Other => {\n                        let required = item.find_default_method().is_none();\n                        // `ArgAction::takes_values` is assuming `ArgAction::default_value` will be\n                        // set though that won't always be true but this should be good enough,\n                        // otherwise we'll report an \"arg required\" error when unwrapping.\n                        let action_value = action.args();\n                        quote_spanned! { ty.span()=>\n                            .value_name(#value_name)\n                            .required(#required && #action_value.takes_values())\n                            #value_parser\n                            #action\n                        }\n                    }\n                };\n\n                let id = item.id();\n                let explicit_methods = item.field_methods();\n                let deprecations = if !override_required {\n                    item.deprecations()\n                } else {\n                    quote!()\n                };\n                let override_methods = if override_required {\n                    quote_spanned! { kind.span()=>\n                        .required(false)\n                    }\n                } else {\n                    quote!()\n                };\n\n                Some(quote_spanned! { field.span()=>\n                    let #app_var = #app_var.arg({\n                        #deprecations\n\n                        #[allow(deprecated)]\n                        let arg = clap::Arg::new(#id)\n                            #implicit_methods;\n\n                        let arg = arg\n                            #explicit_methods;\n\n                        let arg = arg\n                            #override_methods;\n\n                        arg\n                    });\n                })\n            }\n        };\n        args.push(genned);\n    }\n\n    let deprecations = if !override_required {\n        parent_item.deprecations()\n    } else {\n        quote!()\n    };\n    let initial_app_methods = parent_item.initial_top_level_methods();\n    let final_app_methods = parent_item.final_top_level_methods();\n    let group_app_methods = if parent_item.skip_group() {\n        quote!()\n    } else {\n        let group_id = parent_item.group_id();\n        let literal_group_members = fields\n            .iter()\n            .filter_map(|(_field, item)| {\n                let kind = item.kind();\n                if matches!(*kind, Kind::Arg(_)) {\n                    Some(item.id())\n                } else {\n                    None\n                }\n            })\n            .collect::<Vec<_>>();\n        let literal_group_members_len = literal_group_members.len();\n        let mut literal_group_members = quote! {{\n            let members: [clap::Id; #literal_group_members_len] = [#( clap::Id::from(#literal_group_members) ),* ];\n            members\n        }};\n        // HACK: Validation isn't ready yet for nested arg groups, so just don't populate the group in\n        // that situation\n        let possible_group_members_len = fields\n            .iter()\n            .filter(|(_field, item)| {\n                let kind = item.kind();\n                matches!(*kind, Kind::Flatten(_))\n            })\n            .count();\n        if 0 < possible_group_members_len {\n            literal_group_members = quote! {{\n                let members: [clap::Id; 0] = [];\n                members\n            }};\n        }\n\n        let group_methods = parent_item.group_methods();\n\n        quote!(\n            .group(\n                clap::ArgGroup::new(#group_id)\n                    .multiple(true)\n                    #group_methods\n                    .args(#literal_group_members)\n            )\n        )\n    };\n    Ok(quote! {{\n        #deprecations\n        let #app_var = #app_var\n            #initial_app_methods\n            #group_app_methods\n            ;\n        #( #args )*\n        #app_var #final_app_methods\n    }})\n}\n\npub(crate) fn gen_constructor(fields: &[(&Field, Item)]) -> Result<TokenStream, syn::Error> {\n    let fields = fields.iter().map(|(field, item)| {\n        let field_name = field.ident.as_ref().unwrap();\n        let kind = item.kind();\n        let arg_matches = format_ident!(\"__clap_arg_matches\");\n        let genned = match &*kind {\n            Kind::Command(_)\n            | Kind::Value\n            | Kind::ExternalSubcommand => {\n                abort! { kind.span(),\n                    \"`{}` cannot be used with `#[arg]`\",\n                    kind.name(),\n                }\n            }\n            Kind::Subcommand(ty) => {\n                let subcmd_type = match (**ty, sub_type(&field.ty)) {\n                    (Ty::Option, Some(sub_type)) => sub_type,\n                    _ => &field.ty,\n                };\n                match **ty {\n                    Ty::Option => {\n                        quote_spanned! { kind.span()=>\n                            #field_name: {\n                                if #arg_matches.subcommand_name().map(<#subcmd_type as clap::Subcommand>::has_subcommand).unwrap_or(false) {\n                                    Some(<#subcmd_type as clap::FromArgMatches>::from_arg_matches_mut(#arg_matches)?)\n                                } else {\n                                    None\n                                }\n                            }\n                        }\n                    },\n                    Ty::Other => {\n                        quote_spanned! { kind.span()=>\n                            #field_name: {\n                                <#subcmd_type as clap::FromArgMatches>::from_arg_matches_mut(#arg_matches)?\n                            }\n                        }\n                    },\n                    Ty::Unit |\n                    Ty::Vec |\n                    Ty::OptionOption |\n                    Ty::OptionVec |\n                    Ty::VecVec |\n                    Ty::OptionVecVec => {\n                        abort!(\n                            ty.span(),\n                            \"`{}` is an invalid `#[command(subcommand)]` type\",\n                            ty.as_str()\n                        );\n                    }\n                }\n            }\n\n            Kind::Flatten(ty) => {\n                let inner_type = match (**ty, sub_type(&field.ty)) {\n                    (Ty::Option, Some(sub_type)) => sub_type,\n                    _ => &field.ty,\n                };\n                match **ty {\n                    Ty::Other => {\n                        quote_spanned! { kind.span()=>\n                            #field_name: <#inner_type as clap::FromArgMatches>::from_arg_matches_mut(#arg_matches)?\n                        }\n                    },\n                    Ty::Option => {\n                        quote_spanned! { kind.span()=>\n                            #field_name: {\n                                let group_id = <#inner_type as clap::Args>::group_id()\n                                    .expect(\"asserted during `Arg` creation\");\n                                if #arg_matches.contains_id(group_id.as_str()) {\n                                    Some(\n                                        <#inner_type as clap::FromArgMatches>::from_arg_matches_mut(#arg_matches)?\n                                    )\n                                } else {\n                                    None\n                                }\n                            }\n                        }\n                    },\n                    Ty::Unit |\n                    Ty::Vec |\n                    Ty::OptionOption |\n                    Ty::OptionVec |\n                    Ty::VecVec |\n                    Ty::OptionVecVec => {\n                        abort!(\n                            ty.span(),\n                            \"`{}` is an invalid `#[command(flatten)]` type\",\n                            ty.as_str()\n                        );\n                    }\n                }\n            },\n\n            Kind::Skip(val, _) => match val {\n                None => quote_spanned!(kind.span()=> #field_name: Default::default()),\n                Some(val) => quote_spanned!(kind.span()=> #field_name: (#val).into()),\n            },\n\n            Kind::Arg(ty) | Kind::FromGlobal(ty) => {\n                gen_parsers(item, ty, field_name, field, None)?\n            }\n        };\n        Ok(genned)\n    }).collect::<Result<Vec<_>, syn::Error>>()?;\n\n    Ok(quote! {{\n        #( #fields ),*\n    }})\n}\n\npub(crate) fn gen_updater(\n    fields: &[(&Field, Item)],\n    use_self: bool,\n) -> Result<TokenStream, syn::Error> {\n    let mut genned_fields = Vec::new();\n    for (field, item) in fields {\n        let field_name = field.ident.as_ref().unwrap();\n        let kind = item.kind();\n\n        let access = if use_self {\n            quote! {\n                #[allow(non_snake_case)]\n                let #field_name = &mut self.#field_name;\n            }\n        } else {\n            quote!()\n        };\n        let arg_matches = format_ident!(\"__clap_arg_matches\");\n\n        let genned = match &*kind {\n            Kind::Command(_) | Kind::Value | Kind::ExternalSubcommand => {\n                abort! { kind.span(),\n                    \"`{}` cannot be used with `#[arg]`\",\n                    kind.name(),\n                }\n            }\n            Kind::Subcommand(ty) => {\n                let subcmd_type = match (**ty, sub_type(&field.ty)) {\n                    (Ty::Option, Some(sub_type)) => sub_type,\n                    _ => &field.ty,\n                };\n\n                let updater = quote_spanned! { ty.span()=>\n                    <#subcmd_type as clap::FromArgMatches>::update_from_arg_matches_mut(#field_name, #arg_matches)?;\n                };\n\n                let updater = match **ty {\n                    Ty::Option => quote_spanned! { kind.span()=>\n                        if let Some(#field_name) = #field_name.as_mut() {\n                            #updater\n                        } else {\n                            *#field_name = Some(<#subcmd_type as clap::FromArgMatches>::from_arg_matches_mut(\n                                #arg_matches\n                            )?);\n                        }\n                    },\n                    _ => quote_spanned! { kind.span()=>\n                        #updater\n                    },\n                };\n\n                quote_spanned! { kind.span()=>\n                    {\n                        #access\n                        #updater\n                    }\n                }\n            }\n\n            Kind::Flatten(ty) => {\n                let inner_type = match (**ty, sub_type(&field.ty)) {\n                    (Ty::Option, Some(sub_type)) => sub_type,\n                    _ => &field.ty,\n                };\n\n                let updater = quote_spanned! { ty.span()=>\n                    <#inner_type as clap::FromArgMatches>::update_from_arg_matches_mut(#field_name, #arg_matches)?;\n                };\n\n                let updater = match **ty {\n                    Ty::Option => quote_spanned! { kind.span()=>\n                        if let Some(#field_name) = #field_name.as_mut() {\n                            #updater\n                        } else {\n                            *#field_name = Some(<#inner_type as clap::FromArgMatches>::from_arg_matches_mut(\n                                #arg_matches\n                            )?);\n                        }\n                    },\n                    _ => quote_spanned! { kind.span()=>\n                        #updater\n                    },\n                };\n\n                quote_spanned! { kind.span()=>\n                    {\n                        #access\n                        #updater\n                    }\n                }\n            }\n\n            Kind::Skip(_, _) => quote!(),\n\n            Kind::Arg(ty) | Kind::FromGlobal(ty) => {\n                gen_parsers(item, ty, field_name, field, Some(&access))?\n            }\n        };\n        genned_fields.push(genned);\n    }\n\n    Ok(quote! {\n        #( #genned_fields )*\n    })\n}\n\nfn gen_parsers(\n    item: &Item,\n    ty: &Sp<Ty>,\n    field_name: &Ident,\n    field: &Field,\n    update: Option<&TokenStream>,\n) -> Result<TokenStream, syn::Error> {\n    let span = ty.span();\n    let convert_type = inner_type(&field.ty);\n    let id = item.id();\n    let get_one = quote_spanned!(span=> remove_one::<#convert_type>);\n    let get_many = quote_spanned!(span=> remove_many::<#convert_type>);\n    let get_occurrences = quote_spanned!(span=> remove_occurrences::<#convert_type>);\n\n    // Give this identifier the same hygiene\n    // as the `arg_matches` parameter definition. This\n    // allows us to refer to `arg_matches` within a `quote_spanned` block\n    let arg_matches = format_ident!(\"__clap_arg_matches\");\n\n    let field_value = match **ty {\n        Ty::Unit => {\n            quote_spanned! { ty.span()=>\n                ()\n            }\n        }\n\n        Ty::Option => {\n            quote_spanned! { ty.span()=>\n                #arg_matches.#get_one(#id)\n            }\n        }\n\n        Ty::OptionOption => quote_spanned! { ty.span()=>\n            if #arg_matches.contains_id(#id) {\n                Some(\n                    #arg_matches.#get_one(#id)\n                )\n            } else {\n                None\n            }\n        },\n\n        Ty::OptionVec => quote_spanned! { ty.span()=>\n            if #arg_matches.contains_id(#id) {\n                Some(#arg_matches.#get_many(#id)\n                    .map(|v| v.collect::<Vec<_>>())\n                    .unwrap_or_else(Vec::new))\n            } else {\n                None\n            }\n        },\n\n        Ty::Vec => {\n            quote_spanned! { ty.span()=>\n                #arg_matches.#get_many(#id)\n                    .map(|v| v.collect::<Vec<_>>())\n                    .unwrap_or_else(Vec::new)\n            }\n        }\n\n        Ty::VecVec => quote_spanned! { ty.span()=>\n            #arg_matches.#get_occurrences(#id)\n                .map(|g| g.map(::std::iter::Iterator::collect).collect::<Vec<Vec<_>>>())\n                .unwrap_or_else(Vec::new)\n        },\n\n        Ty::OptionVecVec => quote_spanned! { ty.span()=>\n            #arg_matches.#get_occurrences(#id)\n                .map(|g| g.map(::std::iter::Iterator::collect).collect::<Vec<Vec<_>>>())\n        },\n\n        Ty::Other => {\n            // Prefer `concat` where possible for reduced code size but fallback to `format!` to\n            // allow non-literal `id`s\n            match id {\n                Name::Assigned(_) => {\n                    quote_spanned! { ty.span()=>\n                        #arg_matches.#get_one(#id)\n                            .ok_or_else(|| clap::Error::raw(clap::error::ErrorKind::MissingRequiredArgument, format!(\"the following required argument was not provided: {}\", #id)))?\n                    }\n                }\n                Name::Derived(_) => {\n                    quote_spanned! { ty.span()=>\n                        #arg_matches.#get_one(#id)\n                            .ok_or_else(|| clap::Error::raw(clap::error::ErrorKind::MissingRequiredArgument, concat!(\"the following required argument was not provided: \", #id)))?\n                    }\n                }\n            }\n        }\n    };\n\n    let genned = if let Some(access) = update {\n        quote_spanned! { field.span()=>\n            if #arg_matches.contains_id(#id) {\n                #access\n                *#field_name = #field_value\n            }\n        }\n    } else {\n        quote_spanned!(field.span()=> #field_name: #field_value )\n    };\n    Ok(genned)\n}\n\n#[cfg(feature = \"raw-deprecated\")]\npub(crate) fn raw_deprecated() -> TokenStream {\n    quote! {}\n}\n\n#[cfg(not(feature = \"raw-deprecated\"))]\npub(crate) fn raw_deprecated() -> TokenStream {\n    quote! {\n        #![allow(deprecated)]  // Assuming any deprecation in here will be related to a deprecation in `Args`\n\n    }\n}\n\npub(crate) fn collect_args_fields<'a>(\n    item: &'a Item,\n    fields: &'a FieldsNamed,\n) -> Result<Vec<(&'a Field, Item)>, syn::Error> {\n    fields\n        .named\n        .iter()\n        .map(|field| {\n            let item = Item::from_args_field(field, item.casing(), item.env_casing())?;\n            Ok((field, item))\n        })\n        .collect()\n}\n"
  },
  {
    "path": "clap_derive/src/derives/into_app.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse proc_macro2::{Span, TokenStream};\nuse quote::quote;\nuse syn::{Generics, Ident};\n\nuse crate::item::Item;\n\npub(crate) fn gen_for_struct(\n    item: &Item,\n    item_name: &Ident,\n    generics: &Generics,\n) -> Result<TokenStream, syn::Error> {\n    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();\n\n    let name = item.cased_name();\n    let app_var = Ident::new(\"__clap_app\", Span::call_site());\n\n    let tokens = quote! {\n        #[allow(\n            dead_code,\n            unreachable_code,\n            unused_variables,\n            unused_braces,\n            unused_qualifications,\n        )]\n        #[allow(\n            clippy::style,\n            clippy::complexity,\n            clippy::pedantic,\n            clippy::restriction,\n            clippy::perf,\n            clippy::deprecated,\n            clippy::nursery,\n            clippy::cargo,\n            clippy::suspicious_else_formatting,\n            clippy::almost_swapped,\n            clippy::redundant_locals,\n        )]\n        #[automatically_derived]\n        impl #impl_generics clap::CommandFactory for #item_name #ty_generics #where_clause {\n            fn command<'b>() -> clap::Command {\n                let #app_var = clap::Command::new(#name);\n                <Self as clap::Args>::augment_args(#app_var)\n            }\n\n            fn command_for_update<'b>() -> clap::Command {\n                let #app_var = clap::Command::new(#name);\n                <Self as clap::Args>::augment_args_for_update(#app_var)\n            }\n        }\n    };\n\n    Ok(tokens)\n}\n\npub(crate) fn gen_for_enum(\n    item: &Item,\n    item_name: &Ident,\n    generics: &Generics,\n) -> Result<TokenStream, syn::Error> {\n    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();\n\n    let name = item.cased_name();\n    let app_var = Ident::new(\"__clap_app\", Span::call_site());\n\n    Ok(quote! {\n        #[allow(\n            dead_code,\n            unreachable_code,\n            unused_variables,\n            unused_braces,\n            unused_qualifications,\n        )]\n        #[allow(\n            clippy::style,\n            clippy::complexity,\n            clippy::pedantic,\n            clippy::restriction,\n            clippy::perf,\n            clippy::deprecated,\n            clippy::nursery,\n            clippy::cargo,\n            clippy::suspicious_else_formatting,\n            clippy::almost_swapped,\n            clippy::redundant_locals,\n        )]\n        #[automatically_derived]\n        impl #impl_generics clap::CommandFactory for #item_name #ty_generics #where_clause {\n            fn command<'b>() -> clap::Command {\n                let #app_var = clap::Command::new(#name)\n                    .subcommand_required(true)\n                    .arg_required_else_help(true);\n                <Self as clap::Subcommand>::augment_subcommands(#app_var)\n            }\n\n            fn command_for_update<'b>() -> clap::Command {\n                let #app_var = clap::Command::new(#name);\n                <Self as clap::Subcommand>::augment_subcommands_for_update(#app_var)\n                    .subcommand_required(false)\n                    .arg_required_else_help(false)\n            }\n        }\n    })\n}\n"
  },
  {
    "path": "clap_derive/src/derives/mod.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\nmod args;\nmod into_app;\nmod parser;\nmod subcommand;\nmod value_enum;\n\npub(crate) use self::parser::derive_parser;\npub(crate) use args::derive_args;\npub(crate) use subcommand::derive_subcommand;\npub(crate) use value_enum::derive_value_enum;\n"
  },
  {
    "path": "clap_derive/src/derives/parser.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse proc_macro2::TokenStream;\nuse quote::quote;\nuse syn::Ident;\nuse syn::Variant;\nuse syn::{\n    self, Data, DataStruct, DeriveInput, Field, Fields, Generics, punctuated::Punctuated,\n    token::Comma,\n};\n\nuse crate::derives::args::collect_args_fields;\nuse crate::derives::{args, into_app, subcommand};\nuse crate::item::Item;\nuse crate::item::Name;\n\npub(crate) fn derive_parser(input: &DeriveInput) -> Result<TokenStream, syn::Error> {\n    let ident = &input.ident;\n    let pkg_name = std::env::var(\"CARGO_PKG_NAME\").ok().unwrap_or_default();\n\n    match input.data {\n        Data::Struct(DataStruct {\n            fields: Fields::Named(ref fields),\n            ..\n        }) => {\n            let name = Name::Assigned(quote!(#pkg_name));\n            let item = Item::from_args_struct(input, name)?;\n            let fields = collect_args_fields(&item, fields)?;\n            gen_for_struct(&item, ident, &input.generics, &fields)\n        }\n        Data::Struct(DataStruct {\n            fields: Fields::Unit,\n            ..\n        }) => {\n            let name = Name::Assigned(quote!(#pkg_name));\n            let item = Item::from_args_struct(input, name)?;\n            let fields = Punctuated::<Field, Comma>::new();\n            let fields = fields\n                .iter()\n                .map(|field| {\n                    let item = Item::from_args_field(field, item.casing(), item.env_casing())?;\n                    Ok((field, item))\n                })\n                .collect::<Result<Vec<_>, syn::Error>>()?;\n            gen_for_struct(&item, ident, &input.generics, &fields)\n        }\n        Data::Enum(ref e) => {\n            let name = Name::Assigned(quote!(#pkg_name));\n            let item = Item::from_subcommand_enum(input, name)?;\n            let variants = e\n                .variants\n                .iter()\n                .map(|variant| {\n                    let item =\n                        Item::from_subcommand_variant(variant, item.casing(), item.env_casing())?;\n                    Ok((variant, item))\n                })\n                .collect::<Result<Vec<_>, syn::Error>>()?;\n            gen_for_enum(&item, ident, &input.generics, &variants)\n        }\n        _ => abort_call_site!(\"`#[derive(Parser)]` only supports non-tuple structs and enums\"),\n    }\n}\n\nfn gen_for_struct(\n    item: &Item,\n    item_name: &Ident,\n    generics: &Generics,\n    fields: &[(&Field, Item)],\n) -> Result<TokenStream, syn::Error> {\n    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();\n\n    let into_app = into_app::gen_for_struct(item, item_name, generics)?;\n    let args = args::gen_for_struct(item, item_name, generics, fields)?;\n\n    Ok(quote! {\n        #[automatically_derived]\n        #[allow(\n            unused_qualifications,\n            clippy::redundant_locals,\n        )]\n        impl #impl_generics clap::Parser for #item_name #ty_generics #where_clause {}\n\n        #into_app\n        #args\n    })\n}\n\nfn gen_for_enum(\n    item: &Item,\n    item_name: &Ident,\n    generics: &Generics,\n    variants: &[(&Variant, Item)],\n) -> Result<TokenStream, syn::Error> {\n    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();\n\n    let into_app = into_app::gen_for_enum(item, item_name, generics)?;\n    let subcommand = subcommand::gen_for_enum(item, item_name, generics, variants)?;\n\n    Ok(quote! {\n        #[automatically_derived]\n        impl #impl_generics clap::Parser for #item_name #ty_generics #where_clause {}\n\n        #into_app\n        #subcommand\n    })\n}\n"
  },
  {
    "path": "clap_derive/src/derives/subcommand.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse proc_macro2::{Ident, Span, TokenStream};\nuse quote::{format_ident, quote, quote_spanned};\nuse syn::{Data, DeriveInput, FieldsUnnamed, Generics, Variant, spanned::Spanned};\n\nuse crate::derives::args;\nuse crate::derives::args::collect_args_fields;\nuse crate::item::{Item, Kind, Name};\nuse crate::utils::{is_simple_ty, subty_if_name};\n\npub(crate) fn derive_subcommand(input: &DeriveInput) -> Result<TokenStream, syn::Error> {\n    let ident = &input.ident;\n\n    match input.data {\n        Data::Enum(ref e) => {\n            let name = Name::Derived(ident.clone());\n            let item = Item::from_subcommand_enum(input, name)?;\n            let variants = e\n                .variants\n                .iter()\n                .map(|variant| {\n                    let item =\n                        Item::from_subcommand_variant(variant, item.casing(), item.env_casing())?;\n                    Ok((variant, item))\n                })\n                .collect::<Result<Vec<_>, syn::Error>>()?;\n            gen_for_enum(&item, ident, &input.generics, &variants)\n        }\n        _ => abort_call_site!(\"`#[derive(Subcommand)]` only supports enums\"),\n    }\n}\n\npub(crate) fn gen_for_enum(\n    item: &Item,\n    item_name: &Ident,\n    generics: &Generics,\n    variants: &[(&Variant, Item)],\n) -> Result<TokenStream, syn::Error> {\n    if !matches!(&*item.kind(), Kind::Command(_)) {\n        abort! { item.kind().span(),\n            \"`{}` cannot be used with `#[command]`\",\n            item.kind().name(),\n        }\n    }\n\n    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();\n\n    let from_arg_matches = gen_from_arg_matches(variants)?;\n    let update_from_arg_matches = gen_update_from_arg_matches(variants)?;\n\n    let augmentation = gen_augment(variants, item, false)?;\n    let augmentation_update = gen_augment(variants, item, true)?;\n    let has_subcommand = gen_has_subcommand(variants)?;\n\n    Ok(quote! {\n        #[allow(\n            dead_code,\n            unreachable_code,\n            unused_variables,\n            unused_braces,\n            unused_qualifications,\n        )]\n        #[allow(\n            clippy::style,\n            clippy::complexity,\n            clippy::pedantic,\n            clippy::restriction,\n            clippy::perf,\n            clippy::deprecated,\n            clippy::nursery,\n            clippy::cargo,\n            clippy::suspicious_else_formatting,\n            clippy::almost_swapped,\n            clippy::redundant_locals,\n        )]\n        #[automatically_derived]\n        impl #impl_generics clap::FromArgMatches for #item_name #ty_generics #where_clause {\n            fn from_arg_matches(__clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {\n                Self::from_arg_matches_mut(&mut __clap_arg_matches.clone())\n            }\n\n            #from_arg_matches\n\n            fn update_from_arg_matches(&mut self, __clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<(), clap::Error> {\n                self.update_from_arg_matches_mut(&mut __clap_arg_matches.clone())\n            }\n            #update_from_arg_matches\n        }\n\n        #[allow(\n            dead_code,\n            unreachable_code,\n            unused_variables,\n            unused_braces,\n            unused_qualifications,\n        )]\n        #[allow(\n            clippy::style,\n            clippy::complexity,\n            clippy::pedantic,\n            clippy::restriction,\n            clippy::perf,\n            clippy::deprecated,\n            clippy::nursery,\n            clippy::cargo,\n            clippy::suspicious_else_formatting,\n            clippy::almost_swapped,\n            clippy::redundant_locals,\n        )]\n        #[automatically_derived]\n        impl #impl_generics clap::Subcommand for #item_name #ty_generics #where_clause {\n            fn augment_subcommands <'b>(__clap_app: clap::Command) -> clap::Command {\n                #augmentation\n            }\n            fn augment_subcommands_for_update <'b>(__clap_app: clap::Command) -> clap::Command {\n                #augmentation_update\n            }\n            fn has_subcommand(__clap_name: &str) -> bool {\n                #has_subcommand\n            }\n        }\n    })\n}\n\nfn gen_augment(\n    variants: &[(&Variant, Item)],\n    parent_item: &Item,\n    override_required: bool,\n) -> Result<TokenStream, syn::Error> {\n    use syn::Fields::{Named, Unit, Unnamed};\n\n    let app_var = Ident::new(\"__clap_app\", Span::call_site());\n\n    let mut subcommands = Vec::new();\n    for (variant, item) in variants {\n        let kind = item.kind();\n\n        let genned = match &*kind {\n            Kind::Skip(_, _) | Kind::Arg(_) | Kind::FromGlobal(_) | Kind::Value => None,\n\n            Kind::ExternalSubcommand => {\n                let ty = match variant.fields {\n                    Unnamed(ref fields) if fields.unnamed.len() == 1 => &fields.unnamed[0].ty,\n\n                    _ => abort!(\n                        variant,\n                        \"invalid type for `#[command(external_subcommand)]`, expected a newtype variant with either a `Vec<String>` or `Vec<OsString>`\"\n                    ),\n                };\n                let deprecations = if !override_required {\n                    item.deprecations()\n                } else {\n                    quote!()\n                };\n                let subty = subty_if_name(ty, \"Vec\").ok_or_else(|| {\n                    format_err!(\n                        ty.span(),\n                        \"invalid type for `#[command(external_subcommand)]`, expected a `Vec<_>`\"\n                    )\n                })?;\n                let subcommand = quote_spanned! { kind.span()=>\n                    #deprecations\n                    let #app_var = #app_var\n                        .external_subcommand_value_parser(clap::value_parser!(#subty));\n                };\n                Some(subcommand)\n            }\n\n            Kind::Flatten(_) => match variant.fields {\n                Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {\n                    let ty = &unnamed[0].ty;\n                    let deprecations = if !override_required {\n                        item.deprecations()\n                    } else {\n                        quote!()\n                    };\n                    let next_help_heading = item.next_help_heading();\n                    let next_display_order = item.next_display_order();\n                    let subcommand = if override_required {\n                        quote! {\n                            #deprecations\n                            let #app_var = #app_var\n                                #next_help_heading\n                                #next_display_order;\n                            let #app_var = <#ty as clap::Subcommand>::augment_subcommands_for_update(#app_var);\n                        }\n                    } else {\n                        quote! {\n                            #deprecations\n                            let #app_var = #app_var\n                                #next_help_heading\n                                #next_display_order;\n                            let #app_var = <#ty as clap::Subcommand>::augment_subcommands(#app_var);\n                        }\n                    };\n                    Some(subcommand)\n                }\n                _ => abort!(\n                    variant,\n                    \"invalid variant for `#[command(flatten)]`, expected a newtype variant\"\n                ),\n            },\n\n            Kind::Subcommand(_) => {\n                let subcommand_var = Ident::new(\"__clap_subcommand\", Span::call_site());\n                let arg_block = match variant.fields {\n                    Named(_) => {\n                        abort!(\n                            variant,\n                            \"invalid variant for `#[command(subcommand)]`, expected a newtype variant\"\n                        )\n                    }\n                    Unit => quote!( #subcommand_var ),\n                    Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {\n                        let ty = &unnamed[0].ty;\n                        if override_required {\n                            quote_spanned! { ty.span()=>\n                                {\n                                    <#ty as clap::Subcommand>::augment_subcommands_for_update(#subcommand_var)\n                                }\n                            }\n                        } else {\n                            quote_spanned! { ty.span()=>\n                                {\n                                    <#ty as clap::Subcommand>::augment_subcommands(#subcommand_var)\n                                }\n                            }\n                        }\n                    }\n                    Unnamed(..) => {\n                        abort!(\n                            variant,\n                            \"invalid variant for `#[command(subcommand)]`, expected a newtype variant\"\n                        )\n                    }\n                };\n\n                let name = item.cased_name();\n                let deprecations = if !override_required {\n                    item.deprecations()\n                } else {\n                    quote!()\n                };\n                let initial_app_methods = item.initial_top_level_methods();\n                let final_from_attrs = item.final_top_level_methods();\n                let override_methods = if override_required {\n                    quote_spanned! { kind.span()=>\n                        .subcommand_required(false)\n                        .arg_required_else_help(false)\n                    }\n                } else {\n                    quote!()\n                };\n                let subcommand = quote! {\n                    let #app_var = #app_var.subcommand({\n                        #deprecations;\n                        let #subcommand_var = clap::Command::new(#name);\n                        let #subcommand_var = #subcommand_var\n                            .subcommand_required(true)\n                            .arg_required_else_help(true);\n                        let #subcommand_var = #subcommand_var #initial_app_methods;\n                        let #subcommand_var = #arg_block;\n                        #subcommand_var #final_from_attrs #override_methods\n                    });\n                };\n                Some(subcommand)\n            }\n\n            Kind::Command(_) => {\n                let subcommand_var = Ident::new(\"__clap_subcommand\", Span::call_site());\n                let sub_augment = match variant.fields {\n                    Named(ref fields) => {\n                        // Defer to `gen_augment` for adding cmd methods\n                        let fields = collect_args_fields(item, fields)?;\n                        args::gen_augment(&fields, &subcommand_var, item, override_required)?\n                    }\n                    Unit => {\n                        let arg_block = quote!( #subcommand_var );\n                        let initial_app_methods = item.initial_top_level_methods();\n                        let final_from_attrs = item.final_top_level_methods();\n                        quote! {\n                            let #subcommand_var = #subcommand_var #initial_app_methods;\n                            let #subcommand_var = #arg_block;\n                            #subcommand_var #final_from_attrs\n                        }\n                    }\n                    Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {\n                        let ty = &unnamed[0].ty;\n                        let arg_block = if override_required {\n                            quote_spanned! { ty.span()=>\n                                {\n                                    <#ty as clap::Args>::augment_args_for_update(#subcommand_var)\n                                }\n                            }\n                        } else {\n                            quote_spanned! { ty.span()=>\n                                {\n                                    <#ty as clap::Args>::augment_args(#subcommand_var)\n                                }\n                            }\n                        };\n                        let initial_app_methods = item.initial_top_level_methods();\n                        let final_from_attrs = item.final_top_level_methods();\n                        quote! {\n                            let #subcommand_var = #subcommand_var #initial_app_methods;\n                            let #subcommand_var = #arg_block;\n                            #subcommand_var #final_from_attrs\n                        }\n                    }\n                    Unnamed(..) => {\n                        abort!(\n                            variant,\n                            \"invalid variant for `#[command(subcommand)]`, expected a newtype variant\"\n                        )\n                    }\n                };\n\n                let deprecations = if !override_required {\n                    item.deprecations()\n                } else {\n                    quote!()\n                };\n                let name = item.cased_name();\n                let subcommand = quote! {\n                    let #app_var = #app_var.subcommand({\n                        #deprecations\n                        let #subcommand_var = clap::Command::new(#name);\n                        #sub_augment\n                    });\n                };\n                Some(subcommand)\n            }\n        };\n        subcommands.push(genned);\n    }\n\n    let deprecations = if !override_required {\n        parent_item.deprecations()\n    } else {\n        quote!()\n    };\n    let initial_app_methods = parent_item.initial_top_level_methods();\n    let final_app_methods = parent_item.final_top_level_methods();\n    Ok(quote! {\n        #deprecations;\n        let #app_var = #app_var #initial_app_methods;\n        #( #subcommands )*;\n        #app_var #final_app_methods\n    })\n}\n\nfn gen_has_subcommand(variants: &[(&Variant, Item)]) -> Result<TokenStream, syn::Error> {\n    use syn::Fields::Unnamed;\n\n    let mut ext_subcmd = false;\n\n    let (flatten_variants, variants): (Vec<_>, Vec<_>) = variants\n        .iter()\n        .filter_map(|(variant, item)| {\n            let kind = item.kind();\n            match &*kind {\n                Kind::Skip(_, _) | Kind::Arg(_) | Kind::FromGlobal(_) | Kind::Value => None,\n\n                Kind::ExternalSubcommand => {\n                    ext_subcmd = true;\n                    None\n                }\n                Kind::Flatten(_) | Kind::Subcommand(_) | Kind::Command(_) => Some((variant, item)),\n            }\n        })\n        .partition(|(_, item)| {\n            let kind = item.kind();\n            matches!(&*kind, Kind::Flatten(_))\n        });\n\n    let subcommands = variants.iter().map(|(_variant, item)| {\n        let sub_name = item.cased_name();\n        quote! {\n            if #sub_name == __clap_name {\n                return true\n            }\n        }\n    });\n    let child_subcommands = flatten_variants\n        .iter()\n        .map(|(variant, _attrs)| match variant.fields {\n            Unnamed(ref fields) if fields.unnamed.len() == 1 => {\n                let ty = &fields.unnamed[0].ty;\n                Ok(quote! {\n                    if <#ty as clap::Subcommand>::has_subcommand(__clap_name) {\n                        return true;\n                    }\n                })\n            }\n            _ => abort!(\n                variant,\n                \"invalid variant for `#[command(flatten)]`, expected newtype variant\"\n            ),\n        })\n        .collect::<Result<Vec<_>, syn::Error>>()?;\n\n    let genned = if ext_subcmd {\n        quote! { true }\n    } else {\n        quote! {\n            #( #subcommands )*\n\n            #( #child_subcommands )else*\n\n            false\n        }\n    };\n    Ok(genned)\n}\n\nfn gen_from_arg_matches(variants: &[(&Variant, Item)]) -> Result<TokenStream, syn::Error> {\n    use syn::Fields::{Named, Unit, Unnamed};\n\n    let subcommand_name_var = format_ident!(\"__clap_name\");\n    let sub_arg_matches_var = format_ident!(\"__clap_arg_matches\");\n\n    let mut ext_subcmd = None;\n    let mut flatten_variants = Vec::new();\n    let mut unflatten_variants = Vec::new();\n    for (variant, item) in variants {\n        let kind = item.kind();\n        match &*kind {\n            Kind::Skip(_, _) | Kind::Arg(_) | Kind::FromGlobal(_) | Kind::Value => {}\n\n            Kind::ExternalSubcommand => {\n                if ext_subcmd.is_some() {\n                    abort!(\n                        item.kind().span(),\n                        \"`#[command(external_subcommand)] can only be specified once and has already been specified\"\n                    );\n                }\n\n                let ty = match variant.fields {\n                    Unnamed(ref fields) if fields.unnamed.len() == 1 => &fields.unnamed[0].ty,\n\n                    _ => abort!(\n                        variant,\n                        \"invalid type for `#[command(external_subcommand)]`, expected a newtype variant with either a `Vec<String>` or `Vec<OsString>`\"\n                    ),\n                };\n\n                let (span, str_ty) = match subty_if_name(ty, \"Vec\") {\n                    Some(subty) => {\n                        if is_simple_ty(subty, \"String\") {\n                            (subty.span(), quote!(::std::string::String))\n                        } else if is_simple_ty(subty, \"OsString\") {\n                            (subty.span(), quote!(::std::ffi::OsString))\n                        } else {\n                            abort!(\n                                ty.span(),\n                                \"invalid type for `#[command(external_subcommand)]`, expected a `Vec<String>` or `Vec<OsString>`\"\n                            );\n                        }\n                    }\n\n                    None => abort!(\n                        ty.span(),\n                        \"invalid type for `#[command(external_subcommand)]`, expected a `Vec<String>` or `Vec<OsString>`\"\n                    ),\n                };\n\n                ext_subcmd = Some((span, &variant.ident, str_ty));\n            }\n            Kind::Flatten(_) | Kind::Subcommand(_) | Kind::Command(_) => {\n                if matches!(&*item.kind(), Kind::Flatten(_)) {\n                    flatten_variants.push((variant, item));\n                } else {\n                    unflatten_variants.push((variant, item));\n                }\n            }\n        }\n    }\n\n    let subcommands = unflatten_variants.iter().map(|(variant, item)| {\n        let sub_name = item.cased_name();\n        let variant_name = &variant.ident;\n        let constructor_block = match variant.fields {\n            Named(ref fields) => {\n                let fields = collect_args_fields(item, fields)?;\n                args::gen_constructor(&fields)?\n            },\n            Unit => quote!(),\n            Unnamed(ref fields) if fields.unnamed.len() == 1 => {\n                let ty = &fields.unnamed[0].ty;\n                quote!( ( <#ty as clap::FromArgMatches>::from_arg_matches_mut(__clap_arg_matches)? ) )\n            }\n            Unnamed(..) => abort_call_site!(\"{}: tuple enums are not supported\", variant.ident),\n        };\n\n        Ok(quote! {\n            if #subcommand_name_var == #sub_name && !#sub_arg_matches_var.contains_id(\"\") {\n                return ::std::result::Result::Ok(Self :: #variant_name #constructor_block)\n            }\n        })\n    }).collect::<Result<Vec<_>, syn::Error>>()?;\n    let child_subcommands = flatten_variants.iter().map(|(variant, _attrs)| {\n        let variant_name = &variant.ident;\n        match variant.fields {\n            Unnamed(ref fields) if fields.unnamed.len() == 1 => {\n                let ty = &fields.unnamed[0].ty;\n                Ok(quote! {\n                    if __clap_arg_matches\n                        .subcommand_name()\n                        .map(|__clap_name| <#ty as clap::Subcommand>::has_subcommand(__clap_name))\n                        .unwrap_or_default()\n                    {\n                        let __clap_res = <#ty as clap::FromArgMatches>::from_arg_matches_mut(__clap_arg_matches)?;\n                        return ::std::result::Result::Ok(Self :: #variant_name (__clap_res));\n                    }\n                })\n            }\n            _ => abort!(\n                variant,\n                \"invalid variant for `#[command(flatten)]`, expected newtype variant\"\n            ),\n        }\n    }).collect::<Result<Vec<_>, syn::Error>>()?;\n\n    let wildcard = match ext_subcmd {\n        Some((span, var_name, str_ty)) => quote_spanned! { span=>\n                ::std::result::Result::Ok(Self::#var_name(\n                    ::std::iter::once(#str_ty::from(#subcommand_name_var))\n                    .chain(\n                        #sub_arg_matches_var\n                            .remove_many::<#str_ty>(\"\")\n                            .unwrap()\n                            .map(#str_ty::from)\n                    )\n                    .collect::<::std::vec::Vec<_>>()\n                ))\n        },\n\n        None => quote! {\n            ::std::result::Result::Err(clap::Error::raw(clap::error::ErrorKind::InvalidSubcommand, format!(\"the subcommand '{}' wasn't recognized\", #subcommand_name_var)))\n        },\n    };\n\n    let raw_deprecated = args::raw_deprecated();\n    Ok(quote! {\n        fn from_arg_matches_mut(__clap_arg_matches: &mut clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {\n            #raw_deprecated\n\n            #( #child_subcommands )else*\n\n            if let Some((#subcommand_name_var, mut __clap_arg_sub_matches)) = __clap_arg_matches.remove_subcommand() {\n                let #sub_arg_matches_var = &mut __clap_arg_sub_matches;\n                #( #subcommands )*\n\n                #wildcard\n            } else {\n                ::std::result::Result::Err(clap::Error::raw(clap::error::ErrorKind::MissingSubcommand, \"a subcommand is required but one was not provided\"))\n            }\n        }\n    })\n}\n\nfn gen_update_from_arg_matches(variants: &[(&Variant, Item)]) -> Result<TokenStream, syn::Error> {\n    use syn::Fields::{Named, Unit, Unnamed};\n\n    let (flatten, variants): (Vec<_>, Vec<_>) = variants\n        .iter()\n        .filter_map(|(variant, item)| {\n            let kind = item.kind();\n            match &*kind {\n                // Fallback to `from_arg_matches_mut`\n                Kind::Skip(_, _)\n                | Kind::Arg(_)\n                | Kind::FromGlobal(_)\n                | Kind::Value\n                | Kind::ExternalSubcommand => None,\n                Kind::Flatten(_) | Kind::Subcommand(_) | Kind::Command(_) => Some((variant, item)),\n            }\n        })\n        .partition(|(_, item)| {\n            let kind = item.kind();\n            matches!(&*kind, Kind::Flatten(_))\n        });\n\n    let subcommands = variants.iter().map(|(variant, item)| {\n        let sub_name = item.cased_name();\n        let variant_name = &variant.ident;\n        let (pattern, updater) = match variant.fields {\n            Named(ref fields) => {\n                let field_names = fields.named.iter().map(|field| {\n                    field.ident.as_ref().unwrap()\n                }).collect::<Vec<_>>();\n                let fields = collect_args_fields(item, fields)?;\n                let update = args::gen_updater(&fields, false)?;\n                (quote!( { #( #field_names, )* }), quote!( { #update } ))\n            }\n            Unit => (quote!(), quote!({})),\n            Unnamed(ref fields) => {\n                if fields.unnamed.len() == 1 {\n                    (\n                        quote!((__clap_arg)),\n                        quote!(clap::FromArgMatches::update_from_arg_matches_mut(\n                            __clap_arg,\n                            __clap_arg_matches\n                        )?),\n                    )\n                } else {\n                    abort_call_site!(\"{}: tuple enums are not supported\", variant.ident)\n                }\n            }\n        };\n\n        Ok(quote! {\n            Self :: #variant_name #pattern if #sub_name == __clap_name => {\n                let (_, mut __clap_arg_sub_matches) = __clap_arg_matches.remove_subcommand().unwrap();\n                let __clap_arg_matches = &mut __clap_arg_sub_matches;\n                #updater\n            }\n        })\n    }).collect::<Result<Vec<_>, _>>()?;\n\n    let child_subcommands = flatten.iter().map(|(variant, _attrs)| {\n        let variant_name = &variant.ident;\n        match variant.fields {\n            Unnamed(ref fields) if fields.unnamed.len() == 1 => {\n                let ty = &fields.unnamed[0].ty;\n                Ok(quote! {\n                    if <#ty as clap::Subcommand>::has_subcommand(__clap_name) {\n                        if let Self :: #variant_name (child) = s {\n                            <#ty as clap::FromArgMatches>::update_from_arg_matches_mut(child, __clap_arg_matches)?;\n                            return ::std::result::Result::Ok(());\n                        }\n                    }\n                })\n            }\n            _ => abort!(\n                variant,\n                \"invalid variant for `#[command(flatten)]`, expected newtype variant\"\n            ),\n        }\n    }).collect::<Result<Vec<_>, _>>()?;\n\n    let raw_deprecated = args::raw_deprecated();\n    Ok(quote! {\n        fn update_from_arg_matches_mut<'b>(\n            &mut self,\n            __clap_arg_matches: &mut clap::ArgMatches,\n        ) -> ::std::result::Result<(), clap::Error> {\n            #raw_deprecated\n\n            if let Some(__clap_name) = __clap_arg_matches.subcommand_name() {\n                match self {\n                    #( #subcommands ),*\n                    s => {\n                        #( #child_subcommands )*\n                        *s = <Self as clap::FromArgMatches>::from_arg_matches_mut(__clap_arg_matches)?;\n                    }\n                }\n            }\n            ::std::result::Result::Ok(())\n        }\n    })\n}\n"
  },
  {
    "path": "clap_derive/src/derives/value_enum.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse proc_macro2::TokenStream;\nuse quote::quote;\nuse quote::quote_spanned;\nuse syn::{Data, DeriveInput, Fields, Ident, Variant, spanned::Spanned};\n\nuse crate::item::{Item, Kind, Name};\n\npub(crate) fn derive_value_enum(input: &DeriveInput) -> Result<TokenStream, syn::Error> {\n    let ident = &input.ident;\n\n    match input.data {\n        Data::Enum(ref e) => {\n            let name = Name::Derived(ident.clone());\n            let item = Item::from_value_enum(input, name)?;\n            let mut variants = Vec::new();\n            for variant in &e.variants {\n                let item =\n                    Item::from_value_enum_variant(variant, item.casing(), item.env_casing())?;\n                variants.push((variant, item));\n            }\n            gen_for_enum(&item, ident, &variants)\n        }\n        _ => abort_call_site!(\"`#[derive(ValueEnum)]` only supports enums\"),\n    }\n}\n\npub(crate) fn gen_for_enum(\n    item: &Item,\n    item_name: &Ident,\n    variants: &[(&Variant, Item)],\n) -> Result<TokenStream, syn::Error> {\n    if !matches!(&*item.kind(), Kind::Value) {\n        abort! { item.kind().span(),\n            \"`{}` cannot be used with `#[value]`\",\n            item.kind().name(),\n        }\n    }\n\n    let lits = lits(variants)?;\n    let value_variants = gen_value_variants(&lits);\n    let to_possible_value = gen_to_possible_value(item, &lits);\n\n    Ok(quote! {\n        #[allow(\n            dead_code,\n            unreachable_code,\n            unused_variables,\n            unused_braces,\n            unused_qualifications,\n        )]\n        #[allow(\n            clippy::style,\n            clippy::complexity,\n            clippy::pedantic,\n            clippy::restriction,\n            clippy::perf,\n            clippy::deprecated,\n            clippy::nursery,\n            clippy::cargo,\n            clippy::suspicious_else_formatting,\n            clippy::almost_swapped,\n            clippy::redundant_locals,\n        )]\n        #[automatically_derived]\n        impl clap::ValueEnum for #item_name {\n            #value_variants\n            #to_possible_value\n        }\n    })\n}\n\nfn lits(variants: &[(&Variant, Item)]) -> Result<Vec<(TokenStream, Ident)>, syn::Error> {\n    let mut genned = Vec::new();\n    for (variant, item) in variants {\n        if let Kind::Skip(_, _) = &*item.kind() {\n            continue;\n        }\n        if !matches!(variant.fields, Fields::Unit) {\n            abort!(\n                variant.span(),\n                \"`#[derive(ValueEnum)]` only supports unit variants. Non-unit variants must be skipped\"\n            );\n        }\n        let fields = item.field_methods();\n        let deprecations = item.deprecations();\n        let name = item.cased_name();\n        genned.push((\n            quote_spanned! { variant.span()=> {\n                #deprecations\n                clap::builder::PossibleValue::new(#name)\n                #fields\n            }},\n            variant.ident.clone(),\n        ));\n    }\n    Ok(genned)\n}\n\nfn gen_value_variants(lits: &[(TokenStream, Ident)]) -> TokenStream {\n    let lit = lits.iter().map(|l| &l.1).collect::<Vec<_>>();\n\n    quote! {\n        fn value_variants<'a>() -> &'a [Self]{\n            &[#(Self::#lit),*]\n        }\n    }\n}\n\nfn gen_to_possible_value(item: &Item, lits: &[(TokenStream, Ident)]) -> TokenStream {\n    let (lit, variant): (Vec<TokenStream>, Vec<Ident>) = lits.iter().cloned().unzip();\n\n    let deprecations = item.deprecations();\n\n    quote! {\n        fn to_possible_value<'a>(&self) -> ::std::option::Option<clap::builder::PossibleValue> {\n            #deprecations\n            match self {\n                #(Self::#variant => Some(#lit),)*\n                _ => None\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "clap_derive/src/dummies.rs",
    "content": "//! Dummy implementations that we emit along with an error.\n\nuse proc_macro2::Ident;\nuse quote::quote;\n\n#[must_use]\npub(crate) fn parser(name: &Ident) -> proc_macro2::TokenStream {\n    let into_app = into_app(name);\n    quote!(\n        #[automatically_derived]\n        impl clap::Parser for #name {}\n        #into_app\n    )\n}\n\n#[must_use]\npub(crate) fn into_app(name: &Ident) -> proc_macro2::TokenStream {\n    quote! {\n        #[automatically_derived]\n        impl clap::CommandFactory for #name {\n            fn command<'b>() -> clap::Command {\n                unimplemented!()\n            }\n            fn command_for_update<'b>() -> clap::Command {\n                unimplemented!()\n            }\n        }\n    }\n}\n\n#[must_use]\npub(crate) fn from_arg_matches(name: &Ident) -> proc_macro2::TokenStream {\n    quote! {\n        #[automatically_derived]\n        impl clap::FromArgMatches for #name {\n            fn from_arg_matches(_m: &clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {\n                unimplemented!()\n            }\n            fn update_from_arg_matches(&mut self, matches: &clap::ArgMatches) -> ::std::result::Result<(), clap::Error>{\n                unimplemented!()\n            }\n        }\n    }\n}\n\n#[must_use]\npub(crate) fn subcommand(name: &Ident) -> proc_macro2::TokenStream {\n    let from_arg_matches = from_arg_matches(name);\n    quote! {\n        #[automatically_derived]\n        impl clap::Subcommand for #name {\n            fn augment_subcommands(_cmd: clap::Command) -> clap::Command {\n                unimplemented!()\n            }\n            fn augment_subcommands_for_update(_cmd: clap::Command) -> clap::Command {\n                unimplemented!()\n            }\n            fn has_subcommand(name: &str) -> bool {\n                unimplemented!()\n            }\n        }\n        #from_arg_matches\n    }\n}\n\n#[must_use]\npub(crate) fn args(name: &Ident) -> proc_macro2::TokenStream {\n    let from_arg_matches = from_arg_matches(name);\n    quote! {\n        #[automatically_derived]\n        impl clap::Args for #name {\n            fn augment_args(_cmd: clap::Command) -> clap::Command {\n                unimplemented!()\n            }\n            fn augment_args_for_update(_cmd: clap::Command) -> clap::Command {\n                unimplemented!()\n            }\n        }\n        #from_arg_matches\n    }\n}\n\n#[must_use]\npub(crate) fn value_enum(name: &Ident) -> proc_macro2::TokenStream {\n    quote! {\n        #[automatically_derived]\n        impl clap::ValueEnum for #name {\n            fn value_variants<'a>() -> &'a [Self]{\n                unimplemented!()\n            }\n            fn from_str(_input: &str, _ignore_case: bool) -> ::std::result::Result<Self, String> {\n                unimplemented!()\n            }\n            fn to_possible_value<'a>(&self) -> ::std::option::Option<clap::builder::PossibleValue>{\n                unimplemented!()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "clap_derive/src/item.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse std::env;\n\nuse heck::{ToKebabCase, ToLowerCamelCase, ToShoutySnakeCase, ToSnakeCase, ToUpperCamelCase};\nuse proc_macro2::{self, Span, TokenStream};\nuse quote::{ToTokens, format_ident, quote, quote_spanned};\nuse syn::DeriveInput;\nuse syn::{self, Attribute, Field, Ident, LitStr, Type, Variant, ext::IdentExt, spanned::Spanned};\n\nuse crate::attr::{AttrKind, AttrValue, ClapAttr, MagicAttrName};\nuse crate::utils::{Sp, Ty, extract_doc_comment, format_doc_comment, inner_type, is_simple_ty};\n\n/// Default casing style for generated arguments.\npub(crate) const DEFAULT_CASING: CasingStyle = CasingStyle::Kebab;\n\n/// Default casing style for environment variables\npub(crate) const DEFAULT_ENV_CASING: CasingStyle = CasingStyle::ScreamingSnake;\n\n#[derive(Clone)]\npub(crate) struct Item {\n    name: Name,\n    casing: Sp<CasingStyle>,\n    env_casing: Sp<CasingStyle>,\n    ty: Option<Type>,\n    doc_comment: Vec<Method>,\n    methods: Vec<Method>,\n    deprecations: Vec<Deprecation>,\n    value_parser: Option<ValueParser>,\n    action: Option<Action>,\n    verbatim_doc_comment: bool,\n    force_long_help: bool,\n    next_display_order: Option<Method>,\n    next_help_heading: Option<Method>,\n    is_enum: bool,\n    is_positional: bool,\n    skip_group: bool,\n    group_id: Name,\n    group_methods: Vec<Method>,\n    kind: Sp<Kind>,\n}\n\nimpl Item {\n    pub(crate) fn from_args_struct(input: &DeriveInput, name: Name) -> Result<Self, syn::Error> {\n        let ident = input.ident.clone();\n        let span = input.ident.span();\n        let attrs = &input.attrs;\n        let argument_casing = Sp::new(DEFAULT_CASING, span);\n        let env_casing = Sp::new(DEFAULT_ENV_CASING, span);\n        let kind = Sp::new(Kind::Command(Sp::new(Ty::Other, span)), span);\n\n        let mut res = Self::new(name, ident, None, argument_casing, env_casing, kind);\n        let parsed_attrs = ClapAttr::parse_all(attrs)?;\n        res.infer_kind(&parsed_attrs)?;\n        res.push_attrs(&parsed_attrs)?;\n        res.push_doc_comment(attrs, \"about\", Some(\"long_about\"));\n\n        Ok(res)\n    }\n\n    pub(crate) fn from_subcommand_enum(\n        input: &DeriveInput,\n        name: Name,\n    ) -> Result<Self, syn::Error> {\n        let ident = input.ident.clone();\n        let span = input.ident.span();\n        let attrs = &input.attrs;\n        let argument_casing = Sp::new(DEFAULT_CASING, span);\n        let env_casing = Sp::new(DEFAULT_ENV_CASING, span);\n        let kind = Sp::new(Kind::Command(Sp::new(Ty::Other, span)), span);\n\n        let mut res = Self::new(name, ident, None, argument_casing, env_casing, kind);\n        let parsed_attrs = ClapAttr::parse_all(attrs)?;\n        res.infer_kind(&parsed_attrs)?;\n        res.push_attrs(&parsed_attrs)?;\n        res.push_doc_comment(attrs, \"about\", Some(\"long_about\"));\n\n        Ok(res)\n    }\n\n    pub(crate) fn from_value_enum(input: &DeriveInput, name: Name) -> Result<Self, syn::Error> {\n        let ident = input.ident.clone();\n        let span = input.ident.span();\n        let attrs = &input.attrs;\n        let argument_casing = Sp::new(DEFAULT_CASING, span);\n        let env_casing = Sp::new(DEFAULT_ENV_CASING, span);\n        let kind = Sp::new(Kind::Value, span);\n\n        let mut res = Self::new(name, ident, None, argument_casing, env_casing, kind);\n        let parsed_attrs = ClapAttr::parse_all(attrs)?;\n        res.infer_kind(&parsed_attrs)?;\n        res.push_attrs(&parsed_attrs)?;\n        // Ignoring `push_doc_comment` as there is no top-level clap builder to add documentation\n        // to\n\n        if res.has_explicit_methods() {\n            abort!(\n                res.methods[0].name.span(),\n                \"{} doesn't exist for `ValueEnum` enums\",\n                res.methods[0].name\n            );\n        }\n\n        Ok(res)\n    }\n\n    pub(crate) fn from_subcommand_variant(\n        variant: &Variant,\n        struct_casing: Sp<CasingStyle>,\n        env_casing: Sp<CasingStyle>,\n    ) -> Result<Self, syn::Error> {\n        let name = variant.ident.clone();\n        let ident = variant.ident.clone();\n        let span = variant.span();\n        let ty = match variant.fields {\n            syn::Fields::Unnamed(syn::FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {\n                Ty::from_syn_ty(&unnamed[0].ty)\n            }\n            syn::Fields::Named(_) | syn::Fields::Unnamed(..) | syn::Fields::Unit => {\n                Sp::new(Ty::Other, span)\n            }\n        };\n        let kind = Sp::new(Kind::Command(ty), span);\n        let mut res = Self::new(\n            Name::Derived(name),\n            ident,\n            None,\n            struct_casing,\n            env_casing,\n            kind,\n        );\n        let parsed_attrs = ClapAttr::parse_all(&variant.attrs)?;\n        res.infer_kind(&parsed_attrs)?;\n        res.push_attrs(&parsed_attrs)?;\n        if matches!(&*res.kind, Kind::Command(_) | Kind::Subcommand(_)) {\n            res.push_doc_comment(&variant.attrs, \"about\", Some(\"long_about\"));\n        }\n\n        match &*res.kind {\n            Kind::Flatten(_) => {\n                if res.has_explicit_methods() {\n                    abort!(\n                        res.kind.span(),\n                        \"methods are not allowed for flattened entry\"\n                    );\n                }\n            }\n\n            Kind::Subcommand(_)\n            | Kind::ExternalSubcommand\n            | Kind::FromGlobal(_)\n            | Kind::Skip(_, _)\n            | Kind::Command(_)\n            | Kind::Value\n            | Kind::Arg(_) => (),\n        }\n\n        Ok(res)\n    }\n\n    pub(crate) fn from_value_enum_variant(\n        variant: &Variant,\n        argument_casing: Sp<CasingStyle>,\n        env_casing: Sp<CasingStyle>,\n    ) -> Result<Self, syn::Error> {\n        let ident = variant.ident.clone();\n        let span = variant.span();\n        let kind = Sp::new(Kind::Value, span);\n        let mut res = Self::new(\n            Name::Derived(variant.ident.clone()),\n            ident,\n            None,\n            argument_casing,\n            env_casing,\n            kind,\n        );\n        let parsed_attrs = ClapAttr::parse_all(&variant.attrs)?;\n        res.infer_kind(&parsed_attrs)?;\n        res.push_attrs(&parsed_attrs)?;\n        if matches!(&*res.kind, Kind::Value) {\n            res.push_doc_comment(&variant.attrs, \"help\", None);\n        }\n\n        Ok(res)\n    }\n\n    pub(crate) fn from_args_field(\n        field: &Field,\n        struct_casing: Sp<CasingStyle>,\n        env_casing: Sp<CasingStyle>,\n    ) -> Result<Self, syn::Error> {\n        let name = field.ident.clone().unwrap();\n        let ident = field.ident.clone().unwrap();\n        let span = field.span();\n        let ty = Ty::from_syn_ty(&field.ty);\n        let kind = Sp::new(Kind::Arg(ty), span);\n        let mut res = Self::new(\n            Name::Derived(name),\n            ident,\n            Some(field.ty.clone()),\n            struct_casing,\n            env_casing,\n            kind,\n        );\n        let parsed_attrs = ClapAttr::parse_all(&field.attrs)?;\n        res.infer_kind(&parsed_attrs)?;\n        res.push_attrs(&parsed_attrs)?;\n        if matches!(&*res.kind, Kind::Arg(_)) {\n            res.push_doc_comment(&field.attrs, \"help\", Some(\"long_help\"));\n        }\n\n        match &*res.kind {\n            Kind::Flatten(_) => {\n                if res.has_explicit_methods() {\n                    abort!(\n                        res.kind.span(),\n                        \"methods are not allowed for flattened entry\"\n                    );\n                }\n            }\n\n            Kind::Subcommand(_) => {\n                if res.has_explicit_methods() {\n                    abort!(\n                        res.kind.span(),\n                        \"methods in attributes are not allowed for subcommand\"\n                    );\n                }\n            }\n            Kind::Skip(_, _)\n            | Kind::FromGlobal(_)\n            | Kind::Arg(_)\n            | Kind::Command(_)\n            | Kind::Value\n            | Kind::ExternalSubcommand => {}\n        }\n\n        Ok(res)\n    }\n\n    fn new(\n        name: Name,\n        ident: Ident,\n        ty: Option<Type>,\n        casing: Sp<CasingStyle>,\n        env_casing: Sp<CasingStyle>,\n        kind: Sp<Kind>,\n    ) -> Self {\n        let group_id = Name::Derived(ident);\n        Self {\n            name,\n            ty,\n            casing,\n            env_casing,\n            doc_comment: vec![],\n            methods: vec![],\n            deprecations: vec![],\n            value_parser: None,\n            action: None,\n            verbatim_doc_comment: false,\n            force_long_help: false,\n            next_display_order: None,\n            next_help_heading: None,\n            is_enum: false,\n            is_positional: true,\n            skip_group: false,\n            group_id,\n            group_methods: vec![],\n            kind,\n        }\n    }\n\n    fn push_method(&mut self, kind: AttrKind, name: Ident, arg: impl ToTokens) {\n        self.push_method_(kind, name, arg.to_token_stream());\n    }\n\n    fn push_method_(&mut self, kind: AttrKind, name: Ident, arg: TokenStream) {\n        if name == \"id\" {\n            match kind {\n                AttrKind::Command | AttrKind::Value => {\n                    self.deprecations.push(Deprecation {\n                        span: name.span(),\n                        id: \"id_is_only_for_arg\",\n                        version: \"4.0.0\",\n                        description: format!(\n                            \"`#[{}(id)] was allowed by mistake, instead use `#[{}(name)]`\",\n                            kind.as_str(),\n                            kind.as_str()\n                        ),\n                    });\n                    self.name = Name::Assigned(arg);\n                }\n                AttrKind::Group => {\n                    self.group_id = Name::Assigned(arg);\n                }\n                AttrKind::Arg | AttrKind::Clap | AttrKind::StructOpt => {\n                    self.name = Name::Assigned(arg);\n                }\n            }\n        } else if name == \"name\" {\n            match kind {\n                AttrKind::Arg => {\n                    self.deprecations.push(Deprecation {\n                        span: name.span(),\n                        id: \"id_is_only_for_arg\",\n                        version: \"4.0.0\",\n                        description: format!(\n                            \"`#[{}(name)] was allowed by mistake, instead use `#[{}(id)]` or `#[{}(value_name)]`\",\n                            kind.as_str(),\n                            kind.as_str(),\n                            kind.as_str()\n                        ),\n                    });\n                    self.name = Name::Assigned(arg);\n                }\n                AttrKind::Group => self.group_methods.push(Method::new(name, arg)),\n                AttrKind::Command | AttrKind::Value | AttrKind::Clap | AttrKind::StructOpt => {\n                    self.name = Name::Assigned(arg);\n                }\n            }\n        } else if name == \"value_parser\" {\n            self.value_parser = Some(ValueParser::Explicit(Method::new(name, arg)));\n        } else if name == \"action\" {\n            self.action = Some(Action::Explicit(Method::new(name, arg)));\n        } else {\n            if name == \"short\" || name == \"long\" {\n                self.is_positional = false;\n            }\n            match kind {\n                AttrKind::Group => self.group_methods.push(Method::new(name, arg)),\n                _ => self.methods.push(Method::new(name, arg)),\n            };\n        }\n    }\n\n    fn infer_kind(&mut self, attrs: &[ClapAttr]) -> Result<(), syn::Error> {\n        for attr in attrs {\n            if let Some(AttrValue::Call(_)) = &attr.value {\n                continue;\n            }\n\n            let actual_attr_kind = *attr.kind.get();\n            let kind = match &attr.magic {\n                Some(MagicAttrName::FromGlobal) => {\n                    if attr.value.is_some() {\n                        let expr = attr.value_or_abort()?;\n                        abort!(expr, \"attribute `{}` does not accept a value\", attr.name);\n                    }\n                    let ty = self\n                        .kind()\n                        .ty()\n                        .cloned()\n                        .unwrap_or_else(|| Sp::new(Ty::Other, self.kind.span()));\n                    let kind = Sp::new(Kind::FromGlobal(ty), attr.name.span());\n                    Some(kind)\n                }\n                Some(MagicAttrName::Subcommand) if attr.value.is_none() => {\n                    if attr.value.is_some() {\n                        let expr = attr.value_or_abort()?;\n                        abort!(expr, \"attribute `{}` does not accept a value\", attr.name);\n                    }\n                    let ty = self\n                        .kind()\n                        .ty()\n                        .cloned()\n                        .unwrap_or_else(|| Sp::new(Ty::Other, self.kind.span()));\n                    let kind = Sp::new(Kind::Subcommand(ty), attr.name.span());\n                    Some(kind)\n                }\n                Some(MagicAttrName::ExternalSubcommand) if attr.value.is_none() => {\n                    if attr.value.is_some() {\n                        let expr = attr.value_or_abort()?;\n                        abort!(expr, \"attribute `{}` does not accept a value\", attr.name);\n                    }\n                    let kind = Sp::new(Kind::ExternalSubcommand, attr.name.span());\n                    Some(kind)\n                }\n                Some(MagicAttrName::Flatten) if attr.value.is_none() => {\n                    if attr.value.is_some() {\n                        let expr = attr.value_or_abort()?;\n                        abort!(expr, \"attribute `{}` does not accept a value\", attr.name);\n                    }\n                    let ty = self\n                        .kind()\n                        .ty()\n                        .cloned()\n                        .unwrap_or_else(|| Sp::new(Ty::Other, self.kind.span()));\n                    let kind = Sp::new(Kind::Flatten(ty), attr.name.span());\n                    Some(kind)\n                }\n                Some(MagicAttrName::Skip) if actual_attr_kind != AttrKind::Group => {\n                    let expr = attr.value.clone();\n                    let kind = Sp::new(Kind::Skip(expr, self.kind.attr_kind()), attr.name.span());\n                    Some(kind)\n                }\n                _ => None,\n            };\n\n            if let Some(kind) = kind {\n                self.set_kind(kind)?;\n            }\n        }\n\n        Ok(())\n    }\n\n    fn push_attrs(&mut self, attrs: &[ClapAttr]) -> Result<(), syn::Error> {\n        for attr in attrs {\n            let actual_attr_kind = *attr.kind.get();\n            let expected_attr_kind = self.kind.attr_kind();\n            match (actual_attr_kind, expected_attr_kind) {\n                (AttrKind::Clap, _) | (AttrKind::StructOpt, _) => {\n                    self.deprecations.push(Deprecation::attribute(\n                        \"4.0.0\",\n                        actual_attr_kind,\n                        expected_attr_kind,\n                        attr.kind.span(),\n                    ));\n                }\n\n                (AttrKind::Group, AttrKind::Command) => {}\n\n                _ if attr.kind != expected_attr_kind => {\n                    abort!(\n                        attr.kind.span(),\n                        \"expected `{}` attribute instead of `{}`\",\n                        expected_attr_kind.as_str(),\n                        actual_attr_kind.as_str()\n                    );\n                }\n\n                _ => {}\n            }\n\n            if let Some(AttrValue::Call(tokens)) = &attr.value {\n                // Force raw mode with method call syntax\n                self.push_method(*attr.kind.get(), attr.name.clone(), quote!(#(#tokens),*));\n                continue;\n            }\n\n            match &attr.magic {\n                Some(MagicAttrName::Short) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    self.push_method(\n                        *attr.kind.get(),\n                        attr.name.clone(),\n                        self.name.clone().translate_char(*self.casing),\n                    );\n                }\n\n                Some(MagicAttrName::Long) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    self.push_method(*attr.kind.get(), attr.name.clone(), self.name.clone().translate(*self.casing));\n                }\n\n                Some(MagicAttrName::ValueParser) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    self.deprecations.push(Deprecation {\n                        span: attr.name.span(),\n                        id: \"bare_value_parser\",\n                        version: \"4.0.0\",\n                        description: \"`#[arg(value_parser)]` is now the default and is no longer needed`\".to_owned(),\n                    });\n                    self.value_parser = Some(ValueParser::Implicit(attr.name.clone()));\n                }\n\n                Some(MagicAttrName::Action) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    self.deprecations.push(Deprecation {\n                        span: attr.name.span(),\n                        id: \"bare_action\",\n                        version: \"4.0.0\",\n                        description: \"`#[arg(action)]` is now the default and is no longer needed`\".to_owned(),\n                    });\n                    self.action = Some(Action::Implicit(attr.name.clone()));\n                }\n\n                Some(MagicAttrName::Env) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    self.push_method(\n                        *attr.kind.get(),\n                        attr.name.clone(),\n                        self.name.clone().translate(*self.env_casing),\n                    );\n                }\n\n                Some(MagicAttrName::ValueEnum) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    self.is_enum = true;\n                }\n\n                Some(MagicAttrName::VerbatimDocComment) if attr.value.is_none() => {\n                    self.verbatim_doc_comment = true;\n                }\n\n                Some(MagicAttrName::About) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Command])?;\n\n                    if let Some(method) =\n                        Method::from_env(attr.name.clone(), \"CARGO_PKG_DESCRIPTION\")?\n                    {\n                        self.methods.push(method);\n                    }\n                }\n\n                Some(MagicAttrName::LongAbout) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Command])?;\n\n                    self.force_long_help = true;\n                }\n\n                Some(MagicAttrName::LongHelp) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    self.force_long_help = true;\n                }\n\n                Some(MagicAttrName::Author) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Command])?;\n\n                    if let Some(method) = Method::from_env(attr.name.clone(), \"CARGO_PKG_AUTHORS\")? {\n                        self.methods.push(method);\n                    }\n                }\n\n                Some(MagicAttrName::Version) if attr.value.is_none() => {\n                    assert_attr_kind(attr, &[AttrKind::Command])?;\n\n                    if let Some(method) = Method::from_env(attr.name.clone(), \"CARGO_PKG_VERSION\")? {\n                        self.methods.push(method);\n                    }\n                }\n\n                Some(MagicAttrName::DefaultValueT) => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    let ty = if let Some(ty) = self.ty.as_ref() {\n                        ty\n                    } else {\n                        abort!(\n                            attr.name.clone(),\n                            \"#[arg(default_value_t)] (without an argument) can be used \\\n                            only on field level\\n\\n= note: {note}\\n\\n\",\n\n                            note = \"see \\\n                                https://docs.rs/clap/latest/clap/_derive/index.html#arg-attributes\")\n                    };\n\n                    let val = if let Some(expr) = &attr.value {\n                        quote!(#expr)\n                    } else {\n                        quote!(<#ty as ::std::default::Default>::default())\n                    };\n\n                    let val = if attrs\n                        .iter()\n                        .any(|a| a.magic == Some(MagicAttrName::ValueEnum))\n                    {\n                        quote_spanned!(attr.name.span()=> {\n                            static DEFAULT_VALUE: ::std::sync::OnceLock<String> = ::std::sync::OnceLock::new();\n                            let s = DEFAULT_VALUE.get_or_init(|| {\n                                let val: #ty = #val;\n                                clap::ValueEnum::to_possible_value(&val).unwrap().get_name().to_owned()\n                            });\n                            let s: &'static str = &*s;\n                            s\n                        })\n                    } else {\n                        quote_spanned!(attr.name.span()=> {\n                            static DEFAULT_VALUE: ::std::sync::OnceLock<String> = ::std::sync::OnceLock::new();\n                            let s = DEFAULT_VALUE.get_or_init(|| {\n                                let val: #ty = #val;\n                                ::std::string::ToString::to_string(&val)\n                            });\n                            let s: &'static str = &*s;\n                            s\n                        })\n                    };\n\n                    let raw_ident = Ident::new(\"default_value\", attr.name.span());\n                    self.methods.push(Method::new(raw_ident, val));\n                }\n\n                Some(MagicAttrName::DefaultValuesT) => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    let ty = if let Some(ty) = self.ty.as_ref() {\n                        ty\n                    } else {\n                        abort!(\n                            attr.name.clone(),\n                            \"#[arg(default_values_t)] (without an argument) can be used \\\n                            only on field level\\n\\n= note: {note}\\n\\n\",\n\n                            note = \"see \\\n                                https://docs.rs/clap/latest/clap/_derive/index.html#arg-attributes\")\n                    };\n                    let expr = attr.value_or_abort()?;\n\n                    let container_type = Ty::from_syn_ty(ty);\n                    if *container_type != Ty::Vec {\n                        abort!(\n                            attr.name.clone(),\n                            \"#[arg(default_values_t)] can be used only on Vec types\\n\\n= note: {note}\\n\\n\",\n\n                            note = \"see \\\n                                https://docs.rs/clap/latest/clap/_derive/index.html#arg-attributes\")\n                    }\n                    let inner_type = inner_type(ty);\n\n                    // Use `Borrow<#inner_type>` so we accept `&Vec<#inner_type>` and\n                    // `Vec<#inner_type>`.\n                    let val = if attrs\n                        .iter()\n                        .any(|a| a.magic == Some(MagicAttrName::ValueEnum))\n                    {\n                        quote_spanned!(attr.name.span()=> {\n                            {\n                                fn iter_to_vals<T>(iterable: impl IntoIterator<Item = T>) -> impl Iterator<Item=String>\n                                where\n                                    T: ::std::borrow::Borrow<#inner_type>\n                                {\n                                    iterable\n                                        .into_iter()\n                                        .map(|val| {\n                                            clap::ValueEnum::to_possible_value(val.borrow()).unwrap().get_name().to_owned()\n                                        })\n                                }\n\n                                static DEFAULT_STRINGS: ::std::sync::OnceLock<Vec<String>> = ::std::sync::OnceLock::new();\n                                static DEFAULT_VALUES: ::std::sync::OnceLock<Vec<&str>> = ::std::sync::OnceLock::new();\n                                DEFAULT_VALUES.get_or_init(|| {\n                                    DEFAULT_STRINGS.get_or_init(|| iter_to_vals(#expr).collect()).iter().map(::std::string::String::as_str).collect()\n                                }).iter().copied()\n                            }\n                        })\n                    } else {\n                        quote_spanned!(attr.name.span()=> {\n                            {\n                                fn iter_to_vals<T>(iterable: impl IntoIterator<Item = T>) -> impl Iterator<Item=String>\n                                where\n                                    T: ::std::borrow::Borrow<#inner_type>\n                                {\n                                    iterable.into_iter().map(|val| val.borrow().to_string())\n                                }\n\n                                static DEFAULT_STRINGS: ::std::sync::OnceLock<Vec<String>> = ::std::sync::OnceLock::new();\n                                static DEFAULT_VALUES: ::std::sync::OnceLock<Vec<&str>> = ::std::sync::OnceLock::new();\n                                DEFAULT_VALUES.get_or_init(|| {\n                                    DEFAULT_STRINGS.get_or_init(|| iter_to_vals(#expr).collect()).iter().map(::std::string::String::as_str).collect()\n                                }).iter().copied()\n                            }\n                        })\n                    };\n\n                    self.methods.push(Method::new(\n                        Ident::new(\"default_values\", attr.name.span()),\n                        val,\n                    ));\n                }\n\n                Some(MagicAttrName::DefaultValueOsT) => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    let ty = if let Some(ty) = self.ty.as_ref() {\n                        ty\n                    } else {\n                        abort!(\n                            attr.name.clone(),\n                            \"#[arg(default_value_os_t)] (without an argument) can be used \\\n                            only on field level\\n\\n= note: {note}\\n\\n\",\n\n                            note = \"see \\\n                                https://docs.rs/clap/latest/clap/_derive/index.html#arg-attributes\")\n                    };\n\n                    let val = if let Some(expr) = &attr.value {\n                        quote!(#expr)\n                    } else {\n                        quote!(<#ty as ::std::default::Default>::default())\n                    };\n\n                    let val = if attrs\n                        .iter()\n                        .any(|a| a.magic == Some(MagicAttrName::ValueEnum))\n                    {\n                        quote_spanned!(attr.name.span()=> {\n                            static DEFAULT_VALUE: ::std::sync::OnceLock<String> = ::std::sync::OnceLock::new();\n                            let s = DEFAULT_VALUE.get_or_init(|| {\n                                let val: #ty = #val;\n                                clap::ValueEnum::to_possible_value(&val).unwrap().get_name().to_owned()\n                            });\n                            let s: &'static str = &*s;\n                            s\n                        })\n                    } else {\n                        quote_spanned!(attr.name.span()=> {\n                            static DEFAULT_VALUE: ::std::sync::OnceLock<::std::ffi::OsString> = ::std::sync::OnceLock::new();\n                            let s = DEFAULT_VALUE.get_or_init(|| {\n                                let val: #ty = #val;\n                                ::std::ffi::OsString::from(val)\n                            });\n                            let s: &'static ::std::ffi::OsStr = &*s;\n                            s\n                        })\n                    };\n\n                    let raw_ident = Ident::new(\"default_value\", attr.name.span());\n                    self.methods.push(Method::new(raw_ident, val));\n                }\n\n                Some(MagicAttrName::DefaultValuesOsT) => {\n                    assert_attr_kind(attr, &[AttrKind::Arg])?;\n\n                    let ty = if let Some(ty) = self.ty.as_ref() {\n                        ty\n                    } else {\n                        abort!(\n                            attr.name.clone(),\n                            \"#[arg(default_values_os_t)] (without an argument) can be used \\\n                            only on field level\\n\\n= note: {note}\\n\\n\",\n\n                            note = \"see \\\n                                https://docs.rs/clap/latest/clap/_derive/index.html#arg-attributes\")\n                    };\n                    let expr = attr.value_or_abort()?;\n\n                    let container_type = Ty::from_syn_ty(ty);\n                    if *container_type != Ty::Vec {\n                        abort!(\n                            attr.name.clone(),\n                            \"#[arg(default_values_os_t)] can be used only on Vec types\\n\\n= note: {note}\\n\\n\",\n\n                            note = \"see \\\n                                https://docs.rs/clap/latest/clap/_derive/index.html#arg-attributes\")\n                    }\n                    let inner_type = inner_type(ty);\n\n                    // Use `Borrow<#inner_type>` so we accept `&Vec<#inner_type>` and\n                    // `Vec<#inner_type>`.\n                    let val = if attrs\n                        .iter()\n                        .any(|a| a.magic == Some(MagicAttrName::ValueEnum))\n                    {\n                        quote_spanned!(attr.name.span()=> {\n                            {\n                                fn iter_to_vals<T>(iterable: impl IntoIterator<Item = T>) -> impl Iterator<Item=::std::ffi::OsString>\n                                where\n                                    T: ::std::borrow::Borrow<#inner_type>\n                                {\n                                    iterable\n                                        .into_iter()\n                                        .map(|val| {\n                                            clap::ValueEnum::to_possible_value(val.borrow()).unwrap().get_name().to_owned().into()\n                                        })\n                                }\n\n                                static DEFAULT_STRINGS: ::std::sync::OnceLock<Vec<::std::ffi::OsString>> = ::std::sync::OnceLock::new();\n                                static DEFAULT_VALUES: ::std::sync::OnceLock<Vec<&::std::ffi::OsStr>> = ::std::sync::OnceLock::new();\n                                DEFAULT_VALUES.get_or_init(|| {\n                                    DEFAULT_STRINGS.get_or_init(|| iter_to_vals(#expr).collect()).iter().map(::std::ffi::OsString::as_os_str).collect()\n                                }).iter().copied()\n                            }\n                        })\n                    } else {\n                        quote_spanned!(attr.name.span()=> {\n                            {\n                                fn iter_to_vals<T>(iterable: impl IntoIterator<Item = T>) -> impl Iterator<Item=::std::ffi::OsString>\n                                where\n                                    T: ::std::borrow::Borrow<#inner_type>\n                                {\n                                    iterable.into_iter().map(|val| val.borrow().into())\n                                }\n\n                                static DEFAULT_STRINGS: ::std::sync::OnceLock<Vec<::std::ffi::OsString>> = ::std::sync::OnceLock::new();\n                                static DEFAULT_VALUES: ::std::sync::OnceLock<Vec<&::std::ffi::OsStr>> = ::std::sync::OnceLock::new();\n                                DEFAULT_VALUES.get_or_init(|| {\n                                    DEFAULT_STRINGS.get_or_init(|| iter_to_vals(#expr).collect()).iter().map(::std::ffi::OsString::as_os_str).collect()\n                                }).iter().copied()\n                            }\n                        })\n                    };\n\n                    self.methods.push(Method::new(\n                        Ident::new(\"default_values\", attr.name.span()),\n                        val,\n                    ));\n                }\n\n                Some(MagicAttrName::NextDisplayOrder) => {\n                    assert_attr_kind(attr, &[AttrKind::Command])?;\n\n                    let expr = attr.value_or_abort()?;\n                    self.next_display_order = Some(Method::new(attr.name.clone(), quote!(#expr)));\n                }\n\n                Some(MagicAttrName::NextHelpHeading) => {\n                    assert_attr_kind(attr, &[AttrKind::Command])?;\n\n                    let expr = attr.value_or_abort()?;\n                    self.next_help_heading = Some(Method::new(attr.name.clone(), quote!(#expr)));\n                }\n\n                Some(MagicAttrName::RenameAll) => {\n                    let lit = attr.lit_str_or_abort()?;\n                    self.casing = CasingStyle::from_lit(lit)?;\n                }\n\n                Some(MagicAttrName::RenameAllEnv) => {\n                    assert_attr_kind(attr, &[AttrKind::Command, AttrKind::Arg])?;\n\n                    let lit = attr.lit_str_or_abort()?;\n                    self.env_casing = CasingStyle::from_lit(lit)?;\n                }\n\n                Some(MagicAttrName::Skip) if actual_attr_kind == AttrKind::Group => {\n                    self.skip_group = true;\n                }\n\n                None\n                // Magic only for the default, otherwise just forward to the builder\n                | Some(MagicAttrName::Short)\n                | Some(MagicAttrName::Long)\n                | Some(MagicAttrName::Env)\n                | Some(MagicAttrName::About)\n                | Some(MagicAttrName::LongAbout)\n                | Some(MagicAttrName::LongHelp)\n                | Some(MagicAttrName::Author)\n                | Some(MagicAttrName::Version)\n                 => {\n                    let expr = attr.value_or_abort()?;\n                    self.push_method(*attr.kind.get(), attr.name.clone(), expr);\n                }\n\n                // Magic only for the default, otherwise just forward to the builder\n                Some(MagicAttrName::ValueParser) | Some(MagicAttrName::Action) => {\n                    let expr = attr.value_or_abort()?;\n                    self.push_method(*attr.kind.get(), attr.name.clone(), expr);\n                }\n\n                // Directives that never receive a value\n                Some(MagicAttrName::ValueEnum)\n                | Some(MagicAttrName::VerbatimDocComment) => {\n                    let expr = attr.value_or_abort()?;\n                    abort!(expr, \"attribute `{}` does not accept a value\", attr.name);\n                }\n\n                // Kinds\n                Some(MagicAttrName::FromGlobal)\n                | Some(MagicAttrName::Subcommand)\n                | Some(MagicAttrName::ExternalSubcommand)\n                | Some(MagicAttrName::Flatten)\n                | Some(MagicAttrName::Skip) => {\n                }\n            }\n        }\n\n        if self.has_explicit_methods() {\n            if let Kind::Skip(_, attr) = &*self.kind {\n                abort!(\n                    self.methods[0].name.span(),\n                    \"`{}` cannot be used with `#[{}(skip)]\",\n                    self.methods[0].name,\n                    attr.as_str(),\n                );\n            }\n            if let Kind::FromGlobal(_) = &*self.kind {\n                abort!(\n                    self.methods[0].name.span(),\n                    \"`{}` cannot be used with `#[arg(from_global)]\",\n                    self.methods[0].name,\n                );\n            }\n        }\n\n        Ok(())\n    }\n\n    fn push_doc_comment(&mut self, attrs: &[Attribute], short_name: &str, long_name: Option<&str>) {\n        let lines = extract_doc_comment(attrs);\n\n        if !lines.is_empty() {\n            let (short_help, long_help) =\n                format_doc_comment(&lines, !self.verbatim_doc_comment, self.force_long_help);\n            let short_name = format_ident!(\"{short_name}\");\n\n            let is_value_kind = matches!(self.kind.get(), Kind::Value);\n            let short_method = if is_value_kind && cfg!(feature = \"unstable-v5\") {\n                Method::new(\n                    short_name,\n                    long_help\n                        .clone()\n                        .or(short_help)\n                        .map(|h| quote!(#h))\n                        .unwrap_or_else(|| quote!(None)),\n                )\n            } else {\n                Method::new(\n                    short_name,\n                    short_help\n                        .map(|h| quote!(#h))\n                        .unwrap_or_else(|| quote!(None)),\n                )\n            };\n            self.doc_comment.push(short_method);\n            if let Some(long_name) = long_name {\n                let long_name = format_ident!(\"{long_name}\");\n                let long = Method::new(\n                    long_name,\n                    long_help\n                        .map(|h| quote!(#h))\n                        .unwrap_or_else(|| quote!(None)),\n                );\n                self.doc_comment.push(long);\n            }\n        }\n    }\n\n    fn set_kind(&mut self, kind: Sp<Kind>) -> Result<(), syn::Error> {\n        match (self.kind.get(), kind.get()) {\n            (Kind::Arg(_), Kind::FromGlobal(_))\n            | (Kind::Arg(_), Kind::Subcommand(_))\n            | (Kind::Arg(_), Kind::Flatten(_))\n            | (Kind::Arg(_), Kind::Skip(_, _))\n            | (Kind::Command(_), Kind::Subcommand(_))\n            | (Kind::Command(_), Kind::Flatten(_))\n            | (Kind::Command(_), Kind::Skip(_, _))\n            | (Kind::Command(_), Kind::ExternalSubcommand)\n            | (Kind::Value, Kind::Skip(_, _)) => {\n                self.kind = kind;\n            }\n\n            (_, _) => {\n                let old = self.kind.name();\n                let new = kind.name();\n                abort!(kind.span(), \"`{new}` cannot be used with `{old}`\");\n            }\n        }\n        Ok(())\n    }\n\n    pub(crate) fn find_default_method(&self) -> Option<&Method> {\n        self.methods\n            .iter()\n            .find(|m| m.name == \"default_value\" || m.name == \"default_value_os\")\n    }\n\n    /// generate methods from attributes on top of struct or enum\n    pub(crate) fn initial_top_level_methods(&self) -> TokenStream {\n        let next_display_order = self.next_display_order.as_ref().into_iter();\n        let next_help_heading = self.next_help_heading.as_ref().into_iter();\n        quote!(\n            #(#next_display_order)*\n            #(#next_help_heading)*\n        )\n    }\n\n    pub(crate) fn final_top_level_methods(&self) -> TokenStream {\n        let methods = &self.methods;\n        let doc_comment = &self.doc_comment;\n\n        quote!( #(#doc_comment)* #(#methods)*)\n    }\n\n    /// generate methods on top of a field\n    pub(crate) fn field_methods(&self) -> TokenStream {\n        let methods = &self.methods;\n        let doc_comment = &self.doc_comment;\n        quote!( #(#doc_comment)* #(#methods)* )\n    }\n\n    pub(crate) fn group_id(&self) -> &Name {\n        &self.group_id\n    }\n\n    pub(crate) fn group_methods(&self) -> TokenStream {\n        let group_methods = &self.group_methods;\n        quote!( #(#group_methods)* )\n    }\n\n    pub(crate) fn deprecations(&self) -> TokenStream {\n        let deprecations = &self.deprecations;\n        quote!( #(#deprecations)* )\n    }\n\n    pub(crate) fn next_display_order(&self) -> TokenStream {\n        let next_display_order = self.next_display_order.as_ref().into_iter();\n        quote!( #(#next_display_order)* )\n    }\n\n    pub(crate) fn next_help_heading(&self) -> TokenStream {\n        let next_help_heading = self.next_help_heading.as_ref().into_iter();\n        quote!( #(#next_help_heading)* )\n    }\n\n    pub(crate) fn id(&self) -> &Name {\n        &self.name\n    }\n\n    pub(crate) fn cased_name(&self) -> TokenStream {\n        self.name.clone().translate(*self.casing)\n    }\n\n    pub(crate) fn value_name(&self) -> TokenStream {\n        self.name.clone().translate(CasingStyle::ScreamingSnake)\n    }\n\n    pub(crate) fn value_parser(&self, field_type: &Type) -> Method {\n        self.value_parser\n            .clone()\n            .map(|p| {\n                let inner_type = inner_type(field_type);\n                p.resolve(inner_type)\n            })\n            .unwrap_or_else(|| {\n                let inner_type = inner_type(field_type);\n                if let Some(action) = self.action.as_ref() {\n                    let span = action.span();\n                    default_value_parser(inner_type, span)\n                } else {\n                    let span = self\n                        .action\n                        .as_ref()\n                        .map(|a| a.span())\n                        .unwrap_or_else(|| self.kind.span());\n                    default_value_parser(inner_type, span)\n                }\n            })\n    }\n\n    pub(crate) fn action(&self, field_type: &Type) -> Method {\n        self.action\n            .clone()\n            .map(|p| p.resolve(field_type))\n            .unwrap_or_else(|| {\n                if let Some(value_parser) = self.value_parser.as_ref() {\n                    let span = value_parser.span();\n                    default_action(field_type, span)\n                } else {\n                    let span = self\n                        .value_parser\n                        .as_ref()\n                        .map(|a| a.span())\n                        .unwrap_or_else(|| self.kind.span());\n                    default_action(field_type, span)\n                }\n            })\n    }\n\n    pub(crate) fn kind(&self) -> Sp<Kind> {\n        self.kind.clone()\n    }\n\n    pub(crate) fn is_positional(&self) -> bool {\n        self.is_positional\n    }\n\n    pub(crate) fn casing(&self) -> Sp<CasingStyle> {\n        self.casing\n    }\n\n    pub(crate) fn env_casing(&self) -> Sp<CasingStyle> {\n        self.env_casing\n    }\n\n    pub(crate) fn has_explicit_methods(&self) -> bool {\n        self.methods\n            .iter()\n            .any(|m| m.name != \"help\" && m.name != \"long_help\")\n    }\n\n    pub(crate) fn skip_group(&self) -> bool {\n        self.skip_group\n    }\n}\n\n#[derive(Clone)]\nenum ValueParser {\n    Explicit(Method),\n    Implicit(Ident),\n}\n\nimpl ValueParser {\n    fn resolve(self, _inner_type: &Type) -> Method {\n        match self {\n            Self::Explicit(method) => method,\n            Self::Implicit(ident) => default_value_parser(_inner_type, ident.span()),\n        }\n    }\n\n    fn span(&self) -> Span {\n        match self {\n            Self::Explicit(method) => method.name.span(),\n            Self::Implicit(ident) => ident.span(),\n        }\n    }\n}\n\nfn default_value_parser(inner_type: &Type, span: Span) -> Method {\n    let func = Ident::new(\"value_parser\", span);\n    Method::new(\n        func,\n        quote_spanned! { span=>\n            clap::value_parser!(#inner_type)\n        },\n    )\n}\n\n#[derive(Clone)]\npub(crate) enum Action {\n    Explicit(Method),\n    Implicit(Ident),\n}\n\nimpl Action {\n    pub(crate) fn resolve(self, _field_type: &Type) -> Method {\n        match self {\n            Self::Explicit(method) => method,\n            Self::Implicit(ident) => default_action(_field_type, ident.span()),\n        }\n    }\n\n    pub(crate) fn span(&self) -> Span {\n        match self {\n            Self::Explicit(method) => method.name.span(),\n            Self::Implicit(ident) => ident.span(),\n        }\n    }\n}\n\nfn default_action(field_type: &Type, span: Span) -> Method {\n    let ty = Ty::from_syn_ty(field_type);\n    let args = match *ty {\n        Ty::Vec | Ty::OptionVec | Ty::VecVec | Ty::OptionVecVec => {\n            quote_spanned! { span=>\n                clap::ArgAction::Append\n            }\n        }\n        Ty::Option | Ty::OptionOption => {\n            quote_spanned! { span=>\n                clap::ArgAction::Set\n            }\n        }\n        _ => {\n            if is_simple_ty(field_type, \"bool\") {\n                quote_spanned! { span=>\n                    clap::ArgAction::SetTrue\n                }\n            } else {\n                quote_spanned! { span=>\n                    clap::ArgAction::Set\n                }\n            }\n        }\n    };\n\n    let func = Ident::new(\"action\", span);\n    Method::new(func, args)\n}\n\n#[allow(clippy::large_enum_variant)]\n#[derive(Clone)]\npub(crate) enum Kind {\n    Arg(Sp<Ty>),\n    Command(Sp<Ty>),\n    Value,\n    FromGlobal(Sp<Ty>),\n    Subcommand(Sp<Ty>),\n    Flatten(Sp<Ty>),\n    Skip(Option<AttrValue>, AttrKind),\n    ExternalSubcommand,\n}\n\nimpl Kind {\n    pub(crate) fn name(&self) -> &'static str {\n        match self {\n            Self::Arg(_) => \"arg\",\n            Self::Command(_) => \"command\",\n            Self::Value => \"value\",\n            Self::FromGlobal(_) => \"from_global\",\n            Self::Subcommand(_) => \"subcommand\",\n            Self::Flatten(_) => \"flatten\",\n            Self::Skip(_, _) => \"skip\",\n            Self::ExternalSubcommand => \"external_subcommand\",\n        }\n    }\n\n    pub(crate) fn attr_kind(&self) -> AttrKind {\n        match self {\n            Self::Arg(_) => AttrKind::Arg,\n            Self::Command(_) => AttrKind::Command,\n            Self::Value => AttrKind::Value,\n            Self::FromGlobal(_) => AttrKind::Arg,\n            Self::Subcommand(_) => AttrKind::Command,\n            Self::Flatten(_) => AttrKind::Command,\n            Self::Skip(_, kind) => *kind,\n            Self::ExternalSubcommand => AttrKind::Command,\n        }\n    }\n\n    pub(crate) fn ty(&self) -> Option<&Sp<Ty>> {\n        match self {\n            Self::Arg(ty)\n            | Self::Command(ty)\n            | Self::Flatten(ty)\n            | Self::FromGlobal(ty)\n            | Self::Subcommand(ty) => Some(ty),\n            Self::Value | Self::Skip(_, _) | Self::ExternalSubcommand => None,\n        }\n    }\n}\n\n#[derive(Clone)]\npub(crate) struct Method {\n    name: Ident,\n    args: TokenStream,\n}\n\nimpl Method {\n    pub(crate) fn new(name: Ident, args: TokenStream) -> Self {\n        Method { name, args }\n    }\n\n    fn from_env(ident: Ident, env_var: &str) -> Result<Option<Self>, syn::Error> {\n        let mut lit = match env::var(env_var) {\n            Ok(val) => {\n                if val.is_empty() {\n                    return Ok(None);\n                }\n                LitStr::new(&val, ident.span())\n            }\n            Err(_) => {\n                abort!(\n                    ident,\n                    \"cannot derive `{}` from Cargo.toml\\n\\n= note: {note}\\n\\n= help: {help}\\n\\n\",\n                    ident,\n                    note = format_args!(\"`{env_var}` environment variable is not set\"),\n                    help = format_args!(\"use `{ident} = \\\"...\\\"` to set {ident} manually\")\n                );\n            }\n        };\n\n        if ident == \"author\" {\n            let edited = process_author_str(&lit.value());\n            lit = LitStr::new(&edited, lit.span());\n        }\n\n        Ok(Some(Method::new(ident, quote!(#lit))))\n    }\n\n    pub(crate) fn args(&self) -> &TokenStream {\n        &self.args\n    }\n}\n\nimpl ToTokens for Method {\n    fn to_tokens(&self, ts: &mut TokenStream) {\n        let Method { name, args } = self;\n\n        let tokens = quote!( .#name(#args) );\n\n        tokens.to_tokens(ts);\n    }\n}\n\n#[derive(Clone)]\npub(crate) struct Deprecation {\n    pub(crate) span: Span,\n    pub(crate) id: &'static str,\n    pub(crate) version: &'static str,\n    pub(crate) description: String,\n}\n\nimpl Deprecation {\n    fn attribute(version: &'static str, old: AttrKind, new: AttrKind, span: Span) -> Self {\n        Self {\n            span,\n            id: \"old_attribute\",\n            version,\n            description: format!(\n                \"Attribute `#[{}(...)]` has been deprecated in favor of `#[{}(...)]`\",\n                old.as_str(),\n                new.as_str()\n            ),\n        }\n    }\n}\n\nimpl ToTokens for Deprecation {\n    fn to_tokens(&self, ts: &mut TokenStream) {\n        let tokens = if cfg!(feature = \"deprecated\") {\n            let Deprecation {\n                span,\n                id,\n                version,\n                description,\n            } = self;\n            let span = *span;\n            let id = Ident::new(id, span);\n\n            quote_spanned!(span=> {\n                #[deprecated(since = #version, note = #description)]\n                fn #id() {}\n                #id();\n            })\n        } else {\n            quote!()\n        };\n\n        tokens.to_tokens(ts);\n    }\n}\n\nfn assert_attr_kind(attr: &ClapAttr, possible_kind: &[AttrKind]) -> Result<(), syn::Error> {\n    if *attr.kind.get() == AttrKind::Clap || *attr.kind.get() == AttrKind::StructOpt {\n        // deprecated\n    } else if !possible_kind.contains(attr.kind.get()) {\n        let options = possible_kind\n            .iter()\n            .map(|k| format!(\"`#[{}({})]`\", k.as_str(), attr.name))\n            .collect::<Vec<_>>();\n        abort!(\n            attr.name,\n            \"unknown `#[{}({})]` attribute ({} exists)\",\n            attr.kind.as_str(),\n            attr.name,\n            options.join(\", \")\n        );\n    }\n    Ok(())\n}\n\n/// replace all `:` with `, ` when not inside the `<>`\n///\n/// `\"author1:author2:author3\" => \"author1, author2, author3\"`\n/// `\"author1 <http://website1.com>:author2\" => \"author1 <http://website1.com>, author2\"`\nfn process_author_str(author: &str) -> String {\n    let mut res = String::with_capacity(author.len());\n    let mut inside_angle_braces = 0usize;\n\n    for ch in author.chars() {\n        if inside_angle_braces > 0 && ch == '>' {\n            inside_angle_braces -= 1;\n            res.push(ch);\n        } else if ch == '<' {\n            inside_angle_braces += 1;\n            res.push(ch);\n        } else if inside_angle_braces == 0 && ch == ':' {\n            res.push_str(\", \");\n        } else {\n            res.push(ch);\n        }\n    }\n\n    res\n}\n\n/// Defines the casing for the attributes long representation.\n#[derive(Copy, Clone, Debug, PartialEq, Eq)]\npub(crate) enum CasingStyle {\n    /// Indicate word boundaries with uppercase letter, excluding the first word.\n    Camel,\n    /// Keep all letters lowercase and indicate word boundaries with hyphens.\n    Kebab,\n    /// Indicate word boundaries with uppercase letter, including the first word.\n    Pascal,\n    /// Keep all letters uppercase and indicate word boundaries with underscores.\n    ScreamingSnake,\n    /// Keep all letters lowercase and indicate word boundaries with underscores.\n    Snake,\n    /// Keep all letters lowercase and remove word boundaries.\n    Lower,\n    /// Keep all letters uppercase and remove word boundaries.\n    Upper,\n    /// Use the original attribute name defined in the code.\n    Verbatim,\n}\n\nimpl CasingStyle {\n    fn from_lit(name: &LitStr) -> Result<Sp<Self>, syn::Error> {\n        use self::CasingStyle::{\n            Camel, Kebab, Lower, Pascal, ScreamingSnake, Snake, Upper, Verbatim,\n        };\n\n        let normalized = name.value().to_upper_camel_case().to_lowercase();\n        let cs = |kind| Sp::new(kind, name.span());\n\n        let s = match normalized.as_ref() {\n            \"camel\" | \"camelcase\" => cs(Camel),\n            \"kebab\" | \"kebabcase\" => cs(Kebab),\n            \"pascal\" | \"pascalcase\" => cs(Pascal),\n            \"screamingsnake\" | \"screamingsnakecase\" => cs(ScreamingSnake),\n            \"snake\" | \"snakecase\" => cs(Snake),\n            \"lower\" | \"lowercase\" => cs(Lower),\n            \"upper\" | \"uppercase\" => cs(Upper),\n            \"verbatim\" | \"verbatimcase\" => cs(Verbatim),\n            s => abort!(name, \"unsupported casing: `{s}`\"),\n        };\n        Ok(s)\n    }\n}\n\n#[derive(Clone)]\npub(crate) enum Name {\n    Derived(Ident),\n    Assigned(TokenStream),\n}\n\nimpl Name {\n    pub(crate) fn translate(self, style: CasingStyle) -> TokenStream {\n        use CasingStyle::{Camel, Kebab, Lower, Pascal, ScreamingSnake, Snake, Upper, Verbatim};\n\n        match self {\n            Name::Assigned(tokens) => tokens,\n            Name::Derived(ident) => {\n                let s = ident.unraw().to_string();\n                let s = match style {\n                    Pascal => s.to_upper_camel_case(),\n                    Kebab => s.to_kebab_case(),\n                    Camel => s.to_lower_camel_case(),\n                    ScreamingSnake => s.to_shouty_snake_case(),\n                    Snake => s.to_snake_case(),\n                    Lower => s.to_snake_case().replace('_', \"\"),\n                    Upper => s.to_shouty_snake_case().replace('_', \"\"),\n                    Verbatim => s,\n                };\n                quote_spanned!(ident.span()=> #s)\n            }\n        }\n    }\n\n    pub(crate) fn translate_char(self, style: CasingStyle) -> TokenStream {\n        use CasingStyle::{Camel, Kebab, Lower, Pascal, ScreamingSnake, Snake, Upper, Verbatim};\n\n        match self {\n            Name::Assigned(tokens) => quote!( (#tokens).chars().next().unwrap() ),\n            Name::Derived(ident) => {\n                let s = ident.unraw().to_string();\n                let s = match style {\n                    Pascal => s.to_upper_camel_case(),\n                    Kebab => s.to_kebab_case(),\n                    Camel => s.to_lower_camel_case(),\n                    ScreamingSnake => s.to_shouty_snake_case(),\n                    Snake => s.to_snake_case(),\n                    Lower => s.to_snake_case(),\n                    Upper => s.to_shouty_snake_case(),\n                    Verbatim => s,\n                };\n\n                let s = s.chars().next().unwrap();\n                quote_spanned!(ident.span()=> #s)\n            }\n        }\n    }\n}\n\nimpl ToTokens for Name {\n    fn to_tokens(&self, tokens: &mut TokenStream) {\n        match self {\n            Name::Assigned(t) => t.to_tokens(tokens),\n            Name::Derived(ident) => {\n                let s = ident.unraw().to_string();\n                quote_spanned!(ident.span()=> #s).to_tokens(tokens);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "clap_derive/src/lib.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\n#![doc = include_str!(\"../README.md\")]\n#![doc(html_logo_url = \"https://raw.githubusercontent.com/clap-rs/clap/master/assets/clap.png\")]\n#![cfg_attr(docsrs, feature(doc_cfg))]\n#![forbid(unsafe_code)]\n#![warn(missing_docs)]\n#![warn(clippy::print_stderr)]\n#![warn(clippy::print_stdout)]\n\nuse proc_macro::TokenStream;\nuse syn::{Data, DataStruct, Fields};\nuse syn::{DeriveInput, parse_macro_input};\n\n#[macro_use]\nmod macros;\n\nmod attr;\nmod derives;\nmod dummies;\nmod item;\nmod utils;\n\n/// Generates the `ValueEnum` impl.\n#[proc_macro_derive(ValueEnum, attributes(clap, value))]\npub fn value_enum(input: TokenStream) -> TokenStream {\n    let input: DeriveInput = parse_macro_input!(input);\n    derives::derive_value_enum(&input)\n        .unwrap_or_else(|err| {\n            let dummy = dummies::value_enum(&input.ident);\n            to_compile_error(err, dummy)\n        })\n        .into()\n}\n\n/// Generates the `Parser` implementation.\n///\n/// This is far less verbose than defining the `clap::Command` struct manually,\n/// receiving an instance of `clap::ArgMatches` from conducting parsing, and then\n/// implementing a conversion code to instantiate an instance of the user\n/// context struct.\n#[proc_macro_derive(Parser, attributes(clap, structopt, command, arg, group))]\npub fn parser(input: TokenStream) -> TokenStream {\n    let input: DeriveInput = parse_macro_input!(input);\n    derives::derive_parser(&input)\n        .unwrap_or_else(|err| {\n            let specific_dummy = match input.data {\n                Data::Struct(DataStruct {\n                    fields: Fields::Named(ref _fields),\n                    ..\n                }) => Some(dummies::args(&input.ident)),\n                Data::Struct(DataStruct {\n                    fields: Fields::Unit,\n                    ..\n                }) => Some(dummies::args(&input.ident)),\n                Data::Enum(_) => Some(dummies::subcommand(&input.ident)),\n                _ => None,\n            };\n            let dummy = specific_dummy\n                .map(|specific_dummy| {\n                    let parser_dummy = dummies::parser(&input.ident);\n                    quote::quote! {\n                        #parser_dummy\n                        #specific_dummy\n                    }\n                })\n                .unwrap_or_else(|| quote::quote!());\n            to_compile_error(err, dummy)\n        })\n        .into()\n}\n\n/// Generates the `Subcommand` impl.\n#[proc_macro_derive(Subcommand, attributes(clap, command, arg, group))]\npub fn subcommand(input: TokenStream) -> TokenStream {\n    let input: DeriveInput = parse_macro_input!(input);\n    derives::derive_subcommand(&input)\n        .unwrap_or_else(|err| {\n            let dummy = dummies::subcommand(&input.ident);\n            to_compile_error(err, dummy)\n        })\n        .into()\n}\n\n/// Generates the `Args` impl.\n#[proc_macro_derive(Args, attributes(clap, command, arg, group))]\npub fn args(input: TokenStream) -> TokenStream {\n    let input: DeriveInput = parse_macro_input!(input);\n    derives::derive_args(&input)\n        .unwrap_or_else(|err| {\n            let dummy = dummies::args(&input.ident);\n            to_compile_error(err, dummy)\n        })\n        .into()\n}\n\nfn to_compile_error(\n    error: syn::Error,\n    dummy: proc_macro2::TokenStream,\n) -> proc_macro2::TokenStream {\n    let compile_errors = error.to_compile_error();\n    quote::quote!(\n        #dummy\n        #compile_errors\n    )\n}\n"
  },
  {
    "path": "clap_derive/src/macros.rs",
    "content": "macro_rules! format_err {\n    ($obj:expr, $($format:tt)+) => {{\n        #[allow(unused_imports)]\n        use $crate::utils::error::*;\n        let msg = format!($($format)+);\n        $obj.EXPECTED_Span_OR_ToTokens(msg)\n    }};\n}\n\nmacro_rules! abort {\n    ($obj:expr, $($format:tt)+) => {{\n        return Err(format_err!($obj, $($format)+));\n    }};\n}\n\nmacro_rules! abort_call_site {\n    ($($format:tt)+) => {{\n        let span = proc_macro2::Span::call_site();\n        abort!(span, $($format)+)\n    }};\n}\n"
  },
  {
    "path": "clap_derive/src/utils/doc_comments.rs",
    "content": "//! The preprocessing we apply to doc comments.\n//!\n//! #[derive(Parser)] works in terms of \"paragraphs\". Paragraph is a sequence of\n//! non-empty adjacent lines, delimited by sequences of blank (whitespace only) lines.\n\n#[cfg(feature = \"unstable-markdown\")]\nuse markdown::parse_markdown;\n\npub(crate) fn extract_doc_comment(attrs: &[syn::Attribute]) -> Vec<String> {\n    // multiline comments (`/** ... */`) may have LFs (`\\n`) in them,\n    // we need to split so we could handle the lines correctly\n    //\n    // we also need to remove leading and trailing blank lines\n    let mut lines: Vec<_> = attrs\n        .iter()\n        .filter(|attr| attr.path().is_ident(\"doc\"))\n        .filter_map(|attr| {\n            // non #[doc = \"...\"] attributes are not our concern\n            // we leave them for rustc to handle\n            match &attr.meta {\n                syn::Meta::NameValue(syn::MetaNameValue {\n                    value:\n                        syn::Expr::Lit(syn::ExprLit {\n                            lit: syn::Lit::Str(s),\n                            ..\n                        }),\n                    ..\n                }) => Some(s.value()),\n                _ => None,\n            }\n        })\n        .skip_while(|s| is_blank(s))\n        .flat_map(|s| {\n            let lines = s\n                .split('\\n')\n                .map(|s| {\n                    // remove one leading space no matter what\n                    let s = s.strip_prefix(' ').unwrap_or(s);\n                    s.to_owned()\n                })\n                .collect::<Vec<_>>();\n            lines\n        })\n        .collect();\n\n    while let Some(true) = lines.last().map(|s| is_blank(s)) {\n        lines.pop();\n    }\n\n    lines\n}\n\npub(crate) fn format_doc_comment(\n    lines: &[String],\n    preprocess: bool,\n    force_long: bool,\n) -> (Option<String>, Option<String>) {\n    if preprocess {\n        let (short, long) = parse_markdown(lines);\n        let long = long.or_else(|| force_long.then(|| short.clone()));\n\n        (Some(remove_period(short)), long)\n    } else if let Some(first_blank) = lines.iter().position(|s| is_blank(s)) {\n        let short = lines[..first_blank].join(\"\\n\");\n        let long = lines.join(\"\\n\");\n\n        (Some(short), Some(long))\n    } else {\n        let short = lines.join(\"\\n\");\n        let long = force_long.then(|| short.clone());\n\n        (Some(short), long)\n    }\n}\n\n#[cfg(not(feature = \"unstable-markdown\"))]\nfn split_paragraphs(lines: &[String]) -> Vec<String> {\n    use std::iter;\n\n    let mut last_line = 0;\n    iter::from_fn(|| {\n        let slice = &lines[last_line..];\n        let start = slice.iter().position(|s| !is_blank(s)).unwrap_or(0);\n\n        let slice = &slice[start..];\n        let len = slice\n            .iter()\n            .position(|s| is_blank(s))\n            .unwrap_or(slice.len());\n\n        last_line += start + len;\n\n        if len != 0 {\n            Some(merge_lines(&slice[..len]))\n        } else {\n            None\n        }\n    })\n    .collect()\n}\n\nfn remove_period(mut s: String) -> String {\n    if s.ends_with('.') && !s.ends_with(\"..\") {\n        s.pop();\n    }\n    s\n}\n\nfn is_blank(s: &str) -> bool {\n    s.trim().is_empty()\n}\n\n#[cfg(not(feature = \"unstable-markdown\"))]\nfn merge_lines(lines: impl IntoIterator<Item = impl AsRef<str>>) -> String {\n    lines\n        .into_iter()\n        .map(|s| s.as_ref().trim().to_owned())\n        .collect::<Vec<_>>()\n        .join(\" \")\n}\n\n#[cfg(not(feature = \"unstable-markdown\"))]\nfn parse_markdown(lines: &[String]) -> (String, Option<String>) {\n    if lines.iter().any(|s| is_blank(s)) {\n        let paragraphs = split_paragraphs(lines);\n        let short = paragraphs[0].clone();\n        let long = paragraphs.join(\"\\n\\n\");\n        (short, Some(long))\n    } else {\n        let short = merge_lines(lines);\n        (short, None)\n    }\n}\n\n#[cfg(feature = \"unstable-markdown\")]\nmod markdown {\n    use anstyle::{Reset, Style};\n    use pulldown_cmark::{Event, Options, Parser, Tag, TagEnd};\n    use std::fmt;\n    use std::fmt::Write;\n    use std::ops::AddAssign;\n\n    #[derive(Default)]\n    struct MarkdownWriter {\n        output: String,\n        /// Prefix inserted for each line.\n        prefix: String,\n        /// Should an empty line be inserted before the next anything.\n        hanging_paragraph: bool,\n        /// Are we in an empty line\n        dirty_line: bool,\n        styles: Vec<Style>,\n    }\n\n    impl MarkdownWriter {\n        fn newline(&mut self) {\n            self.reset();\n            self.output.push('\\n');\n            self.dirty_line = false;\n        }\n        fn endline(&mut self) {\n            if self.dirty_line {\n                self.newline();\n            }\n        }\n        fn new_paragraph(&mut self) {\n            self.endline();\n            self.hanging_paragraph = true;\n        }\n\n        fn write_fmt(&mut self, arguments: fmt::Arguments<'_>) {\n            if self.hanging_paragraph {\n                self.hanging_paragraph = false;\n                self.newline();\n            }\n            if !self.dirty_line {\n                self.output.push_str(&self.prefix);\n                self.apply_styles();\n                self.dirty_line = true;\n            }\n            self.output.write_fmt(arguments).unwrap();\n        }\n\n        fn start_link(&mut self, dest_url: pulldown_cmark::CowStr<'_>) {\n            write!(self, \"\\x1B]8;;{dest_url}\\x1B\\\\\");\n        }\n        fn end_link(&mut self) {\n            write!(self, \"\\x1B]8;;\\x1B\\\\\");\n        }\n\n        fn start_style(&mut self, style: Style) {\n            self.styles.push(style);\n            write!(self, \"{style}\");\n        }\n        fn end_style(&mut self, style: Style) {\n            let last_style = self.styles.pop();\n            debug_assert_eq!(last_style.unwrap(), style);\n\n            write!(self, \"{Reset}\");\n            self.apply_styles();\n        }\n\n        fn reset(&mut self) {\n            write!(self, \"{Reset}\");\n        }\n\n        fn apply_styles(&mut self) {\n            // Reapplying all, because anstyle doesn't support merging styles\n            // (probably because the ambiguity around colors)\n            // TODO If we decide not to support any colors, we can replace this with\n            // anstyle::Effects and remove the need for applying them all individually.\n            for style in &self.styles {\n                write!(self.output, \"{style}\").unwrap();\n            }\n        }\n\n        fn remove_prefix(&mut self, quote_prefix: &str) {\n            debug_assert!(self.prefix.ends_with(quote_prefix));\n            let new_len = self.prefix.len() - quote_prefix.len();\n            self.prefix.truncate(new_len);\n        }\n\n        fn add_prefix(&mut self, quote_prefix: &str) {\n            if self.hanging_paragraph {\n                self.hanging_paragraph = false;\n                self.newline();\n            }\n            self.prefix += quote_prefix;\n        }\n    }\n\n    pub(super) fn parse_markdown(input: &[String]) -> (String, Option<String>) {\n        // Markdown Configuration\n        let parsing_options = Options::ENABLE_STRIKETHROUGH;\n        // Minimal Styling for now, because we cannot configure it\n        let style_heading = Style::new().bold().underline();\n        let style_emphasis = Style::new().italic();\n        let style_strong = Style::new().bold();\n        let style_strike_through = Style::new().strikethrough();\n        let style_link = Style::new().underline();\n        let style_code = Style::new().bold();\n        let list_symbol = '-';\n        let quote_prefix = \"| \";\n        let indentation = \"  \";\n\n        let input = input.join(\"\\n\");\n        let input = Parser::new_ext(&input, parsing_options);\n\n        let mut short = None;\n        let mut has_details = false;\n\n        let mut writer = MarkdownWriter::default();\n\n        let mut list_indices = Vec::new();\n\n        for event in input {\n            if short.is_some() {\n                has_details = true;\n            }\n            match event {\n                Event::Start(Tag::Paragraph) => { /* nothing to do */ }\n                Event::End(TagEnd::Paragraph) => {\n                    if short.is_none() {\n                        short = Some(writer.output.trim().to_owned());\n                    }\n                    writer.new_paragraph();\n                }\n\n                Event::Start(Tag::Heading { .. }) => writer.start_style(style_heading),\n                Event::End(TagEnd::Heading(..)) => {\n                    writer.end_style(style_heading);\n                    writer.new_paragraph();\n                }\n\n                Event::Start(Tag::Image { .. } | Tag::HtmlBlock) => { /* IGNORED */ }\n                Event::End(TagEnd::Image) => { /* IGNORED */ }\n                Event::End(TagEnd::HtmlBlock) => writer.new_paragraph(),\n\n                Event::Start(Tag::BlockQuote(_)) => writer.add_prefix(quote_prefix),\n                Event::End(TagEnd::BlockQuote(_)) => {\n                    writer.remove_prefix(quote_prefix);\n                    writer.new_paragraph();\n                }\n\n                Event::Start(Tag::CodeBlock(_)) => {\n                    writer.add_prefix(indentation);\n                    writer.start_style(style_code);\n                }\n                Event::End(TagEnd::CodeBlock) => {\n                    writer.remove_prefix(indentation);\n                    writer.end_style(style_code);\n                    writer.dirty_line = false;\n                    writer.hanging_paragraph = true;\n                }\n\n                Event::Start(Tag::List(list_start)) => {\n                    list_indices.push(list_start);\n                    writer.endline();\n                }\n                Event::End(TagEnd::List(_)) => {\n                    let list = list_indices.pop();\n                    debug_assert!(list.is_some());\n                    if list_indices.is_empty() {\n                        writer.new_paragraph();\n                    }\n                }\n                Event::Start(Tag::Item) => {\n                    if let Some(Some(index)) = list_indices.last_mut() {\n                        write!(writer, \"{index}. \");\n                        index.add_assign(1);\n                    } else {\n                        write!(writer, \"{list_symbol} \");\n                    }\n                    writer.add_prefix(indentation);\n                }\n                Event::End(TagEnd::Item) => {\n                    writer.remove_prefix(indentation);\n                    writer.endline();\n                }\n\n                Event::Start(Tag::Emphasis) => writer.start_style(style_emphasis),\n                Event::End(TagEnd::Emphasis) => writer.end_style(style_emphasis),\n                Event::Start(Tag::Strong) => writer.start_style(style_strong),\n                Event::End(TagEnd::Strong) => writer.end_style(style_strong),\n                Event::Start(Tag::Strikethrough) => writer.start_style(style_strike_through),\n                Event::End(TagEnd::Strikethrough) => writer.end_style(style_strike_through),\n\n                Event::Start(Tag::Link { dest_url, .. }) => {\n                    writer.start_link(dest_url);\n                    writer.start_style(style_link);\n                }\n                Event::End(TagEnd::Link) => {\n                    writer.end_link();\n                    writer.end_style(style_link);\n                }\n\n                Event::Text(segment) => {\n                    // split into lines to support code blocks\n                    let mut lines = segment.lines();\n                    // `.lines()`  always returns at least one\n                    write!(writer, \"{}\", lines.next().unwrap());\n                    for line in lines {\n                        writer.endline();\n                        write!(writer, \"{line}\");\n                    }\n                    if segment.ends_with('\\n') {\n                        writer.endline();\n                    }\n                }\n\n                Event::Code(code) => {\n                    writer.start_style(style_code);\n                    write!(writer, \"{code}\");\n                    writer.end_style(style_code);\n                }\n\n                // There is not really anything useful to do with block level html.\n                Event::Html(html) => write!(writer, \"{html}\"),\n                // At some point we could support custom tags like `<red>`\n                Event::InlineHtml(html) => write!(writer, \"{html}\"),\n                Event::SoftBreak => write!(writer, \" \"),\n                Event::HardBreak => writer.endline(),\n\n                Event::Rule => {\n                    writer.new_paragraph();\n                    write!(writer, \"---\");\n                    writer.new_paragraph();\n                }\n\n                // Markdown features currently not supported\n                Event::Start(\n                    Tag::FootnoteDefinition(_)\n                    | Tag::DefinitionList\n                    | Tag::DefinitionListTitle\n                    | Tag::DefinitionListDefinition\n                    | Tag::Table(_)\n                    | Tag::TableHead\n                    | Tag::TableRow\n                    | Tag::TableCell\n                    | Tag::MetadataBlock(_)\n                    | Tag::Superscript\n                    | Tag::Subscript,\n                )\n                | Event::End(\n                    TagEnd::FootnoteDefinition\n                    | TagEnd::DefinitionList\n                    | TagEnd::DefinitionListTitle\n                    | TagEnd::DefinitionListDefinition\n                    | TagEnd::Table\n                    | TagEnd::TableHead\n                    | TagEnd::TableRow\n                    | TagEnd::TableCell\n                    | TagEnd::MetadataBlock(_)\n                    | TagEnd::Superscript\n                    | TagEnd::Subscript,\n                )\n                | Event::InlineMath(_)\n                | Event::DisplayMath(_)\n                | Event::FootnoteReference(_)\n                | Event::TaskListMarker(_) => {\n                    unimplemented!(\"feature not enabled {event:?}\")\n                }\n            }\n        }\n        let short = short.unwrap_or_else(|| writer.output.trim_end().to_owned());\n        let long = writer.output.trim_end();\n        let long = has_details.then(|| long.to_owned());\n        (short, long)\n    }\n}\n"
  },
  {
    "path": "clap_derive/src/utils/error.rs",
    "content": "pub(crate) trait SpanError {\n    #[allow(non_snake_case)]\n    fn EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error;\n}\n\npub(crate) trait ToTokensError {\n    #[allow(non_snake_case)]\n    fn EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error;\n}\n\nimpl<T: quote::ToTokens> ToTokensError for T {\n    fn EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error {\n        // Curb monomorphization from generating too many identical `new_spanned`.\n        syn::Error::new_spanned(self.to_token_stream(), msg)\n    }\n}\n\nimpl SpanError for proc_macro2::Span {\n    fn EXPECTED_Span_OR_ToTokens<D: std::fmt::Display>(&self, msg: D) -> syn::Error {\n        syn::Error::new(*self, msg)\n    }\n}\n"
  },
  {
    "path": "clap_derive/src/utils/mod.rs",
    "content": "pub(crate) mod error;\n\nmod doc_comments;\nmod spanned;\nmod ty;\n\npub(crate) use doc_comments::extract_doc_comment;\npub(crate) use doc_comments::format_doc_comment;\n\npub(crate) use self::{\n    spanned::Sp,\n    ty::{Ty, inner_type, is_simple_ty, sub_type, subty_if_name},\n};\n"
  },
  {
    "path": "clap_derive/src/utils/spanned.rs",
    "content": "use proc_macro2::{Ident, Span, TokenStream};\nuse quote::ToTokens;\nuse syn::LitStr;\n\nuse std::ops::{Deref, DerefMut};\n\n/// An entity with a span attached.\n#[derive(Debug, Copy, Clone)]\npub(crate) struct Sp<T> {\n    val: T,\n    span: Span,\n}\n\nimpl<T> Sp<T> {\n    pub(crate) fn new(val: T, span: Span) -> Self {\n        Sp { val, span }\n    }\n\n    pub(crate) fn get(&self) -> &T {\n        &self.val\n    }\n\n    pub(crate) fn span(&self) -> Span {\n        self.span\n    }\n}\n\nimpl<T> Deref for Sp<T> {\n    type Target = T;\n\n    fn deref(&self) -> &T {\n        &self.val\n    }\n}\n\nimpl<T> DerefMut for Sp<T> {\n    fn deref_mut(&mut self) -> &mut T {\n        &mut self.val\n    }\n}\n\nimpl From<Ident> for Sp<String> {\n    fn from(ident: Ident) -> Self {\n        Sp {\n            val: ident.to_string(),\n            span: ident.span(),\n        }\n    }\n}\n\nimpl From<LitStr> for Sp<String> {\n    fn from(lit: LitStr) -> Self {\n        Sp {\n            val: lit.value(),\n            span: lit.span(),\n        }\n    }\n}\n\nimpl<'a> From<Sp<&'a str>> for Sp<String> {\n    fn from(sp: Sp<&'a str>) -> Self {\n        Sp::new(sp.val.into(), sp.span)\n    }\n}\n\nimpl<U, T: PartialEq<U>> PartialEq<U> for Sp<T> {\n    fn eq(&self, other: &U) -> bool {\n        self.val == *other\n    }\n}\n\nimpl<T: AsRef<str>> AsRef<str> for Sp<T> {\n    fn as_ref(&self) -> &str {\n        self.val.as_ref()\n    }\n}\n\nimpl<T: ToTokens> ToTokens for Sp<T> {\n    fn to_tokens(&self, stream: &mut TokenStream) {\n        // this is the simplest way out of correct ones to change span on\n        // arbitrary token tree I could come up with\n        let tt = self.val.to_token_stream().into_iter().map(|mut tt| {\n            tt.set_span(self.span);\n            tt\n        });\n\n        stream.extend(tt);\n    }\n}\n"
  },
  {
    "path": "clap_derive/src/utils/ty.rs",
    "content": "//! Special types handling\n\nuse super::spanned::Sp;\n\nuse syn::{\n    GenericArgument, Path, PathArguments, PathArguments::AngleBracketed, PathSegment, Type,\n    TypePath, spanned::Spanned,\n};\n\n#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub(crate) enum Ty {\n    Unit,\n    Vec,\n    VecVec,\n    Option,\n    OptionOption,\n    OptionVec,\n    OptionVecVec,\n    Other,\n}\n\nimpl Ty {\n    pub(crate) fn from_syn_ty(ty: &Type) -> Sp<Self> {\n        use self::Ty::{Option, OptionOption, OptionVec, OptionVecVec, Other, Unit, Vec, VecVec};\n        let t = |kind| Sp::new(kind, ty.span());\n\n        if is_unit_ty(ty) {\n            t(Unit)\n        } else if let Some(vt) = get_vec_ty(ty, Vec, VecVec) {\n            t(vt)\n        } else if let Some(subty) = subty_if_name(ty, \"Option\") {\n            if is_generic_ty(subty, \"Option\") {\n                t(OptionOption)\n            } else if let Some(vt) = get_vec_ty(subty, OptionVec, OptionVecVec) {\n                t(vt)\n            } else {\n                t(Option)\n            }\n        } else {\n            t(Other)\n        }\n    }\n\n    pub(crate) fn as_str(&self) -> &'static str {\n        match self {\n            Self::Unit => \"()\",\n            Self::Vec => \"Vec<T>\",\n            Self::Option => \"Option<T>\",\n            Self::OptionOption => \"Option<Option<T>>\",\n            Self::OptionVec => \"Option<Vec<T>>\",\n            Self::VecVec => \"Vec<Vec<T>>\",\n            Self::OptionVecVec => \"Option<Vec<Vec<T>>>\",\n            Self::Other => \"...other...\",\n        }\n    }\n}\n\npub(crate) fn inner_type(field_ty: &Type) -> &Type {\n    let ty = Ty::from_syn_ty(field_ty);\n    match *ty {\n        Ty::Vec | Ty::Option => sub_type(field_ty).unwrap_or(field_ty),\n        Ty::OptionOption | Ty::OptionVec | Ty::VecVec => {\n            sub_type(field_ty).and_then(sub_type).unwrap_or(field_ty)\n        }\n        Ty::OptionVecVec => sub_type(field_ty)\n            .and_then(sub_type)\n            .and_then(sub_type)\n            .unwrap_or(field_ty),\n        _ => field_ty,\n    }\n}\n\npub(crate) fn sub_type(ty: &Type) -> Option<&Type> {\n    subty_if(ty, |_| true)\n}\n\nfn only_last_segment(mut ty: &Type) -> Option<&PathSegment> {\n    while let Type::Group(syn::TypeGroup { elem, .. }) = ty {\n        ty = elem;\n    }\n    match ty {\n        Type::Path(TypePath {\n            qself: None,\n            path:\n                Path {\n                    leading_colon: None,\n                    segments,\n                },\n        }) => only_one(segments.iter()),\n\n        _ => None,\n    }\n}\n\nfn subty_if<F>(ty: &Type, f: F) -> Option<&Type>\nwhere\n    F: FnOnce(&PathSegment) -> bool,\n{\n    only_last_segment(ty)\n        .filter(|segment| f(segment))\n        .and_then(|segment| {\n            if let AngleBracketed(args) = &segment.arguments {\n                only_one(args.args.iter()).and_then(|genneric| {\n                    if let GenericArgument::Type(ty) = genneric {\n                        Some(ty)\n                    } else {\n                        None\n                    }\n                })\n            } else {\n                None\n            }\n        })\n}\n\npub(crate) fn subty_if_name<'a>(ty: &'a Type, name: &str) -> Option<&'a Type> {\n    subty_if(ty, |seg| seg.ident == name)\n}\n\npub(crate) fn is_simple_ty(ty: &Type, name: &str) -> bool {\n    only_last_segment(ty)\n        .map(|segment| {\n            if let PathArguments::None = segment.arguments {\n                segment.ident == name\n            } else {\n                false\n            }\n        })\n        .unwrap_or(false)\n}\n\nfn is_generic_ty(ty: &Type, name: &str) -> bool {\n    subty_if_name(ty, name).is_some()\n}\n\nfn is_unit_ty(ty: &Type) -> bool {\n    if let Type::Tuple(tuple) = ty {\n        tuple.elems.is_empty()\n    } else {\n        false\n    }\n}\n\nfn only_one<I, T>(mut iter: I) -> Option<T>\nwhere\n    I: Iterator<Item = T>,\n{\n    iter.next().filter(|_| iter.next().is_none())\n}\n\n#[cfg(feature = \"unstable-v5\")]\nfn get_vec_ty(ty: &Type, vec_ty: Ty, vecvec_ty: Ty) -> Option<Ty> {\n    subty_if_name(ty, \"Vec\").map(|subty| {\n        if is_generic_ty(subty, \"Vec\") {\n            vecvec_ty\n        } else {\n            vec_ty\n        }\n    })\n}\n\n#[cfg(not(feature = \"unstable-v5\"))]\nfn get_vec_ty(ty: &Type, vec_ty: Ty, _vecvec_ty: Ty) -> Option<Ty> {\n    is_generic_ty(ty, \"Vec\").then_some(vec_ty)\n}\n"
  },
  {
    "path": "clap_lex/CHANGELOG.md",
    "content": "# Change Log\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/)\nand this project adheres to [Semantic Versioning](https://semver.org/).\n\n<!-- next-header -->\n## [Unreleased] - ReleaseDate\n\n## [1.1.0] - 2026-03-12\n\n### Compatibility\n\n- Update MSRV to 1.85\n\n## [1.0.1] - 2026-03-12\n\n### Internal\n\n- Update dependencies\n\n## [1.0.0] - 2026-02-11\n\n## [0.7.7] - 2026-01-12\n\n### Fixes\n\n- Be more specific on lifetimes\n\n## [0.7.6] - 2025-10-13\n\n## [0.7.5] - 2025-06-09\n\n## [0.7.4] - 2024-12-05\n\n### Fixes\n\n- Support `E` in numbers, not just `e`\n\n## [0.7.3] - 2024-11-13\n\n## [0.7.2] - 2024-07-25\n\n## [0.7.1] - 2024-06-06\n\n## [0.7.0] - 2024-02-08\n\n### Compatibility\n\n- Update MSRV to 1.74\n\n### Fixes\n\n- Improve `unsafe` code by using new `OsStr` API\n\n## [0.6.0] - 2023-10-24\n\n### Breaking Change\n\n- Renamed `is_number` to more focused `is_negative_number`\n\n### Performance\n\n- Reduced code size\n\n## [0.5.1] - 2023-08-24\n\n### Compatibility\n\n- Update MSRV to 1.70.0\n\n## [0.5.0] - 2023-05-19\n\n### Breaking Change\n\n- Removed `OsStrExt::split_at`\n\n## [0.4.1] - 2023-03-28\n\n### Compatibility\n\n- Deprecated `OsStrExt::split_at` as its unsound\n\n## [0.4.0] - 2023-03-25\n\n### Breaking Change\n\n- `RawOsStr` and `RawOsString` are no long exported\n- Return types were changed from `RawOsStr` to `OsStr`\n\n### Features\n\n- `OsStrExt` trait added to help with processing `OsStr`s\n\n### Performance\n\n- `os_str_bytes` dependency was dropped to improve build times and reduce binary size\n\n## [0.3.3] - 2023-03-16\n\n## [0.3.2] - 2023-02-23\n\n## [0.3.1] - 2023-01-13\n\n### Compatibility\n\nMSRV changed to 1.64.0\n\n## [0.3.0] - 2022-09-20\n\n### Breaking Changes\n\n- `RawArgs::insert` now takes owned values\n\n### Compatibility\n\n- MSRV changed from 1.56.1 to 1.60.0\n\n## [0.2.4] - 2022-06-28\n\n## [0.2.3] - 2022-06-21\n\n## [0.2.2] - 2022-06-13\n\n## [0.2.1] - 2022-06-13\n\n### Features\n\n- Allow checking if at end of input\n\n## [0.2.0] - 2022-04-30\n\n### Breaking Changes\n\n- Don't do prefix matching by default\n\n## [0.1.1] - 2022-04-15\n\n- Drop `memchr` dependency\n\n<!-- next-url -->\n[Unreleased]: https://github.com/clap-rs/clap/compare/clap_lex-v1.1.0...HEAD\n[1.1.0]: https://github.com/clap-rs/clap/compare/clap_lex-v1.0.1...clap_lex-v1.1.0\n[1.0.1]: https://github.com/clap-rs/clap/compare/clap_lex-v1.0.0...clap_lex-v1.0.1\n[1.0.0]: https://github.com/clap-rs/clap/compare/clap_lex-v0.7.7...clap_lex-v1.0.0\n[0.7.7]: https://github.com/clap-rs/clap/compare/clap_lex-v0.7.6...clap_lex-v0.7.7\n[0.7.6]: https://github.com/clap-rs/clap/compare/clap_lex-v0.7.5...clap_lex-v0.7.6\n[0.7.5]: https://github.com/clap-rs/clap/compare/clap_lex-v0.7.4...clap_lex-v0.7.5\n[0.7.4]: https://github.com/clap-rs/clap/compare/clap_lex-v0.7.3...clap_lex-v0.7.4\n[0.7.3]: https://github.com/clap-rs/clap/compare/clap_lex-v0.7.2...clap_lex-v0.7.3\n[0.7.2]: https://github.com/clap-rs/clap/compare/clap_lex-v0.7.1...clap_lex-v0.7.2\n[0.7.1]: https://github.com/clap-rs/clap/compare/clap_lex-v0.7.0...clap_lex-v0.7.1\n[0.7.0]: https://github.com/clap-rs/clap/compare/clap_lex-v0.6.0...clap_lex-v0.7.0\n[0.6.0]: https://github.com/clap-rs/clap/compare/clap_lex-v0.5.1...clap_lex-v0.6.0\n[0.5.1]: https://github.com/clap-rs/clap/compare/clap_lex-v0.5.0...clap_lex-v0.5.1\n[0.5.0]: https://github.com/clap-rs/clap/compare/clap_lex-v0.4.1...clap_lex-v0.5.0\n[0.4.1]: https://github.com/clap-rs/clap/compare/clap_lex-v0.4.0...clap_lex-v0.4.1\n[0.4.0]: https://github.com/clap-rs/clap/compare/clap_lex-v0.3.3...clap_lex-v0.4.0\n[0.3.3]: https://github.com/clap-rs/clap/compare/clap_lex-v0.3.2...clap_lex-v0.3.3\n[0.3.2]: https://github.com/clap-rs/clap/compare/clap_lex-v0.3.1...clap_lex-v0.3.2\n[0.3.1]: https://github.com/clap-rs/clap/compare/clap_lex-v0.3.0...clap_lex-v0.3.1\n[0.3.0]: https://github.com/clap-rs/clap/compare/clap_lex-v0.2.4...clap_lex-v0.3.0\n[0.2.4]: https://github.com/clap-rs/clap/compare/clap_lex-v0.2.3...clap_lex-v0.2.4\n[0.2.3]: https://github.com/clap-rs/clap/compare/clap_lex-v0.2.2...clap_lex-v0.2.3\n[0.2.2]: https://github.com/clap-rs/clap/compare/clap_lex-v0.2.1...clap_lex-v0.2.2\n[0.2.1]: https://github.com/clap-rs/clap/compare/clap_lex-v0.2.0...clap_lex-v0.2.1\n[0.2.0]: https://github.com/clap-rs/clap/compare/clap_lex-v0.1.1...clap_lex-v0.2.0\n[0.1.1]: https://github.com/clap-rs/clap/compare/ce71b08a3fe28c640dc6e17f6f5bb1452bd6d6d8...clap_lex-v0.1.1\n"
  },
  {
    "path": "clap_lex/CONTRIBUTING.md",
    "content": "# How to Contribute\n\nSee the [clap-wide CONTRIBUTING.md](../CONTRIBUTING.md).  This will contain `clap_lex` specific notes.\n"
  },
  {
    "path": "clap_lex/Cargo.toml",
    "content": "[package]\nname = \"clap_lex\"\nversion = \"1.1.0\"\ndescription = \"Minimal, flexible command line parser\"\ncategories = [\"command-line-interface\"]\nkeywords = [\n  \"argument\",\n  \"cli\",\n  \"arg\",\n  \"parser\",\n  \"parse\"\n]\nrepository.workspace = true\nlicense.workspace = true\nedition.workspace = true\nrust-version.workspace = true\ninclude.workspace = true\n\n[package.metadata.release]\npre-release-replacements = [\n  {file=\"CHANGELOG.md\", search=\"Unreleased\", replace=\"{{version}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"\\\\.\\\\.\\\\.HEAD\", replace=\"...{{tag_name}}\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"ReleaseDate\", replace=\"{{date}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-header -->\", replace=\"<!-- next-header -->\\n## [Unreleased] - ReleaseDate\\n\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-url -->\", replace=\"<!-- next-url -->\\n[Unreleased]: https://github.com/clap-rs/clap/compare/{{tag_name}}...HEAD\", exactly=1},\n  {file=\"README.md\", search=\"github.com/clap-rs/clap/blob/[^/]+/\", replace=\"github.com/clap-rs/clap/blob/{{tag_name}}/\", exactly=4, prerelease = true},\n]\n\n[dev-dependencies]\nautomod = \"1.0.16\"\n\n[lib]\nbench = false\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "clap_lex/README.md",
    "content": "<!-- omit in TOC -->\n# clap_lex\n\n> **Minimal, flexible command line parser**\n\n[![Crates.io](https://img.shields.io/crates/v/clap_lex?style=flat-square)](https://crates.io/crates/clap_lex)\n[![Crates.io](https://img.shields.io/crates/d/clap_lex?style=flat-square)](https://crates.io/crates/clap_lex)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square)](https://github.com/clap-rs/clap/blob/clap_lex-v1.1.0/LICENSE-APACHE)\n[![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](https://github.com/clap-rs/clap/blob/clap_lex-v1.1.0/LICENSE-MIT)\n\nDual-licensed under [Apache 2.0](LICENSE-APACHE) or [MIT](LICENSE-MIT).\n\n1. [About](#about)\n2. [API Reference](https://docs.rs/clap_lex)\n3. [Questions & Discussions](https://github.com/clap-rs/clap/discussions)\n4. [CONTRIBUTING](https://github.com/clap-rs/clap/blob/clap_lex-v1.1.0/clap_lex/CONTRIBUTING.md)\n5. [Sponsors](https://github.com/clap-rs/clap/blob/clap_lex-v1.1.0/README.md#sponsors)\n\n## About\n"
  },
  {
    "path": "clap_lex/src/ext.rs",
    "content": "use std::ffi::OsStr;\n\n/// String-like methods for [`OsStr`]\npub trait OsStrExt: private::Sealed {\n    /// Converts to a string slice.\n    ///\n    /// The `Utf8Error` is guaranteed to have a valid UTF8 boundary\n    /// in its `valid_up_to()`\n    fn try_str(&self) -> Result<&str, std::str::Utf8Error>;\n    /// Returns `true` if the given pattern matches a sub-slice of\n    /// this string slice.\n    ///\n    /// Returns `false` if it does not.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// use clap_lex::OsStrExt as _;\n    /// let bananas = std::ffi::OsStr::new(\"bananas\");\n    ///\n    /// assert!(bananas.contains(\"nana\"));\n    /// assert!(!bananas.contains(\"apples\"));\n    /// ```\n    fn contains(&self, needle: &str) -> bool;\n    /// Returns the byte index of the first character of this string slice that\n    /// matches the pattern.\n    ///\n    /// Returns [`None`] if the pattern doesn't match.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// use clap_lex::OsStrExt as _;\n    /// let s = std::ffi::OsStr::new(\"Löwe 老虎 Léopard Gepardi\");\n    ///\n    /// assert_eq!(s.find(\"L\"), Some(0));\n    /// assert_eq!(s.find(\"é\"), Some(14));\n    /// assert_eq!(s.find(\"par\"), Some(17));\n    /// ```\n    ///\n    /// Not finding the pattern:\n    ///\n    /// ```rust\n    /// use clap_lex::OsStrExt as _;\n    /// let s = std::ffi::OsStr::new(\"Löwe 老虎 Léopard\");\n    ///\n    /// assert_eq!(s.find(\"1\"), None);\n    /// ```\n    fn find(&self, needle: &str) -> Option<usize>;\n    /// Returns a string slice with the prefix removed.\n    ///\n    /// If the string starts with the pattern `prefix`, returns substring after the prefix, wrapped\n    /// in `Some`.\n    ///\n    /// If the string does not start with `prefix`, returns `None`.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::ffi::OsStr;\n    /// use clap_lex::OsStrExt as _;\n    /// assert_eq!(OsStr::new(\"foo:bar\").strip_prefix(\"foo:\"), Some(OsStr::new(\"bar\")));\n    /// assert_eq!(OsStr::new(\"foo:bar\").strip_prefix(\"bar\"), None);\n    /// assert_eq!(OsStr::new(\"foofoo\").strip_prefix(\"foo\"), Some(OsStr::new(\"foo\")));\n    /// ```\n    fn strip_prefix(&self, prefix: &str) -> Option<&OsStr>;\n    /// Returns `true` if the given pattern matches a prefix of this\n    /// string slice.\n    ///\n    /// Returns `false` if it does not.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use clap_lex::OsStrExt as _;\n    /// let bananas = std::ffi::OsStr::new(\"bananas\");\n    ///\n    /// assert!(bananas.starts_with(\"bana\"));\n    /// assert!(!bananas.starts_with(\"nana\"));\n    /// ```\n    fn starts_with(&self, prefix: &str) -> bool;\n    /// An iterator over substrings of this string slice, separated by\n    /// characters matched by a pattern.\n    ///\n    /// # Examples\n    ///\n    /// Simple patterns:\n    ///\n    /// ```\n    /// use std::ffi::OsStr;\n    /// use clap_lex::OsStrExt as _;\n    /// let v: Vec<_> = OsStr::new(\"Mary had a little lamb\").split(\" \").collect();\n    /// assert_eq!(v, [OsStr::new(\"Mary\"), OsStr::new(\"had\"), OsStr::new(\"a\"), OsStr::new(\"little\"), OsStr::new(\"lamb\")]);\n    ///\n    /// let v: Vec<_> = OsStr::new(\"\").split(\"X\").collect();\n    /// assert_eq!(v, [OsStr::new(\"\")]);\n    ///\n    /// let v: Vec<_> = OsStr::new(\"lionXXtigerXleopard\").split(\"X\").collect();\n    /// assert_eq!(v, [OsStr::new(\"lion\"), OsStr::new(\"\"), OsStr::new(\"tiger\"), OsStr::new(\"leopard\")]);\n    ///\n    /// let v: Vec<_> = OsStr::new(\"lion::tiger::leopard\").split(\"::\").collect();\n    /// assert_eq!(v, [OsStr::new(\"lion\"), OsStr::new(\"tiger\"), OsStr::new(\"leopard\")]);\n    /// ```\n    ///\n    /// If a string contains multiple contiguous separators, you will end up\n    /// with empty strings in the output:\n    ///\n    /// ```\n    /// use std::ffi::OsStr;\n    /// use clap_lex::OsStrExt as _;\n    /// let x = OsStr::new(\"||||a||b|c\");\n    /// let d: Vec<_> = x.split(\"|\").collect();\n    ///\n    /// assert_eq!(d, &[OsStr::new(\"\"), OsStr::new(\"\"), OsStr::new(\"\"), OsStr::new(\"\"), OsStr::new(\"a\"), OsStr::new(\"\"), OsStr::new(\"b\"), OsStr::new(\"c\")]);\n    /// ```\n    ///\n    /// Contiguous separators are separated by the empty string.\n    ///\n    /// ```\n    /// use std::ffi::OsStr;\n    /// use clap_lex::OsStrExt as _;\n    /// let x = OsStr::new(\"(///)\");\n    /// let d: Vec<_> = x.split(\"/\").collect();\n    ///\n    /// assert_eq!(d, &[OsStr::new(\"(\"), OsStr::new(\"\"), OsStr::new(\"\"), OsStr::new(\")\")]);\n    /// ```\n    ///\n    /// Separators at the start or end of a string are neighbored\n    /// by empty strings.\n    ///\n    /// ```\n    /// use std::ffi::OsStr;\n    /// use clap_lex::OsStrExt as _;\n    /// let d: Vec<_> = OsStr::new(\"010\").split(\"0\").collect();\n    /// assert_eq!(d, &[OsStr::new(\"\"), OsStr::new(\"1\"), OsStr::new(\"\")]);\n    /// ```\n    ///\n    /// When the empty string is used as a separator, it panics\n    ///\n    /// ```should_panic\n    /// use std::ffi::OsStr;\n    /// use clap_lex::OsStrExt as _;\n    /// let f: Vec<_> = OsStr::new(\"rust\").split(\"\").collect();\n    /// assert_eq!(f, &[OsStr::new(\"\"), OsStr::new(\"r\"), OsStr::new(\"u\"), OsStr::new(\"s\"), OsStr::new(\"t\"), OsStr::new(\"\")]);\n    /// ```\n    ///\n    /// Contiguous separators can lead to possibly surprising behavior\n    /// when whitespace is used as the separator. This code is correct:\n    ///\n    /// ```\n    /// use std::ffi::OsStr;\n    /// use clap_lex::OsStrExt as _;\n    /// let x = OsStr::new(\"    a  b c\");\n    /// let d: Vec<_> = x.split(\" \").collect();\n    ///\n    /// assert_eq!(d, &[OsStr::new(\"\"), OsStr::new(\"\"), OsStr::new(\"\"), OsStr::new(\"\"), OsStr::new(\"a\"), OsStr::new(\"\"), OsStr::new(\"b\"), OsStr::new(\"c\")]);\n    /// ```\n    ///\n    /// It does _not_ give you:\n    ///\n    /// ```,ignore\n    /// assert_eq!(d, &[OsStr::new(\"a\"), OsStr::new(\"b\"), OsStr::new(\"c\")]);\n    /// ```\n    ///\n    /// Use [`split_whitespace`] for this behavior.\n    ///\n    /// [`split_whitespace`]: str::split_whitespace\n    fn split<'s, 'n>(&'s self, needle: &'n str) -> Split<'s, 'n>;\n    /// Splits the string on the first occurrence of the specified delimiter and\n    /// returns prefix before delimiter and suffix after delimiter.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use std::ffi::OsStr;\n    /// use clap_lex::OsStrExt as _;\n    /// assert_eq!(OsStr::new(\"cfg\").split_once(\"=\"), None);\n    /// assert_eq!(OsStr::new(\"cfg=\").split_once(\"=\"), Some((OsStr::new(\"cfg\"), OsStr::new(\"\"))));\n    /// assert_eq!(OsStr::new(\"cfg=foo\").split_once(\"=\"), Some((OsStr::new(\"cfg\"), OsStr::new(\"foo\"))));\n    /// assert_eq!(OsStr::new(\"cfg=foo=bar\").split_once(\"=\"), Some((OsStr::new(\"cfg\"), OsStr::new(\"foo=bar\"))));\n    /// ```\n    fn split_once(&self, needle: &'_ str) -> Option<(&OsStr, &OsStr)>;\n}\n\nimpl OsStrExt for OsStr {\n    fn try_str(&self) -> Result<&str, std::str::Utf8Error> {\n        let bytes = self.as_encoded_bytes();\n        std::str::from_utf8(bytes)\n    }\n\n    fn contains(&self, needle: &str) -> bool {\n        self.find(needle).is_some()\n    }\n\n    fn find(&self, needle: &str) -> Option<usize> {\n        let bytes = self.as_encoded_bytes();\n        (0..=self.len().checked_sub(needle.len())?)\n            .find(|&x| bytes[x..].starts_with(needle.as_bytes()))\n    }\n\n    fn strip_prefix(&self, prefix: &str) -> Option<&OsStr> {\n        let bytes = self.as_encoded_bytes();\n        bytes.strip_prefix(prefix.as_bytes()).map(|s| {\n            // SAFETY:\n            // - This came from `as_encoded_bytes`\n            // - Since `prefix` is `&str`, any split will be along UTF-8 boundary\n            unsafe { OsStr::from_encoded_bytes_unchecked(s) }\n        })\n    }\n    fn starts_with(&self, prefix: &str) -> bool {\n        let bytes = self.as_encoded_bytes();\n        bytes.starts_with(prefix.as_bytes())\n    }\n\n    fn split<'s, 'n>(&'s self, needle: &'n str) -> Split<'s, 'n> {\n        assert_ne!(needle, \"\");\n        Split {\n            haystack: Some(self),\n            needle,\n        }\n    }\n\n    fn split_once(&self, needle: &'_ str) -> Option<(&OsStr, &OsStr)> {\n        let start = self.find(needle)?;\n        let end = start + needle.len();\n        let haystack = self.as_encoded_bytes();\n        let first = &haystack[0..start];\n        let second = &haystack[end..];\n        // SAFETY:\n        // - This came from `as_encoded_bytes`\n        // - Since `needle` is `&str`, any split will be along UTF-8 boundary\n        unsafe {\n            Some((\n                OsStr::from_encoded_bytes_unchecked(first),\n                OsStr::from_encoded_bytes_unchecked(second),\n            ))\n        }\n    }\n}\n\nmod private {\n    pub trait Sealed {}\n\n    impl Sealed for std::ffi::OsStr {}\n}\n\npub struct Split<'s, 'n> {\n    haystack: Option<&'s OsStr>,\n    needle: &'n str,\n}\n\nimpl<'s> Iterator for Split<'s, '_> {\n    type Item = &'s OsStr;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        let haystack = self.haystack?;\n        if let Some((first, second)) = haystack.split_once(self.needle) {\n            if !haystack.is_empty() {\n                debug_assert_ne!(haystack, second);\n            }\n            self.haystack = Some(second);\n            Some(first)\n        } else {\n            self.haystack = None;\n            Some(haystack)\n        }\n    }\n}\n\n/// Split an `OsStr`\n///\n/// # Safety\n///\n/// `index` must be at a valid UTF-8 boundary\npub(crate) unsafe fn split_at(os: &OsStr, index: usize) -> (&OsStr, &OsStr) {\n    unsafe {\n        let bytes = os.as_encoded_bytes();\n        let (first, second) = bytes.split_at(index);\n        (\n            OsStr::from_encoded_bytes_unchecked(first),\n            OsStr::from_encoded_bytes_unchecked(second),\n        )\n    }\n}\n"
  },
  {
    "path": "clap_lex/src/lib.rs",
    "content": "//! Minimal, flexible command-line parser\n//!\n//! As opposed to a declarative parser, this processes arguments as a stream of tokens.  As lexing\n//! a command-line is not context-free, we rely on the caller to decide how to interpret the\n//! arguments.\n//!\n//! # Examples\n//!\n//! ```rust\n//! use std::path::PathBuf;\n//! use std::ffi::OsStr;\n//!\n//! type BoxedError = Box<dyn std::error::Error + Send + Sync>;\n//!\n//! #[derive(Debug)]\n//! struct Args {\n//!     paths: Vec<PathBuf>,\n//!     color: Color,\n//!     verbosity: usize,\n//! }\n//!\n//! #[derive(Debug)]\n//! enum Color {\n//!     Always,\n//!     Auto,\n//!     Never,\n//! }\n//!\n//! impl Color {\n//!     fn parse(s: Option<&OsStr>) -> Result<Self, BoxedError> {\n//!         let s = s.map(|s| s.to_str().ok_or(s));\n//!         match s {\n//!             Some(Ok(\"always\")) | Some(Ok(\"\")) | None => {\n//!                 Ok(Color::Always)\n//!             }\n//!             Some(Ok(\"auto\")) => {\n//!                 Ok(Color::Auto)\n//!             }\n//!             Some(Ok(\"never\")) => {\n//!                 Ok(Color::Never)\n//!             }\n//!             Some(invalid) => {\n//!                 Err(format!(\"Invalid value for `--color`, {invalid:?}\").into())\n//!             }\n//!         }\n//!     }\n//! }\n//!\n//! fn parse_args(\n//!     raw: impl IntoIterator<Item=impl Into<std::ffi::OsString>>\n//! ) -> Result<Args, BoxedError> {\n//!     let mut args = Args {\n//!         paths: Vec::new(),\n//!         color: Color::Auto,\n//!         verbosity: 0,\n//!     };\n//!\n//!     let raw = clap_lex::RawArgs::new(raw);\n//!     let mut cursor = raw.cursor();\n//!     raw.next(&mut cursor);  // Skip the bin\n//!     while let Some(arg) = raw.next(&mut cursor) {\n//!         if arg.is_escape() {\n//!             args.paths.extend(raw.remaining(&mut cursor).map(PathBuf::from));\n//!         } else if arg.is_stdio() {\n//!             args.paths.push(PathBuf::from(\"-\"));\n//!         } else if let Some((long, value)) = arg.to_long() {\n//!             match long {\n//!                 Ok(\"verbose\") => {\n//!                     if let Some(value) = value {\n//!                         return Err(format!(\"`--verbose` does not take a value, got `{value:?}`\").into());\n//!                     }\n//!                     args.verbosity += 1;\n//!                 }\n//!                 Ok(\"color\") => {\n//!                     args.color = Color::parse(value)?;\n//!                 }\n//!                 _ => {\n//!                     return Err(\n//!                         format!(\"Unexpected flag: --{}\", arg.display()).into()\n//!                     );\n//!                 }\n//!             }\n//!         } else if let Some(mut shorts) = arg.to_short() {\n//!             while let Some(short) = shorts.next_flag() {\n//!                 match short {\n//!                     Ok('v') => {\n//!                         args.verbosity += 1;\n//!                     }\n//!                     Ok('c') => {\n//!                         let value = shorts.next_value_os();\n//!                         args.color = Color::parse(value)?;\n//!                     }\n//!                     Ok(c) => {\n//!                         return Err(format!(\"Unexpected flag: -{c}\").into());\n//!                     }\n//!                     Err(e) => {\n//!                         return Err(format!(\"Unexpected flag: -{}\", e.to_string_lossy()).into());\n//!                     }\n//!                 }\n//!             }\n//!         } else {\n//!             args.paths.push(PathBuf::from(arg.to_value_os().to_owned()));\n//!         }\n//!     }\n//!\n//!     Ok(args)\n//! }\n//!\n//! let args = parse_args([\"bin\", \"--hello\", \"world\"]);\n//! println!(\"{args:?}\");\n//! ```\n\n#![cfg_attr(docsrs, feature(doc_cfg))]\n#![warn(missing_docs)]\n#![warn(clippy::print_stderr)]\n#![warn(clippy::print_stdout)]\n\nmod ext;\n\nuse std::ffi::OsStr;\nuse std::ffi::OsString;\n\npub use std::io::SeekFrom;\n\npub use ext::OsStrExt;\n\n/// Command-line arguments\n#[derive(Default, Clone, Debug, PartialEq, Eq)]\npub struct RawArgs {\n    items: Vec<OsString>,\n}\n\nimpl RawArgs {\n    //// Create an argument list to parse\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** The argument returned will be the current binary.\n    ///\n    /// </div>\n    ///\n    /// # Example\n    ///\n    /// ```rust,no_run\n    /// # use std::path::PathBuf;\n    /// let raw = clap_lex::RawArgs::from_args();\n    /// let mut cursor = raw.cursor();\n    /// let _bin = raw.next_os(&mut cursor);\n    ///\n    /// let mut paths = raw.remaining(&mut cursor).map(PathBuf::from).collect::<Vec<_>>();\n    /// println!(\"{paths:?}\");\n    /// ```\n    pub fn from_args() -> Self {\n        Self::new(std::env::args_os())\n    }\n\n    //// Create an argument list to parse\n    ///\n    /// # Example\n    ///\n    /// ```rust,no_run\n    /// # use std::path::PathBuf;\n    /// let raw = clap_lex::RawArgs::new([\"bin\", \"foo.txt\"]);\n    /// let mut cursor = raw.cursor();\n    /// let _bin = raw.next_os(&mut cursor);\n    ///\n    /// let mut paths = raw.remaining(&mut cursor).map(PathBuf::from).collect::<Vec<_>>();\n    /// println!(\"{paths:?}\");\n    /// ```\n    pub fn new(iter: impl IntoIterator<Item = impl Into<OsString>>) -> Self {\n        let iter = iter.into_iter();\n        Self::from(iter)\n    }\n\n    /// Create a cursor for walking the arguments\n    ///\n    /// # Example\n    ///\n    /// ```rust,no_run\n    /// # use std::path::PathBuf;\n    /// let raw = clap_lex::RawArgs::new([\"bin\", \"foo.txt\"]);\n    /// let mut cursor = raw.cursor();\n    /// let _bin = raw.next_os(&mut cursor);\n    ///\n    /// let mut paths = raw.remaining(&mut cursor).map(PathBuf::from).collect::<Vec<_>>();\n    /// println!(\"{paths:?}\");\n    /// ```\n    pub fn cursor(&self) -> ArgCursor {\n        ArgCursor::new()\n    }\n\n    /// Advance the cursor, returning the next [`ParsedArg`]\n    pub fn next<'s>(&'s self, cursor: &mut ArgCursor) -> Option<ParsedArg<'s>> {\n        self.next_os(cursor).map(ParsedArg::new)\n    }\n\n    /// Advance the cursor, returning a raw argument value.\n    pub fn next_os<'s>(&'s self, cursor: &mut ArgCursor) -> Option<&'s OsStr> {\n        let next = self.items.get(cursor.cursor).map(|s| s.as_os_str());\n        cursor.cursor = cursor.cursor.saturating_add(1);\n        next\n    }\n\n    /// Return the next [`ParsedArg`]\n    pub fn peek<'s>(&'s self, cursor: &ArgCursor) -> Option<ParsedArg<'s>> {\n        self.peek_os(cursor).map(ParsedArg::new)\n    }\n\n    /// Return a raw argument value.\n    pub fn peek_os<'s>(&'s self, cursor: &ArgCursor) -> Option<&'s OsStr> {\n        self.items.get(cursor.cursor).map(|s| s.as_os_str())\n    }\n\n    /// Return all remaining raw arguments, advancing the cursor to the end\n    ///\n    /// # Example\n    ///\n    /// ```rust,no_run\n    /// # use std::path::PathBuf;\n    /// let raw = clap_lex::RawArgs::new([\"bin\", \"foo.txt\"]);\n    /// let mut cursor = raw.cursor();\n    /// let _bin = raw.next_os(&mut cursor);\n    ///\n    /// let mut paths = raw.remaining(&mut cursor).map(PathBuf::from).collect::<Vec<_>>();\n    /// println!(\"{paths:?}\");\n    /// ```\n    pub fn remaining<'s>(&'s self, cursor: &mut ArgCursor) -> impl Iterator<Item = &'s OsStr> {\n        let remaining = self.items[cursor.cursor..].iter().map(|s| s.as_os_str());\n        cursor.cursor = self.items.len();\n        remaining\n    }\n\n    /// Adjust the cursor's position\n    pub fn seek(&self, cursor: &mut ArgCursor, pos: SeekFrom) {\n        let pos = match pos {\n            SeekFrom::Start(pos) => pos,\n            SeekFrom::End(pos) => (self.items.len() as i64).saturating_add(pos).max(0) as u64,\n            SeekFrom::Current(pos) => (cursor.cursor as i64).saturating_add(pos).max(0) as u64,\n        };\n        let pos = (pos as usize).min(self.items.len());\n        cursor.cursor = pos;\n    }\n\n    /// Inject arguments before the [`RawArgs::next`]\n    pub fn insert(\n        &mut self,\n        cursor: &ArgCursor,\n        insert_items: impl IntoIterator<Item = impl Into<OsString>>,\n    ) {\n        self.items.splice(\n            cursor.cursor..cursor.cursor,\n            insert_items.into_iter().map(Into::into),\n        );\n    }\n\n    /// Any remaining args?\n    pub fn is_end(&self, cursor: &ArgCursor) -> bool {\n        self.peek_os(cursor).is_none()\n    }\n}\n\nimpl<I, T> From<I> for RawArgs\nwhere\n    I: Iterator<Item = T>,\n    T: Into<OsString>,\n{\n    fn from(val: I) -> Self {\n        Self {\n            items: val.map(|x| x.into()).collect(),\n        }\n    }\n}\n\n/// Position within [`RawArgs`]\n#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]\npub struct ArgCursor {\n    cursor: usize,\n}\n\nimpl ArgCursor {\n    fn new() -> Self {\n        Self { cursor: 0 }\n    }\n}\n\n/// Command-line Argument\n#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct ParsedArg<'s> {\n    inner: &'s OsStr,\n}\n\nimpl<'s> ParsedArg<'s> {\n    fn new(inner: &'s OsStr) -> Self {\n        Self { inner }\n    }\n\n    /// Argument is length of 0\n    pub fn is_empty(&self) -> bool {\n        self.inner.is_empty()\n    }\n\n    /// Does the argument look like a stdio argument (`-`)\n    pub fn is_stdio(&self) -> bool {\n        self.inner == \"-\"\n    }\n\n    /// Does the argument look like an argument escape (`--`)\n    pub fn is_escape(&self) -> bool {\n        self.inner == \"--\"\n    }\n\n    /// Does the argument look like a negative number?\n    ///\n    /// This won't parse the number in full but attempts to see if this looks\n    /// like something along the lines of `-3`, `-0.3`, or `-33.03`\n    pub fn is_negative_number(&self) -> bool {\n        self.to_value()\n            .ok()\n            .and_then(|s| Some(is_number(s.strip_prefix('-')?)))\n            .unwrap_or_default()\n    }\n\n    /// Treat as a long-flag\n    pub fn to_long(&self) -> Option<(Result<&'s str, &'s OsStr>, Option<&'s OsStr>)> {\n        let raw = self.inner;\n        let remainder = raw.strip_prefix(\"--\")?;\n        if remainder.is_empty() {\n            debug_assert!(self.is_escape());\n            return None;\n        }\n\n        let (flag, value) = if let Some((p0, p1)) = remainder.split_once(\"=\") {\n            (p0, Some(p1))\n        } else {\n            (remainder, None)\n        };\n        let flag = flag.to_str().ok_or(flag);\n        Some((flag, value))\n    }\n\n    /// Can treat as a long-flag\n    pub fn is_long(&self) -> bool {\n        self.inner.starts_with(\"--\") && !self.is_escape()\n    }\n\n    /// Treat as a short-flag\n    pub fn to_short(&self) -> Option<ShortFlags<'s>> {\n        if let Some(remainder_os) = self.inner.strip_prefix(\"-\") {\n            if remainder_os.starts_with(\"-\") {\n                None\n            } else if remainder_os.is_empty() {\n                debug_assert!(self.is_stdio());\n                None\n            } else {\n                Some(ShortFlags::new(remainder_os))\n            }\n        } else {\n            None\n        }\n    }\n\n    /// Can treat as a short-flag\n    pub fn is_short(&self) -> bool {\n        self.inner.starts_with(\"-\") && !self.is_stdio() && !self.inner.starts_with(\"--\")\n    }\n\n    /// Treat as a value\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** May return a flag or an escape.\n    ///\n    /// </div>\n    pub fn to_value_os(&self) -> &'s OsStr {\n        self.inner\n    }\n\n    /// Treat as a value\n    ///\n    /// <div class=\"warning\">\n    ///\n    /// **NOTE:** May return a flag or an escape.\n    ///\n    /// </div>\n    pub fn to_value(&self) -> Result<&'s str, &'s OsStr> {\n        self.inner.to_str().ok_or(self.inner)\n    }\n\n    /// Safely print an argument that may contain non-UTF8 content\n    ///\n    /// This may perform lossy conversion, depending on the platform. If you would like an implementation which escapes the path please use Debug instead.\n    pub fn display(&self) -> impl std::fmt::Display + 's {\n        self.inner.to_string_lossy()\n    }\n}\n\n/// Walk through short flags within a [`ParsedArg`]\n#[derive(Clone, Debug)]\npub struct ShortFlags<'s> {\n    inner: &'s OsStr,\n    utf8_prefix: std::str::CharIndices<'s>,\n    invalid_suffix: Option<&'s OsStr>,\n}\n\nimpl<'s> ShortFlags<'s> {\n    fn new(inner: &'s OsStr) -> Self {\n        let (utf8_prefix, invalid_suffix) = split_nonutf8_once(inner);\n        let utf8_prefix = utf8_prefix.char_indices();\n        Self {\n            inner,\n            utf8_prefix,\n            invalid_suffix,\n        }\n    }\n\n    /// Move the iterator forward by `n` short flags\n    pub fn advance_by(&mut self, n: usize) -> Result<(), usize> {\n        for i in 0..n {\n            self.next().ok_or(i)?.map_err(|_| i)?;\n        }\n        Ok(())\n    }\n\n    /// No short flags left\n    pub fn is_empty(&self) -> bool {\n        self.invalid_suffix.is_none() && self.utf8_prefix.as_str().is_empty()\n    }\n\n    /// Does the short flag look like a number\n    ///\n    /// Ideally call this before doing any iterator\n    pub fn is_negative_number(&self) -> bool {\n        self.invalid_suffix.is_none() && is_number(self.utf8_prefix.as_str())\n    }\n\n    /// Advance the iterator, returning the next short flag on success\n    ///\n    /// On error, returns the invalid-UTF8 value\n    pub fn next_flag(&mut self) -> Option<Result<char, &'s OsStr>> {\n        if let Some((_, flag)) = self.utf8_prefix.next() {\n            return Some(Ok(flag));\n        }\n\n        if let Some(suffix) = self.invalid_suffix {\n            self.invalid_suffix = None;\n            return Some(Err(suffix));\n        }\n\n        None\n    }\n\n    /// Advance the iterator, returning everything left as a value\n    pub fn next_value_os(&mut self) -> Option<&'s OsStr> {\n        if let Some((index, _)) = self.utf8_prefix.next() {\n            self.utf8_prefix = \"\".char_indices();\n            self.invalid_suffix = None;\n            // SAFETY: `char_indices` ensures `index` is at a valid UTF-8 boundary\n            let remainder = unsafe { ext::split_at(self.inner, index).1 };\n            return Some(remainder);\n        }\n\n        if let Some(suffix) = self.invalid_suffix {\n            self.invalid_suffix = None;\n            return Some(suffix);\n        }\n\n        None\n    }\n}\n\nimpl<'s> Iterator for ShortFlags<'s> {\n    type Item = Result<char, &'s OsStr>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.next_flag()\n    }\n}\n\nfn split_nonutf8_once(b: &OsStr) -> (&str, Option<&OsStr>) {\n    match b.try_str() {\n        Ok(s) => (s, None),\n        Err(err) => {\n            // SAFETY: `err.valid_up_to()`, which came from str::from_utf8(), is guaranteed\n            // to be a valid UTF8 boundary\n            let (valid, after_valid) = unsafe { ext::split_at(b, err.valid_up_to()) };\n            let valid = valid.try_str().unwrap();\n            (valid, Some(after_valid))\n        }\n    }\n}\n\nfn is_number(arg: &str) -> bool {\n    // Return true if this looks like an integer or a float where it's all\n    // digits plus an optional single dot after some digits.\n    //\n    // For floats allow forms such as `1.`, `1.2`, `1.2e10`, etc.\n    let mut seen_dot = false;\n    let mut position_of_e = None;\n    for (i, c) in arg.as_bytes().iter().enumerate() {\n        match c {\n            // Digits are always valid\n            b'0'..=b'9' => {}\n\n            // Allow a `.`, but only one, only if it comes before an\n            // optional exponent, and only if it's not the first character.\n            b'.' if !seen_dot && position_of_e.is_none() && i > 0 => seen_dot = true,\n\n            // Allow an exponent `e`/`E` but only at most one after the first\n            // character.\n            b'e' | b'E' if position_of_e.is_none() && i > 0 => position_of_e = Some(i),\n\n            _ => return false,\n        }\n    }\n\n    // Disallow `-1e` which isn't a valid float since it doesn't actually have\n    // an exponent.\n    match position_of_e {\n        Some(i) => i != arg.len() - 1,\n        None => true,\n    }\n}\n\n#[doc = include_str!(\"../README.md\")]\n#[cfg(doctest)]\npub struct ReadmeDoctests;\n"
  },
  {
    "path": "clap_lex/tests/testsuite/lexer.rs",
    "content": "#[test]\nfn insert() {\n    let mut raw = clap_lex::RawArgs::new([\"bin\", \"a\", \"b\", \"c\"]);\n    let mut cursor = raw.cursor();\n\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"a\")));\n    raw.insert(&cursor, [\"1\", \"2\", \"3\"]);\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"1\")));\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"2\")));\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"3\")));\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"b\")));\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"c\")));\n\n    let mut cursor = raw.cursor();\n    let rest = raw\n        .remaining(&mut cursor)\n        .map(|s| s.to_string_lossy())\n        .collect::<Vec<_>>();\n    assert_eq!(rest, vec![\"bin\", \"a\", \"1\", \"2\", \"3\", \"b\", \"c\"]);\n}\n\n#[test]\nfn zero_copy_parsing() {\n    use clap_lex::RawArgs;\n    use std::ffi::OsStr;\n    #[derive(Debug, PartialEq)]\n    struct Args<'s> {\n        bin_name: &'s OsStr,\n        verbose_flag: bool,\n        remainder: Vec<&'s OsStr>,\n    }\n    fn parse(raw: &RawArgs) -> Result<Args<'_>, &'static str> {\n        let mut cursor = raw.cursor();\n        let Some(bin_arg) = raw.next(&mut cursor) else {\n            return Err(\"missing bin name\");\n        };\n        let bin_name = bin_arg.to_value_os();\n        let Some(first_arg) = raw.next(&mut cursor) else {\n            return Ok(Args {\n                bin_name,\n                verbose_flag: false,\n                remainder: Vec::new(),\n            });\n        };\n        let verbose_flag = if let Some(flag) = first_arg.to_long() {\n            match flag {\n                (Ok(\"verbose\"), None) => true,\n                _ => return Err(\"unexpected flag\"),\n            }\n        } else {\n            false\n        };\n        let mut remainder = Vec::new();\n        if !verbose_flag {\n            remainder.push(first_arg.to_value_os());\n        }\n        remainder.extend(raw.remaining(&mut cursor));\n        Ok(Args {\n            bin_name,\n            verbose_flag,\n            remainder,\n        })\n    }\n\n    let raw1 = RawArgs::new([\"bin\", \"--verbose\", \"a\", \"b\", \"c\"]);\n    let parsed1 = parse(&raw1).unwrap();\n    assert_eq!(\n        parsed1,\n        Args {\n            bin_name: OsStr::new(\"bin\"),\n            verbose_flag: true,\n            remainder: vec![OsStr::new(\"a\"), OsStr::new(\"b\"), OsStr::new(\"c\")]\n        }\n    );\n\n    let raw2 = RawArgs::new([\"bin\", \"a\", \"b\", \"c\"]);\n    let parsed2 = parse(&raw2).unwrap();\n    assert_eq!(\n        parsed2,\n        Args {\n            bin_name: OsStr::new(\"bin\"),\n            verbose_flag: false,\n            remainder: vec![OsStr::new(\"a\"), OsStr::new(\"b\"), OsStr::new(\"c\")]\n        }\n    );\n}\n"
  },
  {
    "path": "clap_lex/tests/testsuite/main.rs",
    "content": "automod::dir!(\"tests/testsuite\");\n"
  },
  {
    "path": "clap_lex/tests/testsuite/parsed.rs",
    "content": "use std::ffi::OsStr;\n\n// Despite our design philosophy being to support completion generation, we aren't considering `-`\n// the start of a long because there is no valid value to return.\n#[test]\nfn to_long_stdio() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(!next.is_long());\n\n    assert_eq!(next.to_long(), None);\n}\n\n#[test]\nfn to_long_no_escape() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"--\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(!next.is_long());\n\n    assert_eq!(next.to_long(), None);\n}\n\n#[test]\nfn to_long_no_value() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"--long\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(next.is_long());\n\n    let (key, value) = next.to_long().unwrap();\n    assert_eq!(key, Ok(\"long\"));\n    assert_eq!(value, None);\n}\n\n#[test]\nfn to_long_with_empty_value() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"--long=\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(next.is_long());\n\n    let (key, value) = next.to_long().unwrap();\n    assert_eq!(key, Ok(\"long\"));\n    assert_eq!(value, Some(OsStr::new(\"\")));\n}\n\n#[test]\nfn to_long_with_value() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"--long=hello\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(next.is_long());\n\n    let (key, value) = next.to_long().unwrap();\n    assert_eq!(key, Ok(\"long\"));\n    assert_eq!(value, Some(OsStr::new(\"hello\")));\n}\n\n#[test]\nfn to_short_stdio() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(!next.is_short());\n\n    assert!(next.to_short().is_none());\n}\n\n#[test]\nfn to_short_escape() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"--\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(!next.is_short());\n\n    assert!(next.to_short().is_none());\n}\n\n#[test]\nfn to_short_long() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"--long\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(!next.is_short());\n\n    assert!(next.to_short().is_none());\n}\n\n#[test]\nfn to_short() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-short\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(next.is_short());\n\n    let shorts = next.to_short().unwrap();\n    let actual: String = shorts.map(|s| s.unwrap()).collect();\n    assert_eq!(actual, \"short\");\n}\n\n#[test]\nfn is_negative_number() {\n    for number in [\"-10.0\", \"-1\", \"-100\", \"-3.5\", \"-1e10\", \"-1.3e10\", \"-1E10\"] {\n        let raw = clap_lex::RawArgs::new([\"bin\", number]);\n        let mut cursor = raw.cursor();\n        assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n        let next = raw.next(&mut cursor).unwrap();\n\n        assert!(next.is_negative_number());\n    }\n}\n\n#[test]\nfn is_positive_number() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"10.0\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(!next.is_negative_number());\n}\n\n#[test]\nfn is_not_number() {\n    for number in [\n        \"--10.0\", \"-..\", \"-2..\", \"-e\", \"-1e\", \"-1e10.2\", \"-.2\", \"-E\", \"-1E\", \"-1E10.2\",\n    ] {\n        let raw = clap_lex::RawArgs::new([\"bin\", number]);\n        let mut cursor = raw.cursor();\n        assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n        let next = raw.next(&mut cursor).unwrap();\n\n        assert!(\n            !next.is_negative_number(),\n            \"`{number}` is mistakenly classified as a number\"\n        );\n    }\n}\n\n#[test]\nfn is_stdio() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(next.is_stdio());\n}\n\n#[test]\nfn is_not_stdio() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"--\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(!next.is_stdio());\n}\n\n#[test]\nfn is_escape() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"--\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(next.is_escape());\n}\n\n#[test]\nfn is_not_escape() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n\n    assert!(!next.is_escape());\n}\n"
  },
  {
    "path": "clap_lex/tests/testsuite/shorts.rs",
    "content": "#[test]\nfn iter() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-short\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let shorts = next.to_short().unwrap();\n\n    let actual: String = shorts.map(|s| s.unwrap()).collect();\n    assert_eq!(actual, \"short\");\n}\n\n#[test]\nfn next_flag() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-short\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let mut shorts = next.to_short().unwrap();\n\n    let mut actual = String::new();\n    actual.push(shorts.next_flag().unwrap().unwrap());\n    actual.push(shorts.next_flag().unwrap().unwrap());\n    actual.push(shorts.next_flag().unwrap().unwrap());\n    actual.push(shorts.next_flag().unwrap().unwrap());\n    actual.push(shorts.next_flag().unwrap().unwrap());\n    assert_eq!(shorts.next_flag(), None);\n\n    assert_eq!(actual, \"short\");\n}\n\n#[test]\nfn next_value_os() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-short\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let mut shorts = next.to_short().unwrap();\n\n    let actual = shorts.next_value_os().unwrap().to_string_lossy();\n\n    assert_eq!(actual, \"short\");\n}\n\n#[test]\nfn next_flag_with_value() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-short\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let mut shorts = next.to_short().unwrap();\n\n    assert_eq!(shorts.next_flag().unwrap().unwrap(), 's');\n    let actual = shorts.next_value_os().unwrap().to_string_lossy();\n\n    assert_eq!(actual, \"hort\");\n}\n\n#[test]\nfn next_flag_with_no_value() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-short\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let mut shorts = next.to_short().unwrap();\n\n    assert_eq!(shorts.next_flag().unwrap().unwrap(), 's');\n    assert_eq!(shorts.next_flag().unwrap().unwrap(), 'h');\n    assert_eq!(shorts.next_flag().unwrap().unwrap(), 'o');\n    assert_eq!(shorts.next_flag().unwrap().unwrap(), 'r');\n    assert_eq!(shorts.next_flag().unwrap().unwrap(), 't');\n\n    assert_eq!(shorts.next_value_os(), None);\n}\n\n#[test]\nfn advance_by_nothing() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-short\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let mut shorts = next.to_short().unwrap();\n\n    assert_eq!(shorts.advance_by(0), Ok(()));\n\n    let actual: String = shorts.map(|s| s.unwrap()).collect();\n    assert_eq!(actual, \"short\");\n}\n\n#[test]\nfn advance_by_something() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-short\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let mut shorts = next.to_short().unwrap();\n\n    assert_eq!(shorts.advance_by(2), Ok(()));\n\n    let actual: String = shorts.map(|s| s.unwrap()).collect();\n    assert_eq!(actual, \"ort\");\n}\n\n#[test]\nfn advance_by_out_of_bounds() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-short\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let mut shorts = next.to_short().unwrap();\n\n    assert_eq!(shorts.advance_by(2000), Err(5));\n\n    let actual: String = shorts.map(|s| s.unwrap()).collect();\n    assert_eq!(actual, \"\");\n}\n\n#[test]\nfn is_not_empty() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-hello\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let shorts = next.to_short().unwrap();\n\n    assert!(!shorts.is_empty());\n}\n\n#[test]\nfn is_partial_not_empty() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-hello\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let mut shorts = next.to_short().unwrap();\n    shorts.advance_by(1).unwrap();\n\n    assert!(!shorts.is_empty());\n}\n\n#[test]\nfn is_exhausted_empty() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-hello\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let mut shorts = next.to_short().unwrap();\n    shorts.advance_by(20000).unwrap_err();\n\n    assert!(shorts.is_empty());\n}\n\n#[test]\nfn is_negative_number() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-1.0\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let shorts = next.to_short().unwrap();\n\n    assert!(shorts.is_negative_number());\n}\n\n#[test]\nfn is_not_negaitve_number() {\n    let raw = clap_lex::RawArgs::new([\"bin\", \"-hello\"]);\n    let mut cursor = raw.cursor();\n    assert_eq!(raw.next_os(&mut cursor), Some(std::ffi::OsStr::new(\"bin\")));\n    let next = raw.next(&mut cursor).unwrap();\n    let shorts = next.to_short().unwrap();\n\n    assert!(!shorts.is_negative_number());\n}\n"
  },
  {
    "path": "clap_mangen/CHANGELOG.md",
    "content": "# Change Log\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/)\nand this project adheres to [Semantic Versioning](https://semver.org/).\n\n<!-- next-header -->\n## [Unreleased] - ReleaseDate\n\n## [0.2.33] - 2026-03-12\n\n### Compatibility\n\n- Update MSRV to 1.85\n\n## [0.2.32] - 2026-03-12\n\n### Fixes\n\n- Always show possible values as a list\n\n### Internal\n\n- Update dependencies\n\n## [0.2.31] - 2025-10-22\n\n### Fixes\n\n- Reuse display order of `--help`\n\n## [0.2.30] - 2025-10-13\n\n## [0.2.29] - 2025-07-29\n\n### Features\n\n- Show multiple value names\n- Show optionality of flag values\n\n## [0.2.28] - 2025-07-09\n\n## [0.2.27] - 2025-06-09\n\n## [0.2.26] - 2025-01-10\n\n### Features\n\n- Respect `help_heading`\n\n## [0.2.25] - 2025-01-07\n\n### Fixes\n\n- Do not generate man pages for hidden subcommands\n\n## [0.2.24] - 2024-10-08\n\n## [0.2.23] - 2024-07-25\n\n## [0.2.22] - 2024-06-28\n\n## [0.2.21] - 2024-06-06\n\n## [0.2.20] - 2024-02-08\n\n### Compatibility\n\n- Update MSRV to 1.74\n\n## [0.2.19] - 2024-02-02\n\n### Features\n\n- Support generating files for man pages\n\n## [0.2.18] - 2024-01-29\n\n### Fixes\n\n- Print full subcommand name in title (ie include parent commands)\n- Print full subcommand in usage (ie include parent commands\n\n## [0.2.17] - 2024-01-11\n\n### Fixes\n\n- Correctly show help for fake flags\n\n## [0.2.16] - 2023-12-28\n\n### Performance\n\n- Only ask `TypedValueParser` for possible values if needed\n\n## [0.2.15] - 2023-10-24\n\n## [0.2.14] - 2023-09-18\n\n## [0.2.13] - 2023-08-24\n\n### Compatibility\n\n- Update MSRV to 1.70.0\n\n## [0.2.12] - 2023-06-02\n\n## [0.2.11] - 2023-05-19\n\n## [0.2.10] - 2023-03-16\n\n## [0.2.9] - 2023-02-22\n\n### Fixes\n\n- Only show value names if a value is taken\n\n## [0.2.8] - 2023-02-15\n\n## [0.2.7] - 2023-01-13\n\n### Compatibility\n\nMSRV changed to 1.64.0\n\n## [0.2.6] - 2022-12-22\n\n## [0.2.5] - 2022-11-24\n\n## [0.2.4] - 2022-10-31\n\n### Fixes\n\n- Don't show defaults for flags\n\n## [0.2.3] - 2022-10-18\n\n## [0.2.2] - 2022-09-29\n\n### Fixes\n\n- Reference to subcommand man pages now lists the correct name\n\n## [0.2.1] - 2022-09-28\n\n### Fixes\n\n- Respect hide attributes in more cases\n\n## [0.2.0] - 2022-09-28\n\n## [0.1.10] - 2022-06-28\n\n## [0.1.9] - 2022-06-21\n\n## [0.1.8] - 2022-06-13\n\n## [0.1.7] - 2022-06-13\n\n## [0.1.6] - 2022-04-20\n\n### Fixes\n\n- Split environment variables into separate paragraph\n\n## [0.1.5] - 2022-04-19\n\n## [0.1.4] - 2022-04-19\n\n## [0.1.3] - 2022-04-15\n\n- Use value names for positionals\n- Hide hidden flags in synopsis\n- Use italics for replaceable args\n\n## [0.1.2] - 2022-02-16\n\n## [0.1.1] - 2022-02-08\n\n### Fixes\n\n- Expanded the documentation\n\n<!-- next-url -->\n[Unreleased]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.33...HEAD\n[0.2.33]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.32...clap_mangen-v0.2.33\n[0.2.32]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.31...clap_mangen-v0.2.32\n[0.2.31]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.30...clap_mangen-v0.2.31\n[0.2.30]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.29...clap_mangen-v0.2.30\n[0.2.29]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.28...clap_mangen-v0.2.29\n[0.2.28]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.27...clap_mangen-v0.2.28\n[0.2.27]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.26...clap_mangen-v0.2.27\n[0.2.26]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.25...clap_mangen-v0.2.26\n[0.2.25]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.24...clap_mangen-v0.2.25\n[0.2.24]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.23...clap_mangen-v0.2.24\n[0.2.23]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.22...clap_mangen-v0.2.23\n[0.2.22]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.21...clap_mangen-v0.2.22\n[0.2.21]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.20...clap_mangen-v0.2.21\n[0.2.20]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.19...clap_mangen-v0.2.20\n[0.2.19]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.18...clap_mangen-v0.2.19\n[0.2.18]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.17...clap_mangen-v0.2.18\n[0.2.17]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.16...clap_mangen-v0.2.17\n[0.2.16]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.15...clap_mangen-v0.2.16\n[0.2.15]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.14...clap_mangen-v0.2.15\n[0.2.14]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.13...clap_mangen-v0.2.14\n[0.2.13]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.12...clap_mangen-v0.2.13\n[0.2.12]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.11...clap_mangen-v0.2.12\n[0.2.11]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.10...clap_mangen-v0.2.11\n[0.2.10]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.9...clap_mangen-v0.2.10\n[0.2.9]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.8...clap_mangen-v0.2.9\n[0.2.8]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.7...clap_mangen-v0.2.8\n[0.2.7]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.6...clap_mangen-v0.2.7\n[0.2.6]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.5...clap_mangen-v0.2.6\n[0.2.5]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.4...clap_mangen-v0.2.5\n[0.2.4]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.3...clap_mangen-v0.2.4\n[0.2.3]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.2...clap_mangen-v0.2.3\n[0.2.2]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.1...clap_mangen-v0.2.2\n[0.2.1]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.2.0...clap_mangen-v0.2.1\n[0.2.0]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.10...clap_mangen-v0.2.0\n[0.1.10]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.9...clap_mangen-v0.1.10\n[0.1.9]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.8...clap_mangen-v0.1.9\n[0.1.8]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.7...clap_mangen-v0.1.8\n[0.1.7]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.6...clap_mangen-v0.1.7\n[0.1.6]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.5...clap_mangen-v0.1.6\n[0.1.5]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.4...clap_mangen-v0.1.5\n[0.1.4]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.3...clap_mangen-v0.1.4\n[0.1.3]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.2...clap_mangen-v0.1.3\n[0.1.2]: https://github.com/clap-rs/clap/compare/clap_mangen-v0.1.1...clap_mangen-v0.1.2\n[0.1.1]: https://github.com/clap-rs/clap/compare/0b045f5d0de9f6c97607be3276f529a14510e94e...clap_mangen-v0.1.1\n"
  },
  {
    "path": "clap_mangen/CONTRIBUTING.md",
    "content": "# How to Contribute\n\nSee the [clap-wide CONTRIBUTING.md](../CONTRIBUTING.md). This will contain `clap_mangen` specific notes.\n"
  },
  {
    "path": "clap_mangen/Cargo.toml",
    "content": "[package]\nname = \"clap_mangen\"\nversion = \"0.2.33\"\ndescription = \"A manpage generator for clap\"\ncategories = [\"command-line-interface\"]\nkeywords = [\n  \"clap\",\n  \"cli\",\n  \"generate\",\n  \"manpage\",\n]\nrepository.workspace = true\nlicense.workspace = true\nedition.workspace = true\nrust-version.workspace = true\ninclude.workspace = true\n\n[package.metadata.docs.rs]\ntargets = [\"x86_64-unknown-linux-gnu\"]\nrustdoc-args = [\"--generate-link-to-definition\"]\n\n[package.metadata.release]\npre-release-replacements = [\n  {file=\"CHANGELOG.md\", search=\"Unreleased\", replace=\"{{version}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"\\\\.\\\\.\\\\.HEAD\", replace=\"...{{tag_name}}\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"ReleaseDate\", replace=\"{{date}}\", min=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-header -->\", replace=\"<!-- next-header -->\\n## [Unreleased] - ReleaseDate\\n\", exactly=1},\n  {file=\"CHANGELOG.md\", search=\"<!-- next-url -->\", replace=\"<!-- next-url -->\\n[Unreleased]: https://github.com/clap-rs/clap/compare/{{tag_name}}...HEAD\", exactly=1},\n  {file=\"README.md\", search=\"github.com/clap-rs/clap/blob/[^/]+/\", replace=\"github.com/clap-rs/clap/blob/{{tag_name}}/\", exactly=4, prerelease = true},\n]\n\n[lib]\nbench = false\n\n[dependencies]\nroff = \"1.0.0\"\nclap = { path = \"../\", version = \"4.0.0\", default-features = false, features = [\"std\", \"env\"] }\n\n[dev-dependencies]\nsnapbox = { version = \"1.1.0\", features = [\"diff\"] }\nclap = { path = \"../\", version = \"4.0.0\", default-features = false, features = [\"std\", \"help\"] }\nautomod = \"1.0.16\"\n\n[features]\ndefault = []\ndebug = [\"clap/debug\"]\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "clap_mangen/README.md",
    "content": "<!-- omit in TOC -->\n# `clap_mangen`\n\n> **Manpage generation for `clap`**\n\n[![Crates.io](https://img.shields.io/crates/v/clap_mangen?style=flat-square)](https://crates.io/crates/clap_mangen)\n[![Crates.io](https://img.shields.io/crates/d/clap_mangen?style=flat-square)](https://crates.io/crates/clap_mangen)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square)](https://github.com/clap-rs/clap/blob/clap_mangen-v0.2.33/LICENSE-APACHE)\n[![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](https://github.com/clap-rs/clap/blob/clap_mangen-v0.2.33/LICENSE-MIT)\n\nDual-licensed under [Apache 2.0](LICENSE-APACHE) or [MIT](LICENSE-MIT).\n\n1. [About](#about)\n2. [API Reference](https://docs.rs/clap_mangen)\n3. [Questions & Discussions](https://github.com/clap-rs/clap/discussions)\n4. [CONTRIBUTING](https://github.com/clap-rs/clap/blob/clap_mangen-v0.2.33/clap_mangen/CONTRIBUTING.md)\n5. [Sponsors](https://github.com/clap-rs/clap/blob/clap_mangen-v0.2.33/README.md#sponsors)\n\n## About\n\nGenerate [ROFF](https://en.wikipedia.org/wiki/Roff_(software)) from a `clap::Command`.\n\n### Example\n\nWe're going to assume you want to generate your man page as part of your\ndevelopment rather than your shipped program having a flag to generate it.\n\nRun\n```console\n$ cargo add --build clap_mangen\n```\n\nIn your `build.rs`:\n```rust,no_run\nfn main() -> std::io::Result<()> {\n    let out_dir = std::path::PathBuf::from(std::env::var_os(\"OUT_DIR\").ok_or(std::io::ErrorKind::NotFound)?);\n\n    let cmd = clap::Command::new(\"mybin\")\n        .arg(clap::arg!(-n --name <NAME>))\n        .arg(clap::arg!(-c --count <NUM>));\n\n    let man = clap_mangen::Man::new(cmd);\n    let mut buffer: Vec<u8> = Default::default();\n    man.render(&mut buffer)?;\n\n    std::fs::write(out_dir.join(\"mybin.1\"), buffer)?;\n\n    Ok(())\n}\n```\n\nTip: Consider a [cargo xtask](https://github.com/matklad/cargo-xtask) instead of a `build.rs` to reduce build costs.\n"
  },
  {
    "path": "clap_mangen/examples/man.rs",
    "content": "use clap::{Command, arg};\nuse clap_mangen::Man;\nuse std::io;\n\n// Run this example as `cargo run --example man | man -l -`.\n\nfn main() -> Result<(), io::Error> {\n    let cmd = Command::new(\"myapp\")\n        .version(\"1.0\")\n        .author(\"Kevin K. <kbknapp@gmail.com>:Ola Nordmann <old@nordmann.no>\")\n        .about(\"Does awesome things\")\n        .long_about(\n            \"With a longer description to help clarify some things.\n\nAnd a few newlines.\",\n        )\n        .after_help(\"This is an extra section added to the end of the manpage.\")\n        .after_long_help(\"With even more text added.\")\n        .arg(\n            arg!(-c --config <FILE> \"Sets a custom config file\")\n                .long_help(\"Some more text about how to set a custom config file\")\n                .default_value(\"config.toml\")\n                .env(\"CONFIG_FILE\"),\n        )\n        .arg(arg!([output] \"Sets an output file\").default_value(\"result.txt\"))\n        .arg(\n            arg!(-d --debug ... \"Turn debugging information on\")\n                .env(\"DEBUG_ON\")\n                .hide_env(true),\n        )\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"does testing things\")\n                .arg(arg!(-l --list \"Lists test values\")),\n        );\n\n    Man::new(cmd).render(&mut io::stdout())\n}\n"
  },
  {
    "path": "clap_mangen/src/lib.rs",
    "content": "#![doc = include_str!(\"../README.md\")]\n#![doc(html_logo_url = \"https://raw.githubusercontent.com/clap-rs/clap/master/assets/clap.png\")]\n#![cfg_attr(docsrs, feature(doc_cfg))]\n#![forbid(unsafe_code)]\n#![warn(missing_docs)]\n#![warn(clippy::print_stderr)]\n#![warn(clippy::print_stdout)]\n\nmod render;\n\npub use roff;\n\nuse render::subcommand_heading;\nuse roff::{Roff, roman};\nuse std::io::Write;\n\n/// A manpage writer\npub struct Man {\n    cmd: clap::Command,\n    title: String,\n    section: String,\n    date: String,\n    source: String,\n    manual: String,\n}\n\n/// Build a [`Man`]\nimpl Man {\n    /// Create a new manual page.\n    pub fn new(mut cmd: clap::Command) -> Self {\n        cmd.build();\n        let title = cmd\n            .get_display_name()\n            .unwrap_or_else(|| cmd.get_name())\n            .to_owned();\n        let section = \"1\".to_owned();\n        let date = \"\".to_owned();\n        let source = format!(\n            \"{} {}\",\n            cmd.get_name(),\n            cmd.get_version().unwrap_or_default()\n        );\n        let manual = \"\".to_owned();\n        Self {\n            cmd,\n            title,\n            section,\n            date,\n            source,\n            manual,\n        }\n    }\n\n    /// Override the default man page title, written in all caps\n    pub fn title(mut self, title: impl Into<String>) -> Self {\n        self.title = title.into();\n        self\n    }\n\n    /// Override the default section this man page is placed in\n    ///\n    /// Common values:\n    ///\n    /// - `\"1\"`: User Commands\n    /// - `\"2\"`: System Calls\n    /// - `\"3\"`: C Library Functions\n    /// - `\"4\"`: Devices and Special Files\n    /// - `\"5\"`: File Formats and Conventions\n    /// - `\"6\"`: Games et. al.\n    /// - `\"7\"`: Miscellanea\n    /// - `\"8\"`: System Administration tools and Daemons\n    pub fn section(mut self, section: impl Into<String>) -> Self {\n        self.section = section.into();\n        self\n    }\n\n    /// Override the default date for the last non-trivial change to this man page\n    ///\n    /// Dates should be written in the form `YYYY-MM-DD`.\n    pub fn date(mut self, date: impl Into<String>) -> Self {\n        self.date = date.into();\n        self\n    }\n\n    /// Override the default source your command\n    ///\n    /// For those few man-pages pages in Sections 1 and 8, probably you just want to write GNU.\n    pub fn source(mut self, source: impl Into<String>) -> Self {\n        self.source = source.into();\n        self\n    }\n\n    /// Override the default manual this page is a member of\n    pub fn manual(mut self, manual: impl Into<String>) -> Self {\n        self.manual = manual.into();\n        self\n    }\n}\n\n/// Handle [`Man`] in relation to files\nimpl Man {\n    /// Generate the filename of the manual page\n    #[must_use]\n    pub fn get_filename(&self) -> String {\n        format!(\n            \"{}.{}\",\n            self.cmd\n                .get_display_name()\n                .unwrap_or_else(|| self.cmd.get_name()),\n            self.section\n        )\n    }\n\n    /// [Renders](Man::render) the manual page and writes it to a file\n    pub fn generate_to(\n        &self,\n        out_dir: impl AsRef<std::path::Path>,\n    ) -> Result<std::path::PathBuf, std::io::Error> {\n        let filepath = out_dir.as_ref().join(self.get_filename());\n        let mut file = std::fs::File::create(&filepath)?;\n        self.render(&mut file)?;\n        file.flush()?;\n        Ok(filepath)\n    }\n}\n\n/// Generate manual page files for the command with all subcommands\npub fn generate_to(\n    cmd: clap::Command,\n    out_dir: impl AsRef<std::path::Path>,\n) -> Result<(), std::io::Error> {\n    fn generate(cmd: clap::Command, out_dir: &std::path::Path) -> Result<(), std::io::Error> {\n        for cmd in cmd.get_subcommands().filter(|s| !s.is_hide_set()).cloned() {\n            generate(cmd, out_dir)?;\n        }\n        Man::new(cmd).generate_to(out_dir)?;\n        Ok(())\n    }\n\n    let mut cmd = cmd.disable_help_subcommand(true);\n    cmd.build();\n    generate(cmd, out_dir.as_ref())\n}\n\n/// Generate ROFF output\nimpl Man {\n    /// Render a full manual page into the writer.\n    ///\n    /// If customization is needed, you can call the individual sections you want and mix them into\n    /// your own ROFF content.\n    pub fn render(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_title(&mut roff);\n        self._render_name_section(&mut roff);\n        self._render_synopsis_section(&mut roff);\n        self._render_description_section(&mut roff);\n\n        if app_has_arguments(&self.cmd) {\n            self._render_options_section(&mut roff);\n        }\n\n        if app_has_subcommands(&self.cmd) {\n            self._render_subcommands_section(&mut roff);\n        }\n\n        if self.cmd.get_after_long_help().is_some() || self.cmd.get_after_help().is_some() {\n            self._render_extra_section(&mut roff);\n        }\n\n        if app_has_version(&self.cmd) {\n            self._render_version_section(&mut roff);\n        }\n\n        if self.cmd.get_author().is_some() {\n            self._render_authors_section(&mut roff);\n        }\n\n        roff.to_writer(w)\n    }\n\n    /// Render the title into the writer.\n    pub fn render_title(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_title(&mut roff);\n        roff.to_writer(w)\n    }\n\n    fn _render_title(&self, roff: &mut Roff) {\n        roff.control(\"TH\", self.title_args());\n    }\n\n    // Turn metadata into arguments for a .TH macro.\n    fn title_args(&self) -> Vec<&str> {\n        vec![\n            &self.title,\n            &self.section,\n            &self.date,\n            &self.source,\n            &self.manual,\n        ]\n    }\n\n    /// Render the NAME section into the writer.\n    pub fn render_name_section(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_name_section(&mut roff);\n        roff.to_writer(w)\n    }\n\n    fn _render_name_section(&self, roff: &mut Roff) {\n        roff.control(\"SH\", [\"NAME\"]);\n        render::about(roff, &self.cmd);\n    }\n\n    /// Render the SYNOPSIS section into the writer.\n    pub fn render_synopsis_section(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_synopsis_section(&mut roff);\n        roff.to_writer(w)\n    }\n\n    fn _render_synopsis_section(&self, roff: &mut Roff) {\n        roff.control(\"SH\", [\"SYNOPSIS\"]);\n        render::synopsis(roff, &self.cmd);\n    }\n\n    /// Render the DESCRIPTION section into the writer.\n    pub fn render_description_section(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_description_section(&mut roff);\n        roff.to_writer(w)\n    }\n\n    fn _render_description_section(&self, roff: &mut Roff) {\n        roff.control(\"SH\", [\"DESCRIPTION\"]);\n        render::description(roff, &self.cmd);\n    }\n\n    /// Render the OPTIONS section into the writer.\n    pub fn render_options_section(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_options_section(&mut roff);\n        roff.to_writer(w)\n    }\n\n    fn _render_options_section(&self, roff: &mut Roff) {\n        let help_headings = self\n            .cmd\n            .get_arguments()\n            .filter(|a| !a.is_hide_set())\n            .filter_map(|arg| arg.get_help_heading())\n            .fold(vec![], |mut acc, header| {\n                if !acc.contains(&header) {\n                    acc.push(header);\n                }\n\n                acc\n            });\n\n        let (args, mut args_with_heading) =\n            self.cmd\n                .get_arguments()\n                .filter(|a| !a.is_hide_set())\n                .partition::<Vec<_>, _>(|a| a.get_help_heading().is_none());\n\n        if !args.is_empty() {\n            roff.control(\"SH\", [\"OPTIONS\"]);\n            render::options(roff, &args);\n        }\n\n        for heading in help_headings {\n            let args;\n            (args, args_with_heading) = args_with_heading\n                .into_iter()\n                .partition(|&a| a.get_help_heading() == Some(heading));\n\n            roff.control(\"SH\", [heading.to_uppercase().as_str()]);\n            render::options(roff, &args);\n        }\n    }\n\n    /// Render the SUBCOMMANDS section into the writer.\n    pub fn render_subcommands_section(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_subcommands_section(&mut roff);\n        roff.to_writer(w)\n    }\n\n    fn _render_subcommands_section(&self, roff: &mut Roff) {\n        let heading = subcommand_heading(&self.cmd);\n        roff.control(\"SH\", [heading]);\n        render::subcommands(roff, &self.cmd, &self.section);\n    }\n\n    /// Render the EXTRA section into the writer.\n    pub fn render_extra_section(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_extra_section(&mut roff);\n        roff.to_writer(w)\n    }\n\n    fn _render_extra_section(&self, roff: &mut Roff) {\n        roff.control(\"SH\", [\"EXTRA\"]);\n        render::after_help(roff, &self.cmd);\n    }\n\n    /// Render the VERSION section into the writer.\n    pub fn render_version_section(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_version_section(&mut roff);\n        roff.to_writer(w)\n    }\n\n    fn _render_version_section(&self, roff: &mut Roff) {\n        let version = roman(render::version(&self.cmd));\n        roff.control(\"SH\", [\"VERSION\"]);\n        roff.text([version]);\n    }\n\n    /// Render the AUTHORS section into the writer.\n    pub fn render_authors_section(&self, w: &mut dyn Write) -> Result<(), std::io::Error> {\n        let mut roff = Roff::default();\n        self._render_authors_section(&mut roff);\n        roff.to_writer(w)\n    }\n\n    fn _render_authors_section(&self, roff: &mut Roff) {\n        let author = roman(self.cmd.get_author().unwrap_or_default());\n        roff.control(\"SH\", [\"AUTHORS\"]);\n        roff.text([author]);\n    }\n}\n\n// Does the application have a version?\nfn app_has_version(cmd: &clap::Command) -> bool {\n    cmd.get_version()\n        .or_else(|| cmd.get_long_version())\n        .is_some()\n}\n\n// Does the application have any command line arguments?\nfn app_has_arguments(cmd: &clap::Command) -> bool {\n    cmd.get_arguments().any(|i| !i.is_hide_set())\n}\n\n// Does the application have any subcommands?\nfn app_has_subcommands(cmd: &clap::Command) -> bool {\n    cmd.get_subcommands().any(|i| !i.is_hide_set())\n}\n\n#[doc = include_str!(\"../README.md\")]\n#[cfg(doctest)]\npub struct ReadmeDoctests;\n"
  },
  {
    "path": "clap_mangen/src/render.rs",
    "content": "use clap::{Arg, ArgAction};\nuse roff::{Inline, Roff, bold, italic, roman};\n\npub(crate) fn subcommand_heading(cmd: &clap::Command) -> &str {\n    match cmd.get_subcommand_help_heading() {\n        Some(title) => title,\n        None => \"SUBCOMMANDS\",\n    }\n}\n\npub(crate) fn about(roff: &mut Roff, cmd: &clap::Command) {\n    let name = cmd.get_display_name().unwrap_or_else(|| cmd.get_name());\n    let s = match cmd.get_about().or_else(|| cmd.get_long_about()) {\n        Some(about) => format!(\"{name} - {about}\"),\n        None => name.to_owned(),\n    };\n    roff.text([roman(s)]);\n}\n\npub(crate) fn description(roff: &mut Roff, cmd: &clap::Command) {\n    if let Some(about) = cmd.get_long_about().or_else(|| cmd.get_about()) {\n        for line in about.to_string().lines() {\n            if line.trim().is_empty() {\n                roff.control(\"PP\", []);\n            } else {\n                roff.text([roman(line)]);\n            }\n        }\n    }\n}\n\npub(crate) fn synopsis(roff: &mut Roff, cmd: &clap::Command) {\n    let name = cmd.get_bin_name().unwrap_or_else(|| cmd.get_name());\n    let mut line = vec![bold(name), roman(\" \")];\n\n    let mut opts: Vec<_> = cmd.get_arguments().filter(|i| !i.is_hide_set()).collect();\n\n    opts.sort_by_key(|opt| option_sort_key(opt));\n\n    for opt in opts {\n        let (lhs, rhs) = option_markers(opt);\n        match (opt.get_short(), opt.get_long()) {\n            (Some(short), Some(long)) => {\n                line.push(roman(lhs));\n                line.push(bold(format!(\"-{short}\")));\n                line.push(roman(\"|\"));\n                line.push(bold(format!(\"--{long}\",)));\n                line.push(roman(rhs));\n            }\n            (Some(short), None) => {\n                line.push(roman(lhs));\n                line.push(bold(format!(\"-{short} \")));\n                line.push(roman(rhs));\n            }\n            (None, Some(long)) => {\n                line.push(roman(lhs));\n                line.push(bold(format!(\"--{long}\")));\n                line.push(roman(rhs));\n            }\n            (None, None) => continue,\n        };\n\n        if matches!(opt.get_action(), ArgAction::Count) {\n            line.push(roman(\"...\"));\n        }\n        line.push(roman(\" \"));\n    }\n\n    for arg in cmd.get_positionals() {\n        let (lhs, rhs) = option_markers(arg);\n        line.push(roman(lhs));\n        if let Some(value) = arg.get_value_names() {\n            line.push(italic(value.join(\" \")));\n        } else {\n            line.push(italic(arg.get_id().as_str()));\n        }\n        line.push(roman(rhs));\n        line.push(roman(\" \"));\n    }\n\n    if cmd.has_subcommands() {\n        let (lhs, rhs) = subcommand_markers(cmd);\n        line.push(roman(lhs));\n        line.push(italic(\n            cmd.get_subcommand_value_name()\n                .unwrap_or_else(|| subcommand_heading(cmd))\n                .to_lowercase(),\n        ));\n        line.push(roman(rhs));\n    }\n\n    roff.text(line);\n}\n\npub(crate) fn options(roff: &mut Roff, items: &[&Arg]) {\n    let mut sorted_items = items.to_vec();\n    sorted_items.sort_by_key(|opt| option_sort_key(opt));\n\n    for opt in sorted_items.iter().filter(|a| !a.is_positional()) {\n        let mut header = match (opt.get_short(), opt.get_long()) {\n            (Some(short), Some(long)) => {\n                vec![short_option(short), roman(\", \"), long_option(long)]\n            }\n            (Some(short), None) => vec![short_option(short)],\n            (None, Some(long)) => vec![long_option(long)],\n            (None, None) => vec![],\n        };\n\n        let arg_range = opt.get_num_args().expect(\"built\");\n        if arg_range.takes_values() {\n            if let Some(value_names) = &opt.get_value_names() {\n                let (lhs, rhs) = option_value_markers(opt);\n\n                header.push(roman(lhs));\n                for (i, name) in value_names.iter().enumerate() {\n                    if i > 0 {\n                        header.push(italic(\" \"));\n                    }\n\n                    let mut val = format!(\"<{name}>\");\n\n                    // If this is the last value and it's variadic, add \"...\"\n                    let is_last = i == value_names.len() - 1;\n\n                    if is_last && arg_range.max_values() > value_names.len() {\n                        val.push_str(\"...\");\n                    }\n                    header.push(italic(val));\n                }\n                header.push(roman(rhs));\n            }\n        }\n\n        if let Some(defs) = option_default_values(opt) {\n            header.push(roman(\" \"));\n            header.push(roman(defs));\n        }\n\n        let mut body = vec![];\n        let mut arg_help_written = false;\n        if let Some(help) = option_help(opt) {\n            arg_help_written = true;\n            body.push(roman(help.to_string()));\n        }\n\n        roff.control(\"TP\", []);\n        roff.text(header);\n        roff.text(body);\n\n        possible_options(roff, opt, arg_help_written);\n\n        if let Some(env) = option_environment(opt) {\n            roff.control(\"RS\", []);\n            roff.text(env);\n            roff.control(\"RE\", []);\n        }\n    }\n\n    for pos in items.iter().filter(|a| a.is_positional()) {\n        let mut header = vec![];\n        let (lhs, rhs) = option_markers(pos);\n        header.push(roman(lhs));\n        if let Some(value) = pos.get_value_names() {\n            header.push(italic(value.join(\" \")));\n        } else {\n            header.push(italic(pos.get_id().as_str()));\n        };\n        header.push(roman(rhs));\n\n        if let Some(defs) = option_default_values(pos) {\n            header.push(roman(format!(\" {defs}\")));\n        }\n\n        let mut body = vec![];\n        let mut arg_help_written = false;\n        if let Some(help) = option_help(pos) {\n            body.push(roman(help.to_string()));\n            arg_help_written = true;\n        }\n\n        roff.control(\"TP\", []);\n        roff.text(header);\n        roff.text(body);\n\n        if let Some(env) = option_environment(pos) {\n            roff.control(\"RS\", []);\n            roff.text(env);\n            roff.control(\"RE\", []);\n        }\n\n        possible_options(roff, pos, arg_help_written);\n    }\n}\n\nfn possible_options(roff: &mut Roff, arg: &Arg, arg_help_written: bool) {\n    if let Some(possible_values_text) = get_possible_values(arg) {\n        if arg_help_written {\n            // It looks nice to have a separation between the help and the values\n            roff.text([Inline::LineBreak]);\n        }\n        roff.text([Inline::LineBreak, italic(\"Possible values:\")]);\n\n        // Need to indent twice to get it to look right, because .TP heading indents, but\n        // that indent doesn't Carry over to the .IP for the bullets. The standard shift\n        // size is 7 for terminal devices\n        roff.control(\"RS\", [\"14\"]);\n        for line in possible_values_text {\n            roff.control(\"IP\", [\"\\\\(bu\", \"2\"]);\n            roff.extend([line]);\n        }\n        roff.control(\"RE\", []);\n    }\n}\n\npub(crate) fn subcommands(roff: &mut Roff, cmd: &clap::Command, section: &str) {\n    let mut sorted_subcommands: Vec<_> =\n        cmd.get_subcommands().filter(|s| !s.is_hide_set()).collect();\n    sorted_subcommands.sort_by_key(|c| subcommand_sort_key(c));\n    for sub in sorted_subcommands {\n        roff.control(\"TP\", []);\n\n        let name = format!(\n            \"{}-{}({})\",\n            cmd.get_display_name().unwrap_or_else(|| cmd.get_name()),\n            sub.get_name(),\n            section\n        );\n        roff.text([roman(name)]);\n\n        if let Some(about) = sub.get_about().or_else(|| sub.get_long_about()) {\n            for line in about.to_string().lines() {\n                roff.text([roman(line)]);\n            }\n        }\n    }\n}\n\npub(crate) fn version(cmd: &clap::Command) -> String {\n    format!(\n        \"v{}\",\n        cmd.get_long_version()\n            .or_else(|| cmd.get_version())\n            .unwrap()\n    )\n}\n\npub(crate) fn after_help(roff: &mut Roff, cmd: &clap::Command) {\n    if let Some(about) = cmd.get_after_long_help().or_else(|| cmd.get_after_help()) {\n        for line in about.to_string().lines() {\n            roff.text([roman(line)]);\n        }\n    }\n}\n\nfn subcommand_markers(cmd: &clap::Command) -> (&'static str, &'static str) {\n    markers(cmd.is_subcommand_required_set())\n}\n\nfn option_markers(opt: &Arg) -> (&'static str, &'static str) {\n    markers(opt.is_required_set())\n}\n\nfn markers(required: bool) -> (&'static str, &'static str) {\n    if required { (\"<\", \">\") } else { (\"[\", \"]\") }\n}\n\nfn option_value_markers(arg: &Arg) -> (&'static str, &'static str) {\n    let range = arg.get_num_args().expect(\"built\");\n\n    if !range.takes_values() {\n        return (\"\", \"\"); // no value, so nothing to render\n    }\n\n    let required = range.min_values() > 0;\n    let require_equals = arg.is_require_equals_set();\n\n    match (required, require_equals) {\n        // Required, no equals: <VALUE>\n        (true, false) => (\" \", \"\"),\n\n        // Optional, no equals: [<VALUE>]\n        (false, false) => (\" [\", \"]\"),\n\n        // Optional, with equals: [=<VALUE>]\n        (false, true) => (\"[=\", \"]\"),\n\n        // Required, with equals\n        (true, true) => (\"=\", \"\"),\n    }\n}\n\nfn short_option(opt: char) -> Inline {\n    bold(format!(\"-{opt}\"))\n}\n\nfn long_option(opt: &str) -> Inline {\n    bold(format!(\"--{opt}\"))\n}\n\nfn option_help(opt: &Arg) -> Option<&clap::builder::StyledStr> {\n    if !opt.is_hide_long_help_set() {\n        let long_help = opt.get_long_help();\n        if long_help.is_some() {\n            return long_help;\n        }\n    }\n    if !opt.is_hide_short_help_set() {\n        return opt.get_help();\n    }\n\n    None\n}\n\nfn option_environment(opt: &Arg) -> Option<Vec<Inline>> {\n    if opt.is_hide_env_set() {\n        return None;\n    } else if let Some(env) = opt.get_env() {\n        return Some(vec![\n            roman(\"May also be specified with the \"),\n            bold(env.to_string_lossy().into_owned()),\n            roman(\" environment variable. \"),\n        ]);\n    }\n\n    None\n}\n\nfn option_default_values(opt: &Arg) -> Option<String> {\n    if opt.is_hide_default_value_set() || !opt.get_num_args().expect(\"built\").takes_values() {\n        return None;\n    } else if !opt.get_default_values().is_empty() {\n        let values = opt\n            .get_default_values()\n            .iter()\n            .map(|s| s.to_string_lossy())\n            .collect::<Vec<_>>()\n            .join(\",\");\n\n        return Some(format!(\"[default: {values}]\"));\n    }\n\n    None\n}\n\nfn get_possible_values(arg: &Arg) -> Option<Vec<Roff>> {\n    if arg.is_hide_possible_values_set() {\n        return None;\n    }\n\n    let possibles = &arg.get_possible_values();\n    let possibles: Vec<&clap::builder::PossibleValue> =\n        possibles.iter().filter(|pos| !pos.is_hide_set()).collect();\n\n    if !possibles.is_empty() {\n        return Some(format_possible_values(&possibles));\n    }\n    None\n}\n\nfn format_possible_values(possibles: &Vec<&clap::builder::PossibleValue>) -> Vec<Roff> {\n    let mut lines = vec![];\n    for value in possibles {\n        let mut roff = Roff::default();\n        let val_name = value.get_name();\n        match value.get_help() {\n            Some(help) => {\n                roff.text([roman(format!(\"{val_name}: {help}\"))]);\n            }\n            None => {\n                roff.text([roman(val_name.to_owned())]);\n            }\n        }\n        lines.push(roff);\n    }\n    lines\n}\n\nfn subcommand_sort_key(command: &clap::Command) -> (usize, &str) {\n    (command.get_display_order(), command.get_name())\n}\n\n/// Note that this function is duplicated from `clap::builder`\nfn option_sort_key(arg: &Arg) -> (usize, String) {\n    let key = if let Some(x) = arg.get_short() {\n        let mut s = x.to_ascii_lowercase().to_string();\n        s.push(if x.is_ascii_lowercase() { '0' } else { '1' });\n        s\n    } else if let Some(x) = arg.get_long() {\n        x.to_string()\n    } else {\n        let mut s = '{'.to_string();\n        s.push_str(arg.get_id().as_str());\n        s\n    };\n    (arg.get_display_order(), key)\n}\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/aliases.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app 3.0\" \n.SH NAME\nmy\\-app \\- testing bash completions\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-f\\fR|\\fB\\-\\-flag\\fR] [\\fB\\-o\\fR|\\fB\\-\\-option\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fB\\-V\\fR|\\fB\\-\\-version\\fR] [\\fIpositional\\fR] \n.SH DESCRIPTION\ntesting bash completions\n.SH OPTIONS\n.TP\n\\fB\\-f\\fR, \\fB\\-\\-flag\\fR\ncmd flag\n.TP\n\\fB\\-o\\fR, \\fB\\-\\-option\\fR\ncmd option\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.TP\n\\fB\\-V\\fR, \\fB\\-\\-version\\fR\nPrint version\n.TP\n[\\fIpositional\\fR]\n\n.SH VERSION\nv3.0\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/basic.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-c \\fR] [\\fB\\-v \\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fIsubcommands\\fR]\n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-c\\fR\n\n.TP\n\\fB\\-v\\fR\n\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.SH SUBCOMMANDS\n.TP\nmy\\-app\\-test(1)\nSubcommand\nwith a second line\n.TP\nmy\\-app\\-help(1)\nPrint this message or the help of the given subcommand(s)\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/configured_display_order_args.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-O\\fR|\\fB\\-\\-first\\fR] [\\fB\\-P\\fR|\\fB\\-\\-second\\fR] [\\fB\\-Q\\fR|\\fB\\-\\-third\\fR] [\\fB\\-\\-fourth\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fI1st\\fR] [\\fI2nd\\fR] [\\fI3rd\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-O\\fR, \\fB\\-\\-first\\fR\nShould be 1st\n.TP\n\\fB\\-P\\fR, \\fB\\-\\-second\\fR\nShould be 2nd\n.TP\n\\fB\\-Q\\fR, \\fB\\-\\-third\\fR\nShould be 3rd\n.TP\n\\fB\\-\\-fourth\\fR\nShould be 4th\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.TP\n[\\fI1st\\fR]\n1st\n.TP\n[\\fI2nd\\fR]\n2nd\n.TP\n[\\fI3rd\\fR]\n3rd\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/configured_subcmd_order.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app 1\" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fB\\-V\\fR|\\fB\\-\\-version\\fR] [\\fIsubcommands\\fR]\n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.TP\n\\fB\\-V\\fR, \\fB\\-\\-version\\fR\nPrint version\n.SH SUBCOMMANDS\n.TP\nmy\\-app\\-a1(1)\nblah a1\n.TP\nmy\\-app\\-b1(1)\nblah b1\n.TP\nmy\\-app\\-help(1)\nPrint this message or the help of the given subcommand(s)\n.SH VERSION\nv1\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/default_subcmd_order.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app 1\" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fB\\-V\\fR|\\fB\\-\\-version\\fR] [\\fIsubcommands\\fR]\n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.TP\n\\fB\\-V\\fR, \\fB\\-\\-version\\fR\nPrint version\n.SH SUBCOMMANDS\n.TP\nmy\\-app\\-b1(1)\nblah b1\n.TP\nmy\\-app\\-a1(1)\nblah a1\n.TP\nmy\\-app\\-help(1)\nPrint this message or the help of the given subcommand(s)\n.SH VERSION\nv1\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/feature_sample.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app 3.0\" \n.SH NAME\nmy\\-app \\- Tests completions\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-c\\fR|\\fB\\-\\-config\\fR]... [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fB\\-V\\fR|\\fB\\-\\-version\\fR] [\\fIfile\\fR] [\\fIchoice\\fR] [\\fIsubcommands\\fR]\n.SH DESCRIPTION\nTests completions\n.SH OPTIONS\n.TP\n\\fB\\-c\\fR, \\fB\\-\\-config\\fR\nsome config file\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.TP\n\\fB\\-V\\fR, \\fB\\-\\-version\\fR\nPrint version\n.TP\n[\\fIfile\\fR]\nsome input file\n.TP\n[\\fIchoice\\fR]\n\n.br\n\\fIPossible values:\\fR\n.RS 14\n.IP \\(bu 2\nfirst\n.IP \\(bu 2\nsecond\n.RE\n.SH SUBCOMMANDS\n.TP\nmy\\-app\\-test(1)\ntests things\n.TP\nmy\\-app\\-help(1)\nPrint this message or the help of the given subcommand(s)\n.SH VERSION\nv3.0\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/help_headings.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-r\\fR|\\fB\\-\\-recursive\\fR] [\\fB\\-f\\fR|\\fB\\-\\-force\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fIcolor\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-r\\fR, \\fB\\-\\-recursive\\fR\n\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.SH \"CONFLICT OPTIONS\"\n.TP\n\\fB\\-f\\fR, \\fB\\-\\-force\\fR\n\n.SH \"GLOBAL OPTIONS\"\n.TP\n[\\fIcolor\\fR]\n\n.br\n\\fIPossible values:\\fR\n.RS 14\n.IP \\(bu 2\nalways\n.IP \\(bu 2\nnever\n.IP \\(bu 2\nauto\n.RE\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/hidden_option.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-config\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-config\\fR\n\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/multiple_optional_values.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-config\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-config\\fR [\\fI<FILE1>\\fR\\fI \\fR\\fI<FILE2>\\fR]\nOptional config file\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/optional_value.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-config\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-config\\fR [\\fI<FILE>\\fR]\nOptional config file\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/optional_with_required_equals_value.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-config\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-config\\fR[=\\fI<FILE>\\fR]\nOptional config file\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/possible_values.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-choice\\fR] [\\fB\\-\\-method\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fIpositional_choice\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-choice\\fR\n\n.br\n\\fIPossible values:\\fR\n.RS 14\n.IP \\(bu 2\nbash\n.IP \\(bu 2\nfish\n.IP \\(bu 2\nzsh\n.RE\n.TP\n\\fB\\-\\-method\\fR\n\n.br\n\\fIPossible values:\\fR\n.RS 14\n.IP \\(bu 2\nfast: use the Fast method\n.IP \\(bu 2\nslow: use the slow method\n.RE\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help (see a summary with \\*(Aq\\-h\\*(Aq)\n.TP\n[\\fIpositional_choice\\fR]\nPick the Position you want the command to run in\n.br\n\n.br\n\\fIPossible values:\\fR\n.RS 14\n.IP \\(bu 2\nleft: run left adjusted\n.IP \\(bu 2\nright\n.RE\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/quoting.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app 3.0\" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-single\\-quotes\\fR] [\\fB\\-\\-double\\-quotes\\fR] [\\fB\\-\\-backticks\\fR] [\\fB\\-\\-backslash\\fR] [\\fB\\-\\-brackets\\fR] [\\fB\\-\\-expansions\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fB\\-V\\fR|\\fB\\-\\-version\\fR] [\\fIsubcommands\\fR]\n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-single\\-quotes\\fR\nCan be \\*(Aqalways\\*(Aq, \\*(Aqauto\\*(Aq, or \\*(Aqnever\\*(Aq\n.TP\n\\fB\\-\\-double\\-quotes\\fR\nCan be \"always\", \"auto\", or \"never\"\n.TP\n\\fB\\-\\-backticks\\fR\nFor more information see `echo test`\n.TP\n\\fB\\-\\-backslash\\fR\nAvoid \\*(Aq\\\\n\\*(Aq\n.TP\n\\fB\\-\\-brackets\\fR\nList packages [filter]\n.TP\n\\fB\\-\\-expansions\\fR\nExecute the shell command with $SHELL\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.TP\n\\fB\\-V\\fR, \\fB\\-\\-version\\fR\nPrint version\n.SH SUBCOMMANDS\n.TP\nmy\\-app\\-cmd\\-single\\-quotes(1)\nCan be \\*(Aqalways\\*(Aq, \\*(Aqauto\\*(Aq, or \\*(Aqnever\\*(Aq\n.TP\nmy\\-app\\-cmd\\-double\\-quotes(1)\nCan be \"always\", \"auto\", or \"never\"\n.TP\nmy\\-app\\-cmd\\-backticks(1)\nFor more information see `echo test`\n.TP\nmy\\-app\\-cmd\\-backslash(1)\nAvoid \\*(Aq\\\\n\\*(Aq\n.TP\nmy\\-app\\-cmd\\-brackets(1)\nList packages [filter]\n.TP\nmy\\-app\\-cmd\\-expansions(1)\nExecute the shell command with $SHELL\n.TP\nmy\\-app\\-help(1)\nPrint this message or the help of the given subcommand(s)\n.SH VERSION\nv3.0\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/special_commands.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app 3.0\" \n.SH NAME\nmy\\-app \\- Tests completions\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-c\\fR|\\fB\\-\\-config\\fR]... [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fB\\-V\\fR|\\fB\\-\\-version\\fR] [\\fIfile\\fR] [\\fIchoice\\fR] [\\fIsubcommands\\fR]\n.SH DESCRIPTION\nTests completions\n.SH OPTIONS\n.TP\n\\fB\\-c\\fR, \\fB\\-\\-config\\fR\nsome config file\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.TP\n\\fB\\-V\\fR, \\fB\\-\\-version\\fR\nPrint version\n.TP\n[\\fIfile\\fR]\nsome input file\n.TP\n[\\fIchoice\\fR]\n\n.br\n\\fIPossible values:\\fR\n.RS 14\n.IP \\(bu 2\nfirst\n.IP \\(bu 2\nsecond\n.RE\n.SH SUBCOMMANDS\n.TP\nmy\\-app\\-test(1)\ntests things\n.TP\nmy\\-app\\-some_cmd(1)\ntests other things\n.TP\nmy\\-app\\-some\\-cmd\\-with\\-hyphens(1)\n.TP\nmy\\-app\\-help(1)\nPrint this message or the help of the given subcommand(s)\n.SH VERSION\nv3.0\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/sub_subcommand_help.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app-help 1  \"help \" \n.SH NAME\nmy\\-app\\-help \\- Print this message or the help of the given subcommand(s)\n.SH SYNOPSIS\n\\fBmy\\-app help\\fR [\\fIsubcommands\\fR]\n.SH DESCRIPTION\nPrint this message or the help of the given subcommand(s)\n.SH SUBCOMMANDS\n.TP\nmy\\-app\\-help\\-test(1)\ntests things\n.TP\nmy\\-app\\-help\\-some_cmd(1)\ntop level subcommand\n.TP\nmy\\-app\\-help\\-help(1)\nPrint this message or the help of the given subcommand(s)\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/sub_subcommands.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app 3.0\" \n.SH NAME\nmy\\-app \\- Tests completions\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-c\\fR|\\fB\\-\\-config\\fR]... [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fB\\-V\\fR|\\fB\\-\\-version\\fR] [\\fIfile\\fR] [\\fIchoice\\fR] [\\fIsubcommands\\fR]\n.SH DESCRIPTION\nTests completions\n.SH OPTIONS\n.TP\n\\fB\\-c\\fR, \\fB\\-\\-config\\fR\nsome config file\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.TP\n\\fB\\-V\\fR, \\fB\\-\\-version\\fR\nPrint version\n.TP\n[\\fIfile\\fR]\nsome input file\n.TP\n[\\fIchoice\\fR]\n\n.br\n\\fIPossible values:\\fR\n.RS 14\n.IP \\(bu 2\nfirst\n.IP \\(bu 2\nsecond\n.RE\n.SH SUBCOMMANDS\n.TP\nmy\\-app\\-test(1)\ntests things\n.TP\nmy\\-app\\-some_cmd(1)\ntop level subcommand\n.TP\nmy\\-app\\-help(1)\nPrint this message or the help of the given subcommand(s)\n.SH VERSION\nv3.0\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/value_env.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-c \\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-c\\fR [default: config.toml]\nSet configuration file path\n.RS\nMay also be specified with the \\fBCONFIG_FILE\\fR environment variable. \n.RE\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help (see a summary with \\*(Aq\\-h\\*(Aq)\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/value_hint.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-choice\\fR] [\\fB\\-\\-unknown\\fR] [\\fB\\-\\-other\\fR] [\\fB\\-p\\fR|\\fB\\-\\-path\\fR] [\\fB\\-f\\fR|\\fB\\-\\-file\\fR] [\\fB\\-d\\fR|\\fB\\-\\-dir\\fR] [\\fB\\-e\\fR|\\fB\\-\\-exe\\fR] [\\fB\\-\\-cmd\\-name\\fR] [\\fB\\-c\\fR|\\fB\\-\\-cmd\\fR] [\\fB\\-u\\fR|\\fB\\-\\-user\\fR] [\\fB\\-H\\fR|\\fB\\-\\-host\\fR] [\\fB\\-\\-url\\fR] [\\fB\\-\\-email\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] [\\fIcommand_with_args\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-choice\\fR\n\n.br\n\\fIPossible values:\\fR\n.RS 14\n.IP \\(bu 2\nbash\n.IP \\(bu 2\nfish\n.IP \\(bu 2\nzsh\n.RE\n.TP\n\\fB\\-\\-unknown\\fR\n\n.TP\n\\fB\\-\\-other\\fR\n\n.TP\n\\fB\\-p\\fR, \\fB\\-\\-path\\fR\n\n.TP\n\\fB\\-f\\fR, \\fB\\-\\-file\\fR\n\n.TP\n\\fB\\-d\\fR, \\fB\\-\\-dir\\fR\n\n.TP\n\\fB\\-e\\fR, \\fB\\-\\-exe\\fR\n\n.TP\n\\fB\\-\\-cmd\\-name\\fR\n\n.TP\n\\fB\\-c\\fR, \\fB\\-\\-cmd\\fR\n\n.TP\n\\fB\\-u\\fR, \\fB\\-\\-user\\fR\n\n.TP\n\\fB\\-H\\fR, \\fB\\-\\-host\\fR\n\n.TP\n\\fB\\-\\-url\\fR\n\n.TP\n\\fB\\-\\-email\\fR\n\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n.TP\n[\\fIcommand_with_args\\fR]\n\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/value_name_without_arg.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-flag\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-flag\\fR\n\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/value_with_required_equals.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-config\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-config\\fR=\\fI<FILE>\\fR\nOptional config file\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n"
  },
  {
    "path": "clap_mangen/tests/snapshots/variadic_values.bash.roff",
    "content": ".ie \\n(.g .ds Aq \\(aq\n.el .ds Aq '\n.TH my-app 1  \"my-app \" \n.SH NAME\nmy\\-app\n.SH SYNOPSIS\n\\fBmy\\-app\\fR [\\fB\\-\\-config\\fR] [\\fB\\-h\\fR|\\fB\\-\\-help\\fR] \n.SH DESCRIPTION\n.SH OPTIONS\n.TP\n\\fB\\-\\-config\\fR \\fI<FILE1>\\fR\\fI \\fR\\fI<FILE2>...\\fR\nOptional config file\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nPrint help\n"
  },
  {
    "path": "clap_mangen/tests/testsuite/common.rs",
    "content": "use clap::builder::PossibleValue;\nuse snapbox::prelude::*;\n\npub(crate) fn basic_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(\n            clap::Arg::new(\"config\")\n                .short('c')\n                .global(true)\n                .action(clap::ArgAction::SetTrue),\n        )\n        .arg(\n            clap::Arg::new(\"v\")\n                .short('v')\n                .conflicts_with(\"config\")\n                .action(clap::ArgAction::SetTrue),\n        )\n        .subcommand(\n            clap::Command::new(\"test\")\n                .about(\"Subcommand\\nwith a second line\")\n                .arg(\n                    clap::Arg::new(\"debug\")\n                        .short('d')\n                        .action(clap::ArgAction::Count),\n                ),\n        )\n}\n\npub(crate) fn feature_sample_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .version(\"3.0\")\n        .propagate_version(true)\n        .about(\"Tests completions\")\n        .arg(\n            clap::Arg::new(\"file\")\n                .value_hint(clap::ValueHint::FilePath)\n                .help(\"some input file\"),\n        )\n        .arg(\n            clap::Arg::new(\"config\")\n                .action(clap::ArgAction::Count)\n                .help(\"some config file\")\n                .short('c')\n                .visible_short_alias('C')\n                .long(\"config\")\n                .visible_alias(\"conf\"),\n        )\n        .arg(clap::Arg::new(\"choice\").value_parser([\"first\", \"second\"]))\n        .subcommand(\n            clap::Command::new(\"test\").about(\"tests things\").arg(\n                clap::Arg::new(\"case\")\n                    .long(\"case\")\n                    .action(clap::ArgAction::Set)\n                    .help(\"the case to test\"),\n            ),\n        )\n}\n\npub(crate) fn special_commands_command(name: &'static str) -> clap::Command {\n    feature_sample_command(name)\n        .subcommand(\n            clap::Command::new(\"some_cmd\")\n                .about(\"tests other things\")\n                .arg(\n                    clap::Arg::new(\"config\")\n                        .long(\"config\")\n                        .action(clap::ArgAction::Set)\n                        .help(\"the other case to test\"),\n                ),\n        )\n        .subcommand(clap::Command::new(\"some-cmd-with-hyphens\").alias(\"hyphen\"))\n}\n\npub(crate) fn quoting_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .version(\"3.0\")\n        .arg(\n            clap::Arg::new(\"single-quotes\")\n                .long(\"single-quotes\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"Can be 'always', 'auto', or 'never'\"),\n        )\n        .arg(\n            clap::Arg::new(\"double-quotes\")\n                .long(\"double-quotes\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n        )\n        .arg(\n            clap::Arg::new(\"backticks\")\n                .long(\"backticks\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"For more information see `echo test`\"),\n        )\n        .arg(\n            clap::Arg::new(\"backslash\")\n                .long(\"backslash\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"Avoid '\\\\n'\"),\n        )\n        .arg(\n            clap::Arg::new(\"brackets\")\n                .long(\"brackets\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"List packages [filter]\"),\n        )\n        .arg(\n            clap::Arg::new(\"expansions\")\n                .long(\"expansions\")\n                .action(clap::ArgAction::SetTrue)\n                .help(\"Execute the shell command with $SHELL\"),\n        )\n        .subcommands([\n            clap::Command::new(\"cmd-single-quotes\").about(\"Can be 'always', 'auto', or 'never'\"),\n            clap::Command::new(\"cmd-double-quotes\")\n                .about(\"Can be \\\"always\\\", \\\"auto\\\", or \\\"never\\\"\"),\n            clap::Command::new(\"cmd-backticks\").about(\"For more information see `echo test`\"),\n            clap::Command::new(\"cmd-backslash\").about(\"Avoid '\\\\n'\"),\n            clap::Command::new(\"cmd-brackets\").about(\"List packages [filter]\"),\n            clap::Command::new(\"cmd-expansions\").about(\"Execute the shell command with $SHELL\"),\n        ])\n}\n\npub(crate) fn aliases_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .version(\"3.0\")\n        .about(\"testing bash completions\")\n        .arg(\n            clap::Arg::new(\"flag\")\n                .short('f')\n                .visible_short_alias('F')\n                .long(\"flag\")\n                .action(clap::ArgAction::SetTrue)\n                .visible_alias(\"flg\")\n                .help(\"cmd flag\"),\n        )\n        .arg(\n            clap::Arg::new(\"option\")\n                .short('o')\n                .visible_short_alias('O')\n                .long(\"option\")\n                .visible_alias(\"opt\")\n                .help(\"cmd option\")\n                .action(clap::ArgAction::Set),\n        )\n        .arg(clap::Arg::new(\"positional\"))\n}\n\npub(crate) fn sub_subcommands_command(name: &'static str) -> clap::Command {\n    feature_sample_command(name).subcommand(\n        clap::Command::new(\"some_cmd\")\n            .about(\"top level subcommand\")\n            .subcommand(\n                clap::Command::new(\"sub_cmd\").about(\"sub-subcommand\").arg(\n                    clap::Arg::new(\"config\")\n                        .long(\"config\")\n                        .action(clap::ArgAction::Set)\n                        .value_parser([PossibleValue::new(\"Lest quotes aren't escaped.\")])\n                        .help(\"the other case to test\"),\n                ),\n            ),\n    )\n}\n\npub(crate) fn value_hint_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(\n            clap::Arg::new(\"choice\")\n                .long(\"choice\")\n                .action(clap::ArgAction::Set)\n                .value_parser([\"bash\", \"fish\", \"zsh\"]),\n        )\n        .arg(\n            clap::Arg::new(\"unknown\")\n                .long(\"unknown\")\n                .value_hint(clap::ValueHint::Unknown),\n        )\n        .arg(\n            clap::Arg::new(\"other\")\n                .long(\"other\")\n                .value_hint(clap::ValueHint::Other),\n        )\n        .arg(\n            clap::Arg::new(\"path\")\n                .long(\"path\")\n                .short('p')\n                .value_hint(clap::ValueHint::AnyPath),\n        )\n        .arg(\n            clap::Arg::new(\"file\")\n                .long(\"file\")\n                .short('f')\n                .value_hint(clap::ValueHint::FilePath),\n        )\n        .arg(\n            clap::Arg::new(\"dir\")\n                .long(\"dir\")\n                .short('d')\n                .value_hint(clap::ValueHint::DirPath),\n        )\n        .arg(\n            clap::Arg::new(\"exe\")\n                .long(\"exe\")\n                .short('e')\n                .value_hint(clap::ValueHint::ExecutablePath),\n        )\n        .arg(\n            clap::Arg::new(\"cmd_name\")\n                .long(\"cmd-name\")\n                .value_hint(clap::ValueHint::CommandName),\n        )\n        .arg(\n            clap::Arg::new(\"cmd\")\n                .long(\"cmd\")\n                .short('c')\n                .value_hint(clap::ValueHint::CommandString),\n        )\n        .arg(\n            clap::Arg::new(\"command_with_args\")\n                .action(clap::ArgAction::Set)\n                .num_args(1..)\n                .trailing_var_arg(true)\n                .value_hint(clap::ValueHint::CommandWithArguments),\n        )\n        .arg(\n            clap::Arg::new(\"user\")\n                .short('u')\n                .long(\"user\")\n                .value_hint(clap::ValueHint::Username),\n        )\n        .arg(\n            clap::Arg::new(\"host\")\n                .short('H')\n                .long(\"host\")\n                .value_hint(clap::ValueHint::Hostname),\n        )\n        .arg(\n            clap::Arg::new(\"url\")\n                .long(\"url\")\n                .value_hint(clap::ValueHint::Url),\n        )\n        .arg(\n            clap::Arg::new(\"email\")\n                .long(\"email\")\n                .value_hint(clap::ValueHint::EmailAddress),\n        )\n}\n\npub(crate) fn hidden_option_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(\n            clap::Arg::new(\"config\")\n                .long(\"config\")\n                .action(clap::ArgAction::Set),\n        )\n        .arg(\n            clap::Arg::new(\"no-config\")\n                .long(\"no-config\")\n                .hide(true)\n                .overrides_with(\"config\"),\n        )\n}\n\npub(crate) fn env_value_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"config\")\n            .short('c')\n            .long_help(\"Set configuration file path\")\n            .required(false)\n            .action(clap::ArgAction::Set)\n            .default_value(\"config.toml\")\n            .env(\"CONFIG_FILE\"),\n    )\n}\n\npub(crate) fn assert_matches(expected: impl IntoData, cmd: clap::Command) {\n    let mut buf = vec![];\n    clap_mangen::Man::new(cmd).render(&mut buf).unwrap();\n\n    snapbox::Assert::new()\n        .action_env(snapbox::assert::DEFAULT_ACTION_ENV)\n        .normalize_paths(false)\n        .eq(buf, expected);\n}\n\npub(crate) fn possible_values_command(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(\n            clap::Arg::new(\"choice\")\n                .long(\"choice\")\n                .action(clap::ArgAction::Set)\n                .value_parser([\"bash\", \"fish\", \"zsh\"]),\n        )\n        .arg(\n            clap::Arg::new(\"method\")\n                .long(\"method\")\n                .action(clap::ArgAction::Set)\n                .value_parser([\n                    PossibleValue::new(\"fast\").help(\"use the Fast method\"),\n                    PossibleValue::new(\"slow\").help(\"use the slow method\"),\n                    PossibleValue::new(\"normal\")\n                        .help(\"use normal mode\")\n                        .hide(true),\n                ]),\n        )\n        .arg(\n            clap::Arg::new(\"positional_choice\")\n                .action(clap::ArgAction::Set)\n                .help(\"Pick the Position you want the command to run in\")\n                .value_parser([\n                    PossibleValue::new(\"left\").help(\"run left adjusted\"),\n                    PossibleValue::new(\"right\"),\n                    PossibleValue::new(\"center\").hide(true),\n                ]),\n        )\n}\n\npub(crate) fn value_name_without_arg(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"flag\")\n            .long(\"flag\")\n            .value_name(\"SPURIOUS\")\n            .action(clap::ArgAction::SetTrue),\n    )\n}\n\npub(crate) fn configured_display_order_args(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(clap::Arg::new(\"1st\").help(\"1st\"))\n        .arg(clap::Arg::new(\"2nd\").help(\"2nd\"))\n        .arg(clap::Arg::new(\"3rd\").help(\"3rd\").last(true))\n        .arg(\n            clap::Arg::new(\"c\")\n                .long(\"third\")\n                .short('Q')\n                .display_order(3)\n                .help(\"Should be 3rd\"),\n        )\n        .arg(\n            clap::Arg::new(\"d\")\n                .long(\"fourth\")\n                .display_order(4)\n                .help(\"Should be 4th\"),\n        )\n        .arg(\n            clap::Arg::new(\"a\")\n                .long(\"first\")\n                .short('O')\n                .display_order(1)\n                .help(\"Should be 1st\"),\n        )\n        .arg(\n            clap::Arg::new(\"b\")\n                .long(\"second\")\n                .short('P')\n                .display_order(2)\n                .help(\"Should be 2nd\"),\n        )\n}\n\npub(crate) fn help_headings(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .arg(\n            clap::Arg::new(\"recursive\")\n                .long(\"recursive\")\n                .short('r')\n                .action(clap::ArgAction::SetTrue),\n        )\n        .next_help_heading(\"Conflict Options\")\n        .arg(\n            clap::Arg::new(\"force\")\n                .long(\"force\")\n                .short('f')\n                .action(clap::ArgAction::SetTrue),\n        )\n        .next_help_heading(\"Hidden Options\")\n        .arg(\n            clap::Arg::new(\"debug\")\n                .long(\"debug\")\n                .short('d')\n                .hide(true)\n                .action(clap::ArgAction::SetTrue),\n        )\n        .next_help_heading(\"Global Options\")\n        .arg(\n            clap::Arg::new(\"color\")\n                .global(true)\n                .value_parser([\"always\", \"never\", \"auto\"]),\n        )\n}\n\npub(crate) fn value_with_required_equals(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"config\")\n            .long(\"config\")\n            .value_name(\"FILE\")\n            .require_equals(true)\n            .help(\"Optional config file\"),\n    )\n}\n\npub(crate) fn optional_value_with_required_equals(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"config\")\n            .long(\"config\")\n            .value_name(\"FILE\")\n            .require_equals(true)\n            .num_args(0..=1)\n            .help(\"Optional config file\"),\n    )\n}\n\npub(crate) fn optional_value(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"config\")\n            .long(\"config\")\n            .value_name(\"FILE\")\n            .num_args(0..=1)\n            .help(\"Optional config file\"),\n    )\n}\n\npub(crate) fn multiple_optional_values(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"config\")\n            .long(\"config\")\n            .value_names([\"FILE1\", \"FILE2\"])\n            .num_args(0..=2)\n            .help(\"Optional config file\"),\n    )\n}\n\npub(crate) fn variadic_values(name: &'static str) -> clap::Command {\n    clap::Command::new(name).arg(\n        clap::Arg::new(\"config\")\n            .long(\"config\")\n            .value_names([\"FILE1\", \"FILE2\"])\n            .require_equals(false)\n            .num_args(3)\n            .help(\"Optional config file\"),\n    )\n}\n\npub(crate) fn configured_subcmd_order(name: &'static str) -> clap::Command {\n    clap::Command::new(name)\n        .version(\"1\")\n        .next_display_order(None)\n        .subcommands(vec![\n            clap::Command::new(\"b1\").about(\"blah b1\").arg(\n                clap::Arg::new(\"test\")\n                    .short('t')\n                    .action(clap::ArgAction::SetTrue),\n            ),\n            clap::Command::new(\"a1\").about(\"blah a1\").arg(\n                clap::Arg::new(\"roster\")\n                    .short('r')\n                    .action(clap::ArgAction::SetTrue),\n            ),\n        ])\n}\n\npub(crate) fn default_subcmd_order(name: &'static str) -> clap::Command {\n    clap::Command::new(name).version(\"1\").subcommands(vec![\n        clap::Command::new(\"b1\").about(\"blah b1\").arg(\n            clap::Arg::new(\"test\")\n                .short('t')\n                .action(clap::ArgAction::SetTrue),\n        ),\n        clap::Command::new(\"a1\").about(\"blah a1\").arg(\n            clap::Arg::new(\"roster\")\n                .short('r')\n                .action(clap::ArgAction::SetTrue),\n        ),\n    ])\n}\n"
  },
  {
    "path": "clap_mangen/tests/testsuite/main.rs",
    "content": "automod::dir!(\"tests/testsuite\");\n"
  },
  {
    "path": "clap_mangen/tests/testsuite/roff.rs",
    "content": "use crate::common;\n\n#[test]\nfn basic() {\n    let name = \"my-app\";\n    let cmd = common::basic_command(name);\n    common::assert_matches(snapbox::file![\"../snapshots/basic.bash.roff\"], cmd);\n}\n\n#[test]\nfn feature_sample() {\n    let name = \"my-app\";\n    let cmd = common::feature_sample_command(name);\n    common::assert_matches(snapbox::file![\"../snapshots/feature_sample.bash.roff\"], cmd);\n}\n\n#[test]\nfn special_commands() {\n    let name = \"my-app\";\n    let cmd = common::special_commands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/special_commands.bash.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn quoting() {\n    let name = \"my-app\";\n    let cmd = common::quoting_command(name);\n    common::assert_matches(snapbox::file![\"../snapshots/quoting.bash.roff\"], cmd);\n}\n\n#[test]\nfn aliases() {\n    let name = \"my-app\";\n    let cmd = common::aliases_command(name);\n    common::assert_matches(snapbox::file![\"../snapshots/aliases.bash.roff\"], cmd);\n}\n\n#[test]\nfn sub_subcommands() {\n    let name = \"my-app\";\n    let cmd = common::sub_subcommands_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/sub_subcommands.bash.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn value_hint() {\n    let name = \"my-app\";\n    let cmd = common::value_hint_command(name);\n    common::assert_matches(snapbox::file![\"../snapshots/value_hint.bash.roff\"], cmd);\n}\n\n#[test]\nfn hidden_options() {\n    let name = \"my-app\";\n    let cmd = common::hidden_option_command(name);\n    common::assert_matches(snapbox::file![\"../snapshots/hidden_option.bash.roff\"], cmd);\n}\n\n#[test]\nfn value_env() {\n    let name = \"my-app\";\n    let cmd = common::env_value_command(name);\n    common::assert_matches(snapbox::file![\"../snapshots/value_env.bash.roff\"], cmd);\n}\n\n#[test]\nfn possible_values() {\n    let name = \"my-app\";\n    let cmd = common::possible_values_command(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/possible_values.bash.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn sub_subcommands_help() {\n    let name = \"my-app\";\n    let mut cmd = common::sub_subcommands_command(name);\n    cmd.build();\n    let cmd = cmd\n        .get_subcommands()\n        .find(|cmd| cmd.get_display_name() == Some(\"my-app-help\"));\n    assert!(cmd.is_some(), \"help subcommand not found in command\");\n    if let Some(cmd) = cmd {\n        common::assert_matches(\n            snapbox::file![\"../snapshots/sub_subcommand_help.roff\"],\n            cmd.clone(),\n        );\n    }\n}\n\n#[test]\nfn help_headings() {\n    let name = \"my-app\";\n    let cmd = common::help_headings(name);\n    common::assert_matches(snapbox::file![\"../snapshots/help_headings.bash.roff\"], cmd);\n}\n\n#[test]\nfn value_name_without_arg() {\n    let name = \"my-app\";\n    let cmd = common::value_name_without_arg(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_name_without_arg.bash.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn value_with_required_equals() {\n    let name = \"my-app\";\n    let cmd = common::value_with_required_equals(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/value_with_required_equals.bash.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn optional_value_with_required_equals() {\n    let name = \"my-app\";\n    let cmd = common::optional_value_with_required_equals(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/optional_with_required_equals_value.bash.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn optional_value() {\n    let name = \"my-app\";\n    let cmd = common::optional_value(name);\n    common::assert_matches(snapbox::file![\"../snapshots/optional_value.bash.roff\"], cmd);\n}\n\n#[test]\nfn multiple_optional_values() {\n    let name = \"my-app\";\n    let cmd = common::multiple_optional_values(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/multiple_optional_values.bash.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn variadic_values() {\n    let name = \"my-app\";\n    let cmd = common::variadic_values(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/variadic_values.bash.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn configured_display_order_args() {\n    let name = \"my-app\";\n    let cmd = common::configured_display_order_args(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/configured_display_order_args.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn configured_subcmd_order() {\n    let name = \"my-app\";\n    let cmd = common::configured_subcmd_order(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/configured_subcmd_order.roff\"],\n        cmd,\n    );\n}\n\n#[test]\nfn default_subcmd_order() {\n    let name = \"my-app\";\n    let cmd = common::default_subcmd_order(name);\n    common::assert_matches(\n        snapbox::file![\"../snapshots/default_subcmd_order.roff\"],\n        cmd,\n    );\n}\n"
  },
  {
    "path": "committed.toml",
    "content": "style=\"conventional\"\nignore_author_re=\"(dependabot|renovate)\"\nmerge_commit = false\n"
  },
  {
    "path": "deny.toml",
    "content": "# Note that all fields that take a lint level have these possible values:\n# * deny - An error will be produced and the check will fail\n# * warn - A warning will be produced, but the check will not fail\n# * allow - No warning or error will be produced, though in some cases a note\n# will be\n\n# Root options\n\n# The graph table configures how the dependency graph is constructed and thus\n# which crates the checks are performed against\n[graph]\n# If 1 or more target triples (and optionally, target_features) are specified,\n# only the specified targets will be checked when running `cargo deny check`.\n# This means, if a particular package is only ever used as a target specific\n# dependency, such as, for example, the `nix` crate only being used via the\n# `target_family = \"unix\"` configuration, that only having windows targets in\n# this list would mean the nix crate, as well as any of its exclusive\n# dependencies not shared by any other crates, would be ignored, as the target\n# list here is effectively saying which targets you are building for.\ntargets = [\n    # The triple can be any string, but only the target triples built in to\n    # rustc (as of 1.40) can be checked against actual config expressions\n    #\"x86_64-unknown-linux-musl\",\n    # You can also specify which target_features you promise are enabled for a\n    # particular target. target_features are currently not validated against\n    # the actual valid features supported by the target architecture.\n    #{ triple = \"wasm32-unknown-unknown\", features = [\"atomics\"] },\n]\n# When creating the dependency graph used as the source of truth when checks are\n# executed, this field can be used to prune crates from the graph, removing them\n# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate\n# is pruned from the graph, all of its dependencies will also be pruned unless\n# they are connected to another crate in the graph that hasn't been pruned,\n# so it should be used with care. The identifiers are [Package ID Specifications]\n# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html)\n#exclude = []\n# If true, metadata will be collected with `--all-features`. Note that this can't\n# be toggled off if true, if you want to conditionally enable `--all-features` it\n# is recommended to pass `--all-features` on the cmd line instead\nall-features = false\n# If true, metadata will be collected with `--no-default-features`. The same\n# caveat with `all-features` applies\nno-default-features = false\n# If set, these feature will be enabled when collecting metadata. If `--features`\n# is specified on the cmd line they will take precedence over this option.\n#features = []\n\n# The output table provides options for how/if diagnostics are outputted\n[output]\n# When outputting inclusion graphs in diagnostics that include features, this\n# option can be used to specify the depth at which feature edges will be added.\n# This option is included since the graphs can be quite large and the addition\n# of features from the crate(s) to all of the graph roots can be far too verbose.\n# This option can be overridden via `--feature-depth` on the cmd line\nfeature-depth = 1\n\n# This section is considered when running `cargo deny check advisories`\n# More documentation for the advisories section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html\n[advisories]\n# The path where the advisory databases are cloned/fetched into\n#db-path = \"$CARGO_HOME/advisory-dbs\"\n# The url(s) of the advisory databases to use\n#db-urls = [\"https://github.com/rustsec/advisory-db\"]\n# A list of advisory IDs to ignore. Note that ignored advisories will still\n# output a note when they are encountered.\nignore = [\n    #\"RUSTSEC-0000-0000\",\n    #{ id = \"RUSTSEC-0000-0000\", reason = \"you can specify a reason the advisory is ignored\" },\n    #\"a-crate-that-is-yanked@0.1.1\", # you can also ignore yanked crate versions if you wish\n    #{ crate = \"a-crate-that-is-yanked@0.1.1\", reason = \"you can specify why you are ignoring the yanked crate\" },\n]\n# If this is true, then cargo deny will use the git executable to fetch advisory database.\n# If this is false, then it uses a built-in git library.\n# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support.\n# See Git Authentication for more information about setting up git authentication.\n#git-fetch-with-cli = true\n\n# This section is considered when running `cargo deny check licenses`\n# More documentation for the licenses section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html\n[licenses]\n# List of explicitly allowed licenses\n# See https://spdx.org/licenses/ for list of possible licenses\n# [possible values: any SPDX 3.11 short identifier (+ optional exception)].\nallow = [\n    \"MIT\",\n    \"MIT-0\",\n    \"Apache-2.0\",\n    \"BSD-2-Clause\",\n    \"BSD-3-Clause\",\n    \"MPL-2.0\",\n    \"Unicode-DFS-2016\",\n    \"Unicode-3.0\",\n    \"CC0-1.0\",\n    \"ISC\",\n    \"OpenSSL\",\n    \"Zlib\",\n    \"NCSA\",\n]\n# The confidence threshold for detecting a license from license text.\n# The higher the value, the more closely the license text must be to the\n# canonical license text of a valid SPDX license file.\n# [possible values: any between 0.0 and 1.0].\nconfidence-threshold = 0.8\n# Allow 1 or more licenses on a per-crate basis, so that particular licenses\n# aren't accepted for every possible crate as with the normal allow list\nexceptions = [\n    # Each entry is the crate and version constraint, and its specific allow\n    # list\n    #{ allow = [\"Zlib\"], crate = \"adler32\" },\n]\n\n# Some crates don't have (easily) machine readable licensing information,\n# adding a clarification entry for it allows you to manually specify the\n# licensing information\n[[licenses.clarify]]\n# The package spec the clarification applies to\ncrate = \"ring\"\n# The SPDX expression for the license requirements of the crate\nexpression = \"MIT AND ISC AND OpenSSL\"\n# One or more files in the crate's source used as the \"source of truth\" for\n# the license expression. If the contents match, the clarification will be used\n# when running the license check, otherwise the clarification will be ignored\n# and the crate will be checked normally, which may produce warnings or errors\n# depending on the rest of your configuration\nlicense-files = [\n# Each entry is a crate relative path, and the (opaque) hash of its contents\n{ path = \"LICENSE\", hash = 0xbd0eed23 }\n]\n\n[licenses.private]\n# If true, ignores workspace crates that aren't published, or are only\n# published to private registries.\n# To see how to mark a crate as unpublished (to the official registry),\n# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field.\nignore = true\n# One or more private registries that you might publish crates to, if a crate\n# is only published to private registries, and ignore is true, the crate will\n# not have its license(s) checked\nregistries = [\n    #\"https://sekretz.com/registry\n]\n\n# This section is considered when running `cargo deny check bans`.\n# More documentation about the 'bans' section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html\n[bans]\n# Lint level for when multiple versions of the same crate are detected\nmultiple-versions = \"warn\"\n# Lint level for when a crate version requirement is `*`\nwildcards = \"allow\"\n# The graph highlighting used when creating dotgraphs for crates\n# with multiple versions\n# * lowest-version - The path to the lowest versioned duplicate is highlighted\n# * simplest-path - The path to the version with the fewest edges is highlighted\n# * all - Both lowest-version and simplest-path are used\nhighlight = \"all\"\n# The default lint level for `default` features for crates that are members of\n# the workspace that is being checked. This can be overridden by allowing/denying\n# `default` on a crate-by-crate basis if desired.\nworkspace-default-features = \"allow\"\n# The default lint level for `default` features for external crates that are not\n# members of the workspace. This can be overridden by allowing/denying `default`\n# on a crate-by-crate basis if desired.\nexternal-default-features = \"allow\"\n# List of crates that are allowed. Use with care!\nallow = [\n    #\"ansi_term@0.11.0\",\n    #{ crate = \"ansi_term@0.11.0\", reason = \"you can specify a reason it is allowed\" },\n]\n# List of crates to deny\ndeny = [\n    #\"ansi_term@0.11.0\",\n    #{ crate = \"ansi_term@0.11.0\", reason = \"you can specify a reason it is banned\" },\n    # Wrapper crates can optionally be specified to allow the crate when it\n    # is a direct dependency of the otherwise banned crate\n    #{ crate = \"ansi_term@0.11.0\", wrappers = [\"this-crate-directly-depends-on-ansi_term\"] },\n]\n\n# List of features to allow/deny\n# Each entry the name of a crate and a version range. If version is\n# not specified, all versions will be matched.\n#[[bans.features]]\n#crate = \"reqwest\"\n# Features to not allow\n#deny = [\"json\"]\n# Features to allow\n#allow = [\n#    \"rustls\",\n#    \"__rustls\",\n#    \"__tls\",\n#    \"hyper-rustls\",\n#    \"rustls\",\n#    \"rustls-pemfile\",\n#    \"rustls-tls-webpki-roots\",\n#    \"tokio-rustls\",\n#    \"webpki-roots\",\n#]\n# If true, the allowed features must exactly match the enabled feature set. If\n# this is set there is no point setting `deny`\n#exact = true\n\n# Certain crates/versions that will be skipped when doing duplicate detection.\nskip = [\n    #\"ansi_term@0.11.0\",\n    #{ crate = \"ansi_term@0.11.0\", reason = \"you can specify a reason why it can't be updated/removed\" },\n]\n# Similarly to `skip` allows you to skip certain crates during duplicate\n# detection. Unlike skip, it also includes the entire tree of transitive\n# dependencies starting at the specified crate, up to a certain depth, which is\n# by default infinite.\nskip-tree = [\n    #\"ansi_term@0.11.0\", # will be skipped along with _all_ of its direct and transitive dependencies\n    #{ crate = \"ansi_term@0.11.0\", depth = 20 },\n]\n\n# This section is considered when running `cargo deny check sources`.\n# More documentation about the 'sources' section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html\n[sources]\n# Lint level for what to happen when a crate from a crate registry that is not\n# in the allow list is encountered\nunknown-registry = \"deny\"\n# Lint level for what to happen when a crate from a git repository that is not\n# in the allow list is encountered\nunknown-git = \"deny\"\n# List of URLs for allowed crate registries. Defaults to the crates.io index\n# if not specified. If it is specified but empty, no registries are allowed.\nallow-registry = [\"https://github.com/rust-lang/crates.io-index\"]\n# List of URLs for allowed Git repositories\nallow-git = []\n\n[sources.allow-org]\n# 1 or more github.com organizations to allow git sources for\ngithub = []\n# 1 or more gitlab.com organizations to allow git sources for\ngitlab = []\n# 1 or more bitbucket.org organizations to allow git sources for\nbitbucket = []\n"
  },
  {
    "path": "examples/README.md",
    "content": "# Examples\n\nWe try to focus our documentation on the [four types of\ndocumentation](https://documentation.divio.com/).  Examples fit into this by\nproviding:\n- [Cookbook / How-To Guides](https://docs.rs/clap/latest/clap/_cookbook/index.html)\n- Tutorials ([derive](https://docs.rs/clap/latest/clap/_derive/_tutorial/index.html), [builder](https://docs.rs/clap/latest/clap/_tutorial/index.html))\n\nThis directory contains the source for the above.\n\n## Contributing\n\nNew examples should fit within the above structure and support their narrative\n- Add the example to [Cargo.toml](../Cargo.toml) for any `required-features`\n- Document how the example works with a `.md` file which will be verified using [trycmd](https://docs.rs/trycmd)\n- Pull the `.rs` and `.md` file into the appropriate module doc comment to be accessible on docs.rs\n"
  },
  {
    "path": "examples/cargo-example-derive.md",
    "content": "For more on creating a custom subcommand, see [the cargo\nbook](https://doc.rust-lang.org/cargo/reference/external-tools.html#custom-subcommands).\nThe crate [`clap-cargo`](https://github.com/crate-ci/clap-cargo) can help in\nmimicking cargo's interface.\n\nThe help looks like:\n```console\n$ cargo-example-derive --help\nUsage: cargo <COMMAND>\n\nCommands:\n  example-derive  A simple to use, efficient, and full-featured Command Line Argument Parser\n  help            Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help\n\n$ cargo-example-derive example-derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: cargo example-derive [OPTIONS]\n\nOptions:\n      --manifest-path <MANIFEST_PATH>  \n  -h, --help                           Print help\n  -V, --version                        Print version\n\n```\n\nThen to directly invoke the command, run:\n```console\n$ cargo-example-derive example-derive\nNone\n\n$ cargo-example-derive example-derive --manifest-path Cargo.toml\nSome(\"Cargo.toml\")\n\n```\n"
  },
  {
    "path": "examples/cargo-example-derive.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)] // requires `derive` feature\n#[command(name = \"cargo\")]\n#[command(bin_name = \"cargo\")]\n#[command(styles = CLAP_STYLING)]\nenum CargoCli {\n    ExampleDerive(ExampleDeriveArgs),\n}\n\n// See also `clap_cargo::style::CLAP_STYLING`\npub const CLAP_STYLING: clap::builder::styling::Styles = clap::builder::styling::Styles::styled()\n    .header(clap_cargo::style::HEADER)\n    .usage(clap_cargo::style::USAGE)\n    .literal(clap_cargo::style::LITERAL)\n    .placeholder(clap_cargo::style::PLACEHOLDER)\n    .error(clap_cargo::style::ERROR)\n    .valid(clap_cargo::style::VALID)\n    .invalid(clap_cargo::style::INVALID);\n\n#[derive(clap::Args)]\n#[command(version, about, long_about = None)]\nstruct ExampleDeriveArgs {\n    #[arg(long)]\n    manifest_path: Option<std::path::PathBuf>,\n}\n\nfn main() {\n    let CargoCli::ExampleDerive(args) = CargoCli::parse();\n    println!(\"{:?}\", args.manifest_path);\n}\n"
  },
  {
    "path": "examples/cargo-example.md",
    "content": "For more on creating a custom subcommand, see [the cargo\nbook](https://doc.rust-lang.org/cargo/reference/external-tools.html#custom-subcommands).\nThe crate [`clap-cargo`](https://github.com/crate-ci/clap-cargo) can help in\nmimicking cargo's interface.\n\nThe help looks like:\n```console\n$ cargo-example --help\nUsage: cargo <COMMAND>\n\nCommands:\n  example  A simple to use, efficient, and full-featured Command Line Argument Parser\n  help     Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help\n\n$ cargo-example example --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: cargo example [OPTIONS]\n\nOptions:\n      --manifest-path <PATH>  \n  -h, --help                  Print help\n  -V, --version               Print version\n\n```\n\nThen to directly invoke the command, run:\n```console\n$ cargo-example example\nNone\n\n$ cargo-example example --manifest-path Cargo.toml\nSome(\"Cargo.toml\")\n\n```\n"
  },
  {
    "path": "examples/cargo-example.rs",
    "content": "fn main() {\n    let cmd = clap::Command::new(\"cargo\")\n        .bin_name(\"cargo\")\n        .styles(CLAP_STYLING)\n        .subcommand_required(true)\n        .subcommand(\n            clap::command!(\"example\").arg(\n                clap::arg!(--\"manifest-path\" <PATH>)\n                    .value_parser(clap::value_parser!(std::path::PathBuf)),\n            ),\n        );\n    let matches = cmd.get_matches();\n    let matches = match matches.subcommand() {\n        Some((\"example\", matches)) => matches,\n        _ => unreachable!(\"clap should ensure we don't get here\"),\n    };\n    let manifest_path = matches.get_one::<std::path::PathBuf>(\"manifest-path\");\n    println!(\"{manifest_path:?}\");\n}\n\n// See also `clap_cargo::style::CLAP_STYLING`\npub const CLAP_STYLING: clap::builder::styling::Styles = clap::builder::styling::Styles::styled()\n    .header(clap_cargo::style::HEADER)\n    .usage(clap_cargo::style::USAGE)\n    .literal(clap_cargo::style::LITERAL)\n    .placeholder(clap_cargo::style::PLACEHOLDER)\n    .error(clap_cargo::style::ERROR)\n    .valid(clap_cargo::style::VALID)\n    .invalid(clap_cargo::style::INVALID);\n"
  },
  {
    "path": "examples/demo.md",
    "content": "```console\n$ demo --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: demo[EXE] [OPTIONS] --name <NAME>\n\nOptions:\n  -n, --name <NAME>    Name of the person to greet\n  -c, --count <COUNT>  Number of times to greet [default: 1]\n  -h, --help           Print help\n  -V, --version        Print version\n\n$ demo --name Me\nHello Me!\n\n```\n*(version number and `.exe` extension on windows replaced by placeholders)*\n"
  },
  {
    "path": "examples/demo.rs",
    "content": "use clap::Parser;\n\n/// Simple program to greet a person\n#[derive(Parser, Debug)]\n#[command(version, about, long_about = None)]\nstruct Args {\n    /// Name of the person to greet\n    #[arg(short, long)]\n    name: String,\n\n    /// Number of times to greet\n    #[arg(short, long, default_value_t = 1)]\n    count: u8,\n}\n\nfn main() {\n    let args = Args::parse();\n\n    for _ in 0..args.count {\n        println!(\"Hello {}!\", args.name);\n    }\n}\n"
  },
  {
    "path": "examples/derive_ref/augment_args.rs",
    "content": "use clap::{Args, Command, FromArgMatches as _, arg};\n\n#[derive(Args, Debug)]\nstruct DerivedArgs {\n    #[arg(short, long)]\n    derived: bool,\n}\n\nfn main() {\n    let cli = Command::new(\"CLI\").arg(arg!(-b - -built).action(clap::ArgAction::SetTrue));\n    // Augment built args with derived args\n    let cli = DerivedArgs::augment_args(cli);\n\n    let matches = cli.get_matches();\n    println!(\"Value of built: {:?}\", matches.get_flag(\"built\"));\n    println!(\n        \"Value of derived via ArgMatches: {:?}\",\n        matches.get_flag(\"derived\")\n    );\n\n    // Since DerivedArgs implements FromArgMatches, we can extract it from the unstructured ArgMatches.\n    // This is the main benefit of using derived arguments.\n    let derived_matches = DerivedArgs::from_arg_matches(&matches)\n        .map_err(|err| err.exit())\n        .unwrap();\n    println!(\"Value of derived: {derived_matches:#?}\");\n}\n"
  },
  {
    "path": "examples/derive_ref/augment_subcommands.rs",
    "content": "use clap::{Command, FromArgMatches as _, Parser, Subcommand as _};\n\n#[derive(Parser, Debug)]\nenum Subcommands {\n    Derived {\n        #[arg(short, long)]\n        derived_flag: bool,\n    },\n}\n\nfn main() {\n    let cli = Command::new(\"Built CLI\");\n    // Augment with derived subcommands\n    let cli = Subcommands::augment_subcommands(cli);\n\n    let matches = cli.get_matches();\n    let derived_subcommands = Subcommands::from_arg_matches(&matches)\n        .map_err(|err| err.exit())\n        .unwrap();\n    println!(\"Derived subcommands: {derived_subcommands:#?}\");\n}\n"
  },
  {
    "path": "examples/derive_ref/flatten_hand_args.rs",
    "content": "use clap::error::Error;\nuse clap::{Arg, ArgAction, ArgMatches, Args, Command, FromArgMatches, Parser};\n\n#[derive(Debug)]\nstruct CliArgs {\n    foo: bool,\n    bar: bool,\n    quuz: Option<String>,\n}\n\nimpl FromArgMatches for CliArgs {\n    fn from_arg_matches(matches: &ArgMatches) -> Result<Self, Error> {\n        let mut matches = matches.clone();\n        Self::from_arg_matches_mut(&mut matches)\n    }\n    fn from_arg_matches_mut(matches: &mut ArgMatches) -> Result<Self, Error> {\n        Ok(Self {\n            foo: matches.get_flag(\"foo\"),\n            bar: matches.get_flag(\"bar\"),\n            quuz: matches.remove_one::<String>(\"quuz\"),\n        })\n    }\n    fn update_from_arg_matches(&mut self, matches: &ArgMatches) -> Result<(), Error> {\n        let mut matches = matches.clone();\n        self.update_from_arg_matches_mut(&mut matches)\n    }\n    fn update_from_arg_matches_mut(&mut self, matches: &mut ArgMatches) -> Result<(), Error> {\n        self.foo |= matches.get_flag(\"foo\");\n        self.bar |= matches.get_flag(\"bar\");\n        if let Some(quuz) = matches.remove_one::<String>(\"quuz\") {\n            self.quuz = Some(quuz);\n        }\n        Ok(())\n    }\n}\n\nimpl Args for CliArgs {\n    fn augment_args(cmd: Command) -> Command {\n        cmd.arg(\n            Arg::new(\"foo\")\n                .short('f')\n                .long(\"foo\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"bar\")\n                .short('b')\n                .long(\"bar\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"quuz\")\n                .short('q')\n                .long(\"quuz\")\n                .action(ArgAction::Set),\n        )\n    }\n    fn augment_args_for_update(cmd: Command) -> Command {\n        cmd.arg(\n            Arg::new(\"foo\")\n                .short('f')\n                .long(\"foo\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"bar\")\n                .short('b')\n                .long(\"bar\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"quuz\")\n                .short('q')\n                .long(\"quuz\")\n                .action(ArgAction::Set),\n        )\n    }\n}\n\n#[derive(Parser, Debug)]\nstruct Cli {\n    #[arg(short, long)]\n    top_level: bool,\n    #[command(flatten)]\n    more_args: CliArgs,\n}\n\nfn main() {\n    let args = Cli::parse();\n    println!(\"{args:#?}\");\n}\n"
  },
  {
    "path": "examples/derive_ref/hand_subcommand.rs",
    "content": "#![allow(dead_code)]\nuse clap::error::{Error, ErrorKind};\nuse clap::{ArgMatches, Args as _, Command, FromArgMatches, Parser, Subcommand};\n\n#[derive(Parser, Debug)]\nstruct AddArgs {\n    name: Vec<String>,\n}\n#[derive(Parser, Debug)]\nstruct RemoveArgs {\n    #[arg(short, long)]\n    force: bool,\n    name: Vec<String>,\n}\n\n#[derive(Debug)]\nenum CliSub {\n    Add(AddArgs),\n    Remove(RemoveArgs),\n}\n\nimpl FromArgMatches for CliSub {\n    fn from_arg_matches(matches: &ArgMatches) -> Result<Self, Error> {\n        match matches.subcommand() {\n            Some((\"add\", args)) => Ok(Self::Add(AddArgs::from_arg_matches(args)?)),\n            Some((\"remove\", args)) => Ok(Self::Remove(RemoveArgs::from_arg_matches(args)?)),\n            Some((_, _)) => Err(Error::raw(\n                ErrorKind::InvalidSubcommand,\n                \"Valid subcommands are `add` and `remove`\",\n            )),\n            None => Err(Error::raw(\n                ErrorKind::MissingSubcommand,\n                \"Valid subcommands are `add` and `remove`\",\n            )),\n        }\n    }\n    fn update_from_arg_matches(&mut self, matches: &ArgMatches) -> Result<(), Error> {\n        match matches.subcommand() {\n            Some((\"add\", args)) => *self = Self::Add(AddArgs::from_arg_matches(args)?),\n            Some((\"remove\", args)) => *self = Self::Remove(RemoveArgs::from_arg_matches(args)?),\n            Some((_, _)) => {\n                return Err(Error::raw(\n                    ErrorKind::InvalidSubcommand,\n                    \"Valid subcommands are `add` and `remove`\",\n                ));\n            }\n            None => (),\n        };\n        Ok(())\n    }\n}\n\nimpl Subcommand for CliSub {\n    fn augment_subcommands(cmd: Command) -> Command {\n        cmd.subcommand(AddArgs::augment_args(Command::new(\"add\")))\n            .subcommand(RemoveArgs::augment_args(Command::new(\"remove\")))\n            .subcommand_required(true)\n    }\n    fn augment_subcommands_for_update(cmd: Command) -> Command {\n        cmd.subcommand(AddArgs::augment_args(Command::new(\"add\")))\n            .subcommand(RemoveArgs::augment_args(Command::new(\"remove\")))\n            .subcommand_required(true)\n    }\n    fn has_subcommand(name: &str) -> bool {\n        matches!(name, \"add\" | \"remove\")\n    }\n}\n\n#[derive(Parser, Debug)]\nstruct Cli {\n    #[arg(short, long)]\n    top_level: bool,\n    #[command(subcommand)]\n    subcommand: CliSub,\n}\n\nfn main() {\n    let args = Cli::parse();\n    println!(\"{args:#?}\");\n}\n"
  },
  {
    "path": "examples/derive_ref/interop_tests.md",
    "content": "Following are tests for the interop examples in this directory.\n\n## Augment Args\n\n```console\n$ interop_augment_args\nValue of built: false\nValue of derived via ArgMatches: false\nValue of derived: DerivedArgs {\n    derived: false,\n}\n\n```\n\n```console\n$ interop_augment_args -b --derived\nValue of built: true\nValue of derived via ArgMatches: true\nValue of derived: DerivedArgs {\n    derived: true,\n}\n\n```\n\n```console\n$ interop_augment_args -d --built\nValue of built: true\nValue of derived via ArgMatches: true\nValue of derived: DerivedArgs {\n    derived: true,\n}\n\n```\n\n```console\n$ interop_augment_args --unknown\n? failed\nerror: unexpected argument '--unknown' found\n\nUsage: interop_augment_args[EXE] [OPTIONS]\n\nFor more information, try '--help'.\n\n```\n\n## Augment Subcommands\n\n```console\n$ interop_augment_subcommands\n? failed\nerror: a subcommand is required but one was not provided\n```\n\n```console\n$ interop_augment_subcommands derived\nDerived subcommands: Derived {\n    derived_flag: false,\n}\n\n```\n\n```console\n$ interop_augment_subcommands derived --derived-flag\nDerived subcommands: Derived {\n    derived_flag: true,\n}\n\n```\n\n```console\n$ interop_augment_subcommands derived --unknown\n? failed\nerror: unexpected argument '--unknown' found\n\nUsage: interop_augment_subcommands[EXE] derived [OPTIONS]\n\nFor more information, try '--help'.\n\n```\n\n```console\n$ interop_augment_subcommands unknown\n? failed\nerror: unrecognized subcommand 'unknown'\n\nUsage: interop_augment_subcommands[EXE] [COMMAND]\n\nFor more information, try '--help'.\n\n```\n\n## Hand-Implemented Subcommand\n\n```console\n$ interop_hand_subcommand\n? failed\nUsage: interop_hand_subcommand[EXE] [OPTIONS] <COMMAND>\n\nCommands:\n  add     \n  remove  \n  help    Print this message or the help of the given subcommand(s)\n\nOptions:\n  -t, --top-level  \n  -h, --help       Print help\n\n```\n\n```console\n$ interop_hand_subcommand add\nCli {\n    top_level: false,\n    subcommand: Add(\n        AddArgs {\n            name: [],\n        },\n    ),\n}\n\n```\n\n```console\n$ interop_hand_subcommand add a b c\nCli {\n    top_level: false,\n    subcommand: Add(\n        AddArgs {\n            name: [\n                \"a\",\n                \"b\",\n                \"c\",\n            ],\n        },\n    ),\n}\n\n```\n\n```console\n$ interop_hand_subcommand add --unknown\n? failed\nerror: unexpected argument '--unknown' found\n\n  tip: to pass '--unknown' as a value, use '-- --unknown'\n\nUsage: interop_hand_subcommand[EXE] add [NAME]...\n\nFor more information, try '--help'.\n\n```\n\n```console\n$ interop_hand_subcommand remove\nCli {\n    top_level: false,\n    subcommand: Remove(\n        RemoveArgs {\n            force: false,\n            name: [],\n        },\n    ),\n}\n\n```\n\n```console\n$ interop_hand_subcommand remove --force a b c\nCli {\n    top_level: false,\n    subcommand: Remove(\n        RemoveArgs {\n            force: true,\n            name: [\n                \"a\",\n                \"b\",\n                \"c\",\n            ],\n        },\n    ),\n}\n\n```\n\n```console\n$ interop_hand_subcommand unknown\n? failed\nerror: unrecognized subcommand 'unknown'\n\nUsage: interop_hand_subcommand[EXE] [OPTIONS] <COMMAND>\n\nFor more information, try '--help'.\n\n```\n\n## Flatten Hand-Implemented Args\n\n```console\n$ interop_flatten_hand_args\nCli {\n    top_level: false,\n    more_args: CliArgs {\n        foo: false,\n        bar: false,\n        quuz: None,\n    },\n}\n\n```\n\n```console\n$ interop_flatten_hand_args -f --bar\nCli {\n    top_level: false,\n    more_args: CliArgs {\n        foo: true,\n        bar: true,\n        quuz: None,\n    },\n}\n\n```\n\n```console\n$ interop_flatten_hand_args --quuz abc\nCli {\n    top_level: false,\n    more_args: CliArgs {\n        foo: false,\n        bar: false,\n        quuz: Some(\n            \"abc\",\n        ),\n    },\n}\n\n```\n\n```console\n$ interop_flatten_hand_args --unknown\n? failed\nerror: unexpected argument '--unknown' found\n\nUsage: interop_flatten_hand_args[EXE] [OPTIONS]\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/escaped-positional-derive.md",
    "content": "**This requires enabling the [`derive` feature flag][crate::_features].**\n\nYou can use `--` to escape further arguments.\n\nLet's see what this looks like in the help:\n```console\n$ escaped-positional-derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: escaped-positional-derive[EXE] [OPTIONS] [-- <SLOP>...]\n\nArguments:\n  [SLOP]...  \n\nOptions:\n  -f             \n  -p <PEAR>      \n  -h, --help     Print help\n  -V, --version  Print version\n\n```\n\nHere is a baseline without any arguments:\n```console\n$ escaped-positional-derive\n-f used: false\n-p's value: None\n'slops' values: []\n\n```\n\nNotice that we can't pass positional arguments before `--`:\n```console\n$ escaped-positional-derive foo bar\n? failed\nerror: unexpected argument 'foo' found\n\nUsage: escaped-positional-derive[EXE] [OPTIONS] [-- <SLOP>...]\n\nFor more information, try '--help'.\n\n```\n\nBut you can after:\n```console\n$ escaped-positional-derive -f -p=bob -- sloppy slop slop\n-f used: true\n-p's value: Some(\"bob\")\n'slops' values: [\"sloppy\", \"slop\", \"slop\"]\n\n```\n\nAs mentioned, the parser will directly pass everything through:\n```console\n$ escaped-positional-derive -- -f -p=bob sloppy slop slop\n-f used: false\n-p's value: None\n'slops' values: [\"-f\", \"-p=bob\", \"sloppy\", \"slop\", \"slop\"]\n\n```\n"
  },
  {
    "path": "examples/escaped-positional-derive.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)] // requires `derive` feature\n#[command(version, about, long_about = None)]\nstruct Cli {\n    #[arg(short = 'f')]\n    eff: bool,\n\n    #[arg(short = 'p', value_name = \"PEAR\")]\n    pea: Option<String>,\n\n    #[arg(last = true)]\n    slop: Vec<String>,\n}\n\nfn main() {\n    let args = Cli::parse();\n\n    // This is what will happen with `myprog -f -p=bob -- sloppy slop slop`...\n    println!(\"-f used: {:?}\", args.eff); // -f used: true\n    println!(\"-p's value: {:?}\", args.pea); // -p's value: Some(\"bob\")\n    println!(\"'slops' values: {:?}\", args.slop); // 'slops' values: Some([\"sloppy\", \"slop\", \"slop\"])\n\n    // Continued program logic goes here...\n}\n"
  },
  {
    "path": "examples/escaped-positional.md",
    "content": "**This requires enabling the [`cargo` feature flag][crate::_features].**\n\nYou can use `--` to escape further arguments.\n\nLet's see what this looks like in the help:\n```console\n$ escaped-positional --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: escaped-positional[EXE] [OPTIONS] [-- <SLOP>...]\n\nArguments:\n  [SLOP]...  \n\nOptions:\n  -f             \n  -p <PEAR>      \n  -h, --help     Print help\n  -V, --version  Print version\n\n```\n\nHere is a baseline without any arguments:\n```console\n$ escaped-positional\n-f used: false\n-p's value: None\n'slops' values: []\n\n```\n\nNotice that we can't pass positional arguments before `--`:\n```console\n$ escaped-positional foo bar\n? failed\nerror: unexpected argument 'foo' found\n\nUsage: escaped-positional[EXE] [OPTIONS] [-- <SLOP>...]\n\nFor more information, try '--help'.\n\n```\n\nBut you can after:\n```console\n$ escaped-positional -f -p=bob -- sloppy slop slop\n-f used: true\n-p's value: Some(\"bob\")\n'slops' values: [\"sloppy\", \"slop\", \"slop\"]\n\n```\n\nAs mentioned, the parser will directly pass everything through:\n```console\n$ escaped-positional -- -f -p=bob sloppy slop slop\n-f used: false\n-p's value: None\n'slops' values: [\"-f\", \"-p=bob\", \"sloppy\", \"slop\", \"slop\"]\n\n```\n"
  },
  {
    "path": "examples/escaped-positional.rs",
    "content": "use clap::{ArgAction, arg, command, value_parser};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(arg!(eff: -f).action(ArgAction::SetTrue))\n        .arg(arg!(pea: -p <PEAR>).value_parser(value_parser!(String)))\n        .arg(\n            // Indicates that `slop` is only accessible after `--`.\n            arg!(slop: [SLOP])\n                .num_args(1..)\n                .last(true)\n                .value_parser(value_parser!(String)),\n        )\n        .get_matches();\n\n    // This is what will happen with `myprog -f -p=bob -- sloppy slop slop`...\n\n    // -f used: true\n    println!(\"-f used: {:?}\", matches.get_flag(\"eff\"));\n    // -p's value: Some(\"bob\")\n    println!(\"-p's value: {:?}\", matches.get_one::<String>(\"pea\"));\n    // 'slops' values: Some([\"sloppy\", \"slop\", \"slop\"])\n    println!(\n        \"'slops' values: {:?}\",\n        matches\n            .get_many::<String>(\"slop\")\n            .map(|vals| vals.collect::<Vec<_>>())\n            .unwrap_or_default()\n    );\n\n    // Continued program logic goes here...\n}\n"
  },
  {
    "path": "examples/find.md",
    "content": "`find` is an example of position-sensitive flags\n\n```console\n$ find --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: find[EXE] [OPTIONS]\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\nTESTS:\n      --empty        File is empty and is either a regular file or a directory\n      --name <name>  Base of file name (the path with the leading directories removed) matches shell\n                     pattern pattern\n\nOPERATORS:\n  -o, --or   expr2 is not evaluate if exp1 is true\n  -a, --and  Same as `expr1 expr1`\n\n$ find --empty -o --name .keep\n[\n    (\n        \"empty\",\n        Bool(\n            true,\n        ),\n    ),\n    (\n        \"or\",\n        Bool(\n            true,\n        ),\n    ),\n    (\n        \"name\",\n        String(\n            \".keep\",\n        ),\n    ),\n]\n\n$ find --empty -o --name .keep -o --name foo\n[\n    (\n        \"empty\",\n        Bool(\n            true,\n        ),\n    ),\n    (\n        \"or\",\n        Bool(\n            true,\n        ),\n    ),\n    (\n        \"name\",\n        String(\n            \".keep\",\n        ),\n    ),\n    (\n        \"or\",\n        Bool(\n            true,\n        ),\n    ),\n    (\n        \"name\",\n        String(\n            \"foo\",\n        ),\n    ),\n]\n\n```\n\n"
  },
  {
    "path": "examples/find.rs",
    "content": "use std::collections::BTreeMap;\n\nuse clap::{Arg, ArgAction, ArgGroup, ArgMatches, Command, command, value_parser};\n\nfn main() {\n    let matches = cli().get_matches();\n    let values = Value::from_matches(&matches);\n    println!(\"{values:#?}\");\n}\n\nfn cli() -> Command {\n    command!()\n        .group(ArgGroup::new(\"tests\").multiple(true))\n        .next_help_heading(\"TESTS\")\n        .args([\n            position_sensitive_flag(Arg::new(\"empty\"))\n                .long(\"empty\")\n                .action(ArgAction::Append)\n                .help(\"File is empty and is either a regular file or a directory\")\n                .group(\"tests\"),\n            Arg::new(\"name\")\n                .long(\"name\")\n                .action(ArgAction::Append)\n                .help(\"Base of file name (the path with the leading directories removed) matches shell pattern pattern\")\n                .group(\"tests\")\n        ])\n        .group(ArgGroup::new(\"operators\").multiple(true))\n        .next_help_heading(\"OPERATORS\")\n        .args([\n            position_sensitive_flag(Arg::new(\"or\"))\n                .short('o')\n                .long(\"or\")\n                .action(ArgAction::Append)\n                .help(\"expr2 is not evaluate if exp1 is true\")\n                .group(\"operators\"),\n            position_sensitive_flag(Arg::new(\"and\"))\n                .short('a')\n                .long(\"and\")\n                .action(ArgAction::Append)\n                .help(\"Same as `expr1 expr1`\")\n                .group(\"operators\"),\n        ])\n}\n\nfn position_sensitive_flag(arg: Arg) -> Arg {\n    // Flags don't track the position of each occurrence, so we need to emulate flags with\n    // value-less options to get the same result\n    arg.num_args(0)\n        .value_parser(value_parser!(bool))\n        .default_missing_value(\"true\")\n        .default_value(\"false\")\n}\n\n#[derive(Clone, PartialEq, Eq, Hash, Debug)]\npub enum Value {\n    Bool(bool),\n    String(String),\n}\n\nimpl Value {\n    pub fn from_matches(matches: &ArgMatches) -> Vec<(clap::Id, Self)> {\n        let mut values = BTreeMap::new();\n        for id in matches.ids() {\n            if matches.try_get_many::<clap::Id>(id.as_str()).is_ok() {\n                // ignore groups\n                continue;\n            }\n            let value_source = matches\n                .value_source(id.as_str())\n                .expect(\"id came from matches\");\n            if value_source != clap::parser::ValueSource::CommandLine {\n                // Any other source just gets tacked on at the end (like default values)\n                continue;\n            }\n            if Self::extract::<String>(matches, id, &mut values) {\n                continue;\n            }\n            if Self::extract::<bool>(matches, id, &mut values) {\n                continue;\n            }\n            unimplemented!(\"unknown type for {id}: {matches:?}\");\n        }\n        values.into_values().collect::<Vec<_>>()\n    }\n\n    fn extract<T: Clone + Into<Value> + Send + Sync + 'static>(\n        matches: &ArgMatches,\n        id: &clap::Id,\n        output: &mut BTreeMap<usize, (clap::Id, Self)>,\n    ) -> bool {\n        match matches.try_get_many::<T>(id.as_str()) {\n            Ok(Some(values)) => {\n                for (value, index) in values.zip(\n                    matches\n                        .indices_of(id.as_str())\n                        .expect(\"id came from matches\"),\n                ) {\n                    output.insert(index, (id.clone(), value.clone().into()));\n                }\n                true\n            }\n            Ok(None) => {\n                unreachable!(\"`ids` only reports what is present\")\n            }\n            Err(clap::parser::MatchesError::UnknownArgument { .. }) => {\n                unreachable!(\"id came from matches\")\n            }\n            Err(clap::parser::MatchesError::Downcast { .. }) => false,\n            Err(_) => {\n                unreachable!(\"id came from matches\")\n            }\n        }\n    }\n}\n\nimpl From<String> for Value {\n    fn from(other: String) -> Self {\n        Self::String(other)\n    }\n}\n\nimpl From<bool> for Value {\n    fn from(other: bool) -> Self {\n        Self::Bool(other)\n    }\n}\n"
  },
  {
    "path": "examples/git-derive.md",
    "content": "**This requires enabling the [`derive` feature flag][crate::_features].**\n\nGit is an example of several common subcommand patterns.\n\nHelp:\n```console\n$ git-derive\n? failed\nA fictional versioning CLI\n\nUsage: git-derive[EXE] <COMMAND>\n\nCommands:\n  clone  Clones repos\n  diff   Compare two commits\n  push   pushes things\n  add    adds things\n  stash  \n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help\n\n$ git-derive help\nA fictional versioning CLI\n\nUsage: git-derive[EXE] <COMMAND>\n\nCommands:\n  clone  Clones repos\n  diff   Compare two commits\n  push   pushes things\n  add    adds things\n  stash  \n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help\n\n$ git-derive help add\nadds things\n\nUsage: git-derive[EXE] add <PATH>...\n\nArguments:\n  <PATH>...  Stuff to add\n\nOptions:\n  -h, --help  Print help\n\n```\n\nA basic argument:\n```console\n$ git-derive add\n? failed\nadds things\n\nUsage: git-derive[EXE] add <PATH>...\n\nArguments:\n  <PATH>...  Stuff to add\n\nOptions:\n  -h, --help  Print help\n\n$ git-derive add Cargo.toml Cargo.lock\nAdding [\"Cargo.toml\", \"Cargo.lock\"]\n\n```\n\nDefault subcommand:\n```console\n$ git-derive stash -h\nUsage: git-derive[EXE] stash [OPTIONS]\n       git-derive[EXE] stash push [OPTIONS]\n       git-derive[EXE] stash pop [STASH]\n       git-derive[EXE] stash apply [STASH]\n       git-derive[EXE] stash help [COMMAND]...\n\nOptions:\n  -m, --message <MESSAGE>  \n  -h, --help               Print help\n\ngit-derive[EXE] stash push:\n  -m, --message <MESSAGE>  \n  -h, --help               Print help\n\ngit-derive[EXE] stash pop:\n  -h, --help  Print help\n  [STASH]     \n\ngit-derive[EXE] stash apply:\n  -h, --help  Print help\n  [STASH]     \n\ngit-derive[EXE] stash help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n$ git-derive stash push -h\nUsage: git-derive[EXE] stash push [OPTIONS]\n\nOptions:\n  -m, --message <MESSAGE>  \n  -h, --help               Print help\n\n$ git-derive stash pop -h\nUsage: git-derive[EXE] stash pop [STASH]\n\nArguments:\n  [STASH]  \n\nOptions:\n  -h, --help  Print help\n\n$ git-derive stash -m \"Prototype\"\nPushing StashPushArgs { message: Some(\"Prototype\") }\n\n$ git-derive stash pop\nPopping None\n\n$ git-derive stash push -m \"Prototype\"\nPushing StashPushArgs { message: Some(\"Prototype\") }\n\n$ git-derive stash pop\nPopping None\n\n```\n\nExternal subcommands:\n```console\n$ git-derive custom-tool arg1 --foo bar\nCalling out to \"custom-tool\" with [\"arg1\", \"--foo\", \"bar\"]\n\n```\n\nLast argument:\n```console\n$ git-derive diff --help\nCompare two commits\n\nUsage: git-derive[EXE] diff [OPTIONS] [COMMIT] [COMMIT] [-- <PATH>]\n\nArguments:\n  [COMMIT]  \n  [COMMIT]  \n  [PATH]    \n\nOptions:\n      --color[=<WHEN>]  [default: auto] [possible values: always, auto, never]\n  -h, --help            Print help\n\n$ git-derive diff\nDiffing stage..worktree  (color=auto)\n\n$ git-derive diff ./src\nDiffing stage..worktree ./src (color=auto)\n\n$ git-derive diff HEAD ./src\nDiffing HEAD..worktree ./src (color=auto)\n\n$ git-derive diff HEAD~~ -- HEAD\nDiffing HEAD~~..worktree HEAD (color=auto)\n\n$ git-derive diff --color\nDiffing stage..worktree  (color=always)\n\n$ git-derive diff --color=never\nDiffing stage..worktree  (color=never)\n\n```\n"
  },
  {
    "path": "examples/git-derive.rs",
    "content": "use std::ffi::OsStr;\nuse std::ffi::OsString;\nuse std::path::PathBuf;\n\nuse clap::{Args, Parser, Subcommand, ValueEnum};\n\n/// A fictional versioning CLI\n#[derive(Debug, Parser)] // requires `derive` feature\n#[command(name = \"git\")]\n#[command(about = \"A fictional versioning CLI\", long_about = None)]\nstruct Cli {\n    #[command(subcommand)]\n    command: Commands,\n}\n\n#[derive(Debug, Subcommand)]\nenum Commands {\n    /// Clones repos\n    #[command(arg_required_else_help = true)]\n    Clone {\n        /// The remote to clone\n        remote: String,\n    },\n    /// Compare two commits\n    Diff {\n        #[arg(value_name = \"COMMIT\")]\n        base: Option<OsString>,\n        #[arg(value_name = \"COMMIT\")]\n        head: Option<OsString>,\n        #[arg(last = true)]\n        path: Option<OsString>,\n        #[arg(\n            long,\n            require_equals = true,\n            value_name = \"WHEN\",\n            num_args = 0..=1,\n            default_value_t = ColorWhen::Auto,\n            default_missing_value = \"always\",\n            value_enum\n        )]\n        color: ColorWhen,\n    },\n    /// pushes things\n    #[command(arg_required_else_help = true)]\n    Push {\n        /// The remote to target\n        remote: String,\n    },\n    /// adds things\n    #[command(arg_required_else_help = true)]\n    Add {\n        /// Stuff to add\n        #[arg(required = true)]\n        path: Vec<PathBuf>,\n    },\n    Stash(StashArgs),\n    #[command(external_subcommand)]\n    External(Vec<OsString>),\n}\n\n#[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Eq)]\nenum ColorWhen {\n    Always,\n    Auto,\n    Never,\n}\n\nimpl std::fmt::Display for ColorWhen {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.to_possible_value()\n            .expect(\"no values are skipped\")\n            .get_name()\n            .fmt(f)\n    }\n}\n\n#[derive(Debug, Args)]\n#[command(args_conflicts_with_subcommands = true)]\n#[command(flatten_help = true)]\nstruct StashArgs {\n    #[command(subcommand)]\n    command: Option<StashCommands>,\n\n    #[command(flatten)]\n    push: StashPushArgs,\n}\n\n#[derive(Debug, Subcommand)]\nenum StashCommands {\n    Push(StashPushArgs),\n    Pop { stash: Option<String> },\n    Apply { stash: Option<String> },\n}\n\n#[derive(Debug, Args)]\nstruct StashPushArgs {\n    #[arg(short, long)]\n    message: Option<String>,\n}\n\nfn main() {\n    let args = Cli::parse();\n\n    match args.command {\n        Commands::Clone { remote } => {\n            println!(\"Cloning {remote}\");\n        }\n        Commands::Diff {\n            mut base,\n            mut head,\n            mut path,\n            color,\n        } => {\n            if path.is_none() {\n                path = head;\n                head = None;\n                if path.is_none() {\n                    path = base;\n                    base = None;\n                }\n            }\n            let base = base\n                .as_deref()\n                .map(|s| s.to_str().unwrap())\n                .unwrap_or(\"stage\");\n            let head = head\n                .as_deref()\n                .map(|s| s.to_str().unwrap())\n                .unwrap_or(\"worktree\");\n            let path = path.as_deref().unwrap_or_else(|| OsStr::new(\"\"));\n            println!(\n                \"Diffing {}..{} {} (color={})\",\n                base,\n                head,\n                path.to_string_lossy(),\n                color\n            );\n        }\n        Commands::Push { remote } => {\n            println!(\"Pushing to {remote}\");\n        }\n        Commands::Add { path } => {\n            println!(\"Adding {path:?}\");\n        }\n        Commands::Stash(stash) => {\n            let stash_cmd = stash.command.unwrap_or(StashCommands::Push(stash.push));\n            match stash_cmd {\n                StashCommands::Push(push) => {\n                    println!(\"Pushing {push:?}\");\n                }\n                StashCommands::Pop { stash } => {\n                    println!(\"Popping {stash:?}\");\n                }\n                StashCommands::Apply { stash } => {\n                    println!(\"Applying {stash:?}\");\n                }\n            }\n        }\n        Commands::External(args) => {\n            println!(\"Calling out to {:?} with {:?}\", &args[0], &args[1..]);\n        }\n    }\n\n    // Continued program logic goes here...\n}\n"
  },
  {
    "path": "examples/git.md",
    "content": "Git is an example of several common subcommand patterns.\n\nHelp:\n```console\n$ git\n? failed\nA fictional versioning CLI\n\nUsage: git[EXE] <COMMAND>\n\nCommands:\n  clone  Clones repos\n  diff   Compare two commits\n  push   pushes things\n  add    adds things\n  stash  \n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help\n\n$ git help\nA fictional versioning CLI\n\nUsage: git[EXE] <COMMAND>\n\nCommands:\n  clone  Clones repos\n  diff   Compare two commits\n  push   pushes things\n  add    adds things\n  stash  \n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help\n\n$ git help add\nadds things\n\nUsage: git[EXE] add <PATH>...\n\nArguments:\n  <PATH>...  Stuff to add\n\nOptions:\n  -h, --help  Print help\n\n```\n\nA basic argument:\n```console\n$ git add\n? failed\nadds things\n\nUsage: git[EXE] add <PATH>...\n\nArguments:\n  <PATH>...  Stuff to add\n\nOptions:\n  -h, --help  Print help\n\n$ git add Cargo.toml Cargo.lock\nAdding [\"Cargo.toml\", \"Cargo.lock\"]\n\n```\n\nDefault subcommand:\n```console\n$ git stash -h\nUsage: git[EXE] stash [OPTIONS]\n       git[EXE] stash push [OPTIONS]\n       git[EXE] stash pop [STASH]\n       git[EXE] stash apply [STASH]\n       git[EXE] stash help [COMMAND]...\n\nOptions:\n  -m, --message <MESSAGE>  \n  -h, --help               Print help\n\ngit[EXE] stash push:\n  -m, --message <MESSAGE>  \n  -h, --help               Print help\n\ngit[EXE] stash pop:\n  -h, --help  Print help\n  [STASH]     \n\ngit[EXE] stash apply:\n  -h, --help  Print help\n  [STASH]     \n\ngit[EXE] stash help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n$ git stash push -h\nUsage: git[EXE] stash push [OPTIONS]\n\nOptions:\n  -m, --message <MESSAGE>  \n  -h, --help               Print help\n\n$ git stash pop -h\nUsage: git[EXE] stash pop [STASH]\n\nArguments:\n  [STASH]  \n\nOptions:\n  -h, --help  Print help\n\n$ git stash -m \"Prototype\"\nPushing Some(\"Prototype\")\n\n$ git stash pop\nPopping None\n\n$ git stash push -m \"Prototype\"\nPushing Some(\"Prototype\")\n\n$ git stash pop\nPopping None\n\n```\n\nExternal subcommands:\n```console\n$ git custom-tool arg1 --foo bar\nCalling out to \"custom-tool\" with [\"arg1\", \"--foo\", \"bar\"]\n\n```\n\nLast argument:\n```console\n$ git diff --help\nCompare two commits\n\nUsage: git[EXE] diff [OPTIONS] [COMMIT] [COMMIT] [-- <PATH>]\n\nArguments:\n  [COMMIT]  \n  [COMMIT]  \n  [PATH]    \n\nOptions:\n      --color[=<WHEN>]  [default: auto] [possible values: always, auto, never]\n  -h, --help            Print help\n\n$ git diff\nDiffing stage..worktree  (color=auto)\n\n$ git diff ./src\nDiffing stage..worktree ./src (color=auto)\n\n$ git diff HEAD ./src\nDiffing HEAD..worktree ./src (color=auto)\n\n$ git diff HEAD~~ -- HEAD\nDiffing HEAD~~..worktree HEAD (color=auto)\n\n$ git diff --color\nDiffing stage..worktree  (color=always)\n\n$ git diff --color=never\nDiffing stage..worktree  (color=never)\n\n```\n"
  },
  {
    "path": "examples/git.rs",
    "content": "use std::ffi::OsString;\nuse std::path::PathBuf;\n\nuse clap::{Command, arg};\n\nfn cli() -> Command {\n    Command::new(\"git\")\n        .about(\"A fictional versioning CLI\")\n        .subcommand_required(true)\n        .arg_required_else_help(true)\n        .allow_external_subcommands(true)\n        .subcommand(\n            Command::new(\"clone\")\n                .about(\"Clones repos\")\n                .arg(arg!(<REMOTE> \"The remote to clone\"))\n                .arg_required_else_help(true),\n        )\n        .subcommand(\n            Command::new(\"diff\")\n                .about(\"Compare two commits\")\n                .arg(arg!(base: [COMMIT]))\n                .arg(arg!(head: [COMMIT]))\n                .arg(arg!(path: [PATH]).last(true))\n                .arg(\n                    arg!(--color <WHEN>)\n                        .value_parser([\"always\", \"auto\", \"never\"])\n                        .num_args(0..=1)\n                        .require_equals(true)\n                        .default_value(\"auto\")\n                        .default_missing_value(\"always\"),\n                ),\n        )\n        .subcommand(\n            Command::new(\"push\")\n                .about(\"pushes things\")\n                .arg(arg!(<REMOTE> \"The remote to target\"))\n                .arg_required_else_help(true),\n        )\n        .subcommand(\n            Command::new(\"add\")\n                .about(\"adds things\")\n                .arg_required_else_help(true)\n                .arg(arg!(<PATH> ... \"Stuff to add\").value_parser(clap::value_parser!(PathBuf))),\n        )\n        .subcommand(\n            Command::new(\"stash\")\n                .args_conflicts_with_subcommands(true)\n                .flatten_help(true)\n                .args(push_args())\n                .subcommand(Command::new(\"push\").args(push_args()))\n                .subcommand(Command::new(\"pop\").arg(arg!([STASH])))\n                .subcommand(Command::new(\"apply\").arg(arg!([STASH]))),\n        )\n}\n\nfn push_args() -> Vec<clap::Arg> {\n    vec![arg!(-m --message <MESSAGE>)]\n}\n\nfn main() {\n    let matches = cli().get_matches();\n\n    match matches.subcommand() {\n        Some((\"clone\", sub_matches)) => {\n            println!(\n                \"Cloning {}\",\n                sub_matches.get_one::<String>(\"REMOTE\").expect(\"required\")\n            );\n        }\n        Some((\"diff\", sub_matches)) => {\n            let color = sub_matches\n                .get_one::<String>(\"color\")\n                .map(|s| s.as_str())\n                .expect(\"defaulted in clap\");\n\n            let mut base = sub_matches.get_one::<String>(\"base\").map(|s| s.as_str());\n            let mut head = sub_matches.get_one::<String>(\"head\").map(|s| s.as_str());\n            let mut path = sub_matches.get_one::<String>(\"path\").map(|s| s.as_str());\n            if path.is_none() {\n                path = head;\n                head = None;\n                if path.is_none() {\n                    path = base;\n                    base = None;\n                }\n            }\n            let base = base.unwrap_or(\"stage\");\n            let head = head.unwrap_or(\"worktree\");\n            let path = path.unwrap_or(\"\");\n            println!(\"Diffing {base}..{head} {path} (color={color})\");\n        }\n        Some((\"push\", sub_matches)) => {\n            println!(\n                \"Pushing to {}\",\n                sub_matches.get_one::<String>(\"REMOTE\").expect(\"required\")\n            );\n        }\n        Some((\"add\", sub_matches)) => {\n            let paths = sub_matches\n                .get_many::<PathBuf>(\"PATH\")\n                .into_iter()\n                .flatten()\n                .collect::<Vec<_>>();\n            println!(\"Adding {paths:?}\");\n        }\n        Some((\"stash\", sub_matches)) => {\n            let stash_command = sub_matches.subcommand().unwrap_or((\"push\", sub_matches));\n            match stash_command {\n                (\"apply\", sub_matches) => {\n                    let stash = sub_matches.get_one::<String>(\"STASH\");\n                    println!(\"Applying {stash:?}\");\n                }\n                (\"pop\", sub_matches) => {\n                    let stash = sub_matches.get_one::<String>(\"STASH\");\n                    println!(\"Popping {stash:?}\");\n                }\n                (\"push\", sub_matches) => {\n                    let message = sub_matches.get_one::<String>(\"message\");\n                    println!(\"Pushing {message:?}\");\n                }\n                (name, _) => {\n                    unreachable!(\"Unsupported subcommand `{name}`\")\n                }\n            }\n        }\n        Some((ext, sub_matches)) => {\n            let args = sub_matches\n                .get_many::<OsString>(\"\")\n                .into_iter()\n                .flatten()\n                .collect::<Vec<_>>();\n            println!(\"Calling out to {ext:?} with {args:?}\");\n        }\n        _ => unreachable!(), // If all subcommands are defined above, anything else is unreachable!()\n    }\n\n    // Continued program logic goes here...\n}\n"
  },
  {
    "path": "examples/multicall-busybox.md",
    "content": "See the documentation for [`Command::multicall`][crate::Command::multicall] for rationale.\n\nThis example omits every command except true and false,\nwhich are the most trivial to implement,\n```console\n$ busybox true\n? 0\n\n$ busybox false\n? 1\n\n```\n*Note: without the links setup, we can't demonstrate the multicall behavior*\n\nBut includes the `--install` option as an example of why it can be useful\nfor the main program to take arguments that aren't applet subcommands.\n```console\n$ busybox --install\n? failed\n...\n\n```\n\nThough users must pass something:\n```console\n$ busybox\n? failed\nUsage: busybox [OPTIONS] [APPLET]\n\nAPPLETS:\n  true   does nothing successfully\n  false  does nothing unsuccessfully\n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n      --install <install>  Install hardlinks for all subcommands in path\n  -h, --help               Print help\n\n```\n"
  },
  {
    "path": "examples/multicall-busybox.rs",
    "content": "use std::path::PathBuf;\nuse std::process::exit;\n\nuse clap::{Arg, ArgAction, Command, value_parser};\n\nfn applet_commands() -> [Command; 2] {\n    [\n        Command::new(\"true\").about(\"does nothing successfully\"),\n        Command::new(\"false\").about(\"does nothing unsuccessfully\"),\n    ]\n}\n\nfn main() {\n    let cmd = Command::new(env!(\"CARGO_CRATE_NAME\"))\n        .multicall(true)\n        .subcommand(\n            Command::new(\"busybox\")\n                .arg_required_else_help(true)\n                .subcommand_value_name(\"APPLET\")\n                .subcommand_help_heading(\"APPLETS\")\n                .arg(\n                    Arg::new(\"install\")\n                        .long(\"install\")\n                        .help(\"Install hardlinks for all subcommands in path\")\n                        .exclusive(true)\n                        .action(ArgAction::Set)\n                        .default_missing_value(\"/usr/local/bin\")\n                        .value_parser(value_parser!(PathBuf)),\n                )\n                .subcommands(applet_commands()),\n        )\n        .subcommands(applet_commands());\n\n    let matches = cmd.get_matches();\n    let mut subcommand = matches.subcommand();\n    if let Some((\"busybox\", cmd)) = subcommand {\n        if cmd.contains_id(\"install\") {\n            unimplemented!(\"Make hardlinks to the executable here\");\n        }\n        subcommand = cmd.subcommand();\n    }\n    match subcommand {\n        Some((\"false\", _)) => exit(1),\n        Some((\"true\", _)) => exit(0),\n        _ => unreachable!(\"parser should ensure only valid subcommand names are used\"),\n    }\n}\n"
  },
  {
    "path": "examples/multicall-hostname.md",
    "content": "See the documentation for [`Command::multicall`][crate::Command::multicall] for rationale.\n\nThis example omits the implementation of displaying address config\n\n```console\n$ hostname\nwww\n\n```\n*Note: without the links setup, we can't demonstrate the multicall behavior*\n"
  },
  {
    "path": "examples/multicall-hostname.rs",
    "content": "use clap::Command;\n\nfn main() {\n    let cmd = Command::new(env!(\"CARGO_CRATE_NAME\"))\n        .multicall(true)\n        .arg_required_else_help(true)\n        .subcommand_value_name(\"APPLET\")\n        .subcommand_help_heading(\"APPLETS\")\n        .subcommand(Command::new(\"hostname\").about(\"show hostname part of FQDN\"))\n        .subcommand(Command::new(\"dnsdomainname\").about(\"show domain name part of FQDN\"));\n\n    match cmd.get_matches().subcommand_name() {\n        Some(\"hostname\") => println!(\"www\"),\n        Some(\"dnsdomainname\") => println!(\"example.com\"),\n        _ => unreachable!(\"parser should ensure only valid subcommand names are used\"),\n    }\n}\n"
  },
  {
    "path": "examples/pacman.md",
    "content": "[`pacman`](https://wiki.archlinux.org/index.php/pacman) defines subcommands via flags.\n\nHere, `-S` is a short flag subcommand:\n```console\n$ pacman -S package\nInstalling package...\n\n```\n\nHere `--sync` is a long flag subcommand:\n```console\n$ pacman --sync package\nInstalling package...\n\n```\n\nNow the short flag subcommand (`-S`) with a long flag:\n```console\n$ pacman -S --search name\nSearching for name...\n\n```\n\nAnd the various forms of short flags that work:\n```console\n$ pacman -S -s name\nSearching for name...\n\n$ pacman -Ss name\nSearching for name...\n\n```\n*(users can \"stack\" short subcommands with short flags or with other short flag subcommands)*\n\nIn the help, this looks like:\n```console\n$ pacman -h\npackage manager utility\n\nUsage: pacman[EXE] <COMMAND>\n\nCommands:\n  query, -Q, --query  Query the package database.\n  sync, -S, --sync    Synchronize packages.\n  help                Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ pacman -S -h\nSynchronize packages.\n\nUsage: pacman[EXE] {sync|--sync|-S} [OPTIONS] [package]...\n\nArguments:\n  [package]...  packages\n\nOptions:\n  -s, --search <search>...  search remote repositories for matching strings\n  -i, --info                view package information\n  -h, --help                Print help\n\n```\n\nAnd errors:\n```console\n$ pacman -S -s foo -i bar\n? failed\nerror: the argument '--search <search>...' cannot be used with '--info'\n\nUsage: pacman[EXE] {sync|--sync|-S} --search <search>... <package>...\n\nFor more information, try '--help'.\n\n```\n\n<div class=\"warning\">\n\n**NOTE:** Keep in mind that subcommands, flags, and long flags are *case sensitive*: `-Q` and `-q` are different flags/subcommands. For example, you can have both `-Q` subcommand and `-q` flag, and they will be properly disambiguated.\nLet's make a quick program to illustrate.\n\n</div>\n"
  },
  {
    "path": "examples/pacman.rs",
    "content": "use clap::{Arg, ArgAction, Command};\n\nfn main() {\n    let matches = Command::new(\"pacman\")\n        .about(\"package manager utility\")\n        .version(\"5.2.1\")\n        .subcommand_required(true)\n        .arg_required_else_help(true)\n        // Query subcommand\n        //\n        // Only a few of its arguments are implemented below.\n        .subcommand(\n            Command::new(\"query\")\n                .short_flag('Q')\n                .long_flag(\"query\")\n                .about(\"Query the package database.\")\n                .arg(\n                    Arg::new(\"search\")\n                        .short('s')\n                        .long(\"search\")\n                        .help(\"search locally installed packages for matching strings\")\n                        .conflicts_with(\"info\")\n                        .action(ArgAction::Set)\n                        .num_args(1..),\n                )\n                .arg(\n                    Arg::new(\"info\")\n                        .long(\"info\")\n                        .short('i')\n                        .conflicts_with(\"search\")\n                        .help(\"view package information\")\n                        .action(ArgAction::Set)\n                        .num_args(1..),\n                ),\n        )\n        // Sync subcommand\n        //\n        // Only a few of its arguments are implemented below.\n        .subcommand(\n            Command::new(\"sync\")\n                .short_flag('S')\n                .long_flag(\"sync\")\n                .about(\"Synchronize packages.\")\n                .arg(\n                    Arg::new(\"search\")\n                        .short('s')\n                        .long(\"search\")\n                        .conflicts_with(\"info\")\n                        .action(ArgAction::Set)\n                        .num_args(1..)\n                        .help(\"search remote repositories for matching strings\"),\n                )\n                .arg(\n                    Arg::new(\"info\")\n                        .long(\"info\")\n                        .conflicts_with(\"search\")\n                        .short('i')\n                        .action(ArgAction::SetTrue)\n                        .help(\"view package information\"),\n                )\n                .arg(\n                    Arg::new(\"package\")\n                        .help(\"packages\")\n                        .required_unless_present(\"search\")\n                        .action(ArgAction::Set)\n                        .num_args(1..),\n                ),\n        )\n        .get_matches();\n\n    match matches.subcommand() {\n        Some((\"sync\", sync_matches)) => {\n            if sync_matches.contains_id(\"search\") {\n                let packages: Vec<_> = sync_matches\n                    .get_many::<String>(\"search\")\n                    .expect(\"contains_id\")\n                    .map(|s| s.as_str())\n                    .collect();\n                let values = packages.join(\", \");\n                println!(\"Searching for {values}...\");\n                return;\n            }\n\n            let packages: Vec<_> = sync_matches\n                .get_many::<String>(\"package\")\n                .expect(\"is present\")\n                .map(|s| s.as_str())\n                .collect();\n            let values = packages.join(\", \");\n\n            if sync_matches.get_flag(\"info\") {\n                println!(\"Retrieving info for {values}...\");\n            } else {\n                println!(\"Installing {values}...\");\n            }\n        }\n        Some((\"query\", query_matches)) => {\n            if let Some(packages) = query_matches.get_many::<String>(\"info\") {\n                let comma_sep = packages.map(|s| s.as_str()).collect::<Vec<_>>().join(\", \");\n                println!(\"Retrieving info for {comma_sep}...\");\n            } else if let Some(queries) = query_matches.get_many::<String>(\"search\") {\n                let comma_sep = queries.map(|s| s.as_str()).collect::<Vec<_>>().join(\", \");\n                println!(\"Searching Locally for {comma_sep}...\");\n            } else {\n                println!(\"Displaying all locally installed packages...\");\n            }\n        }\n        _ => unreachable!(), // If all subcommands are defined above, anything else is unreachable\n    }\n}\n"
  },
  {
    "path": "examples/repl-derive.rs",
    "content": "use std::io::Write;\n\nuse clap::{Parser, Subcommand};\n\nfn main() -> Result<(), String> {\n    loop {\n        let line = readline()?;\n        let line = line.trim();\n        if line.is_empty() {\n            continue;\n        }\n\n        match respond(line) {\n            Ok(quit) => {\n                if quit {\n                    break;\n                }\n            }\n            Err(err) => {\n                write!(std::io::stdout(), \"{err}\").map_err(|e| e.to_string())?;\n                std::io::stdout().flush().map_err(|e| e.to_string())?;\n            }\n        }\n    }\n\n    Ok(())\n}\n\nfn respond(line: &str) -> Result<bool, String> {\n    let args = shlex::split(line).ok_or(\"error: Invalid quoting\")?;\n    let cli = Cli::try_parse_from(args).map_err(|e| e.to_string())?;\n    match cli.command {\n        Commands::Ping => {\n            write!(std::io::stdout(), \"Pong\").map_err(|e| e.to_string())?;\n            std::io::stdout().flush().map_err(|e| e.to_string())?;\n        }\n        Commands::Exit => {\n            write!(std::io::stdout(), \"Exiting ...\").map_err(|e| e.to_string())?;\n            std::io::stdout().flush().map_err(|e| e.to_string())?;\n            return Ok(true);\n        }\n    }\n    Ok(false)\n}\n\n#[derive(Debug, Parser)]\n#[command(multicall = true)]\nstruct Cli {\n    #[command(subcommand)]\n    command: Commands,\n}\n\n#[derive(Debug, Subcommand)]\nenum Commands {\n    Ping,\n    Exit,\n}\n\nfn readline() -> Result<String, String> {\n    write!(std::io::stdout(), \"$ \").map_err(|e| e.to_string())?;\n    std::io::stdout().flush().map_err(|e| e.to_string())?;\n    let mut buffer = String::new();\n    std::io::stdin()\n        .read_line(&mut buffer)\n        .map_err(|e| e.to_string())?;\n    Ok(buffer)\n}\n"
  },
  {
    "path": "examples/repl.rs",
    "content": "use std::io::Write;\n\nuse clap::Command;\n\nfn main() -> Result<(), String> {\n    loop {\n        let line = readline()?;\n        let line = line.trim();\n        if line.is_empty() {\n            continue;\n        }\n\n        match respond(line) {\n            Ok(quit) => {\n                if quit {\n                    break;\n                }\n            }\n            Err(err) => {\n                write!(std::io::stdout(), \"{err}\").map_err(|e| e.to_string())?;\n                std::io::stdout().flush().map_err(|e| e.to_string())?;\n            }\n        }\n    }\n\n    Ok(())\n}\n\nfn respond(line: &str) -> Result<bool, String> {\n    let args = shlex::split(line).ok_or(\"error: Invalid quoting\")?;\n    let matches = cli()\n        .try_get_matches_from(args)\n        .map_err(|e| e.to_string())?;\n    match matches.subcommand() {\n        Some((\"ping\", _matches)) => {\n            write!(std::io::stdout(), \"Pong\").map_err(|e| e.to_string())?;\n            std::io::stdout().flush().map_err(|e| e.to_string())?;\n        }\n        Some((\"quit\", _matches)) => {\n            write!(std::io::stdout(), \"Exiting ...\").map_err(|e| e.to_string())?;\n            std::io::stdout().flush().map_err(|e| e.to_string())?;\n            return Ok(true);\n        }\n        Some((name, _matches)) => unimplemented!(\"{name}\"),\n        None => unreachable!(\"subcommand required\"),\n    }\n\n    Ok(false)\n}\n\nfn cli() -> Command {\n    // strip out usage\n    const PARSER_TEMPLATE: &str = \"\\\n        {all-args}\n    \";\n    // strip out name/version\n    const APPLET_TEMPLATE: &str = \"\\\n        {about-with-newline}\\n\\\n        {usage-heading}\\n    {usage}\\n\\\n        \\n\\\n        {all-args}{after-help}\\\n    \";\n\n    Command::new(\"repl\")\n        .multicall(true)\n        .arg_required_else_help(true)\n        .subcommand_required(true)\n        .subcommand_value_name(\"APPLET\")\n        .subcommand_help_heading(\"APPLETS\")\n        .help_template(PARSER_TEMPLATE)\n        .subcommand(\n            Command::new(\"ping\")\n                .about(\"Get a response\")\n                .help_template(APPLET_TEMPLATE),\n        )\n        .subcommand(\n            Command::new(\"quit\")\n                .alias(\"exit\")\n                .about(\"Quit the REPL\")\n                .help_template(APPLET_TEMPLATE),\n        )\n}\n\nfn readline() -> Result<String, String> {\n    write!(std::io::stdout(), \"$ \").map_err(|e| e.to_string())?;\n    std::io::stdout().flush().map_err(|e| e.to_string())?;\n    let mut buffer = String::new();\n    std::io::stdin()\n        .read_line(&mut buffer)\n        .map_err(|e| e.to_string())?;\n    Ok(buffer)\n}\n"
  },
  {
    "path": "examples/tutorial_builder/01_quick.md",
    "content": "```console\n$ 01_quick --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 01_quick[EXE] [OPTIONS] [name] [COMMAND]\n\nCommands:\n  test  does testing things\n  help  Print this message or the help of the given subcommand(s)\n\nArguments:\n  [name]  Optional name to operate on\n\nOptions:\n  -c, --config <FILE>  Sets a custom config file\n  -d, --debug...       Turn debugging information on\n  -h, --help           Print help\n  -V, --version        Print version\n\n```\n\nBy default, the program does nothing:\n```console\n$ 01_quick\nDebug mode is off\n\n```\n\nBut you can mix and match the various features\n```console\n$ 01_quick -dd test\nDebug mode is on\nNot printing testing lists...\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/01_quick.rs",
    "content": "use std::path::PathBuf;\n\nuse clap::{ArgAction, Command, arg, command, value_parser};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(arg!([name] \"Optional name to operate on\"))\n        .arg(\n            arg!(\n                -c --config <FILE> \"Sets a custom config file\"\n            )\n            // We don't have syntax yet for optional options, so manually calling `required`\n            .required(false)\n            .value_parser(value_parser!(PathBuf)),\n        )\n        .arg(arg!(\n            -d --debug ... \"Turn debugging information on\"\n        ))\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"does testing things\")\n                .arg(arg!(-l --list \"lists test values\").action(ArgAction::SetTrue)),\n        )\n        .get_matches();\n\n    // You can check the value provided by positional arguments, or option arguments\n    if let Some(name) = matches.get_one::<String>(\"name\") {\n        println!(\"Value for name: {name}\");\n    }\n\n    if let Some(config_path) = matches.get_one::<PathBuf>(\"config\") {\n        println!(\"Value for config: {}\", config_path.display());\n    }\n\n    // You can see how many times a particular flag or argument occurred\n    // Note, only flags can have multiple occurrences\n    match matches\n        .get_one::<u8>(\"debug\")\n        .expect(\"Counts are defaulted\")\n    {\n        0 => println!(\"Debug mode is off\"),\n        1 => println!(\"Debug mode is kind of on\"),\n        2 => println!(\"Debug mode is on\"),\n        _ => println!(\"Don't be crazy\"),\n    }\n\n    // You can check for the existence of subcommands, and if found use their\n    // matches just as you would the top level cmd\n    if let Some(matches) = matches.subcommand_matches(\"test\") {\n        // \"$ myapp test\" was run\n        if matches.get_flag(\"list\") {\n            // \"$ myapp test -l\" was run\n            println!(\"Printing testing lists...\");\n        } else {\n            println!(\"Not printing testing lists...\");\n        }\n    }\n\n    // Continued program logic goes here...\n}\n"
  },
  {
    "path": "examples/tutorial_builder/02_app_settings.md",
    "content": "```console\n$ 02_app_settings --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 02_app_settings[EXE] --two <VALUE> --one <VALUE>\n\nOptions:\n      --two <VALUE>\n          \n      --one <VALUE>\n          \n  -h, --help\n          Print help\n  -V, --version\n          Print version\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/02_app_settings.rs",
    "content": "use clap::{ArgAction, arg, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .next_line_help(true)\n        .arg(arg!(--two <VALUE>).required(true).action(ArgAction::Set))\n        .arg(arg!(--one <VALUE>).required(true).action(ArgAction::Set))\n        .get_matches();\n\n    println!(\n        \"two: {:?}\",\n        matches.get_one::<String>(\"two\").expect(\"required\")\n    );\n    println!(\n        \"one: {:?}\",\n        matches.get_one::<String>(\"one\").expect(\"required\")\n    );\n}\n"
  },
  {
    "path": "examples/tutorial_builder/02_apps.md",
    "content": "```console\n$ 02_apps --help\nDoes awesome things\n\nUsage: 02_apps[EXE] --two <VALUE> --one <VALUE>\n\nOptions:\n      --two <VALUE>  \n      --one <VALUE>  \n  -h, --help         Print help\n  -V, --version      Print version\n\n$ 02_apps --version\nMyApp 1.0\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/02_apps.rs",
    "content": "use clap::{Command, arg};\n\nfn main() {\n    let matches = Command::new(\"MyApp\")\n        .version(\"1.0\")\n        .about(\"Does awesome things\")\n        .arg(arg!(--two <VALUE>).required(true))\n        .arg(arg!(--one <VALUE>).required(true))\n        .get_matches();\n\n    println!(\n        \"two: {:?}\",\n        matches.get_one::<String>(\"two\").expect(\"required\")\n    );\n    println!(\n        \"one: {:?}\",\n        matches.get_one::<String>(\"one\").expect(\"required\")\n    );\n}\n"
  },
  {
    "path": "examples/tutorial_builder/02_crate.md",
    "content": "```console\n$ 02_crate --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 02_crate[EXE] --two <VALUE> --one <VALUE>\n\nOptions:\n      --two <VALUE>  \n      --one <VALUE>  \n  -h, --help         Print help\n  -V, --version      Print version\n\n$ 02_crate --version\nclap [..]\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/02_crate.rs",
    "content": "use clap::{arg, command};\n\nfn main() {\n    // requires `cargo` feature, reading name, version, author, and description from `Cargo.toml`\n    let matches = command!()\n        .arg(arg!(--two <VALUE>).required(true))\n        .arg(arg!(--one <VALUE>).required(true))\n        .get_matches();\n\n    println!(\n        \"two: {:?}\",\n        matches.get_one::<String>(\"two\").expect(\"required\")\n    );\n    println!(\n        \"one: {:?}\",\n        matches.get_one::<String>(\"one\").expect(\"required\")\n    );\n}\n"
  },
  {
    "path": "examples/tutorial_builder/03_01_flag_bool.md",
    "content": "```console\n$ 03_01_flag_bool --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_01_flag_bool[EXE] [OPTIONS]\n\nOptions:\n  -v, --verbose  \n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_01_flag_bool\nverbose: false\n\n$ 03_01_flag_bool --verbose\nverbose: true\n\n$ 03_01_flag_bool --verbose --verbose\n? failed\nerror: the argument '--verbose' cannot be used multiple times\n\nUsage: 03_01_flag_bool[EXE] [OPTIONS]\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/03_01_flag_bool.rs",
    "content": "use clap::{Arg, ArgAction, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(\n            Arg::new(\"verbose\")\n                .short('v')\n                .long(\"verbose\")\n                .action(ArgAction::SetTrue),\n        )\n        .get_matches();\n\n    println!(\"verbose: {:?}\", matches.get_flag(\"verbose\"));\n}\n"
  },
  {
    "path": "examples/tutorial_builder/03_01_flag_count.md",
    "content": "```console\n$ 03_01_flag_count --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_01_flag_count[EXE] [OPTIONS]\n\nOptions:\n  -v, --verbose...  \n  -h, --help        Print help\n  -V, --version     Print version\n\n$ 03_01_flag_count\nverbose: 0\n\n$ 03_01_flag_count --verbose\nverbose: 1\n\n$ 03_01_flag_count --verbose --verbose\nverbose: 2\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/03_01_flag_count.rs",
    "content": "use clap::{Arg, ArgAction, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(\n            Arg::new(\"verbose\")\n                .short('v')\n                .long(\"verbose\")\n                .action(ArgAction::Count),\n        )\n        .get_matches();\n\n    println!(\"verbose: {:?}\", matches.get_count(\"verbose\"));\n}\n"
  },
  {
    "path": "examples/tutorial_builder/03_02_option.md",
    "content": "```console\n$ 03_02_option --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_02_option[EXE] [OPTIONS]\n\nOptions:\n  -n, --name <name>  \n  -h, --help         Print help\n  -V, --version      Print version\n\n$ 03_02_option\nname: None\n\n$ 03_02_option --name bob\nname: Some(\"bob\")\n\n$ 03_02_option --name=bob\nname: Some(\"bob\")\n\n$ 03_02_option -n bob\nname: Some(\"bob\")\n\n$ 03_02_option -n=bob\nname: Some(\"bob\")\n\n$ 03_02_option -nbob\nname: Some(\"bob\")\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/03_02_option.rs",
    "content": "use clap::{Arg, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(Arg::new(\"name\").short('n').long(\"name\"))\n        .get_matches();\n\n    println!(\"name: {:?}\", matches.get_one::<String>(\"name\"));\n}\n"
  },
  {
    "path": "examples/tutorial_builder/03_02_option_mult.md",
    "content": "```console\n$ 03_02_option_mult --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_02_option_mult[EXE] [OPTIONS]\n\nOptions:\n  -n, --name <name>  \n  -h, --help         Print help\n  -V, --version      Print version\n\n$ 03_02_option_mult\nnames: []\n\n$ 03_02_option_mult --name bob\nnames: [\"bob\"]\n\n$ 03_02_option_mult --name bob --name john\nnames: [\"bob\", \"john\"]\n\n$ 03_02_option_mult_derive --name bob --name=john -n tom -n=chris -nsteve\nname: [\"bob\", \"john\", \"tom\", \"chris\", \"steve\"]\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/03_02_option_mult.rs",
    "content": "use clap::{Arg, ArgAction, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(\n            Arg::new(\"name\")\n                .short('n')\n                .long(\"name\")\n                .action(ArgAction::Append),\n        )\n        .get_matches();\n\n    let args = matches\n        .get_many::<String>(\"name\")\n        .unwrap_or_default()\n        .map(|v| v.as_str())\n        .collect::<Vec<_>>();\n\n    println!(\"names: {:?}\", &args);\n}\n"
  },
  {
    "path": "examples/tutorial_builder/03_03_positional.md",
    "content": "```console\n$ 03_03_positional --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_03_positional[EXE] [name]\n\nArguments:\n  [name]  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_03_positional\nname: None\n\n$ 03_03_positional bob\nname: Some(\"bob\")\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/03_03_positional.rs",
    "content": "use clap::{Arg, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(Arg::new(\"name\"))\n        .get_matches();\n\n    println!(\"name: {:?}\", matches.get_one::<String>(\"name\"));\n}\n"
  },
  {
    "path": "examples/tutorial_builder/03_03_positional_mult.md",
    "content": "```console\n$ 03_03_positional_mult --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_03_positional_mult[EXE] [name]...\n\nArguments:\n  [name]...  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_03_positional_mult\nnames: []\n\n$ 03_03_positional_mult bob\nnames: [\"bob\"]\n\n$ 03_03_positional_mult bob john\nnames: [\"bob\", \"john\"]\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/03_03_positional_mult.rs",
    "content": "use clap::{Arg, ArgAction, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(Arg::new(\"name\").action(ArgAction::Append))\n        .get_matches();\n\n    let args = matches\n        .get_many::<String>(\"name\")\n        .unwrap_or_default()\n        .map(|v| v.as_str())\n        .collect::<Vec<_>>();\n\n    println!(\"names: {:?}\", &args);\n}\n"
  },
  {
    "path": "examples/tutorial_builder/03_04_subcommands.md",
    "content": "```console\n$ 03_04_subcommands help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_04_subcommands[EXE] <COMMAND>\n\nCommands:\n  add   Adds files to myapp\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_04_subcommands help add\nAdds files to myapp\n\nUsage: 03_04_subcommands[EXE] add [NAME]\n\nArguments:\n  [NAME]  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_04_subcommands add bob\n'myapp add' was used, name is: Some(\"bob\")\n\n```\n\nWe set\n[`Command::arg_required_else_help`][crate::Command::arg_required_else_help] to\nshow the help, rather than an error, when the\n[required subcommand][crate::Command::subcommand_required] is missing:\n```console\n$ 03_04_subcommands\n? failed\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_04_subcommands[EXE] <COMMAND>\n\nCommands:\n  add   Adds files to myapp\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n```\n\nSince we specified [`Command::propagate_version`][crate::Command::propagate_version], the `--version` flag\nis available in all subcommands:\n```console\n$ 03_04_subcommands --version\nclap [..]\n\n$ 03_04_subcommands add --version\nclap-add [..]\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/03_04_subcommands.rs",
    "content": "use clap::{Command, arg, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .propagate_version(true)\n        .subcommand_required(true)\n        .arg_required_else_help(true)\n        .subcommand(\n            Command::new(\"add\")\n                .about(\"Adds files to myapp\")\n                .arg(arg!([NAME])),\n        )\n        .get_matches();\n\n    match matches.subcommand() {\n        Some((\"add\", sub_matches)) => println!(\n            \"'myapp add' was used, name is: {:?}\",\n            sub_matches.get_one::<String>(\"NAME\")\n        ),\n        _ => unreachable!(\"Exhausted list of subcommands and subcommand_required prevents `None`\"),\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_builder/03_05_default_values.md",
    "content": "```console\n$ 03_05_default_values --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_05_default_values[EXE] [PORT]\n\nArguments:\n  [PORT]  [default: 2020]\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_05_default_values\nport: 2020\n\n$ 03_05_default_values 22\nport: 22\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/03_05_default_values.rs",
    "content": "use clap::{arg, command, value_parser};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(\n            arg!([PORT])\n                .value_parser(value_parser!(u16))\n                .default_value(\"2020\"),\n        )\n        .get_matches();\n\n    println!(\n        \"port: {:?}\",\n        matches\n            .get_one::<u16>(\"PORT\")\n            .expect(\"default ensures there is always a value\")\n    );\n}\n"
  },
  {
    "path": "examples/tutorial_builder/03_06_required.md",
    "content": "```console\n$ 03_06_required --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_06_required[EXE] <name>\n\nArguments:\n  <name>  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_06_required\n? 2\nerror: the following required arguments were not provided:\n  <name>\n\nUsage: 03_06_required[EXE] <name>\n\nFor more information, try '--help'.\n\n$ 03_06_required bob\nname: \"bob\"\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/03_06_required.rs",
    "content": "use clap::{Arg, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(Arg::new(\"name\").required(true))\n        .get_matches();\n\n    println!(\n        \"name: {:?}\",\n        matches\n            .get_one::<String>(\"name\")\n            .expect(\"clap `required` ensures its present\")\n    );\n}\n"
  },
  {
    "path": "examples/tutorial_builder/04_01_enum.md",
    "content": "```console\n$ 04_01_enum --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_01_enum[EXE] <MODE>\n\nArguments:\n  <MODE>\n          What mode to run the program in\n\n          Possible values:\n          - fast: Run swiftly\n          - slow: Crawl slowly but steadily\n\nOptions:\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\n$ 04_01_enum -h\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_01_enum[EXE] <MODE>\n\nArguments:\n  <MODE>  What mode to run the program in [possible values: fast, slow]\n\nOptions:\n  -h, --help     Print help (see more with '--help')\n  -V, --version  Print version\n\n$ 04_01_enum fast\nHare\n\n$ 04_01_enum slow\nTortoise\n\n$ 04_01_enum medium\n? failed\nerror: invalid value 'medium' for '<MODE>'\n  [possible values: fast, slow]\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/04_01_enum.rs",
    "content": "use clap::{ValueEnum, arg, builder::PossibleValue, command, value_parser};\n\n#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]\nenum Mode {\n    Fast,\n    Slow,\n}\n\n// Can also be derived with feature flag `derive`\nimpl ValueEnum for Mode {\n    fn value_variants<'a>() -> &'a [Self] {\n        &[Mode::Fast, Mode::Slow]\n    }\n\n    fn to_possible_value(&self) -> Option<PossibleValue> {\n        Some(match self {\n            Mode::Fast => PossibleValue::new(\"fast\").help(\"Run swiftly\"),\n            Mode::Slow => PossibleValue::new(\"slow\").help(\"Crawl slowly but steadily\"),\n        })\n    }\n}\n\nimpl std::fmt::Display for Mode {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.to_possible_value()\n            .expect(\"no values are skipped\")\n            .get_name()\n            .fmt(f)\n    }\n}\n\nimpl std::str::FromStr for Mode {\n    type Err = String;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        for variant in Self::value_variants() {\n            if variant.to_possible_value().unwrap().matches(s, false) {\n                return Ok(*variant);\n            }\n        }\n        Err(format!(\"invalid variant: {s}\"))\n    }\n}\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(\n            arg!(<MODE>)\n                .help(\"What mode to run the program in\")\n                .value_parser(value_parser!(Mode)),\n        )\n        .get_matches();\n\n    // Note, it's safe to call unwrap() because the arg is required\n    match matches\n        .get_one::<Mode>(\"MODE\")\n        .expect(\"'MODE' is required and parsing will fail if its missing\")\n    {\n        Mode::Fast => {\n            println!(\"Hare\");\n        }\n        Mode::Slow => {\n            println!(\"Tortoise\");\n        }\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_builder/04_01_possible.md",
    "content": "```console\n$ 04_01_possible --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_01_possible[EXE] <MODE>\n\nArguments:\n  <MODE>  What mode to run the program in [possible values: fast, slow]\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 04_01_possible fast\nHare\n\n$ 04_01_possible slow\nTortoise\n\n$ 04_01_possible medium\n? failed\nerror: invalid value 'medium' for '<MODE>'\n  [possible values: fast, slow]\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/04_01_possible.rs",
    "content": "use clap::{arg, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(\n            arg!(<MODE>)\n                .help(\"What mode to run the program in\")\n                .value_parser([\"fast\", \"slow\"]),\n        )\n        .get_matches();\n\n    // Note, it's safe to call unwrap() because the arg is required\n    match matches\n        .get_one::<String>(\"MODE\")\n        .expect(\"'MODE' is required and parsing will fail if its missing\")\n        .as_str()\n    {\n        \"fast\" => {\n            println!(\"Hare\");\n        }\n        \"slow\" => {\n            println!(\"Tortoise\");\n        }\n        _ => unreachable!(),\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_builder/04_02_parse.md",
    "content": "```console\n$ 04_02_parse --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_02_parse[EXE] <PORT>\n\nArguments:\n  <PORT>  Network port to use\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 04_02_parse 22\nPORT = 22\n\n$ 04_02_parse foobar\n? failed\nerror: invalid value 'foobar' for '<PORT>': invalid digit found in string\n\nFor more information, try '--help'.\n\n$ 04_02_parse_derive 0\n? failed\nerror: invalid value '0' for '<PORT>': 0 is not in 1..=65535\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/04_02_parse.rs",
    "content": "use clap::{arg, command, value_parser};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(\n            arg!(<PORT>)\n                .help(\"Network port to use\")\n                .value_parser(value_parser!(u16).range(1..)),\n        )\n        .get_matches();\n\n    // Note, it's safe to call unwrap() because the arg is required\n    let port: u16 = *matches\n        .get_one::<u16>(\"PORT\")\n        .expect(\"'PORT' is required and parsing will fail if its missing\");\n    println!(\"PORT = {port}\");\n}\n"
  },
  {
    "path": "examples/tutorial_builder/04_02_validate.md",
    "content": "```console\n$ 04_02_validate --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_02_validate[EXE] <PORT>\n\nArguments:\n  <PORT>  Network port to use\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 04_02_validate 22\nPORT = 22\n\n$ 04_02_validate foobar\n? failed\nerror: invalid value 'foobar' for '<PORT>': `foobar` isn't a port number\n\nFor more information, try '--help'.\n\n$ 04_02_validate 0\n? failed\nerror: invalid value '0' for '<PORT>': port not in range 1-65535\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/04_02_validate.rs",
    "content": "use std::ops::RangeInclusive;\n\nuse clap::{arg, command};\n\nfn main() {\n    let matches = command!() // requires `cargo` feature\n        .arg(\n            arg!(<PORT>)\n                .help(\"Network port to use\")\n                .value_parser(port_in_range),\n        )\n        .get_matches();\n\n    // Note, it's safe to call unwrap() because the arg is required\n    let port: u16 = *matches\n        .get_one::<u16>(\"PORT\")\n        .expect(\"'PORT' is required and parsing will fail if its missing\");\n    println!(\"PORT = {port}\");\n}\n\nconst PORT_RANGE: RangeInclusive<usize> = 1..=65535;\n\nfn port_in_range(s: &str) -> Result<u16, String> {\n    let port: usize = s\n        .parse()\n        .map_err(|_| format!(\"`{s}` isn't a port number\"))?;\n    if PORT_RANGE.contains(&port) {\n        Ok(port as u16)\n    } else {\n        Err(format!(\n            \"port not in range {}-{}\",\n            PORT_RANGE.start(),\n            PORT_RANGE.end()\n        ))\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_builder/04_03_relations.md",
    "content": "```console\n$ 04_03_relations --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_03_relations[EXE] [OPTIONS] <--set-ver <VER>|--major|--minor|--patch> [INPUT_FILE]\n\nArguments:\n  [INPUT_FILE]  some regular input\n\nOptions:\n      --set-ver <VER>      set version manually\n      --major              auto inc major\n      --minor              auto inc minor\n      --patch              auto inc patch\n      --spec-in <SPEC_IN>  some special input argument\n  -c <CONFIG>              \n  -h, --help               Print help\n  -V, --version            Print version\n\n$ 04_03_relations\n? failed\nerror: the following required arguments were not provided:\n  <--set-ver <VER>|--major|--minor|--patch>\n\nUsage: 04_03_relations[EXE] <--set-ver <VER>|--major|--minor|--patch> [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_03_relations --major\nVersion: 2.2.3\n\n$ 04_03_relations --major --minor\n? failed\nerror: the argument '--major' cannot be used with '--minor'\n\nUsage: 04_03_relations[EXE] <--set-ver <VER>|--major|--minor|--patch> [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_03_relations --major -c config.toml\n? failed\nerror: the following required arguments were not provided:\n  <INPUT_FILE|--spec-in <SPEC_IN>>\n\nUsage: 04_03_relations[EXE] -c <CONFIG> <--set-ver <VER>|--major|--minor|--patch> <INPUT_FILE|--spec-in <SPEC_IN>>\n\nFor more information, try '--help'.\n\n$ 04_03_relations --major -c config.toml --spec-in input.txt\nVersion: 2.2.3\nDoing work using input input.txt and config config.toml\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/04_03_relations.rs",
    "content": "use std::path::PathBuf;\n\nuse clap::{ArgAction, ArgGroup, arg, command, value_parser};\n\nfn main() {\n    // Create application like normal\n    let matches = command!() // requires `cargo` feature\n        // Add the version arguments\n        .arg(arg!(--\"set-ver\" <VER> \"set version manually\"))\n        .arg(arg!(--major         \"auto inc major\").action(ArgAction::SetTrue))\n        .arg(arg!(--minor         \"auto inc minor\").action(ArgAction::SetTrue))\n        .arg(arg!(--patch         \"auto inc patch\").action(ArgAction::SetTrue))\n        // Create a group, make it required, and add the above arguments\n        .group(\n            ArgGroup::new(\"vers\")\n                .required(true)\n                .args([\"set-ver\", \"major\", \"minor\", \"patch\"]),\n        )\n        // Arguments can also be added to a group individually, these two arguments\n        // are part of the \"input\" group which is not required\n        .arg(\n            arg!([INPUT_FILE] \"some regular input\")\n                .value_parser(value_parser!(PathBuf))\n                .group(\"input\"),\n        )\n        .arg(\n            arg!(--\"spec-in\" <SPEC_IN> \"some special input argument\")\n                .value_parser(value_parser!(PathBuf))\n                .group(\"input\"),\n        )\n        // Now let's assume we have a -c [config] argument which requires one of\n        // (but **not** both) the \"input\" arguments\n        .arg(\n            arg!(config: -c <CONFIG>)\n                .value_parser(value_parser!(PathBuf))\n                .requires(\"input\"),\n        )\n        .get_matches();\n\n    // Let's assume the old version 1.2.3\n    let mut major = 1;\n    let mut minor = 2;\n    let mut patch = 3;\n\n    // See if --set-ver was used to set the version manually\n    let version = if let Some(ver) = matches.get_one::<String>(\"set-ver\") {\n        ver.to_owned()\n    } else {\n        // Increment the one requested (in a real program, we'd reset the lower numbers)\n        let (maj, min, pat) = (\n            matches.get_flag(\"major\"),\n            matches.get_flag(\"minor\"),\n            matches.get_flag(\"patch\"),\n        );\n        match (maj, min, pat) {\n            (true, _, _) => major += 1,\n            (_, true, _) => minor += 1,\n            (_, _, true) => patch += 1,\n            _ => unreachable!(),\n        };\n        format!(\"{major}.{minor}.{patch}\")\n    };\n\n    println!(\"Version: {version}\");\n\n    // Check for usage of -c\n    if matches.contains_id(\"config\") {\n        let input = matches\n            .get_one::<PathBuf>(\"INPUT_FILE\")\n            .unwrap_or_else(|| matches.get_one::<PathBuf>(\"spec-in\").unwrap())\n            .display();\n        println!(\n            \"Doing work using input {} and config {}\",\n            input,\n            matches.get_one::<PathBuf>(\"config\").unwrap().display()\n        );\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_builder/04_04_custom.md",
    "content": "```console\n$ 04_04_custom --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_04_custom[EXE] [OPTIONS] [INPUT_FILE]\n\nArguments:\n  [INPUT_FILE]  some regular input\n\nOptions:\n      --set-ver <VER>      set version manually\n      --major              auto inc major\n      --minor              auto inc minor\n      --patch              auto inc patch\n      --spec-in <SPEC_IN>  some special input argument\n  -c <CONFIG>              \n  -h, --help               Print help\n  -V, --version            Print version\n\n$ 04_04_custom\n? failed\nerror: Can only modify one version field\n\nUsage: 04_04_custom[EXE] [OPTIONS] [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_04_custom --major\nVersion: 2.2.3\n\n$ 04_04_custom --major --minor\n? failed\nerror: Can only modify one version field\n\nUsage: 04_04_custom[EXE] [OPTIONS] [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_04_custom --major -c config.toml\n? failed\nVersion: 2.2.3\nerror: INPUT_FILE or --spec-in is required when using --config\n\nUsage: 04_04_custom[EXE] [OPTIONS] [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_04_custom --major -c config.toml --spec-in input.txt\nVersion: 2.2.3\nDoing work using input input.txt and config config.toml\n\n```\n"
  },
  {
    "path": "examples/tutorial_builder/04_04_custom.rs",
    "content": "use std::path::PathBuf;\n\nuse clap::error::ErrorKind;\nuse clap::{ArgAction, arg, command, value_parser};\n\nfn main() {\n    // Create application like normal\n    let mut cmd = command!() // requires `cargo` feature\n        // Add the version arguments\n        .arg(arg!(--\"set-ver\" <VER> \"set version manually\"))\n        .arg(arg!(--major         \"auto inc major\").action(ArgAction::SetTrue))\n        .arg(arg!(--minor         \"auto inc minor\").action(ArgAction::SetTrue))\n        .arg(arg!(--patch         \"auto inc patch\").action(ArgAction::SetTrue))\n        // Arguments can also be added to a group individually, these two arguments\n        // are part of the \"input\" group which is not required\n        .arg(arg!([INPUT_FILE] \"some regular input\").value_parser(value_parser!(PathBuf)))\n        .arg(\n            arg!(--\"spec-in\" <SPEC_IN> \"some special input argument\")\n                .value_parser(value_parser!(PathBuf)),\n        )\n        // Now let's assume we have a -c [config] argument which requires one of\n        // (but **not** both) the \"input\" arguments\n        .arg(arg!(config: -c <CONFIG>).value_parser(value_parser!(PathBuf)));\n    let matches = cmd.get_matches_mut();\n\n    // Let's assume the old version 1.2.3\n    let mut major = 1;\n    let mut minor = 2;\n    let mut patch = 3;\n\n    // See if --set-ver was used to set the version manually\n    let version = if let Some(ver) = matches.get_one::<String>(\"set-ver\") {\n        if matches.get_flag(\"major\") || matches.get_flag(\"minor\") || matches.get_flag(\"patch\") {\n            cmd.error(\n                ErrorKind::ArgumentConflict,\n                \"Can't do relative and absolute version change\",\n            )\n            .exit();\n        }\n        ver.clone()\n    } else {\n        // Increment the one requested (in a real program, we'd reset the lower numbers)\n        let (maj, min, pat) = (\n            matches.get_flag(\"major\"),\n            matches.get_flag(\"minor\"),\n            matches.get_flag(\"patch\"),\n        );\n        match (maj, min, pat) {\n            (true, false, false) => major += 1,\n            (false, true, false) => minor += 1,\n            (false, false, true) => patch += 1,\n            _ => {\n                cmd.error(\n                    ErrorKind::ArgumentConflict,\n                    \"Can only modify one version field\",\n                )\n                .exit();\n            }\n        };\n        format!(\"{major}.{minor}.{patch}\")\n    };\n\n    println!(\"Version: {version}\");\n\n    // Check for usage of -c\n    if matches.contains_id(\"config\") {\n        let input = matches\n            .get_one::<PathBuf>(\"INPUT_FILE\")\n            .or_else(|| matches.get_one::<PathBuf>(\"spec-in\"))\n            .unwrap_or_else(|| {\n                cmd.error(\n                    ErrorKind::MissingRequiredArgument,\n                    \"INPUT_FILE or --spec-in is required when using --config\",\n                )\n                .exit()\n            })\n            .display();\n        println!(\n            \"Doing work using input {} and config {}\",\n            input,\n            matches.get_one::<PathBuf>(\"config\").unwrap().display()\n        );\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_builder/05_01_assert.rs",
    "content": "use clap::{arg, command, value_parser};\n\nfn main() {\n    let matches = cmd().get_matches();\n\n    // Note, it's safe to call unwrap() because the arg is required\n    let port: usize = *matches\n        .get_one::<usize>(\"PORT\")\n        .expect(\"'PORT' is required and parsing will fail if its missing\");\n    println!(\"PORT = {port}\");\n}\n\nfn cmd() -> clap::Command {\n    command!() // requires `cargo` feature\n        .arg(\n            arg!(<PORT>)\n                .help(\"Network port to use\")\n                .value_parser(value_parser!(usize)),\n        )\n}\n\n#[test]\nfn verify_cmd() {\n    cmd().debug_assert();\n}\n"
  },
  {
    "path": "examples/tutorial_derive/01_quick.md",
    "content": "```console\n$ 01_quick_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 01_quick_derive[EXE] [OPTIONS] [NAME] [COMMAND]\n\nCommands:\n  test  does testing things\n  help  Print this message or the help of the given subcommand(s)\n\nArguments:\n  [NAME]  Optional name to operate on\n\nOptions:\n  -c, --config <FILE>  Sets a custom config file\n  -d, --debug...       Turn debugging information on\n  -h, --help           Print help\n  -V, --version        Print version\n\n```\n\nBy default, the program does nothing:\n```console\n$ 01_quick_derive\nDebug mode is off\n\n```\n\nBut you can mix and match the various features\n```console\n$ 01_quick_derive -dd test\nDebug mode is on\nNot printing testing lists...\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/01_quick.rs",
    "content": "use std::path::PathBuf;\n\nuse clap::{Parser, Subcommand};\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    /// Optional name to operate on\n    name: Option<String>,\n\n    /// Sets a custom config file\n    #[arg(short, long, value_name = \"FILE\")]\n    config: Option<PathBuf>,\n\n    /// Turn debugging information on\n    #[arg(short, long, action = clap::ArgAction::Count)]\n    debug: u8,\n\n    #[command(subcommand)]\n    command: Option<Commands>,\n}\n\n#[derive(Subcommand)]\nenum Commands {\n    /// does testing things\n    Test {\n        /// lists test values\n        #[arg(short, long)]\n        list: bool,\n    },\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    // You can check the value provided by positional arguments, or option arguments\n    if let Some(name) = cli.name.as_deref() {\n        println!(\"Value for name: {name}\");\n    }\n\n    if let Some(config_path) = cli.config.as_deref() {\n        println!(\"Value for config: {}\", config_path.display());\n    }\n\n    // You can see how many times a particular flag or argument occurred\n    // Note, only flags can have multiple occurrences\n    match cli.debug {\n        0 => println!(\"Debug mode is off\"),\n        1 => println!(\"Debug mode is kind of on\"),\n        2 => println!(\"Debug mode is on\"),\n        _ => println!(\"Don't be crazy\"),\n    }\n\n    // You can check for the existence of subcommands, and if found use their\n    // matches just as you would the top level cmd\n    match &cli.command {\n        Some(Commands::Test { list }) => {\n            if *list {\n                println!(\"Printing testing lists...\");\n            } else {\n                println!(\"Not printing testing lists...\");\n            }\n        }\n        None => {}\n    }\n\n    // Continued program logic goes here...\n}\n"
  },
  {
    "path": "examples/tutorial_derive/02_app_settings.md",
    "content": "```console\n$ 02_app_settings_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 02_app_settings_derive[EXE] --two <TWO> --one <ONE>\n\nOptions:\n      --two <TWO>\n          \n      --one <ONE>\n          \n  -h, --help\n          Print help\n  -V, --version\n          Print version\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/02_app_settings.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\n#[command(next_line_help = true)]\nstruct Cli {\n    #[arg(long)]\n    two: String,\n    #[arg(long)]\n    one: String,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"two: {:?}\", cli.two);\n    println!(\"one: {:?}\", cli.one);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/02_apps.md",
    "content": "```console\n$ 02_apps_derive --help\nDoes awesome things\n\nUsage: 02_apps_derive[EXE] --two <TWO> --one <ONE>\n\nOptions:\n      --two <TWO>  \n      --one <ONE>  \n  -h, --help       Print help\n  -V, --version    Print version\n\n$ 02_apps_derive --version\nMyApp 1.0\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/02_apps.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(name = \"MyApp\")]\n#[command(version = \"1.0\")]\n#[command(about = \"Does awesome things\", long_about = None)]\nstruct Cli {\n    #[arg(long)]\n    two: String,\n    #[arg(long)]\n    one: String,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"two: {:?}\", cli.two);\n    println!(\"one: {:?}\", cli.one);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/02_crate.md",
    "content": "```console\n$ 02_crate_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 02_crate_derive[EXE] --two <TWO> --one <ONE>\n\nOptions:\n      --two <TWO>  \n      --one <ONE>  \n  -h, --help       Print help\n  -V, --version    Print version\n\n$ 02_crate_derive --version\nclap [..]\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/02_crate.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)] // Read from `Cargo.toml`\nstruct Cli {\n    #[arg(long)]\n    two: String,\n    #[arg(long)]\n    one: String,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"two: {:?}\", cli.two);\n    println!(\"one: {:?}\", cli.one);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_01_flag_bool.md",
    "content": "```console\n$ 03_01_flag_bool_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_01_flag_bool_derive[EXE] [OPTIONS]\n\nOptions:\n  -v, --verbose  \n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_01_flag_bool_derive\nverbose: false\n\n$ 03_01_flag_bool_derive --verbose\nverbose: true\n\n$ 03_01_flag_bool_derive --verbose --verbose\n? failed\nerror: the argument '--verbose' cannot be used multiple times\n\nUsage: 03_01_flag_bool_derive[EXE] [OPTIONS]\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/03_01_flag_bool.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    #[arg(short, long)]\n    verbose: bool,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"verbose: {:?}\", cli.verbose);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_01_flag_count.md",
    "content": "```console\n$ 03_01_flag_count_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_01_flag_count_derive[EXE] [OPTIONS]\n\nOptions:\n  -v, --verbose...  \n  -h, --help        Print help\n  -V, --version     Print version\n\n$ 03_01_flag_count_derive\nverbose: 0\n\n$ 03_01_flag_count_derive --verbose\nverbose: 1\n\n$ 03_01_flag_count_derive --verbose --verbose\nverbose: 2\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/03_01_flag_count.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    #[arg(short, long, action = clap::ArgAction::Count)]\n    verbose: u8,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"verbose: {:?}\", cli.verbose);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_02_option.md",
    "content": "```console\n$ 03_02_option_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_02_option_derive[EXE] --name <NAME>\n\nOptions:\n  -n, --name <NAME>  \n  -h, --help         Print help\n  -V, --version      Print version\n\n$ 03_02_option_derive\n? 2\nerror: the following required arguments were not provided:\n  --name <NAME>\n\nUsage: 03_02_option_derive[EXE] --name <NAME>\n\nFor more information, try '--help'.\n\n$ 03_02_option_derive --name bob\nname: \"bob\"\n\n$ 03_02_option_derive --name=bob\nname: \"bob\"\n\n$ 03_02_option_derive -n bob\nname: \"bob\"\n\n$ 03_02_option_derive -n=bob\nname: \"bob\"\n\n$ 03_02_option_derive -nbob\nname: \"bob\"\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/03_02_option.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    #[arg(short, long)]\n    name: String,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"name: {:?}\", cli.name);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_02_option_mult.md",
    "content": "```console\n$ 03_02_option_mult_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_02_option_mult_derive[EXE] [OPTIONS]\n\nOptions:\n  -n, --name <NAME>  \n  -h, --help         Print help\n  -V, --version      Print version\n\n$ 03_02_option_mult_derive\nname: []\n\n$ 03_02_option_mult_derive --name bob\nname: [\"bob\"]\n\n$ 03_02_option_mult_derive --name bob --name john\nname: [\"bob\", \"john\"]\n\n$ 03_02_option_mult_derive --name bob --name=john -n tom -n=chris -nsteve\nname: [\"bob\", \"john\", \"tom\", \"chris\", \"steve\"]\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/03_02_option_mult.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    #[arg(short, long)]\n    name: Vec<String>,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"name: {:?}\", cli.name);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_03_positional.md",
    "content": "```console\n$ 03_03_positional_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_03_positional_derive[EXE] <NAME>\n\nArguments:\n  <NAME>  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_03_positional_derive\n? 2\nerror: the following required arguments were not provided:\n  <NAME>\n\nUsage: 03_03_positional_derive[EXE] <NAME>\n\nFor more information, try '--help'.\n\n$ 03_03_positional_derive bob\nname: \"bob\"\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/03_03_positional.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    name: String,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"name: {:?}\", cli.name);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_03_positional_mult.md",
    "content": "```console\n$ 03_03_positional_mult_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_03_positional_mult_derive[EXE] [NAME]...\n\nArguments:\n  [NAME]...  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_03_positional_mult_derive\nname: []\n\n$ 03_03_positional_mult_derive bob\nname: [\"bob\"]\n\n$ 03_03_positional_mult_derive bob john\nname: [\"bob\", \"john\"]\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/03_03_positional_mult.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    name: Vec<String>,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"name: {:?}\", cli.name);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_04_subcommands.md",
    "content": "```console\n$ 03_04_subcommands_derive help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_04_subcommands_derive[EXE] <COMMAND>\n\nCommands:\n  add   Adds files to myapp\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_04_subcommands_derive help add\nAdds files to myapp\n\nUsage: 03_04_subcommands_derive[EXE] add [NAME]\n\nArguments:\n  [NAME]  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_04_subcommands_derive add bob\n'myapp add' was used, name is: Some(\"bob\")\n\n```\n\nWhen specifying commands with `command: Commands`, they are [required][crate::Command::subcommand_required].\nBy default, a missing subcommand will [show help rather than error][crate::Command::arg_required_else_help].\n```console\n$ 03_04_subcommands_derive\n? failed\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_04_subcommands_derive[EXE] <COMMAND>\n\nCommands:\n  add   Adds files to myapp\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n```\nTo make a subcommand optional, wrap it in an `Option` (e.g. `command: Option<Commands>`).\n\nSince we specified [`#[command(propagate_version = true)]`][crate::Command::propagate_version],\nthe `--version` flag is available in all subcommands:\n```console\n$ 03_04_subcommands_derive --version\nclap [..]\n\n$ 03_04_subcommands_derive add --version\nclap-add [..]\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/03_04_subcommands.rs",
    "content": "use clap::{Parser, Subcommand};\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\n#[command(propagate_version = true)]\nstruct Cli {\n    #[command(subcommand)]\n    command: Commands,\n}\n\n#[derive(Subcommand)]\nenum Commands {\n    /// Adds files to myapp\n    Add { name: Option<String> },\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    // You can check for the existence of subcommands, and if found use their\n    // matches just as you would the top level cmd\n    match &cli.command {\n        Commands::Add { name } => {\n            println!(\"'myapp add' was used, name is: {name:?}\");\n        }\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_04_subcommands_alt.rs",
    "content": "use clap::{Args, Parser, Subcommand};\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\n#[command(propagate_version = true)]\nstruct Cli {\n    #[command(subcommand)]\n    command: Commands,\n}\n\n#[derive(Subcommand)]\nenum Commands {\n    /// Adds files to myapp\n    Add(AddArgs),\n}\n\n#[derive(Args)]\nstruct AddArgs {\n    name: Option<String>,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    // You can check for the existence of subcommands, and if found use their\n    // matches just as you would the top level cmd\n    match &cli.command {\n        Commands::Add(name) => {\n            println!(\"'myapp add' was used, name is: {:?}\", name.name);\n        }\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_05_default_values.md",
    "content": "```console\n$ 03_05_default_values_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_05_default_values_derive[EXE] [PORT]\n\nArguments:\n  [PORT]  [default: 2020]\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_05_default_values_derive\nport: 2020\n\n$ 03_05_default_values_derive 22\nport: 22\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/03_05_default_values.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    #[arg(default_value_t = 2020)]\n    port: u16,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"port: {:?}\", cli.port);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/03_06_optional.md",
    "content": "```console\n$ 03_06_optional_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 03_06_optional_derive[EXE] [NAME]\n\nArguments:\n  [NAME]  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 03_06_optional_derive\nname: None\n\n$ 03_06_optional_derive bob\nname: Some(\"bob\")\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/03_06_optional.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    name: Option<String>,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"name: {:?}\", cli.name);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/04_01_enum.md",
    "content": "```console\n$ 04_01_enum_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_01_enum_derive[EXE] <MODE>\n\nArguments:\n  <MODE>\n          What mode to run the program in\n\n          Possible values:\n          - fast: Run swiftly\n          - slow: Crawl slowly but steadily\n\nOptions:\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\n$ 04_01_enum_derive -h\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_01_enum_derive[EXE] <MODE>\n\nArguments:\n  <MODE>  What mode to run the program in [possible values: fast, slow]\n\nOptions:\n  -h, --help     Print help (see more with '--help')\n  -V, --version  Print version\n\n$ 04_01_enum_derive fast\nHare\n\n$ 04_01_enum_derive slow\nTortoise\n\n$ 04_01_enum_derive medium\n? failed\nerror: invalid value 'medium' for '<MODE>'\n  [possible values: fast, slow]\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/04_01_enum.rs",
    "content": "use clap::{Parser, ValueEnum};\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    /// What mode to run the program in\n    #[arg(value_enum)]\n    mode: Mode,\n}\n\n#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]\nenum Mode {\n    /// Run swiftly\n    Fast,\n    /// Crawl slowly but steadily\n    ///\n    /// This paragraph is ignored because there is no long help text for possible values.\n    Slow,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    match cli.mode {\n        Mode::Fast => {\n            println!(\"Hare\");\n        }\n        Mode::Slow => {\n            println!(\"Tortoise\");\n        }\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_derive/04_02_parse.md",
    "content": "```console\n$ 04_02_parse_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_02_parse_derive[EXE] <PORT>\n\nArguments:\n  <PORT>  Network port to use\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 04_02_parse_derive 22\nPORT = 22\n\n$ 04_02_parse_derive foobar\n? failed\nerror: invalid value 'foobar' for '<PORT>': invalid digit found in string\n\nFor more information, try '--help'.\n\n$ 04_02_parse_derive 0\n? failed\nerror: invalid value '0' for '<PORT>': 0 is not in 1..=65535\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/04_02_parse.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    /// Network port to use\n    #[arg(value_parser = clap::value_parser!(u16).range(1..))]\n    port: u16,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"PORT = {}\", cli.port);\n}\n"
  },
  {
    "path": "examples/tutorial_derive/04_02_validate.md",
    "content": "```console\n$ 04_02_validate_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_02_validate_derive[EXE] <PORT>\n\nArguments:\n  <PORT>  Network port to use\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n$ 04_02_validate_derive 22\nPORT = 22\n\n$ 04_02_validate_derive foobar\n? failed\nerror: invalid value 'foobar' for '<PORT>': `foobar` isn't a port number\n\nFor more information, try '--help'.\n\n$ 04_02_validate_derive 0\n? failed\nerror: invalid value '0' for '<PORT>': port not in range 1-65535\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/04_02_validate.rs",
    "content": "use std::ops::RangeInclusive;\n\nuse clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    /// Network port to use\n    #[arg(value_parser = port_in_range)]\n    port: u16,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"PORT = {}\", cli.port);\n}\n\nconst PORT_RANGE: RangeInclusive<usize> = 1..=65535;\n\nfn port_in_range(s: &str) -> Result<u16, String> {\n    let port: usize = s\n        .parse()\n        .map_err(|_| format!(\"`{s}` isn't a port number\"))?;\n    if PORT_RANGE.contains(&port) {\n        Ok(port as u16)\n    } else {\n        Err(format!(\n            \"port not in range {}-{}\",\n            PORT_RANGE.start(),\n            PORT_RANGE.end()\n        ))\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_derive/04_03_relations.md",
    "content": "```console\n$ 04_03_relations_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_03_relations_derive[EXE] [OPTIONS] <--set-ver <VER>|--major|--minor|--patch> [INPUT_FILE]\n\nArguments:\n  [INPUT_FILE]  some regular input\n\nOptions:\n      --set-ver <VER>      set version manually\n      --major              auto inc major\n      --minor              auto inc minor\n      --patch              auto inc patch\n      --spec-in <SPEC_IN>  some special input argument\n  -c <CONFIG>              \n  -h, --help               Print help\n  -V, --version            Print version\n\n$ 04_03_relations_derive\n? failed\nerror: the following required arguments were not provided:\n  <--set-ver <VER>|--major|--minor|--patch>\n\nUsage: 04_03_relations_derive[EXE] <--set-ver <VER>|--major|--minor|--patch> [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_03_relations_derive --major\nVersion: 2.2.3\n\n$ 04_03_relations_derive --major --minor\n? failed\nerror: the argument '--major' cannot be used with '--minor'\n\nUsage: 04_03_relations_derive[EXE] <--set-ver <VER>|--major|--minor|--patch> [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_03_relations_derive --major -c config.toml\n? failed\nerror: the following required arguments were not provided:\n  <INPUT_FILE|--spec-in <SPEC_IN>>\n\nUsage: 04_03_relations_derive[EXE] -c <CONFIG> <--set-ver <VER>|--major|--minor|--patch> <INPUT_FILE|--spec-in <SPEC_IN>>\n\nFor more information, try '--help'.\n\n$ 04_03_relations_derive --major -c config.toml --spec-in input.txt\nVersion: 2.2.3\nDoing work using input input.txt and config config.toml\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/04_03_relations.rs",
    "content": "use clap::{Args, Parser};\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    #[command(flatten)]\n    vers: Vers,\n\n    /// some regular input\n    #[arg(group = \"input\")]\n    input_file: Option<String>,\n\n    /// some special input argument\n    #[arg(long, group = \"input\")]\n    spec_in: Option<String>,\n\n    #[arg(short, requires = \"input\")]\n    config: Option<String>,\n}\n\n#[derive(Args)]\n#[group(required = true, multiple = false)]\nstruct Vers {\n    /// set version manually\n    #[arg(long, value_name = \"VER\")]\n    set_ver: Option<String>,\n\n    /// auto inc major\n    #[arg(long)]\n    major: bool,\n\n    /// auto inc minor\n    #[arg(long)]\n    minor: bool,\n\n    /// auto inc patch\n    #[arg(long)]\n    patch: bool,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    // Let's assume the old version 1.2.3\n    let mut major = 1;\n    let mut minor = 2;\n    let mut patch = 3;\n\n    // See if --set_ver was used to set the version manually\n    let vers = &cli.vers;\n    let version = if let Some(ver) = vers.set_ver.as_deref() {\n        ver.to_string()\n    } else {\n        // Increment the one requested (in a real program, we'd reset the lower numbers)\n        let (maj, min, pat) = (vers.major, vers.minor, vers.patch);\n        match (maj, min, pat) {\n            (true, _, _) => major += 1,\n            (_, true, _) => minor += 1,\n            (_, _, true) => patch += 1,\n            _ => unreachable!(),\n        };\n        format!(\"{major}.{minor}.{patch}\")\n    };\n\n    println!(\"Version: {version}\");\n\n    // Check for usage of -c\n    if let Some(config) = cli.config.as_deref() {\n        let input = cli\n            .input_file\n            .as_deref()\n            .unwrap_or_else(|| cli.spec_in.as_deref().unwrap());\n        println!(\"Doing work using input {input} and config {config}\");\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_derive/04_04_custom.md",
    "content": "```console\n$ 04_04_custom_derive --help\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: 04_04_custom_derive[EXE] [OPTIONS] [INPUT_FILE]\n\nArguments:\n  [INPUT_FILE]  some regular input\n\nOptions:\n      --set-ver <VER>      set version manually\n      --major              auto inc major\n      --minor              auto inc minor\n      --patch              auto inc patch\n      --spec-in <SPEC_IN>  some special input argument\n  -c <CONFIG>              \n  -h, --help               Print help\n  -V, --version            Print version\n\n$ 04_04_custom_derive\n? failed\nerror: Can only modify one version field\n\nUsage: clap [OPTIONS] [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_04_custom_derive --major\nVersion: 2.2.3\n\n$ 04_04_custom_derive --major --minor\n? failed\nerror: Can only modify one version field\n\nUsage: clap [OPTIONS] [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_04_custom_derive --major -c config.toml\n? failed\nVersion: 2.2.3\nerror: INPUT_FILE or --spec-in is required when using --config\n\nUsage: clap [OPTIONS] [INPUT_FILE]\n\nFor more information, try '--help'.\n\n$ 04_04_custom_derive --major -c config.toml --spec-in input.txt\nVersion: 2.2.3\nDoing work using input input.txt and config config.toml\n\n```\n"
  },
  {
    "path": "examples/tutorial_derive/04_04_custom.rs",
    "content": "use clap::error::ErrorKind;\nuse clap::{CommandFactory, Parser};\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    /// set version manually\n    #[arg(long, value_name = \"VER\")]\n    set_ver: Option<String>,\n\n    /// auto inc major\n    #[arg(long)]\n    major: bool,\n\n    /// auto inc minor\n    #[arg(long)]\n    minor: bool,\n\n    /// auto inc patch\n    #[arg(long)]\n    patch: bool,\n\n    /// some regular input\n    input_file: Option<String>,\n\n    /// some special input argument\n    #[arg(long)]\n    spec_in: Option<String>,\n\n    #[arg(short)]\n    config: Option<String>,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    // Let's assume the old version 1.2.3\n    let mut major = 1;\n    let mut minor = 2;\n    let mut patch = 3;\n\n    // See if --set-ver was used to set the version manually\n    let version = if let Some(ver) = cli.set_ver.as_deref() {\n        if cli.major || cli.minor || cli.patch {\n            let mut cmd = Cli::command();\n            cmd.error(\n                ErrorKind::ArgumentConflict,\n                \"Can't do relative and absolute version change\",\n            )\n            .exit();\n        }\n        ver.to_string()\n    } else {\n        // Increment the one requested (in a real program, we'd reset the lower numbers)\n        let (maj, min, pat) = (cli.major, cli.minor, cli.patch);\n        match (maj, min, pat) {\n            (true, false, false) => major += 1,\n            (false, true, false) => minor += 1,\n            (false, false, true) => patch += 1,\n            _ => {\n                let mut cmd = Cli::command();\n                cmd.error(\n                    ErrorKind::ArgumentConflict,\n                    \"Can only modify one version field\",\n                )\n                .exit();\n            }\n        };\n        format!(\"{major}.{minor}.{patch}\")\n    };\n\n    println!(\"Version: {version}\");\n\n    // Check for usage of -c\n    if let Some(config) = cli.config.as_deref() {\n        let input = cli\n            .input_file\n            .as_deref()\n            // 'or' is preferred to 'or_else' here since `Option::as_deref` is 'const'\n            .or(cli.spec_in.as_deref())\n            .unwrap_or_else(|| {\n                let mut cmd = Cli::command();\n                cmd.error(\n                    ErrorKind::MissingRequiredArgument,\n                    \"INPUT_FILE or --spec-in is required when using --config\",\n                )\n                .exit()\n            });\n        println!(\"Doing work using input {input} and config {config}\");\n    }\n}\n"
  },
  {
    "path": "examples/tutorial_derive/05_01_assert.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser)]\n#[command(version, about, long_about = None)]\nstruct Cli {\n    /// Network port to use\n    port: u16,\n}\n\nfn main() {\n    let cli = Cli::parse();\n\n    println!(\"PORT = {}\", cli.port);\n}\n\n#[test]\nfn verify_cli() {\n    use clap::CommandFactory;\n    Cli::command().debug_assert();\n}\n"
  },
  {
    "path": "examples/typed-derive/builtin.md",
    "content": "Help:\n```console\n$ typed-derive builtin --help\nUsage: typed-derive builtin [OPTIONS]\n\nOptions:\n      --port <PORT>            Support for discrete numbers [default: 22] [possible values: 22, 80]\n      --log-level <LOG_LEVEL>  Support enums from a foreign crate that don't implement `ValueEnum` [default: info] [possible values: trace, debug, info, warn, error]\n  -h, --help                   Print help\n\n```\n\nDiscrete numbers\n```console\n$ typed-derive builtin --port 22\nBuiltin(BuiltInParsers { port: 22, log_level: Info })\n\n$ typed-derive builtin --port 80\nBuiltin(BuiltInParsers { port: 80, log_level: Info })\n\n$ typed-derive builtin --port\n? failed\nerror: a value is required for '--port <PORT>' but none was supplied\n  [possible values: 22, 80]\n\nFor more information, try '--help'.\n\n$ typed-derive builtin --port 3000\n? failed\nerror: invalid value '3000' for '--port <PORT>'\n  [possible values: 22, 80]\n\nFor more information, try '--help'.\n\n```\n\nEnums from crates that can't implement `ValueEnum`\n```console\n$ typed-derive builtin --log-level debug\nBuiltin(BuiltInParsers { port: 22, log_level: Debug })\n\n$ typed-derive builtin --log-level error\nBuiltin(BuiltInParsers { port: 22, log_level: Error })\n\n$ typed-derive builtin --log-level\n? failed\nerror: a value is required for '--log-level <LOG_LEVEL>' but none was supplied\n  [possible values: trace, debug, info, warn, error]\n\nFor more information, try '--help'.\n\n$ typed-derive builtin --log-level critical\n? failed\nerror: invalid value 'critical' for '--log-level <LOG_LEVEL>'\n  [possible values: trace, debug, info, warn, error]\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/typed-derive/builtin.rs",
    "content": "use clap::Args;\nuse clap::builder::TypedValueParser as _;\n\nuse crate::foreign_crate;\n\n#[derive(Args, Debug)]\npub(crate) struct BuiltInParsers {\n    /// Support for discrete numbers\n    #[arg(\n        long,\n        default_value_t = 22,\n        value_parser = clap::builder::PossibleValuesParser::new([\"22\", \"80\"])\n            .map(|s| s.parse::<usize>().unwrap()),\n    )]\n    port: usize,\n\n    /// Support enums from a foreign crate that don't implement `ValueEnum`\n    #[arg(\n        long,\n        default_value_t = foreign_crate::LogLevel::Info,\n        value_parser = clap::builder::PossibleValuesParser::new([\"trace\", \"debug\", \"info\", \"warn\", \"error\"])\n            .map(|s| s.parse::<foreign_crate::LogLevel>().unwrap()),\n    )]\n    log_level: foreign_crate::LogLevel,\n}\n"
  },
  {
    "path": "examples/typed-derive/custom.md",
    "content": "Help:\n```console\n$ typed-derive custom --help\nUsage: typed-derive custom [OPTIONS]\n\nOptions:\n      --target-version <TARGET_VERSION>\n          Hand-implement `TypedValueParser`\n\n          Possible values:\n          - major: Increase the major version (x.0.0)\n          - minor: Increase the minor version (x.y.0)\n          - patch: Increase the patch version (x.y.z)\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n```\n\nDefines (key-value pairs)\n```console\n$ typed-derive custom --target-version major\nCustom(CustomParser { target_version: Some(Relative(Major)) })\n\n$ typed-derive custom --target-version 10.0.0\nCustom(CustomParser { target_version: Some(Absolute(Version { major: 10, minor: 0, patch: 0 })) })\n\n$ typed-derive custom --target-version 10\n? failed\nerror: invalid value '10' for '--target-version <TARGET_VERSION>': unexpected end of input while parsing major version number\n\nFor more information, try '--help'.\n\n$ typed-derive custom --target-version blue\n? failed\nerror: invalid value 'blue' for '--target-version <TARGET_VERSION>': unexpected character 'b' while parsing major version number\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/typed-derive/custom.rs",
    "content": "use clap::Args;\n\nuse crate::implicit::BumpLevel;\n\n#[derive(Args, Debug)]\npub(crate) struct CustomParser {\n    /// Hand-implement `TypedValueParser`\n    #[arg(long)]\n    target_version: Option<TargetVersion>,\n}\n\n/// Enum or custom value\n#[derive(Clone, Debug)]\npub(crate) enum TargetVersion {\n    Relative(BumpLevel),\n    Absolute(semver::Version),\n}\n\nimpl std::fmt::Display for TargetVersion {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {\n        match self {\n            TargetVersion::Relative(bump_level) => {\n                write!(f, \"{bump_level}\")\n            }\n            TargetVersion::Absolute(version) => {\n                write!(f, \"{version}\")\n            }\n        }\n    }\n}\n\nimpl std::str::FromStr for TargetVersion {\n    type Err = String;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        if let Ok(bump_level) = BumpLevel::from_str(s) {\n            Ok(TargetVersion::Relative(bump_level))\n        } else {\n            Ok(TargetVersion::Absolute(\n                semver::Version::parse(s).map_err(|e| e.to_string())?,\n            ))\n        }\n    }\n}\n\n/// Default to `TargetVersionParser` for `TargetVersion`, instead of `FromStr`\nimpl clap::builder::ValueParserFactory for TargetVersion {\n    type Parser = TargetVersionParser;\n\n    fn value_parser() -> Self::Parser {\n        TargetVersionParser\n    }\n}\n\n#[derive(Copy, Clone)]\npub(crate) struct TargetVersionParser;\n\nimpl clap::builder::TypedValueParser for TargetVersionParser {\n    type Value = TargetVersion;\n\n    fn parse_ref(\n        &self,\n        cmd: &clap::Command,\n        arg: Option<&clap::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, clap::Error> {\n        let inner_parser = <TargetVersion as std::str::FromStr>::from_str;\n        inner_parser.parse_ref(cmd, arg, value)\n    }\n\n    fn possible_values(\n        &self,\n    ) -> Option<Box<dyn Iterator<Item = clap::builder::PossibleValue> + '_>> {\n        let inner_parser = clap::builder::EnumValueParser::<BumpLevel>::new();\n        #[allow(clippy::needless_collect)] // Erasing a lifetime\n        inner_parser.possible_values().map(|ps| {\n            let ps = ps.collect::<Vec<_>>();\n            let ps: Box<dyn Iterator<Item = clap::builder::PossibleValue> + '_> =\n                Box::new(ps.into_iter());\n            ps\n        })\n    }\n}\n"
  },
  {
    "path": "examples/typed-derive/fn_parser.md",
    "content": "Help:\n```console\n$ typed-derive fn-parser --help\nUsage: typed-derive fn-parser [OPTIONS]\n\nOptions:\n  -D <KEY=VALUE>  Hand-written parser for tuples\n  -h, --help      Print help\n\n```\n\nDefines (key-value pairs)\n```console\n$ typed-derive fn-parser -D Foo=10 -D Alice=30\nFnParser(FnParser { defines: [(\"Foo\", 10), (\"Alice\", 30)] })\n\n$ typed-derive fn-parser -D Foo\n? failed\nerror: invalid value 'Foo' for '-D <KEY=VALUE>': invalid KEY=value: no `=` found in `Foo`\n\nFor more information, try '--help'.\n\n$ typed-derive fn-parser -D Foo=Bar\n? failed\nerror: invalid value 'Foo=Bar' for '-D <KEY=VALUE>': invalid digit found in string\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/typed-derive/fn_parser.rs",
    "content": "use std::error::Error;\n\nuse clap::Args;\n\n#[derive(Args, Debug)]\npub(crate) struct FnParser {\n    /// Hand-written parser for tuples\n    #[arg(short = 'D', value_name = \"KEY=VALUE\", value_parser = parse_key_val::<String, i32>)]\n    defines: Vec<(String, i32)>,\n}\n\n/// Parse a single key-value pair\nfn parse_key_val<T, U>(s: &str) -> Result<(T, U), Box<dyn Error + Send + Sync + 'static>>\nwhere\n    T: std::str::FromStr,\n    T::Err: Error + Send + Sync + 'static,\n    U: std::str::FromStr,\n    U::Err: Error + Send + Sync + 'static,\n{\n    let pos = s\n        .find('=')\n        .ok_or_else(|| format!(\"invalid KEY=value: no `=` found in `{s}`\"))?;\n    Ok((s[..pos].parse()?, s[pos + 1..].parse()?))\n}\n"
  },
  {
    "path": "examples/typed-derive/foreign_crate.rs",
    "content": "#[derive(Copy, Clone, PartialEq, Eq, Debug)]\npub(crate) enum LogLevel {\n    Trace,\n    Debug,\n    Info,\n    Warn,\n    Error,\n}\n\nimpl std::fmt::Display for LogLevel {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        let s = match self {\n            Self::Trace => \"trace\",\n            Self::Debug => \"debug\",\n            Self::Info => \"info\",\n            Self::Warn => \"warn\",\n            Self::Error => \"error\",\n        };\n        s.fmt(f)\n    }\n}\nimpl std::str::FromStr for LogLevel {\n    type Err = String;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            \"trace\" => Ok(Self::Trace),\n            \"debug\" => Ok(Self::Debug),\n            \"info\" => Ok(Self::Info),\n            \"warn\" => Ok(Self::Warn),\n            \"error\" => Ok(Self::Error),\n            _ => Err(format!(\"Unknown log level: {s}\")),\n        }\n    }\n}\n"
  },
  {
    "path": "examples/typed-derive/implicit.md",
    "content": "Help:\n```console\n$ typed-derive implicit --help\nUsage: typed-derive implicit [OPTIONS]\n\nOptions:\n  -O <OPTIMIZATION>\n          Implicitly using `std::str::FromStr`\n\n  -I <DIR>\n          Allow invalid UTF-8 paths\n\n      --bind <BIND>\n          Handle IP addresses\n\n      --sleep <SLEEP>\n          Allow human-readable durations\n\n      --bump-level <BUMP_LEVEL>\n          Custom enums\n\n          Possible values:\n          - major: Increase the major version (x.0.0)\n          - minor: Increase the minor version (x.y.0)\n          - patch: Increase the patch version (x.y.z)\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n```\n\nOptimization-level (number)\n```console\n$ typed-derive implicit -O 1\nImplicit(ImplicitParsers { optimization: Some(1), include: None, bind: None, sleep: None, bump_level: None })\n\n$ typed-derive implicit -O plaid\n? failed\nerror: invalid value 'plaid' for '-O <OPTIMIZATION>': invalid digit found in string\n\nFor more information, try '--help'.\n\n```\n\nInclude (path)\n```console\n$ typed-derive implicit -I../hello\nImplicit(ImplicitParsers { optimization: None, include: Some(\"../hello\"), bind: None, sleep: None, bump_level: None })\n\n```\n\nIP Address\n```console\n$ typed-derive implicit --bind 192.0.0.1\nImplicit(ImplicitParsers { optimization: None, include: None, bind: Some(192.0.0.1), sleep: None, bump_level: None })\n\n$ typed-derive implicit --bind localhost\n? failed\nerror: invalid value 'localhost' for '--bind <BIND>': invalid IP address syntax\n\nFor more information, try '--help'.\n\n```\n\nTime\n```console\n$ typed-derive implicit --sleep 10s\nImplicit(ImplicitParsers { optimization: None, include: None, bind: None, sleep: Some(10s), bump_level: None })\n\n$ typed-derive implicit --sleep forever\n? failed\nerror: invalid value 'forever' for '--sleep <SLEEP>': failed to parse input in the \"friendly\" duration format: expected duration to start with a unit value (a decimal integer) after an optional sign, but no integer was found\n\nFor more information, try '--help'.\n\n```\n\nVersion field\n```console\n$ typed-derive implicit --bump-level minor\nImplicit(ImplicitParsers { optimization: None, include: None, bind: None, sleep: None, bump_level: Some(Minor) })\n\n$ typed-derive implicit --bump-level 10.0.0\n? failed\nerror: invalid value '10.0.0' for '--bump-level <BUMP_LEVEL>'\n  [possible values: major, minor, patch]\n\nFor more information, try '--help'.\n\n$ typed-derive implicit --bump-level blue\n? failed\nerror: invalid value 'blue' for '--bump-level <BUMP_LEVEL>'\n  [possible values: major, minor, patch]\n\nFor more information, try '--help'.\n\n```\n"
  },
  {
    "path": "examples/typed-derive/implicit.rs",
    "content": "use clap::Args;\nuse clap::ValueEnum;\n\n#[derive(Args, Debug)]\npub(crate) struct ImplicitParsers {\n    /// Implicitly using `std::str::FromStr`\n    #[arg(short = 'O')]\n    optimization: Option<usize>,\n\n    /// Allow invalid UTF-8 paths\n    #[arg(short = 'I', value_name = \"DIR\", value_hint = clap::ValueHint::DirPath)]\n    include: Option<std::path::PathBuf>,\n\n    /// Handle IP addresses\n    #[arg(long)]\n    bind: Option<std::net::IpAddr>,\n\n    /// Allow human-readable durations\n    #[arg(long)]\n    sleep: Option<jiff::SignedDuration>,\n\n    /// Custom enums\n    #[arg(long)]\n    bump_level: Option<BumpLevel>,\n}\n\n#[derive(Debug, Clone, Copy, ValueEnum)]\n#[value(rename_all = \"kebab-case\")]\npub(crate) enum BumpLevel {\n    /// Increase the major version (x.0.0)\n    Major,\n    /// Increase the minor version (x.y.0)\n    Minor,\n    /// Increase the patch version (x.y.z)\n    Patch,\n}\n\nimpl std::fmt::Display for BumpLevel {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        use clap::ValueEnum;\n\n        self.to_possible_value()\n            .expect(\"no values are skipped\")\n            .get_name()\n            .fmt(f)\n    }\n}\n\nimpl std::str::FromStr for BumpLevel {\n    type Err = String;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        use clap::ValueEnum;\n\n        for variant in Self::value_variants() {\n            if variant.to_possible_value().unwrap().matches(s, false) {\n                return Ok(*variant);\n            }\n        }\n        Err(format!(\"Invalid variant: {s}\"))\n    }\n}\n"
  },
  {
    "path": "examples/typed-derive/main.rs",
    "content": "use clap::Parser;\n\nmod builtin;\nmod custom;\nmod fn_parser;\nmod foreign_crate;\nmod implicit;\n\n#[derive(Parser, Debug)] // requires `derive` feature\n#[command(term_width = 0)] // Just to make testing across clap features easier\n#[command(bin_name = \"typed-derive\")] // Make testing easier by avoiding `.exe` in Usage on Windows\nenum Cli {\n    Implicit(implicit::ImplicitParsers),\n    Builtin(builtin::BuiltInParsers),\n    FnParser(fn_parser::FnParser),\n    Custom(custom::CustomParser),\n}\n\nfn main() {\n    let cli = Cli::parse();\n    println!(\"{cli:?}\");\n}\n"
  },
  {
    "path": "release.toml",
    "content": "owners = [\"github:clap-rs:Admins\", \"github:rust-cli:Maintainers\"]\ndependent-version = \"fix\"\nallow-branch = [\"master\", \"v*-master\"]\n"
  },
  {
    "path": "src/_concepts.rs",
    "content": "//! ## CLI Concepts\n//!\n//! Note: this will be speaking towards the general case.\n//!\n//! ### Environmental context\n//!\n//! When you run a command line application, it is inside a terminal emulator, or terminal.\n//! This handles integration with the rest of your system including user input,\n//! rendering, etc.\n//!\n//! The terminal will run inside of itself an interactive shell.\n//! The shell is responsible for showing the prompt, receiving input including the command you are writing,\n//! letting that command take over until completion, and then repeating.\n//! This is called a read-eval-print loop, or REPL.\n//! Typically the shell will take the command you typed and split it into separate arguments,\n//! including handling of quoting, escaping, and globbing.\n//! The parsing and evaluation of the command is shell specific.\n//! The shell will then determine which application to run and then pass the full command-line as\n//! individual arguments to your program.\n//! These arguments are exposed in Rust as [`std::env::args_os`].\n//!\n//! Windows is an exception in Shell behavior in that the command is passed as an individual\n//! string, verbatim, and the application must split the arguments.\n//! [`std::env::args_os`] will handle the splitting for you but will not handle globs.\n//!\n//! Takeaways:\n//! - Your application will only see quotes that have been escaped within the shell\n//!   - e.g. to receive `message=\"hello world\"`, you may need to type `'message=\"hello world\"'` or `message=\\\"hello world\\\"`\n//! - If your applications needs to parse a string into arguments,\n//!   you will need to pick a syntax and do it yourself\n//!   - POSIX's shell syntax is a common choice and available in packages like [shlex](https://docs.rs/shlex)\n//!   - See also our [REPL cookbook entry][crate::_cookbook::repl]\n//! - On Windows, you will need to handle globbing yourself if desired\n//!   - [`wild`](https://docs.rs/wild) can help with that\n//!\n//! ### Argument Parsing\n//!\n//! The first argument of [`std::env::args_os`] is the [`Command::bin_name`]\n//! which is usually limited to affecting [`Command::render_usage`].\n//! [`Command::no_binary_name`] and [`Command::multicall`] exist for rare cases when this assumption is not valid.\n//!\n//! Command-lines are a context-sensitive grammar,\n//! meaning the interpretation of an argument is based on the arguments that came before.\n//! Arguments come in one of several flavors:\n//! - Values\n//! - Flags\n//! - Subcommands\n//!\n//! When examining the next argument,\n//! 1. If it starts with a `--`,\n//!    then that is a long Flag and all remaining text up to a `=` or the end is\n//!    matched to a [`Arg::long`], [`Command::long_flag`], or alias.\n//!    - Everything after the `=` is taken as a Value and parsing a new argument is examined.\n//!    - If no `=` is present, then Values will be taken according to [`Arg::num_args`]\n//!    - We generally call a Flag that takes a Value an Option\n//! 2. If it starts with a `-`,\n//!    then that is a sequence of short Flags where each character is matched against a [`Arg::short`], [`Command::short_flag`] or\n//!    alias until `=`, the end, or a short Flag takes Values (see [`Arg::num_args`])\n//! 3. If its a `--`, that is an escape and all future arguments are considered to be a Value, even if\n//!    they start with `--` or `-`\n//! 4. If it matches a [`Command::name`],\n//!    then the argument is a subcommand\n//! 5. If there is an [`Arg`] at the next [`Arg::index`],\n//!    then the argument is considered a Positional argument\n//!\n//! When a subcommand matches,\n//! all further arguments are parsed by that [`Command`].\n//!\n//! There are many settings that tweak this behavior, including:\n//! - [`Arg::last`]: a positional that can only come after `--`\n//! - [`Arg::trailing_var_arg`]: all further arguments are captured as additional Values\n//! - [`Arg::allow_hyphen_values`] and [`Arg::allow_negative_numbers`]: assumes arguments\n//!   starting with `-` are Values and not Flags.\n//! - [`Command::subcommand_precedence_over_arg`]: when an [`Arg::num_args`] takes Values,\n//!   stop if one matches a subCommand\n//! - [`Command::allow_missing_positional`]: in limited cases a [`Arg::index`] may be skipped\n//! - [`Command::allow_external_subcommands`]: treat any unknown argument as a subcommand, capturing\n//!   all remaining arguments.\n//!\n//! Takeaways\n//! - Values that start with a `-` either need to be escaped by the user with `--`\n//!   (if a positional),\n//!   or you need to set [`Arg::allow_hyphen_values`] or [`Arg::allow_negative_numbers`]\n//! - [`Arg::num_args`],\n//!   [`ArgAction::Append`] (on a positional),\n//!   [`Arg::trailing_var_arg`],\n//!   and [`Command::allow_external_subcommands`]\n//!   all affect the parser in similar but slightly different ways and which to use depends on your\n//!   application\n//!\n//! ### Value Parsing\n//!\n//! When reacting to a Flag (no Value),\n//! [`Arg::default_missing_values`] will be applied.\n//!\n//! The Value will be split by [`Arg::value_delimiter`].\n//!\n//! The Value will then be stored according to its [`ArgAction`].\n//! For most [`ArgAction`]s,\n//! the Value will be parsed according to [`ValueParser`]\n//! and stored in the [`ArgMatches`].\n\n#![allow(unused_imports)]\nuse clap_builder::Arg;\nuse clap_builder::ArgAction;\nuse clap_builder::ArgMatches;\nuse clap_builder::Command;\nuse clap_builder::builder::ValueParser;\n"
  },
  {
    "path": "src/_cookbook/cargo_example.rs",
    "content": "//! # Example: cargo subcommand (Builder API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/cargo-example.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/cargo-example.md\")]\n"
  },
  {
    "path": "src/_cookbook/cargo_example_derive.rs",
    "content": "//! # Example: cargo subcommand (Derive API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/cargo-example-derive.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/cargo-example-derive.md\")]\n"
  },
  {
    "path": "src/_cookbook/escaped_positional.rs",
    "content": "//! # Example (Builder API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/escaped-positional.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/escaped-positional.md\")]\n"
  },
  {
    "path": "src/_cookbook/escaped_positional_derive.rs",
    "content": "//! # Example (Derive API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/escaped-positional-derive.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/escaped-positional-derive.md\")]\n"
  },
  {
    "path": "src/_cookbook/find.rs",
    "content": "//! # Example: find-like CLI (Builder API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/find.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/find.md\")]\n"
  },
  {
    "path": "src/_cookbook/git.rs",
    "content": "//! # Example: git-like CLI (Builder API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/git.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/git.md\")]\n"
  },
  {
    "path": "src/_cookbook/git_derive.rs",
    "content": "//! # Example: git-like CLI (Derive API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/git-derive.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/git-derive.md\")]\n"
  },
  {
    "path": "src/_cookbook/mod.rs",
    "content": "// Contributing\n//\n// New examples:\n// - Building: They must be added to `Cargo.toml` with the appropriate `required-features`.\n// - Testing: Ensure there is a markdown file with [trycmd](https://docs.rs/trycmd) syntax\n// - Link the `.md` file from here\n\n//! # Documentation: Cookbook\n//!\n//! Typed arguments: [derive][typed_derive]\n//! - Topics:\n//!   - Custom `parse()`\n//!\n//! Custom cargo command: [builder][cargo_example], [derive][cargo_example_derive]\n//! - Topics:\n//!   - Subcommands\n//!   - Cargo plugins\n//!   - custom terminal [styles][crate::Command::styles] (colors)\n//!\n//! find-like interface: [builder][find]\n//! - Topics:\n//!   - Position-sensitive flags\n//!\n//! git-like interface: [builder][git], [derive][git_derive]\n//! - Topics:\n//!   - Subcommands\n//!   - External subcommands\n//!   - Optional subcommands\n//!   - Default subcommands\n//!   - [`last`][crate::Arg::last]\n//!\n//! pacman-like interface: [builder][pacman]\n//! - Topics:\n//!   - Flag subcommands\n//!   - Conflicting arguments\n//!\n//! Escaped positionals with `--`: [builder][escaped_positional], [derive][escaped_positional_derive]\n//!\n//! Multi-call\n//! - busybox: [builder][multicall_busybox]\n//!   - Topics:\n//!     - Subcommands\n//! - hostname: [builder][multicall_hostname]\n//!   - Topics:\n//!     - Subcommands\n//!\n//! repl: [builder][repl], [derive][repl_derive]\n//! - Topics:\n//!   - Read-Eval-Print Loops / Custom command lines\n\npub mod cargo_example;\npub mod cargo_example_derive;\npub mod escaped_positional;\npub mod escaped_positional_derive;\npub mod find;\npub mod git;\npub mod git_derive;\npub mod multicall_busybox;\npub mod multicall_hostname;\npub mod pacman;\npub mod repl;\npub mod repl_derive;\npub mod typed_derive;\n"
  },
  {
    "path": "src/_cookbook/multicall_busybox.rs",
    "content": "//! # Example: busybox-like CLI (Builder API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/multicall-busybox.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/multicall-busybox.md\")]\n"
  },
  {
    "path": "src/_cookbook/multicall_hostname.rs",
    "content": "//! # Example: hostname-like CLI (Builder API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/multicall-hostname.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/multicall-hostname.md\")]\n"
  },
  {
    "path": "src/_cookbook/pacman.rs",
    "content": "//! # Example: pacman-like CLI (Builder API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/pacman.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/pacman.md\")]\n"
  },
  {
    "path": "src/_cookbook/repl.rs",
    "content": "//! # Example: Command REPL (Builder API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/repl.rs\")]\n//! ```\n"
  },
  {
    "path": "src/_cookbook/repl_derive.rs",
    "content": "//! # Example: REPL (Derive API)\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/repl-derive.rs\")]\n"
  },
  {
    "path": "src/_cookbook/typed_derive.rs",
    "content": "//! # Example: Custom Types (Derive API)\n//!\n//! **This requires enabling the [`derive` feature flag][crate::_features].**\n//!\n//! ## Implicit [`Arg::value_parser`][crate::Arg::value_parser]\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/typed-derive/implicit.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/typed-derive/implicit.md\")]\n//!\n//! ## Built-in [`TypedValueParser`][crate::builder::TypedValueParser]\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/typed-derive/builtin.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/typed-derive/builtin.md\")]\n//!\n//! ## Custom parser function\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/typed-derive/fn_parser.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/typed-derive/fn_parser.md\")]\n//!\n//! ## Custom [`TypedValueParser`][crate::builder::TypedValueParser]\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/typed-derive/custom.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/typed-derive/custom.md\")]\n"
  },
  {
    "path": "src/_derive/_tutorial.rs",
    "content": "// Contributing\n//\n// New example code:\n// - Please update the corresponding section in the derive tutorial\n// - Building: They must be added to `Cargo.toml` with the appropriate `required-features`.\n// - Testing: Ensure there is a markdown file with [trycmd](https://docs.rs/trycmd) syntax\n//\n// See also the general CONTRIBUTING\n\n//! ## Tutorial for the Derive API\n//!\n//! *See the side bar for the Table of Contents*\n//!\n//! ## Quick Start\n//!\n//! You can create an application declaratively with a `struct` and some\n//! attributes.\n//!\n//! First, ensure `clap` is available with the [`derive` feature flag][crate::_features]:\n//! ```console\n//! $ cargo add clap --features derive\n//! ```\n//!\n//! Here is a preview of the type of application you can make:\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/01_quick.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/tutorial_derive/01_quick.md\")]\n//!\n//! See also\n//! - [FAQ: When should I use the builder vs derive APIs?][crate::_faq#when-should-i-use-the-builder-vs-derive-apis]\n//! - The [cookbook][crate::_cookbook] for more application-focused examples\n//!\n//! ## Configuring the Parser\n//!\n//! You use derive [`Parser`][crate::Parser] to start building a parser.\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/02_apps.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/tutorial_derive/02_apps.md\")]\n//!\n//! You can use [`#[command(version, about)]` attribute defaults][super#command-attributes] on the struct to fill these fields in from your `Cargo.toml` file.\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/02_crate.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/02_crate.md\")]\n//!\n//! You can use `#[command]` attributes on the struct to change the application level behavior of clap.  Any [`Command`][crate::Command] builder function can be used as an attribute, like [`Command::next_line_help`].\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/02_app_settings.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/02_app_settings.md\")]\n//!\n//! ## Adding Arguments\n//!\n//! 1. [Positionals](#positionals)\n//! 2. [Options](#options)\n//! 3. [Flags](#flags)\n//! 4. [Optional](#optional)\n//! 5. [Defaults](#defaults)\n//! 6. [Subcommands](#subcommands)\n//!\n//! Arguments are inferred from the fields of your struct.\n//!\n//! ### Positionals\n//!\n//! By default, struct fields define positional arguments:\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_03_positional.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/03_03_positional.md\")]\n//!\n//! Note that the [default `ArgAction` is `Set`][super#arg-types].  To\n//! accept multiple values, override the [action][Arg::action] with [`Append`][crate::ArgAction::Append] via `Vec`:\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_03_positional_mult.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/03_03_positional_mult.md\")]\n//!\n//! ### Options\n//!\n//! You can name your arguments with a flag:\n//! - Intent of the value is clearer\n//! - Order doesn't matter\n//!\n//! To specify the flags for an argument, you can use [`#[arg(short = 'n')]`][Arg::short] and/or\n//! [`#[arg(long = \"name\")]`][Arg::long] attributes on a field.  When no value is given (e.g.\n//! `#[arg(short)]`), the flag is inferred from the field's name.\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_02_option.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/03_02_option.md\")]\n//!\n//! Note that the [default `ArgAction` is `Set`][super#arg-types].  To\n//! accept multiple occurrences, override the [action][Arg::action] with [`Append`][crate::ArgAction::Append] via `Vec`:\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_02_option_mult.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/03_02_option_mult.md\")]\n//!\n//! ### Flags\n//!\n//! Flags can also be switches that can be on/off:\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_01_flag_bool.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/03_01_flag_bool.md\")]\n//!\n//! Note that the [default `ArgAction` for a `bool` field is\n//! `SetTrue`][super#arg-types].  To accept multiple flags, override the [action][Arg::action] with\n//! [`Count`][crate::ArgAction::Count]:\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_01_flag_count.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/03_01_flag_count.md\")]\n//!\n//! This also shows that any[`Arg`][crate::Args] method may be used as an attribute.\n//!\n//! ### Optional\n//!\n//! By default, arguments are assumed to be [`required`][crate::Arg::required].\n//! To make an argument optional, wrap the field's type in `Option`:\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_06_optional.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/03_06_optional.md\")]\n//!\n//! ### Defaults\n//!\n//! We've previously showed that arguments can be [`required`][crate::Arg::required] or optional.\n//! When optional, you work with a `Option` and can `unwrap_or`.  Alternatively, you can\n//! set [`#[arg(default_value_t)]`][super#arg-attributes].\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_05_default_values.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/03_05_default_values.md\")]\n//!\n//! ### Subcommands\n//!\n//! Subcommands are derived with `#[derive(Subcommand)]` and be added via\n//! [`#[command(subcommand)]` attribute][super#command-attributes] on the field using that type.\n//! Each instance of a [Subcommand][crate::Subcommand] can have its own version, author(s), Args,\n//! and even its own subcommands.\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_04_subcommands.rs\")]\n//! ```\n//! We used a struct-variant to define the `add` subcommand.\n//! Alternatively, you can use a struct for your subcommand's arguments:\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/03_04_subcommands_alt.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../../examples/tutorial_derive/03_04_subcommands.md\")]\n//!\n//! ## Validation\n//!\n//! 1. [Enumerated values](#enumerated-values)\n//! 2. [Validated values](#validated-values)\n//! 3. [Argument Relations](#argument-relations)\n//! 4. [Custom Validation](#custom-validation)\n//!\n//! An appropriate default parser/validator will be selected for the field's type.  See\n//! [`value_parser!`][crate::value_parser!] for more details.\n//!\n//! ### Enumerated values\n//!\n//! For example, if you have arguments of specific values you want to test for, you can derive\n//! [`ValueEnum`][super#valueenum-attributes]\n//! (any [`PossibleValue`] builder function can be used as a `#[value]` attribute on enum variants).\n//!\n//! This allows you specify the valid values for that argument. If the user does not use one of\n//! those specific values, they will receive a graceful exit with error message informing them\n//! of the mistake, and what the possible valid values are\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/04_01_enum.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/04_01_enum.md\")]\n//!\n//! ### Validated values\n//!\n//! More generally, you can validate and parse into any data type with [`Arg::value_parser`].\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/04_02_parse.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/04_02_parse.md\")]\n//!\n//! A [custom parser][TypedValueParser] can be used to improve the error messages or provide additional validation:\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/04_02_validate.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/04_02_validate.md\")]\n//!\n//! See [`Arg::value_parser`][crate::Arg::value_parser] for more details.\n//!\n//! ### Argument Relations\n//!\n//! You can declare dependencies or conflicts between [`Arg`][crate::Arg]s or even\n//! [`ArgGroup`][crate::ArgGroup]s.\n//!\n//! [`ArgGroup`][crate::ArgGroup]s  make it easier to declare relations instead of having to list\n//! each individually, or when you want a rule to apply \"any but not all\" arguments.\n//!\n//! Perhaps the most common use of [`ArgGroup`][crate::ArgGroup]s is to require one and *only* one\n//! argument to be present out of a given set. Imagine that you had multiple arguments, and you\n//! want one of them to be required, but making all of them required isn't feasible because perhaps\n//! they conflict with each other.\n//!\n//! [`ArgGroup`][crate::ArgGroup]s are automatically created for a `struct` with its\n//! [`ArgGroup::id`][crate::ArgGroup::id] being the struct's name.\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/04_03_relations.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/04_03_relations.md\")]\n//!\n//! ### Custom Validation\n//!\n//! As a last resort, you can create custom errors with the basics of clap's formatting.\n//!\n//! ```rust\n#![doc = include_str!(\"../../examples/tutorial_derive/04_04_custom.rs\")]\n//! ```\n#![doc = include_str!(\"../../examples/tutorial_derive/04_04_custom.md\")]\n//!\n//! ## Testing\n//!\n//! clap reports most development errors as `debug_assert!`s.  Rather than checking every\n//! subcommand, you should have a test that calls\n//! [`Command::debug_assert`][crate::Command::debug_assert]:\n//! ```rust,no_run\n#![doc = include_str!(\"../../examples/tutorial_derive/05_01_assert.rs\")]\n//! ```\n//!\n//! ## Next Steps\n//!\n//! - [Cookbook][crate::_cookbook] for application-focused examples\n//! - Explore more features in the [Derive reference][super]\n//!   - See also [`Command`], [`Arg`], [`ArgGroup`], and [`PossibleValue`] builder functions which\n//!     can be used as attributes\n//!\n//! For support, see [Discussions](https://github.com/clap-rs/clap/discussions)\n#![allow(unused_imports)]\nuse crate::builder::*;\n"
  },
  {
    "path": "src/_derive/mod.rs",
    "content": "//! # Documentation: Derive Reference\n//!\n//! 1. [Overview](#overview)\n//! 2. [Attributes](#attributes)\n//!     1. [Terminology](#terminology)\n//!     2. [Command Attributes](#command-attributes)\n//!     2. [ArgGroup Attributes](#arggroup-attributes)\n//!     3. [Arg Attributes](#arg-attributes)\n//!     4. [ValueEnum Attributes](#valueenum-attributes)\n//!     5. [Possible Value Attributes](#possible-value-attributes)\n//! 3. [Field Types](#field-types)\n//! 4. [Doc Comments](#doc-comments)\n//! 5. [Mixing Builder and Derive APIs](#mixing-builder-and-derive-apis)\n//! 6. [Tips](#tips)\n//!\n//! ## Overview\n//!\n//! To derive `clap` types, you need to enable the [`derive` feature flag][crate::_features].\n//!\n//! Example:\n//! ```rust\n#![doc = include_str!(\"../../examples/demo.rs\")]\n//! ```\n//!\n//! Let's start by breaking down the anatomy of the derive attributes:\n//! ```rust\n//! use clap::{Parser, Args, Subcommand, ValueEnum};\n//!\n//! /// Doc comment\n//! #[derive(Parser)]\n//! #[command(CMD ATTRIBUTE)]\n//! #[group(GROUP ATTRIBUTE)]\n//! struct Cli {\n//!     /// Doc comment\n//!     #[arg(ARG ATTRIBUTE)]\n//!     field: UserType,\n//!\n//!     #[arg(value_enum, ARG ATTRIBUTE...)]\n//!     field: EnumValues,\n//!\n//!     #[command(flatten)]\n//!     delegate: Struct,\n//!\n//!     #[command(subcommand)]\n//!     command: Command,\n//! }\n//!\n//! /// Doc comment\n//! #[derive(Args)]\n//! #[command(PARENT CMD ATTRIBUTE)]\n//! #[group(GROUP ATTRIBUTE)]\n//! struct Struct {\n//!     /// Doc comment\n//!     #[command(ARG ATTRIBUTE)]\n//!     field: UserType,\n//! }\n//!\n//! /// Doc comment\n//! #[derive(Subcommand)]\n//! #[command(PARENT CMD ATTRIBUTE)]\n//! enum Command {\n//!     /// Doc comment\n//!     #[command(CMD ATTRIBUTE)]\n//!     Variant1(Struct),\n//!\n//!     /// Doc comment\n//!     #[command(CMD ATTRIBUTE)]\n//!     Variant2 {\n//!         /// Doc comment\n//!         #[arg(ARG ATTRIBUTE)]\n//!         field: UserType,\n//!     }\n//! }\n//!\n//! /// Doc comment\n//! #[derive(ValueEnum)]\n//! #[value(VALUE ENUM ATTRIBUTE)]\n//! enum EnumValues {\n//!     /// Doc comment\n//!     #[value(POSSIBLE VALUE ATTRIBUTE)]\n//!     Variant1,\n//! }\n//!\n//! let cli = Cli::parse();\n//! ```\n//!\n//! Traits:\n//! - [`Parser`][crate::Parser] parses arguments into a `struct` (arguments) or `enum` (subcommands).\n//!   - [`Args`][crate::Args] allows defining a set of re-usable arguments that get merged into their parent container.\n//!   - [`Subcommand`][crate::Subcommand] defines available subcommands.\n//!   - Subcommand arguments can be defined in a struct-variant or automatically flattened with a tuple-variant.\n//! - [`ValueEnum`][crate::ValueEnum] allows parsing a value directly into an `enum`, erroring on unsupported values.\n//!   - The derive doesn't work on enums that contain non-unit variants, unless they are skipped\n//!\n//! *See also the [derive tutorial][crate::_derive::_tutorial] and [cookbook][crate::_cookbook]*\n//!\n//! ## Attributes\n//!\n//! ### Terminology\n//!\n//! **Raw attributes** are forwarded directly to the underlying [`clap` builder][crate::builder].  Any\n//! [`Command`][crate::Command], [`Arg`][crate::Arg], or [`PossibleValue`][crate::builder::PossibleValue] method can be used as an attribute.\n//!\n//! Raw attributes come in two different syntaxes:\n//! ```rust,ignore\n//! #[arg(\n//!     global = true, // name = arg form, neat for one-arg methods\n//!     required_if_eq(\"out\", \"file\") // name(arg1, arg2, ...) form.\n//! )]\n//! ```\n//!\n//! - `method = arg` can only be used for methods which take only one argument.\n//! - `method(arg1, arg2)` can be used with any method.\n//!\n//! As long as `method_name` is not one of the magical methods it will be\n//! translated into a mere method call.\n//!\n//! **Magic attributes** have post-processing done to them, whether that is\n//! - Providing of defaults\n//! - Special behavior is triggered off of it\n//!\n//! Magic attributes are more constrained in the syntax they support, usually just\n//! `<attr> = <value>` though some use `<attr>(<value>)` instead.  See the specific\n//! magic attributes documentation for details.  This allows users to access the\n//! raw behavior of an attribute via `<attr>(<value>)` syntax.\n//!\n//! <div class=\"warning\">\n//!\n//! **NOTE:** Some attributes are inferred from [Arg Types](#arg-types) and [Doc\n//! Comments](#doc-comments).  Explicit attributes take precedence over inferred\n//! attributes.\n//!\n//! </div>\n//!\n//! ### Command Attributes\n//!\n//! These correspond to a [`Command`][crate::Command] which is used for both top-level parsers and\n//! when defining subcommands.\n//!\n//! **Raw attributes:**  Any [`Command` method][crate::Command] can also be used as an attribute,\n//! see [Terminology](#terminology) for syntax.\n//! - e.g. `#[command(arg_required_else_help(true))]` would translate to `cmd.arg_required_else_help(true)`\n//!\n//! **Magic attributes:**\n//! - `name  = <expr>`: [`Command::name`][crate::Command::name]\n//!   - When not present: [package `name`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-name-field) (if on [`Parser`][crate::Parser] container), variant name (if on [`Subcommand`][crate::Subcommand] variant)\n//! - `version [= <expr>]`: [`Command::version`][crate::Command::version]\n//!   - When not present: no version set\n//!   - Without `<expr>`: defaults to [crate `version`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-version-field)\n//! - `author [= <expr>]`: [`Command::author`][crate::Command::author]\n//!   - When not present: no author set\n//!   - Without `<expr>`: defaults to [crate `authors`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-authors-field)\n//!   - **NOTE:** A custom [`help_template`][crate::Command::help_template] is needed for author to show up.\n//! - `about [= <expr>]`: [`Command::about`][crate::Command::about]\n//!   - When not present: [Doc comment summary](#doc-comments)\n//!   - Without `<expr>`: [crate `description`](https://doc.rust-lang.org/cargo/reference/manifest.html#the-description-field) ([`Parser`][crate::Parser] container)\n//!     - **TIP:** When a doc comment is also present, you most likely want to add\n//!       `#[arg(long_about = None)]` to clear the doc comment so only [`about`][crate::Command::about]\n//!       gets shown with both `-h` and `--help`.\n//! - `long_about[ = <expr>]`: [`Command::long_about`][crate::Command::long_about]\n//!   - When not present: [Doc comment](#doc-comments) if there is a blank line, else nothing\n//!   - When present without a value: [Doc comment](#doc-comments)\n//! - `verbatim_doc_comment`: Minimizes pre-processing when converting doc comments to [`about`][crate::Command::about] / [`long_about`][crate::Command::long_about]\n//! - `next_display_order`: [`Command::next_display_order`][crate::Command::next_display_order]\n//! - `next_help_heading`: [`Command::next_help_heading`][crate::Command::next_help_heading]\n//!   - When `flatten`ing [`Args`][crate::Args], this is scoped to just the args in this struct and any struct `flatten`ed into it\n//! - `rename_all = <string_literal>`: Override default field / variant name case conversion for [`Command::name`][crate::Command::name] / [`Arg::id`][crate::Arg::id]\n//!   - When not present: `\"kebab-case\"`\n//!   - Available values: `\"camelCase\"`, `\"kebab-case\"`, `\"PascalCase\"`, `\"SCREAMING_SNAKE_CASE\"`, `\"snake_case\"`, `\"lower\"`, `\"UPPER\"`, `\"verbatim\"`\n//! - `rename_all_env = <string_literal>`: Override default field name case conversion for env variables for  [`Arg::env`][crate::Arg::env]\n//!   - When not present: `\"SCREAMING_SNAKE_CASE\"`\n//!   - Available values: `\"camelCase\"`, `\"kebab-case\"`, `\"PascalCase\"`, `\"SCREAMING_SNAKE_CASE\"`, `\"snake_case\"`, `\"lower\"`, `\"UPPER\"`, `\"verbatim\"`\n//!\n//! And for [`Subcommand`][crate::Subcommand] variants:\n//! - `skip`: Ignore this variant\n//! - `flatten`: Delegates to the variant for more subcommands (must implement\n//!   [`Subcommand`][crate::Subcommand])\n//! - `subcommand`: Nest subcommands under the current set of subcommands (must implement\n//!   [`Subcommand`][crate::Subcommand])\n//! - `external_subcommand`: [`Command::allow_external_subcommand(true)`][crate::Command::allow_external_subcommands]\n//!   - Variant must be either `Variant(Vec<String>)` or `Variant(Vec<OsString>)`\n//!\n//! And for [`Args`][crate::Args] fields:\n//! - `flatten`: Delegates to the field for more arguments (must implement [`Args`][crate::Args])\n//!   - Only [`next_help_heading`][crate::Command::next_help_heading] can be used with `flatten`.  See\n//!     [clap-rs/clap#3269](https://github.com/clap-rs/clap/issues/3269) for why\n//!     arg attributes are not generally supported.\n//!   - **Tip:** Though we do apply a flattened [`Args`][crate::Args]'s Parent Command Attributes, this\n//!     makes reuse harder. Generally prefer putting the cmd attributes on the\n//!     [`Parser`][crate::Parser] or on the flattened field.\n//! - `subcommand`: Delegates definition of subcommands to the field (must implement\n//!   [`Subcommand`][crate::Subcommand])\n//!   - When `Option<T>`, the subcommand becomes optional\n//!\n//! See [Configuring the Parser][_tutorial#configuring-the-parser] and\n//! [Subcommands][_tutorial#subcommands] from the tutorial.\n//!\n//! ### ArgGroup Attributes\n//!\n//! These correspond to the [`ArgGroup`][crate::ArgGroup] which is implicitly created for each\n//! `Args` derive.\n//!\n//! **Raw attributes:**  Any [`ArgGroup` method][crate::ArgGroup] can also be used as an attribute, see [Terminology](#terminology) for syntax.\n//! - e.g. `#[group(required = true)]` would translate to `arg_group.required(true)`\n//!\n//! **Magic attributes**:\n//! - `id = <expr>`: [`ArgGroup::id`][crate::ArgGroup::id]\n//!   - When not present: struct's name is used\n//! - `skip [= <expr>]`: Ignore this field, filling in with `<expr>`\n//!   - Without `<expr>`: fills the field with `Default::default()`\n//!\n//! Note:\n//! - For `struct`s, [`multiple = true`][crate::ArgGroup::multiple] is implied\n//! - `enum` support is tracked at [#2621](https://github.com/clap-rs/clap/issues/2621)\n//!\n//! See [Argument Relations][_tutorial#argument-relations] from the tutorial.\n//!\n//! ### Arg Attributes\n//!\n//! These correspond to a [`Arg`][crate::Arg].\n//! The default state for a field without attributes is to be a positional argument with [behavior\n//! inferred from the field type](#arg-types).\n//! `#[arg(...)]` attributes allow overriding or extending those defaults.\n//!\n//! **Raw attributes:**  Any [`Arg` method][crate::Arg] can also be used as an attribute, see [Terminology](#terminology) for syntax.\n//! - e.g. `#[arg(num_args(..=3))]` would translate to `arg.num_args(..=3)`\n//!\n//! **Magic attributes**:\n//! - `id = <expr>`: [`Arg::id`][crate::Arg::id]\n//!   - When not present: field's name is used\n//! - `value_parser [= <expr>]`: [`Arg::value_parser`][crate::Arg::value_parser]\n//!   - When not present: will auto-select an implementation based on the field type using\n//!     [`value_parser!`][crate::value_parser!]\n//! - `action [= <expr>]`: [`Arg::action`][crate::Arg::action]\n//!   - When not present: will auto-select an action based on the field type\n//! - `help = <expr>`: [`Arg::help`][crate::Arg::help]\n//!   - When not present: [Doc comment summary](#doc-comments)\n//! - `long_help[ = <expr>]`: [`Arg::long_help`][crate::Arg::long_help]\n//!   - When not present: [Doc comment](#doc-comments) if there is a blank line, else nothing\n//!   - When present without a value: [Doc comment](#doc-comments)\n//! - `verbatim_doc_comment`: Minimizes pre-processing when converting doc comments to [`help`][crate::Arg::help] / [`long_help`][crate::Arg::long_help]\n//! - `short [= <char>]`: [`Arg::short`][crate::Arg::short]\n//!   - When not present: no short set\n//!   - Without `<char>`: defaults to first character in the case-converted field name\n//! - `long [= <str>]`: [`Arg::long`][crate::Arg::long]\n//!   - When not present: no long set\n//!   - Without `<str>`: defaults to the case-converted field name\n//! - `env [= <str>]`: [`Arg::env`][crate::Arg::env] (needs [`env` feature][crate::_features] enabled)\n//!   - When not present: no env set\n//!   - Without `<str>`: defaults to the case-converted field name\n//! - `from_global`: Read a [`Arg::global`][crate::Arg::global] argument (raw attribute), regardless of what subcommand you are in\n//! - `value_enum`: Parse the value using the [`ValueEnum`][crate::ValueEnum]\n//! - `skip [= <expr>]`: Ignore this field, filling in with `<expr>`\n//!   - Without `<expr>`: fills the field with `Default::default()`\n//! - `default_value = <str>`: [`Arg::default_value`][crate::Arg::default_value] and [`Arg::required(false)`][crate::Arg::required]\n//! - `default_value_t [= <expr>]`: [`Arg::default_value`][crate::Arg::default_value] and [`Arg::required(false)`][crate::Arg::required]\n//!   - Requires `std::fmt::Display` that roundtrips correctly with the\n//!     [`Arg::value_parser`][crate::Arg::value_parser] or `#[arg(value_enum)]`\n//!   - Without `<expr>`, relies on `Default::default()`\n//! - `default_values_t = <expr>`: [`Arg::default_values`][crate::Arg::default_values] and [`Arg::required(false)`][crate::Arg::required]\n//!   - Requires field arg to be of type `Vec<T>` and `T` to implement `std::fmt::Display` or `#[arg(value_enum)]`\n//!   - `<expr>` must implement `IntoIterator<T>`\n//! - `default_value_os_t [= <expr>]`: [`Arg::default_value_os`][crate::Arg::default_value_os] and [`Arg::required(false)`][crate::Arg::required]\n//!   - Requires `std::convert::Into<OsString>` or `#[arg(value_enum)]`\n//!   - Without `<expr>`, relies on `Default::default()`\n//! - `default_values_os_t = <expr>`: [`Arg::default_values_os`][crate::Arg::default_values_os] and [`Arg::required(false)`][crate::Arg::required]\n//!   - Requires field arg to be of type `Vec<T>` and `T` to implement `std::convert::Into<OsString>` or `#[arg(value_enum)]`\n//!   - `<expr>` must implement `IntoIterator<T>`\n//!\n//! See [Adding Arguments][_tutorial#adding-arguments] and [Validation][_tutorial#validation] from the\n//! tutorial.\n//!\n//! ### ValueEnum Attributes\n//!\n//! - `rename_all = <string_literal>`: Override default field / variant name case conversion for [`PossibleValue::new`][crate::builder::PossibleValue]\n//!   - When not present: `\"kebab-case\"`\n//!   - Available values: `\"camelCase\"`, `\"kebab-case\"`, `\"PascalCase\"`, `\"SCREAMING_SNAKE_CASE\"`, `\"snake_case\"`, `\"lower\"`, `\"UPPER\"`, `\"verbatim\"`\n//!\n//! See [Enumerated values][_tutorial#enumerated-values] from the tutorial.\n//!\n//! ### Possible Value Attributes\n//!\n//! These correspond to a [`PossibleValue`][crate::builder::PossibleValue].\n//!\n//! **Raw attributes:**  Any [`PossibleValue` method][crate::builder::PossibleValue] can also be used as an attribute, see [Terminology](#terminology) for syntax.\n//! - e.g. `#[value(alias(\"foo\"))]` would translate to `pv.alias(\"foo\")`\n//!\n//! **Magic attributes**:\n//! - `name = <expr>`: [`PossibleValue::new`][crate::builder::PossibleValue::new]\n//!   - When not present: case-converted field name is used\n//! - `help = <expr>`: [`PossibleValue::help`][crate::builder::PossibleValue::help]\n//!   - When not present: [Doc comment summary](#doc-comments)\n//! - `skip`: Ignore this variant\n//!\n//! ## Field Types\n//!\n//! `clap` assumes some intent based on the type used.\n//!\n//! ### Subcommand Types\n//!\n//! | Type                  | Effect              | Implies                                                   |\n//! |-----------------------|---------------------|-----------------------------------------------------------|\n//! | `Option<T>`           | optional subcommand |                                                           |\n//! | `T`                   | required subcommand | `.subcommand_required(true).arg_required_else_help(true)` |\n//!\n//! ### Arg Types\n//!\n//! | Type                  | Effect                                               | Implies                                                     | Notes |\n//! |-----------------------|------------------------------------------------------|-------------------------------------------------------------|-------|\n//! | `()`                  | user-defined                                         | `.action(ArgAction::Set).required(false)`                   |       |\n//! | `bool`                | flag                                                 | `.action(ArgAction::SetTrue)`                               |       |\n//! | `Option<T>`           | optional argument                                    | `.action(ArgAction::Set).required(false)`                   |       |\n//! | `Option<Option<T>>`   | optional value for optional argument                 | `.action(ArgAction::Set).required(false).num_args(0..=1)`   |       |\n//! | `T`                   | required argument                                    | `.action(ArgAction::Set).required(!has_default)`            |       |\n//! | `Vec<T>`              | `0..` occurrences of argument                        | `.action(ArgAction::Append).required(false)`  |       |\n//! | `Option<Vec<T>>`      | `0..` occurrences of argument                        | `.action(ArgAction::Append).required(false)`  |       |\n//! | `Vec<Vec<T>>`         | `0..` occurrences of argument, grouped by occurrence | `.action(ArgAction::Append).required(false)`  | requires `unstable-v5` |\n//! | `Option<Vec<Vec<T>>>` | `0..` occurrences of argument, grouped by occurrence | `.action(ArgAction::Append).required(false)`  | requires `unstable-v5` |\n//!\n//! In addition, [`.value_parser(value_parser!(T))`][crate::value_parser!] is called for each\n//! field in the absence of a [`#[arg(value_parser)]` attribute](#arg-attributes).\n//!\n//! Notes:\n//! - For custom type behavior, you can override the implied attributes/settings and/or set additional ones\n//!   - To force any inferred type (like `Vec<T>`) to be treated as `T`, you can refer to the type\n//!     by another means, like using `std::vec::Vec` instead of `Vec`.  For improving this, see\n//!     [#4626](https://github.com/clap-rs/clap/issues/4626).\n//! - `Option<Vec<T>>` and `Option<Vec<Vec<T>>` will be `None` instead of `vec![]` if no arguments are provided.\n//!   - This gives the user some flexibility in designing their argument, like with `num_args(0..)`\n//! - `Vec<Vec<T>>` will need [`Arg::num_args`][crate::Arg::num_args] set to be meaningful\n//!\n//! ## Doc Comments\n//!\n//! In clap, help messages for the whole binary can be specified\n//! via [`Command::about`][crate::Command::about] and [`Command::long_about`][crate::Command::long_about] while help messages\n//! for individual arguments can be specified via [`Arg::help`][crate::Arg::help] and [`Arg::long_help`][crate::Arg::long_help].\n//!\n//! `long_*` variants are used when user calls the program with\n//! `--help` and \"short\" variants are used with `-h` flag.\n//!\n//! ```rust\n//! # use clap::Parser;\n//!\n//! #[derive(Parser)]\n//! #[command(about = \"I am a program and I work, just pass `-h`\", long_about = None)]\n//! struct Foo {\n//!     #[arg(short, help = \"Pass `-h` and you'll see me!\")]\n//!     bar: String,\n//! }\n//! ```\n//!\n//! For convenience, doc comments can be used instead of raw methods\n//! (this example works exactly like the one above):\n//!\n//! ```rust\n//! # use clap::Parser;\n//!\n//! #[derive(Parser)]\n//! /// I am a program and I work, just pass `-h`\n//! struct Foo {\n//!     /// Pass `-h` and you'll see me!\n//!     bar: String,\n//! }\n//! ```\n//!\n//! <div class=\"warning\">\n//!\n//! **NOTE:** Attributes have priority over doc comments!\n//!\n//! **Top level doc comments always generate `Command::about/long_about` calls!**\n//! If you really want to use the `Command::about/long_about` methods (you likely don't),\n//! use the `about` / `long_about` attributes to override the calls generated from\n//! the doc comment.  To clear `long_about`, you can use\n//! `#[command(long_about = None)]`.\n//!\n//! </div>\n//!\n//! ### Pre-processing\n//!\n//! ```rust\n//! # use clap::Parser;\n//! #[derive(Parser)]\n//! /// Hi there, I'm Robo!\n//! ///\n//! /// I like beeping, stumbling, eating your electricity,\n//! /// and making records of you singing in a shower.\n//! /// Pay up, or I'll upload it to youtube!\n//! struct Robo {\n//!     /// Call my brother SkyNet.\n//!     ///\n//!     /// I am artificial superintelligence. I won't rest\n//!     /// until I'll have destroyed humanity. Enjoy your\n//!     /// pathetic existence, you mere mortals.\n//!     #[arg(long, action)]\n//!     kill_all_humans: bool,\n//! }\n//! ```\n//!\n//! A doc comment consists of three parts:\n//! - Short summary\n//! - A blank line (whitespace only)\n//! - Detailed description, all the rest\n//!\n//! The summary corresponds with `Command::about` / `Arg::help`.  When a blank line is\n//! present, the whole doc comment will be passed to `Command::long_about` /\n//! `Arg::long_help`.  Or in other words, a doc may result in just a `Command::about` /\n//! `Arg::help` or `Command::about` / `Arg::help` and `Command::long_about` /\n//! `Arg::long_help`\n//!\n//! In addition, when `verbatim_doc_comment` is not present, `clap` applies some preprocessing, including:\n//!\n//! - Strip leading and trailing whitespace from every line, if present.\n//!\n//! - Strip leading and trailing blank lines, if present.\n//!\n//! - Interpret each group of non-empty lines as a word-wrapped paragraph.\n//!\n//!   We replace newlines within paragraphs with spaces to allow the output\n//!   to be re-wrapped to the terminal width.\n//!\n//! - Strip any excess blank lines so that there is exactly one per paragraph break.\n//!\n//! - If the first paragraph ends in exactly one period,\n//!   remove the trailing period (i.e. strip trailing periods but not trailing ellipses).\n//!\n//! Sometimes you don't want this preprocessing to apply, for example the comment contains\n//! some ASCII art or markdown tables, you would need to preserve LFs along with\n//! blank lines and the leading/trailing whitespace. When you pass use the\n//! `verbatim_doc_comment` magic attribute, you  preserve\n//! them.\n//!\n//! **Note:** Keep in mind that `verbatim_doc_comment` will *still*\n//! - Remove one leading space from each line, even if this attribute is present,\n//!   to allow for a space between `///` and the content.\n//! - Remove leading and trailing blank lines\n//!\n//! ## Mixing Builder and Derive APIs\n//!\n//! The builder and derive APIs do not live in isolation. They can work together, which is\n//! especially helpful if some arguments can be specified at compile-time while others must be\n//! specified at runtime.\n//!\n//! ### Using derived arguments in a builder application\n//!\n//! When using the derive API, you can `#[command(flatten)]` a struct deriving `Args` into a struct\n//! deriving `Args` or `Parser`. This example shows how you can augment a `Command` instance\n//! created using the builder API with `Args` created using the derive API.\n//!\n//! It uses the [`Args::augment_args`][crate::Args::augment_args] method to add the arguments to\n//! the `Command` instance.\n//!\n//! Crates such as [clap-verbosity-flag](https://github.com/rust-cli/clap-verbosity-flag) provide\n//! structs that implement `Args`. Without the technique shown in this example, it would not be\n//! possible to use such crates with the builder API.\n//!\n//! For example:\n//! ```rust\n#![doc = include_str!(\"../../examples/derive_ref/augment_args.rs\")]\n//! ```\n//!\n//! ### Using derived subcommands in a builder application\n//!\n//! When using the derive API, you can use `#[command(subcommand)]` inside the struct to add\n//! subcommands. The type of the field is usually an enum that derived `Parser`. However, you can\n//! also add the subcommands in that enum to a `Command` instance created with the builder API.\n//!\n//! It uses the [`Subcommand::augment_subcommands`][crate::Subcommand::augment_subcommands] method\n//! to add the subcommands to the `Command` instance.\n//!\n//! For example:\n//! ```rust\n#![doc = include_str!(\"../../examples/derive_ref/augment_subcommands.rs\")]\n//! ```\n//!\n//! ### Adding hand-implemented subcommands to a derived application\n//!\n//! When using the derive API, you can use `#[command(subcommand)]` inside the struct to add\n//! subcommands. The type of the field is usually an enum that derived `Parser`. However, you can\n//! also implement the `Subcommand` trait manually on this enum (or any other type) and it can\n//! still be used inside the struct created with the derive API. The implementation of the\n//! `Subcommand` trait will use the builder API to add the subcommands to the `Command` instance\n//! created behind the scenes for you by the derive API.\n//!\n//! Notice how in the previous example we used\n//! [`augment_subcommands`][crate::Subcommand::augment_subcommands] on an enum that derived\n//! `Parser`, whereas now we implement\n//! [`augment_subcommands`][crate::Subcommand::augment_subcommands] ourselves, but the derive API\n//! calls it automatically since we used the `#[command(subcommand)]` attribute.\n//!\n//! For example:\n//! ```rust\n#![doc = include_str!(\"../../examples/derive_ref/hand_subcommand.rs\")]\n//! ```\n//!\n//! ### Flattening hand-implemented args into a derived application\n//!\n//! When using the derive API, you can use `#[command(flatten)]` inside the struct to add arguments as\n//! if they were added directly to the containing struct. The type of the field is usually an\n//! struct that derived `Args`. However, you can also implement the `Args` trait manually on this\n//! struct (or any other type) and it can still be used inside the struct created with the derive\n//! API. The implementation of the `Args` trait will use the builder API to add the arguments to\n//! the `Command` instance created behind the scenes for you by the derive API.\n//!\n//! Notice how in the previous example we used [`augment_args`][crate::Args::augment_args] on the\n//! struct that derived `Parser`, whereas now we implement\n//! [`augment_args`][crate::Args::augment_args] ourselves, but the derive API calls it\n//! automatically since we used the `#[command(flatten)]` attribute.\n//!\n//! For example:\n//! ```rust\n#![doc = include_str!(\"../../examples/derive_ref/flatten_hand_args.rs\")]\n//! ```\n//!\n//! ## Tips\n//!\n//! - To get access to a [`Command`][crate::Command] call\n//!   [`CommandFactory::command`][crate::CommandFactory::command] (implemented when deriving\n//!   [`Parser`][crate::Parser])\n//! - Proactively check for bad [`Command`][crate::Command] configurations by calling\n//!   [`Command::debug_assert`][crate::Command::debug_assert] in a test\n//!   ([example][_tutorial#testing])\n//! - Always remember to [document](#doc-comments) args and commands with `#![deny(missing_docs)]`\n\n// Point people here that search for attributes that don't exist in the derive (a subset of magic\n// attributes)\n#![doc(alias = \"skip\")]\n#![doc(alias = \"verbatim_doc_comment\")]\n#![doc(alias = \"flatten\")]\n#![doc(alias = \"external_subcommand\")]\n#![doc(alias = \"subcommand\")]\n#![doc(alias = \"rename_all\")]\n#![doc(alias = \"rename_all_env\")]\n#![doc(alias = \"default_value_t\")]\n#![doc(alias = \"default_values_t\")]\n#![doc(alias = \"default_value_os_t\")]\n#![doc(alias = \"default_values_os_t\")]\n\npub mod _tutorial;\n#[doc(inline)]\npub use crate::_cookbook;\n"
  },
  {
    "path": "src/_faq.rs",
    "content": "//! # Documentation: FAQ\n//!\n//! 1. [Comparisons](#comparisons)\n//!    1. [How does `clap` compare to structopt?](#how-does-clap-compare-to-structopt)\n//!    2. [What are some reasons to use `clap`? (The Pitch)](#what-are-some-reasons-to-use-clap-the-pitch)\n//!    3. [What are some reasons *not* to use `clap`? (The Anti Pitch)](#what-are-some-reasons-not-to-use-clap-the-anti-pitch)\n//!    4. [Reasons to use `clap`](#reasons-to-use-clap)\n//! 2. [How many approaches are there to create a parser?](#how-many-approaches-are-there-to-create-a-parser)\n//! 3. [When should I use the builder vs derive APIs?](#when-should-i-use-the-builder-vs-derive-apis)\n//! 4. [Why is there a default subcommand of help?](#why-is-there-a-default-subcommand-of-help)\n//!\n//! ### Comparisons\n//!\n//! First, let me say that these comparisons are highly subjective, and not meant\n//! in a critical or harsh manner. All the argument parsing libraries out there (to\n//! include `clap`) have their own strengths and weaknesses. Sometimes it just\n//! comes down to personal taste when all other factors are equal. When in doubt,\n//! try them all and pick one that you enjoy :). There's plenty of room in the Rust\n//! community for multiple implementations!\n//!\n//! For less detailed but more broad comparisons, see\n//! [argparse-benchmarks](https://github.com/rust-cli/argparse-benchmarks-rs).\n//!\n//! #### How does `clap` compare to [structopt](https://github.com/TeXitoi/structopt)?\n//!\n//! Simple! `clap` *is* `structopt`.  `structopt` started as a derive API built on\n//! top of clap v2.  With clap v3, we've forked structopt and integrated it\n//! directly into clap.  structopt is in\n//! [maintenance mode](https://github.com/TeXitoi/structopt/issues/516#issuecomment-989566094)\n//! with the release of `clap_derive`.\n//!\n//! The benefits of integrating `structopt` and `clap` are:\n//! - Easier cross-linking in documentation\n//! - Documentation parity\n//! - Tighter design feedback loop, ensuring all new features are designed with\n//!   derives in mind and easier to change `clap` in response to `structopt` bugs.\n//! - Clearer endorsement of `structopt`\n//!\n//! See also\n//! - [`clap` v3 CHANGELOG](https://github.com/clap-rs/clap/blob/v3-master/CHANGELOG.md#300---2021-12-31)\n//! - [`structopt` migration guide](https://github.com/clap-rs/clap/blob/v3-master/CHANGELOG.md#migrate-structopt)\n//!\n//! #### What are some reasons to use `clap`? (The Pitch)\n//!\n//! `clap` is as fast, and as lightweight as possible while still giving all the features you'd expect from a modern argument parser. In fact, for the amount and type of features `clap` offers it remains about as fast as `getopts`. If you use `clap`, when you just need some simple arguments parsed, you'll find it's a walk in the park. `clap` also makes it possible to represent extremely complex and advanced requirements without too much thought. `clap` aims to be intuitive, easy to use, and fully capable for wide variety use cases and needs.\n//!\n//! #### What are some reasons *not* to use `clap`? (The Anti Pitch)\n//!\n//! Depending on the style in which you choose to define the valid arguments, `clap` can be very verbose. `clap` also offers so many finetuning knobs and dials, that learning everything can seem overwhelming. I strive to keep the simple cases simple, but when turning all those custom dials it can get complex. `clap` is also opinionated about parsing. Even though so much can be tweaked and tuned with `clap` (and I'm adding more all the time), there are still certain features which `clap` implements in specific ways that may be contrary to some users' use-cases.\n//!\n//! #### Reasons to use `clap`\n//!\n//!  * You want all the nice CLI features your users may expect, yet you don't want to implement them all yourself. You'd like to focus on your application, not argument parsing.\n//!  * In addition to the point above, you don't want to sacrifice performance to get all those nice features.\n//!  * You have complex requirements/conflicts between your various valid args.\n//!  * You want to use subcommands (although other libraries also support subcommands, they are not nearly as feature rich as those provided by `clap`).\n//!  * You want some sort of custom validation built into the argument parsing process, instead of as part of your application (which allows for earlier failures, better error messages, more cohesive experience, etc.).\n//!\n//! ### How many approaches are there to create a parser?\n//!\n//! The following APIs are supported:\n//! - [Derive][crate::_derive::_tutorial]\n//! - [Builder][crate::_tutorial]\n//!\n//! Previously, we supported:\n//! - [YAML](https://github.com/clap-rs/clap/issues/3087)\n//! - [docopt](http://docopt.org/)-inspired [usage parser](https://github.com/clap-rs/clap/issues/3086)\n//! - [`clap_app!`](https://github.com/clap-rs/clap/issues/2835)\n//!\n//! There are also experiments with other APIs:\n//! - [fncmd](https://github.com/yuhr/fncmd): function attribute\n//! - [clap-serde](https://github.com/aobatact/clap-serde): create a `Command` from a deserializer\n//!\n//! ### When should I use the builder vs derive APIs?\n//!\n//! Our default answer is to use the [Derive API][crate::_derive::_tutorial]:\n//! - Easier to read, write, and modify\n//! - Easier to keep the argument declaration and reading of argument in sync\n//! - Easier to reuse, e.g. [clap-verbosity-flag](https://crates.io/crates/clap-verbosity-flag)\n//!\n//! The [Builder API][crate::_tutorial] is a lower-level API that someone might want to use for\n//! - Faster compile times if you aren't already using other procedural macros\n//! - More flexibility, e.g. you can look up the [argument's values][crate::ArgMatches::get_many],\n//!   their [ordering with other arguments][crate::ArgMatches::indices_of], and [what set\n//!   them][crate::ArgMatches::value_source].  The Derive API can only report values and not\n//!   indices of or other data.\n//!\n//! You can [interop between Derive and Builder APIs][crate::_derive#mixing-builder-and-derive-apis].\n//!\n//! ### Why is there a default subcommand of help?\n//!\n//! There is only a default subcommand of `help` when other subcommands have been defined manually. So it's opt-in(ish), being that you only get a `help` subcommand if you're actually using subcommands.\n//!\n//! Also, if the user defined a `help` subcommand themselves, the auto-generated one wouldn't be added (meaning it's only generated if the user hasn't defined one themselves).\n//!\n"
  },
  {
    "path": "src/_features.rs",
    "content": "//! ## Documentation: Feature Flags\n//!\n//! Available [compile-time feature flags](https://doc.rust-lang.org/cargo/reference/features.html#dependency-features)\n//!\n//! #### Default Features\n//!\n//! * `std`: _Not Currently Used._ Placeholder for supporting `no_std` environments in a backwards compatible manner.\n//! * `color`: Turns on terminal styling of help and error messages.  See\n//!   [`Command::styles`][crate::Command::styles] to customize this.\n//! * `help`: Auto-generate help output\n//! * `usage`: Auto-generate usage\n//! * `error-context`: Include contextual information for errors (which arg failed, etc)\n//! * `suggestions`: Turns on the `Did you mean '--myoption'?` feature for when users make typos.\n//!\n//! #### Optional features\n//!\n//! * `deprecated`: Guided experience to prepare for next breaking release (at different stages of development, this may become default)\n//! * `derive`: Enables the custom derive (i.e. `#[derive(Parser)]`). Without this you must use one of the other methods of creating a `clap` CLI listed above.\n//! * `cargo`: Turns on macros that read values from [`CARGO_*` environment variables](https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates).\n//! * `env`: Turns on the usage of environment variables during parsing.\n//! * `unicode`: Turns on support for unicode characters (including emoji) in arguments and help messages.\n//! * ``wrap_help``: Turns on the help text wrapping feature, based on the terminal size.\n//! * `string`: Allow runtime generated strings (e.g. with [`Str`][crate::builder::Str]).\n//!\n//! #### Experimental features\n//!\n//! **Warning:** These may contain breaking changes between minor releases.\n//!\n//! * `unstable-v5`: Preview features which will be stable on the v5.0 release\n"
  },
  {
    "path": "src/_tutorial.rs",
    "content": "// Contributing\n//\n// New example code:\n// - Please update the corresponding section in the derive tutorial\n// - Building: They must be added to `Cargo.toml` with the appropriate `required-features`.\n// - Testing: Ensure there is a markdown file with [trycmd](https://docs.rs/trycmd) syntax\n//\n// See also the general CONTRIBUTING\n\n//! ## Tutorial for the Builder API\n//!\n//! *See the side bar for the Table of Contents*\n//!\n//! ## Quick Start\n//!\n//! You can create an application with several arguments using usage strings.\n//!\n//! First, ensure `clap` is available:\n//! ```console\n//! $ cargo add clap\n//! ```\n//!\n//! Here is a preview of the type of application you can make:\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/01_quick.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../examples/tutorial_builder/01_quick.md\")]\n//!\n//! See also\n//! - [FAQ: When should I use the builder vs derive APIs?][crate::_faq#when-should-i-use-the-builder-vs-derive-apis]\n//! - The [cookbook][crate::_cookbook] for more application-focused examples\n//!\n//! ## Configuring the Parser\n//!\n//! You use [`Command`][crate::Command] to start building a parser.\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/02_apps.rs\")]\n//! ```\n//!\n#![doc = include_str!(\"../examples/tutorial_builder/02_apps.md\")]\n//!\n//! You can use [`command!()`][crate::command!] to fill these fields in from your `Cargo.toml`\n//! file.  **This requires the [`cargo` feature flag][crate::_features].**\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/02_crate.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/02_crate.md\")]\n//!\n//! You can use [`Command`][crate::Command] methods to change the application level behavior of\n//! clap, like [`Command::next_line_help`].\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/02_app_settings.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/02_app_settings.md\")]\n//!\n//! ## Adding Arguments\n//!\n//! 1. [Positionals](#positionals)\n//! 2. [Options](#options)\n//! 3. [Flags](#flags)\n//! 4. [Required](#required)\n//! 5. [Defaults](#defaults)\n//! 6. [Subcommands](#subcommands)\n//!\n//!\n//! ### Positionals\n//!\n//! By default, an [`Arg`] defines a positional argument:\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/03_03_positional.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/03_03_positional.md\")]\n//!\n//! Note that the default [`ArgAction`][crate::ArgAction] is [`Set`][crate::ArgAction::Set].  To\n//! accept multiple values, override the [action][Arg::action] with [`Append`][crate::ArgAction::Append]:\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/03_03_positional_mult.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/03_03_positional_mult.md\")]\n//!\n//! ### Options\n//!\n//! You can name your arguments with a flag:\n//! - Intent of the value is clearer\n//! - Order doesn't matter\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/03_02_option.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/03_02_option.md\")]\n//!\n//! Note that the default [`ArgAction`][crate::ArgAction] is [`Set`][crate::ArgAction::Set].  To\n//! accept multiple occurrences, override the [action][Arg::action] with [`Append`][crate::ArgAction::Append]:\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/03_02_option_mult.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/03_02_option_mult.md\")]\n//!\n//! ### Flags\n//!\n//! Flags can also be switches that can be on/off:\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/03_01_flag_bool.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/03_01_flag_bool.md\")]\n//!\n//! To accept multiple flags, use [`Count`][crate::ArgAction::Count]:\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/03_01_flag_count.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/03_01_flag_count.md\")]\n//!\n//! ### Required\n//!\n//! By default, an [`Arg`] is optional which can be changed with\n//! [`required`][crate::Arg::required].\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/03_06_required.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/03_06_required.md\")]\n//!\n//! ### Defaults\n//!\n//! We've previously showed that arguments can be [`required`][crate::Arg::required] or optional.\n//! When optional, you work with a `Option` and can `unwrap_or`.  Alternatively, you can set\n//! [`Arg::default_value`][crate::Arg::default_value].\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/03_05_default_values.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/03_05_default_values.md\")]\n//!\n//! ### Subcommands\n//!\n//! Subcommands are defined as [`Command`][crate::Command]s that get added via\n//! [`Command::subcommand`][crate::Command::subcommand]. Each instance of a Subcommand can have its\n//! own version, author(s), Args, and even its own subcommands.\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/03_04_subcommands.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/03_04_subcommands.md\")]\n//!\n//! ## Validation\n//!\n//! 1. [Enumerated values](#enumerated-values)\n//! 2. [Validated values](#validated-values)\n//! 3. [Argument Relations](#argument-relations)\n//! 4. [Custom Validation](#custom-validation)\n//!\n//! An appropriate default parser/validator will be selected for the field's type.  See\n//! [`value_parser!`][crate::value_parser!] for more details.\n//!\n//! ### Enumerated values\n//!\n//! If you have arguments of specific values you want to test for, you can use the\n//! [`PossibleValuesParser`] or [`Arg::value_parser([\"val1\",\n//! ...])`][crate::Arg::value_parser] for short.\n//!\n//! This allows you to specify the valid values for that argument. If the user does not use one of\n//! those specific values, they will receive a graceful exit with error message informing them\n//! of the mistake, and what the possible valid values are\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/04_01_possible.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/04_01_possible.md\")]\n//!\n//! When enabling the [`derive` feature][crate::_features], you can use\n//! [`ValueEnum`][crate::ValueEnum] to take care of the boiler plate for you, giving the same\n//! results.\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/04_01_enum.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/04_01_enum.md\")]\n//!\n//! ### Validated values\n//!\n//! More generally, you can validate and parse into any data type with [`Arg::value_parser`].\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/04_02_parse.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/04_02_parse.md\")]\n//!\n//! A [custom parser][TypedValueParser] can be used to improve the error messages or provide additional validation:\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/04_02_validate.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/04_02_validate.md\")]\n//!\n//! See [`Arg::value_parser`][crate::Arg::value_parser] for more details.\n//!\n//! ### Argument Relations\n//!\n//! You can declare dependencies or conflicts between [`Arg`][crate::Arg]s or even\n//! [`ArgGroup`][crate::ArgGroup]s.\n//!\n//! [`ArgGroup`][crate::ArgGroup]s  make it easier to declare relations instead of having to list\n//! each individually, or when you want a rule to apply \"any but not all\" arguments.\n//!\n//! Perhaps the most common use of [`ArgGroup`][crate::ArgGroup]s is to require one and *only* one\n//! argument to be present out of a given set. Imagine that you had multiple arguments, and you\n//! want one of them to be required, but making all of them required isn't feasible because perhaps\n//! they conflict with each other.\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/04_03_relations.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/04_03_relations.md\")]\n//!\n//! ### Custom Validation\n//!\n//! As a last resort, you can create custom errors with the basics of clap's formatting.\n//!\n//! ```rust\n#![doc = include_str!(\"../examples/tutorial_builder/04_04_custom.rs\")]\n//! ```\n#![doc = include_str!(\"../examples/tutorial_builder/04_04_custom.md\")]\n//!\n//! ## Testing\n//!\n//! clap reports most development errors as `debug_assert!`s.  Rather than checking every\n//! subcommand, you should have a test that calls\n//! [`Command::debug_assert`][crate::Command::debug_assert]:\n//! ```rust,no_run\n#![doc = include_str!(\"../examples/tutorial_builder/05_01_assert.rs\")]\n//! ```\n//!\n//! ## Next Steps\n//!\n//! - [Cookbook][crate::_cookbook] for application-focused examples\n//! - Explore more features in the [API reference][super]\n//!\n//! For support, see [Discussions](https://github.com/clap-rs/clap/discussions)\n#![allow(unused_imports)]\nuse crate::builder::*;\n"
  },
  {
    "path": "src/bin/stdio-fixture.rs",
    "content": "use clap::{Arg, ArgAction, Command, builder::PossibleValue};\n\nfn main() {\n    #[allow(unused_mut)]\n    let mut cmd = Command::new(\"stdio-fixture\")\n        .version(\"1.0\")\n        .long_version(\"1.0 - a2132c\")\n        .term_width(0)\n        .max_term_width(0)\n        .arg_required_else_help(true)\n        .subcommand(Command::new(\"more\"))\n        .subcommand(\n            Command::new(\"test\")\n                .visible_alias(\"do-stuff\")\n                .long_about(\"Subcommand with one visible alias\"),\n        )\n        .subcommand(\n            Command::new(\"test_2\")\n                .visible_aliases([\"do-other-stuff\", \"tests\"])\n                .about(\"several visible aliases\")\n                .long_about(\"Subcommand with multiple visible aliases\"),\n        )\n        .subcommand(\n            Command::new(\"test_3\")\n                .long_flag(\"test\")\n                .about(\"several visible long flag aliases\")\n                .visible_long_flag_aliases([\"testing\", \"testall\", \"test_all\"]),\n        )\n        .subcommand(\n            Command::new(\"test_4\")\n                .short_flag('t')\n                .about(\"several visible short flag aliases\")\n                .visible_short_flag_aliases(['q', 'w']),\n        )\n        .subcommand(\n            Command::new(\"test_5\")\n                .short_flag('e')\n                .long_flag(\"test-hdr\")\n                .about(\"all kinds of visible aliases\")\n                .visible_aliases([\"tests_4k\"])\n                .visible_long_flag_aliases([\"thetests\", \"t4k\"])\n                .visible_short_flag_aliases(['r', 'y']),\n        )\n        .arg(\n            Arg::new(\"verbose\")\n                .long(\"verbose\")\n                .help(\"log\")\n                .action(ArgAction::SetTrue)\n                .long_help(\"more log\"),\n        )\n        .arg(\n            Arg::new(\"config\")\n                .action(ArgAction::Set)\n                .help(\"Speed configuration\")\n                .short('c')\n                .long(\"config\")\n                .value_name(\"MODE\")\n                .value_parser([\n                    PossibleValue::new(\"fast\"),\n                    PossibleValue::new(\"slow\").help(\"slower than fast\"),\n                    PossibleValue::new(\"secret speed\").hide(true),\n                ])\n                .default_value(\"fast\"),\n        )\n        .arg(\n            Arg::new(\"name\")\n                .action(ArgAction::Set)\n                .help(\"App name\")\n                .long_help(\"Set the instance app name\")\n                .value_name(\"NAME\")\n                .visible_alias(\"app-name\")\n                .default_value(\"clap\"),\n        )\n        .arg(\n            Arg::new(\"fruits\")\n                .short('f')\n                .visible_short_alias('b')\n                .action(ArgAction::Append)\n                .value_name(\"FRUITS\")\n                .help(\"List of fruits\")\n                .default_values([\"apple\", \"banane\", \"orange\"]),\n        );\n    #[cfg(feature = \"env\")]\n    {\n        cmd = cmd.arg(\n            Arg::new(\"env_arg\")\n                .help(\"Read from env var when arg is not present.\")\n                .value_name(\"ENV\")\n                .env(\"ENV_ARG\"),\n        );\n    }\n    #[cfg(feature = \"color\")]\n    {\n        use clap::builder::styling::{AnsiColor, Styles};\n        const STYLES: Styles = Styles::styled()\n            .header(AnsiColor::Green.on_default().bold())\n            .error(AnsiColor::Red.on_default().bold())\n            .usage(AnsiColor::Green.on_default().bold().underline())\n            .literal(AnsiColor::Blue.on_default().bold())\n            .placeholder(AnsiColor::Cyan.on_default())\n            .valid(AnsiColor::Green.on_default())\n            .invalid(AnsiColor::Magenta.on_default().bold())\n            .context(AnsiColor::Yellow.on_default().dimmed())\n            .context_value(AnsiColor::Yellow.on_default().italic());\n        cmd = cmd.styles(STYLES);\n    }\n    cmd.get_matches();\n}\n"
  },
  {
    "path": "src/lib.rs",
    "content": "// Copyright ⓒ 2015-2016 Kevin B. Knapp and [`clap-rs` contributors](https://github.com/clap-rs/clap/graphs/contributors).\n// Licensed under the MIT license\n// (see LICENSE or <http://opensource.org/licenses/MIT>) All files in the project carrying such\n// notice may not be copied, modified, or distributed except according to those terms.\n\n//! > **Command Line Argument Parser for Rust**\n//!\n//! Quick Links:\n//! - Derive [tutorial][_derive::_tutorial] and [reference][_derive]\n//! - Builder [tutorial][_tutorial] and [reference][Command]\n//! - [Cookbook][_cookbook]\n//! - [CLI Concepts][_concepts]\n//! - [FAQ][_faq]\n//! - [Discussions](https://github.com/clap-rs/clap/discussions)\n//! - [CHANGELOG](https://github.com/clap-rs/clap/blob/v4.6.0/CHANGELOG.md) (includes major version migration\n//!   guides)\n//!\n//! ## Aspirations\n//!\n//! - Out of the box, users get a polished CLI experience\n//!   - Including common argument behavior, help generation, suggested fixes for users, colored output, [shell completions](https://github.com/clap-rs/clap/tree/master/clap_complete), etc\n//! - Flexible enough to port your existing CLI interface\n//!   - However, we won't necessarily streamline support for each use case\n//! - Reasonable parse performance\n//! - Resilient maintainership, including\n//!   - Willing to break compatibility rather than batching up breaking changes in large releases\n//!   - Leverage feature flags to keep to one active branch\n//!   - Being under [WG-CLI](https://github.com/rust-cli/team/) to increase the bus factor\n//! - We follow semver and will wait about 6-9 months between major breaking changes\n//! - We will support the last two minor Rust releases (MSRV, currently 1.74)\n//!\n//! While these aspirations can be at odds with fast build times and low binary\n//! size, we will still strive to keep these reasonable for the flexibility you\n//! get.  Check out the\n//! [argparse-benchmarks](https://github.com/rust-cli/argparse-benchmarks-rs) for\n//! CLI parsers optimized for other use cases.\n//!\n//! ## Example\n//!\n//! Run\n//! ```console\n//! $ cargo add clap --features derive\n//! ```\n//! *(See also [feature flag reference][_features])*\n//!\n//! Then define your CLI in `main.rs`:\n//! ```rust\n//! # #[cfg(feature = \"derive\")] {\n#![doc = include_str!(\"../examples/demo.rs\")]\n//! # }\n//! ```\n//!\n//! And try it out:\n#![doc = include_str!(\"../examples/demo.md\")]\n//!\n//! See also the derive [tutorial][_derive::_tutorial] and [reference][_derive]\n//!\n//! ### Related Projects\n//!\n//! Augment clap:\n//! - [wild](https://crates.io/crates/wild) for supporting wildcards (`*`) on Windows like you do Linux\n//! - [argfile](https://crates.io/crates/argfile) for loading additional arguments from a file (aka response files)\n//! - [shadow-rs](https://crates.io/crates/shadow-rs) for generating `Command::long_version`\n//! - [clap_mangen](https://crates.io/crates/clap_mangen) for generating man page source (roff)\n//! - [clap_complete](https://crates.io/crates/clap_complete) for shell completion support\n//! - [clap-i18n-richformatter](https://crates.io/crates/clap-i18n-richformatter) for i18n support with `clap::error::RichFormatter`\n//!\n//! CLI Helpers\n//! - [clio](https://crates.io/crates/clio) for reading/writing to files specified as arguments\n//! - [clap-verbosity-flag](https://crates.io/crates/clap-verbosity-flag)\n//! - [clap-cargo](https://crates.io/crates/clap-cargo)\n//! - [colorchoice-clap](https://crates.io/crates/colorchoice-clap)\n//!\n//! Testing\n//! - [`trycmd`](https://crates.io/crates/trycmd):  Bulk snapshot testing\n//! - [`snapbox`](https://crates.io/crates/snapbox):  Specialized snapshot testing\n//! - [`assert_cmd`](https://crates.io/crates/assert_cmd) and [`assert_fs`](https://crates.io/crates/assert_fs): Customized testing\n//!\n//! Documentation:\n//! - [Command-line Apps for Rust](https://rust-cli.github.io/book/index.html) book\n//!\n\n#![doc(html_logo_url = \"https://raw.githubusercontent.com/clap-rs/clap/master/assets/clap.png\")]\n#![cfg_attr(docsrs, feature(doc_cfg))]\n#![forbid(unsafe_code)]\n#![warn(missing_docs)]\n#![warn(clippy::print_stderr)]\n#![warn(clippy::print_stdout)]\n\npub use clap_builder::*;\n#[cfg(feature = \"derive\")]\n#[doc(hidden)]\npub use clap_derive::{self, Args, Parser, Subcommand, ValueEnum};\n\n#[cfg(feature = \"unstable-doc\")]\npub mod _concepts;\n#[cfg(feature = \"unstable-doc\")]\npub mod _cookbook;\n#[cfg(feature = \"unstable-doc\")]\npub mod _derive;\n#[cfg(feature = \"unstable-doc\")]\npub mod _faq;\n#[cfg(feature = \"unstable-doc\")]\npub mod _features;\n#[cfg(feature = \"unstable-doc\")]\npub mod _tutorial;\n\n#[doc = include_str!(\"../README.md\")]\n#[cfg(doctest)]\npub struct ReadmeDoctests;\n"
  },
  {
    "path": "tests/builder/action.rs",
    "content": "#![allow(clippy::bool_assert_comparison)]\n\nuse clap::builder::ArgPredicate;\nuse clap::error::ErrorKind;\nuse clap::Arg;\nuse clap::ArgAction;\nuse clap::Command;\n\n#[test]\nfn set() {\n    let cmd = Command::new(\"test\").arg(Arg::new(\"mammal\").long(\"mammal\").action(ArgAction::Set));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_one::<String>(\"mammal\"), None);\n    assert_eq!(matches.contains_id(\"mammal\"), false);\n    assert_eq!(matches.index_of(\"mammal\"), None);\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\", \"dog\"])\n        .unwrap();\n    assert_eq!(matches.get_one::<String>(\"mammal\").unwrap(), \"dog\");\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(2));\n\n    let result = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\", \"dog\", \"--mammal\", \"cat\"]);\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let matches = cmd\n        .clone()\n        .args_override_self(true)\n        .try_get_matches_from([\"test\", \"--mammal\", \"dog\", \"--mammal\", \"cat\"])\n        .unwrap();\n    assert_eq!(matches.get_one::<String>(\"mammal\").unwrap(), \"cat\");\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(4));\n}\n\n#[test]\nfn append() {\n    let cmd = Command::new(\"test\").arg(Arg::new(\"mammal\").long(\"mammal\").action(ArgAction::Append));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_one::<String>(\"mammal\"), None);\n    assert_eq!(matches.contains_id(\"mammal\"), false);\n    assert_eq!(matches.index_of(\"mammal\"), None);\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\", \"dog\"])\n        .unwrap();\n    assert_eq!(matches.get_one::<String>(\"mammal\").unwrap(), \"dog\");\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(\n        matches.indices_of(\"mammal\").unwrap().collect::<Vec<_>>(),\n        vec![2]\n    );\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\", \"dog\", \"--mammal\", \"cat\"])\n        .unwrap();\n    assert_eq!(\n        matches\n            .get_many::<String>(\"mammal\")\n            .unwrap()\n            .map(|s| s.as_str())\n            .collect::<Vec<_>>(),\n        vec![\"dog\", \"cat\"]\n    );\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(\n        matches.indices_of(\"mammal\").unwrap().collect::<Vec<_>>(),\n        vec![2, 4]\n    );\n}\n\n#[test]\nfn set_true() {\n    let cmd =\n        Command::new(\"test\").arg(Arg::new(\"mammal\").long(\"mammal\").action(ArgAction::SetTrue));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n\n    let result = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\", \"--mammal\"]);\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let matches = cmd\n        .clone()\n        .args_override_self(true)\n        .try_get_matches_from([\"test\", \"--mammal\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(2));\n}\n\n#[test]\nfn set_true_with_explicit_default_value() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"mammal\")\n            .long(\"mammal\")\n            .action(ArgAction::SetTrue)\n            .default_value(\"false\"),\n    );\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n}\n\n#[test]\nfn set_true_with_default_value_if_present() {\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::SetTrue)\n                .default_value_if(\"dog\", ArgPredicate::IsPresent, Some(\"true\")),\n        )\n        .arg(Arg::new(\"dog\").long(\"dog\").action(ArgAction::SetTrue));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), false);\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--dog\"]).unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), true);\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), false);\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n}\n\n#[test]\nfn set_true_with_default_value_if_value() {\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::SetTrue)\n                .default_value_if(\"dog\", \"true\", Some(\"true\")),\n        )\n        .arg(Arg::new(\"dog\").long(\"dog\").action(ArgAction::SetTrue));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), false);\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--dog\"]).unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), true);\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), false);\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n}\n\n#[test]\nfn set_true_with_required_if_eq() {\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::SetTrue)\n                .required_if_eq(\"dog\", \"true\"),\n        )\n        .arg(Arg::new(\"dog\").long(\"dog\").action(ArgAction::SetTrue));\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), false);\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n\n    cmd.clone()\n        .try_get_matches_from([\"test\", \"--dog\"])\n        .unwrap_err();\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--dog\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), true);\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n}\n\n#[test]\n#[should_panic = \"Argument `mammal`'s action SetTrue is incompatible with `num_args(1..)`\"]\nfn set_true_with_incompatible_num_args() {\n    Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::SetTrue)\n                .num_args(1..),\n        )\n        .build();\n}\n\n#[test]\nfn set_false() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"mammal\")\n            .long(\"mammal\")\n            .action(ArgAction::SetFalse),\n    );\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n\n    let result = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\", \"--mammal\"]);\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let matches = cmd\n        .clone()\n        .args_override_self(true)\n        .try_get_matches_from([\"test\", \"--mammal\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(2));\n}\n\n#[test]\nfn set_false_with_explicit_default_value() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"mammal\")\n            .long(\"mammal\")\n            .action(ArgAction::SetFalse)\n            .default_value(\"true\"),\n    );\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n}\n\n#[test]\nfn set_false_with_default_value_if_present() {\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::SetFalse)\n                .default_value_if(\"dog\", ArgPredicate::IsPresent, Some(\"false\")),\n        )\n        .arg(Arg::new(\"dog\").long(\"dog\").action(ArgAction::SetFalse));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), true);\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--dog\"]).unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), false);\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), true);\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n}\n\n#[test]\nfn set_false_with_default_value_if_value() {\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::SetFalse)\n                .default_value_if(\"dog\", \"false\", Some(\"false\")),\n        )\n        .arg(Arg::new(\"dog\").long(\"dog\").action(ArgAction::SetFalse));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), true);\n    assert_eq!(matches.get_flag(\"mammal\"), true);\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--dog\"]).unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), false);\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(matches.get_flag(\"dog\"), true);\n    assert_eq!(matches.get_flag(\"mammal\"), false);\n}\n\n#[test]\n#[should_panic = \"Argument `mammal`'s action SetFalse is incompatible with `num_args(1..)`\"]\nfn set_false_with_incompatible_num_args() {\n    Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::SetFalse)\n                .num_args(1..),\n        )\n        .build();\n}\n\n#[test]\nfn count() {\n    let cmd = Command::new(\"test\").arg(Arg::new(\"mammal\").long(\"mammal\").action(ArgAction::Count));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 0);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 1);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 2);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(2));\n}\n\n#[test]\nfn count_with_explicit_default_value() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"mammal\")\n            .long(\"mammal\")\n            .action(ArgAction::Count)\n            .default_value(\"10\"),\n    );\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 1);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 10);\n    assert_eq!(matches.contains_id(\"mammal\"), true);\n    assert_eq!(matches.index_of(\"mammal\"), Some(1));\n}\n\n#[test]\nfn count_with_default_value_if_present() {\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::Count)\n                .default_value_if(\"dog\", ArgPredicate::IsPresent, Some(\"10\")),\n        )\n        .arg(Arg::new(\"dog\").long(\"dog\").action(ArgAction::Count));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"dog\").unwrap(), 0);\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 0);\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--dog\"]).unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"dog\").unwrap(), 1);\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 10);\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"dog\").unwrap(), 0);\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 1);\n}\n\n#[test]\nfn count_with_default_value_if_value() {\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::Count)\n                .default_value_if(\"dog\", \"2\", Some(\"10\")),\n        )\n        .arg(Arg::new(\"dog\").long(\"dog\").action(ArgAction::Count));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"dog\").unwrap(), 0);\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 0);\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--dog\"]).unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"dog\").unwrap(), 1);\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 0);\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--dog\", \"--dog\"])\n        .unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"dog\").unwrap(), 2);\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 10);\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--mammal\"])\n        .unwrap();\n    assert_eq!(*matches.get_one::<u8>(\"dog\").unwrap(), 0);\n    assert_eq!(*matches.get_one::<u8>(\"mammal\").unwrap(), 1);\n}\n\n#[test]\n#[should_panic = \"Argument `mammal`'s action Count is incompatible with `num_args(1..)`\"]\nfn count_with_incompatible_num_args() {\n    Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::Count)\n                .num_args(1..),\n        )\n        .build();\n}\n\n#[test]\n#[should_panic = \"Argument `mammal`'s action Help is incompatible with `num_args(1..)`\"]\nfn help_with_incompatible_num_args() {\n    Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::Help)\n                .num_args(1..),\n        )\n        .build();\n}\n\n#[test]\n#[should_panic = \"Argument `mammal`'s action HelpShort is incompatible with `num_args(1..)`\"]\nfn help_short_with_incompatible_num_args() {\n    Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::HelpShort)\n                .num_args(1..),\n        )\n        .build();\n}\n\n#[test]\n#[should_panic = \"Argument `mammal`'s action HelpLong is incompatible with `num_args(1..)`\"]\nfn help_long_with_incompatible_num_args() {\n    Command::new(\"test\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::HelpLong)\n                .num_args(1..),\n        )\n        .build();\n}\n\n#[test]\n#[should_panic = \"Argument `mammal`'s action Version is incompatible with `num_args(1..)`\"]\nfn version_with_incompatible_num_args() {\n    Command::new(\"test\")\n        .version(\"1.0.0\")\n        .arg(\n            Arg::new(\"mammal\")\n                .long(\"mammal\")\n                .action(ArgAction::Version)\n                .num_args(1..),\n        )\n        .build();\n}\n"
  },
  {
    "path": "tests/builder/app_settings.rs",
    "content": "use std::ffi::OsString;\n\nuse clap::{arg, error::ErrorKind, Arg, ArgAction, Command};\n\nuse super::utils;\n\nstatic ALLOW_EXT_SC: &str = \"\\\nUsage: clap-test [COMMAND]\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\nstatic DONT_COLLAPSE_ARGS: &str = \"\\\nUsage: clap-test [arg1] [arg2] [arg3]\n\nArguments:\n  [arg1]  some\n  [arg2]  some\n  [arg3]  some\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n#[test]\nfn sub_command_negate_required() {\n    Command::new(\"sub_command_negate\")\n        .subcommand_negates_reqs(true)\n        .arg(Arg::new(\"test\").required(true).index(1))\n        .subcommand(Command::new(\"sub1\"))\n        .try_get_matches_from(vec![\"myprog\", \"sub1\"])\n        .unwrap();\n}\n\n#[test]\nfn sub_command_negate_required_2() {\n    let result = Command::new(\"sub_command_negate\")\n        .subcommand_negates_reqs(true)\n        .arg(Arg::new(\"test\").required(true).index(1))\n        .subcommand(Command::new(\"sub1\"))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn sub_command_required() {\n    let result = Command::new(\"sc_required\")\n        .subcommand_required(true)\n        .subcommand(Command::new(\"sub1\"))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingSubcommand);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn sub_command_required_error() {\n    static ERROR: &str = \"\\\nerror: 'sc_required' requires a subcommand but one was not provided\n  [subcommands: sub1, help]\n\nUsage: sc_required <COMMAND>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"sc_required\")\n        .subcommand_required(true)\n        .subcommand(Command::new(\"sub1\"));\n    utils::assert_output(cmd, \"sc_required\", ERROR, true);\n}\n\n#[test]\nfn arg_required_else_help() {\n    let result = Command::new(\"arg_required\")\n        .arg_required_else_help(true)\n        .arg(Arg::new(\"test\").index(1))\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(\n        err.kind(),\n        ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand\n    );\n}\n\n#[test]\nfn arg_required_else_help_over_req_arg() {\n    let result = Command::new(\"arg_required\")\n        .arg_required_else_help(true)\n        .arg(Arg::new(\"test\").index(1).required(true))\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(\n        err.kind(),\n        ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand\n    );\n}\n\n#[test]\nfn arg_required_else_help_over_req_subcommand() {\n    let result = Command::new(\"sub_required\")\n        .arg_required_else_help(true)\n        .subcommand_required(true)\n        .subcommand(Command::new(\"sub1\"))\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(\n        err.kind(),\n        ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand\n    );\n}\n\n#[test]\nfn arg_required_else_help_with_default() {\n    let result = Command::new(\"arg_required\")\n        .arg_required_else_help(true)\n        .arg(arg!(--input <PATH>).default_value(\"-\"))\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(\n        err.kind(),\n        ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand\n    );\n}\n\n#[test]\nfn arg_required_else_help_error_message() {\n    static ARG_REQUIRED_ELSE_HELP: &str = \"\\\nUsage: test [OPTIONS]\n\nOptions:\n  -i, --info     Provides more info\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n    let cmd = Command::new(\"test\")\n        .arg_required_else_help(true)\n        .version(\"1.0\")\n        .arg(\n            Arg::new(\"info\")\n                .help(\"Provides more info\")\n                .short('i')\n                .long(\"info\")\n                .action(ArgAction::SetTrue),\n        );\n    utils::assert_output(\n        cmd,\n        \"test\",\n        ARG_REQUIRED_ELSE_HELP,\n        true, // Unlike normal displaying of help, we should provide a fatal exit code\n    );\n}\n\n#[cfg(not(feature = \"suggestions\"))]\n#[test]\nfn infer_subcommands_fail_no_args() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\"))\n        .subcommand(Command::new(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"te\"]);\n    assert!(m.is_err(), \"{:#?}\", m.unwrap());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);\n}\n\n#[cfg(feature = \"suggestions\")]\n#[test]\nfn infer_subcommands_fail_no_args() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\"))\n        .subcommand(Command::new(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"te\"]);\n    assert!(m.is_err(), \"{:#?}\", m.unwrap());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);\n}\n\n#[test]\nfn infer_subcommands_fail_with_args() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .arg(Arg::new(\"some\"))\n        .subcommand(Command::new(\"test\"))\n        .subcommand(Command::new(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"t\"]);\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    assert_eq!(\n        m.unwrap().get_one::<String>(\"some\").map(|v| v.as_str()),\n        Some(\"t\")\n    );\n}\n\n#[test]\nfn infer_subcommands_fail_with_args2() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .arg(Arg::new(\"some\"))\n        .subcommand(Command::new(\"test\"))\n        .subcommand(Command::new(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"te\"]);\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    assert_eq!(\n        m.unwrap().get_one::<String>(\"some\").map(|v| v.as_str()),\n        Some(\"te\")\n    );\n}\n\n#[test]\nfn infer_subcommands_pass() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\"))\n        .try_get_matches_from(vec![\"prog\", \"te\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\n#[test]\nfn infer_subcommands_pass_close() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\"))\n        .subcommand(Command::new(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"tes\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\n#[test]\nfn infer_subcommands_pass_exact_match() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\"))\n        .subcommand(Command::new(\"testa\"))\n        .subcommand(Command::new(\"testb\"))\n        .try_get_matches_from(vec![\"prog\", \"test\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\n#[test]\nfn infer_subcommands_pass_conflicting_aliases() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\").aliases([\"testa\", \"t\", \"testb\"]))\n        .try_get_matches_from(vec![\"prog\", \"te\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\n#[test]\nfn infer_long_flag_pass_conflicting_aliases() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(\n            Command::new(\"c\")\n                .long_flag(\"test\")\n                .long_flag_aliases([\"testa\", \"t\", \"testb\"]),\n        )\n        .try_get_matches_from(vec![\"prog\", \"--te\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"c\"));\n}\n\n#[test]\nfn infer_long_flag() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\").long_flag(\"testa\"))\n        .try_get_matches_from(vec![\"prog\", \"--te\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\n#[test]\nfn infer_subcommands_long_flag_fail_with_args2() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"a\").long_flag(\"test\"))\n        .subcommand(Command::new(\"b\").long_flag(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"--te\"]);\n    assert!(m.is_err(), \"{:#?}\", m.unwrap());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[cfg(feature = \"suggestions\")]\n#[test]\nfn infer_subcommands_fail_suggestions() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\"))\n        .subcommand(Command::new(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"temps\"]);\n    assert!(m.is_err(), \"{:#?}\", m.unwrap());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);\n}\n\n#[cfg(not(feature = \"suggestions\"))]\n#[test]\nfn infer_subcommands_fail_suggestions() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\"))\n        .subcommand(Command::new(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"temps\"]);\n    assert!(m.is_err(), \"{:#?}\", m.unwrap());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);\n}\n\n#[test]\nfn no_bin_name() {\n    let result = Command::new(\"arg_required\")\n        .no_binary_name(true)\n        .arg(Arg::new(\"test\").required(true).index(1))\n        .try_get_matches_from(vec![\"testing\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let matches = result.unwrap();\n    assert_eq!(\n        matches\n            .get_one::<String>(\"test\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"testing\"\n    );\n}\n\n#[test]\nfn skip_possible_values() {\n    static SKIP_POS_VALS: &str = \"\\\ntests stuff\n\nUsage: test [OPTIONS] [arg1]\n\nArguments:\n  [arg1]  some pos arg\n\nOptions:\n  -o, --opt <opt>  some option\n  -h, --help       Print help\n  -V, --version    Print version\n\";\n\n    let cmd = Command::new(\"test\")\n        .author(\"Kevin K.\")\n        .about(\"tests stuff\")\n        .version(\"1.3\")\n        .hide_possible_values(true)\n        .args([\n            arg!(-o --opt <opt> \"some option\").value_parser([\"one\", \"two\"]),\n            arg!([arg1] \"some pos arg\").value_parser([\"three\", \"four\"]),\n        ]);\n\n    utils::assert_output(cmd, \"test --help\", SKIP_POS_VALS, false);\n}\n\n#[test]\nfn stop_delim_values_only_pos_follows() {\n    let r = Command::new(\"onlypos\")\n        .dont_delimit_trailing_values(true)\n        .args([arg!(f: -f <flag> \"some opt\"), arg!([arg] ... \"some arg\")])\n        .try_get_matches_from(vec![\"\", \"--\", \"-f\", \"-g,x\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert!(!m.contains_id(\"f\"));\n    assert_eq!(\n        m.get_many::<String>(\"arg\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"-f\", \"-g,x\"]\n    );\n}\n\n#[test]\nfn dont_delim_values_trailingvararg() {\n    let m = Command::new(\"positional\")\n        .dont_delimit_trailing_values(true)\n        .arg(arg!([opt] ... \"some pos\").trailing_var_arg(true))\n        .try_get_matches_from(vec![\"\", \"test\", \"--foo\", \"-Wl,-bar\"])\n        .unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(\n        m.get_many::<String>(\"opt\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"test\", \"--foo\", \"-Wl,-bar\"]\n    );\n}\n\n#[test]\nfn delim_values_only_pos_follows() {\n    let r = Command::new(\"onlypos\")\n        .args([arg!(f: -f [flag] \"some opt\"), arg!([arg] ... \"some arg\")])\n        .try_get_matches_from(vec![\"\", \"--\", \"-f\", \"-g,x\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert!(!m.contains_id(\"f\"));\n    assert_eq!(\n        m.get_many::<String>(\"arg\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"-f\", \"-g,x\"]\n    );\n}\n\n#[test]\nfn delim_values_trailingvararg() {\n    let m = Command::new(\"positional\")\n        .arg(arg!([opt] ... \"some pos\").trailing_var_arg(true))\n        .try_get_matches_from(vec![\"\", \"test\", \"--foo\", \"-Wl,-bar\"])\n        .unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(\n        m.get_many::<String>(\"opt\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"test\", \"--foo\", \"-Wl,-bar\"]\n    );\n}\n\n#[test]\nfn delim_values_only_pos_follows_with_delim() {\n    let r = Command::new(\"onlypos\")\n        .args([\n            arg!(f: -f [flag] \"some opt\"),\n            arg!([arg] ... \"some arg\").value_delimiter(','),\n        ])\n        .try_get_matches_from(vec![\"\", \"--\", \"-f\", \"-g,x\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert!(!m.contains_id(\"f\"));\n    assert_eq!(\n        m.get_many::<String>(\"arg\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"-f\", \"-g\", \"x\"]\n    );\n}\n\n#[test]\nfn delim_values_trailingvararg_with_delim() {\n    let m = Command::new(\"positional\")\n        .arg(\n            arg!([opt] ... \"some pos\")\n                .value_delimiter(',')\n                .trailing_var_arg(true),\n        )\n        .try_get_matches_from(vec![\"\", \"test\", \"--foo\", \"-Wl,-bar\"])\n        .unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(\n        m.get_many::<String>(\"opt\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"test\", \"--foo\", \"-Wl\", \"-bar\"]\n    );\n}\n\n#[test]\nfn leading_hyphen_short() {\n    let res = Command::new(\"leadhy\")\n        .arg(Arg::new(\"some\").allow_hyphen_values(true))\n        .arg(Arg::new(\"other\").short('o').action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-bar\", \"-o\"]);\n    assert!(res.is_ok(), \"Error: {:?}\", res.unwrap_err().kind());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"some\"));\n    assert!(m.contains_id(\"other\"));\n    assert_eq!(\n        m.get_one::<String>(\"some\").map(|v| v.as_str()).unwrap(),\n        \"-bar\"\n    );\n    assert_eq!(\n        *m.get_one::<bool>(\"other\").expect(\"defaulted by clap\"),\n        true\n    );\n}\n\n#[test]\nfn leading_hyphen_long() {\n    let res = Command::new(\"leadhy\")\n        .arg(Arg::new(\"some\").allow_hyphen_values(true))\n        .arg(Arg::new(\"other\").short('o').action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"--bar\", \"-o\"]);\n    assert!(res.is_ok(), \"Error: {:?}\", res.unwrap_err().kind());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"some\"));\n    assert!(m.contains_id(\"other\"));\n    assert_eq!(\n        m.get_one::<String>(\"some\").map(|v| v.as_str()).unwrap(),\n        \"--bar\"\n    );\n    assert_eq!(\n        *m.get_one::<bool>(\"other\").expect(\"defaulted by clap\"),\n        true\n    );\n}\n\n#[test]\nfn leading_hyphen_opt() {\n    let res = Command::new(\"leadhy\")\n        .arg(\n            Arg::new(\"some\")\n                .action(ArgAction::Set)\n                .long(\"opt\")\n                .allow_hyphen_values(true),\n        )\n        .arg(Arg::new(\"other\").short('o').action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"--opt\", \"--bar\", \"-o\"]);\n    assert!(res.is_ok(), \"Error: {:?}\", res.unwrap_err().kind());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"some\"));\n    assert!(m.contains_id(\"other\"));\n    assert_eq!(\n        m.get_one::<String>(\"some\").map(|v| v.as_str()).unwrap(),\n        \"--bar\"\n    );\n    assert_eq!(\n        *m.get_one::<bool>(\"other\").expect(\"defaulted by clap\"),\n        true\n    );\n}\n\n#[test]\nfn allow_negative_numbers_success() {\n    let res = Command::new(\"negnum\")\n        .arg(Arg::new(\"panum\").allow_negative_numbers(true))\n        .arg(\n            Arg::new(\"onum\")\n                .short('o')\n                .action(ArgAction::Set)\n                .allow_negative_numbers(true),\n        )\n        .try_get_matches_from(vec![\"negnum\", \"-20\", \"-o\", \"-1.2\"]);\n    assert!(res.is_ok(), \"Error: {:?}\", res.unwrap_err().kind());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"panum\").map(|v| v.as_str()).unwrap(),\n        \"-20\"\n    );\n    assert_eq!(\n        m.get_one::<String>(\"onum\").map(|v| v.as_str()).unwrap(),\n        \"-1.2\"\n    );\n}\n\n#[test]\nfn allow_negative_numbers_fail() {\n    let res = Command::new(\"negnum\")\n        .arg(Arg::new(\"panum\").allow_negative_numbers(true))\n        .arg(\n            Arg::new(\"onum\")\n                .short('o')\n                .action(ArgAction::Set)\n                .allow_negative_numbers(true),\n        )\n        .try_get_matches_from(vec![\"negnum\", \"--foo\", \"-o\", \"-1.2\"]);\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn trailing_var_arg_with_hyphen_values_escape_first() {\n    assert_trailing_var_args(&[\"test\", \"--\", \"foo\", \"bar\"], Some(&[\"foo\", \"bar\"]), false);\n}\n\n#[test]\nfn trailing_var_arg_with_hyphen_values_escape_middle() {\n    assert_trailing_var_args(\n        &[\"test\", \"foo\", \"--\", \"bar\"],\n        Some(&[\"foo\", \"--\", \"bar\"]),\n        false,\n    );\n}\n\n#[test]\nfn trailing_var_arg_with_hyphen_values_short_first() {\n    assert_trailing_var_args(&[\"test\", \"-p\", \"foo\", \"bar\"], Some(&[\"foo\", \"bar\"]), true);\n}\n\n#[test]\nfn trailing_var_arg_with_hyphen_values_short_middle() {\n    assert_trailing_var_args(\n        &[\"test\", \"foo\", \"-p\", \"bar\"],\n        Some(&[\"foo\", \"-p\", \"bar\"]),\n        false,\n    );\n}\n\n#[test]\nfn trailing_var_arg_with_hyphen_values_long_first() {\n    assert_trailing_var_args(\n        &[\"test\", \"--prog\", \"foo\", \"bar\"],\n        Some(&[\"foo\", \"bar\"]),\n        true,\n    );\n}\n\n#[test]\nfn trailing_var_arg_with_hyphen_values_long_middle() {\n    assert_trailing_var_args(\n        &[\"test\", \"foo\", \"--prog\", \"bar\"],\n        Some(&[\"foo\", \"--prog\", \"bar\"]),\n        false,\n    );\n}\n\n#[track_caller]\nfn assert_trailing_var_args(\n    input: &[&str],\n    expected_var_arg: Option<&[&str]>,\n    expected_flag: bool,\n) {\n    let cmd = Command::new(\"test\").arg(arg!(-p - -prog)).arg(\n        arg!([opt] ... \"some pos\")\n            .trailing_var_arg(true)\n            .allow_hyphen_values(true),\n    );\n    let m = cmd.try_get_matches_from(input);\n    assert!(\n        m.is_ok(),\n        \"failed with args {:?}: {}\",\n        input,\n        m.unwrap_err()\n    );\n    let m = m.unwrap();\n\n    let actual_var_args = m\n        .get_many::<String>(\"opt\")\n        .map(|v| v.map(|s| s.as_str()).collect::<Vec<_>>());\n    assert_eq!(actual_var_args.as_deref(), expected_var_arg);\n    assert_eq!(m.get_flag(\"prog\"), expected_flag);\n}\n\n#[test]\nfn disable_help_subcommand() {\n    let result = Command::new(\"disablehelp\")\n        .disable_help_subcommand(true)\n        .subcommand(Command::new(\"sub1\"))\n        .try_get_matches_from(vec![\"\", \"help\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::InvalidSubcommand);\n}\n\n#[test]\nfn dont_collapse_args() {\n    let cmd = Command::new(\"clap-test\").version(\"v1.4.8\").args([\n        Arg::new(\"arg1\").help(\"some\"),\n        Arg::new(\"arg2\").help(\"some\"),\n        Arg::new(\"arg3\").help(\"some\"),\n    ]);\n    utils::assert_output(cmd, \"clap-test --help\", DONT_COLLAPSE_ARGS, false);\n}\n\n#[test]\nfn require_eq() {\n    static REQUIRE_EQUALS: &str = \"\\\nUsage: clap-test --opt=<FILE>\n\nOptions:\n  -o, --opt=<FILE>  some\n  -h, --help        Print help\n  -V, --version     Print version\n\";\n\n    let cmd = Command::new(\"clap-test\").version(\"v1.4.8\").arg(\n        Arg::new(\"opt\")\n            .long(\"opt\")\n            .short('o')\n            .required(true)\n            .require_equals(true)\n            .value_name(\"FILE\")\n            .help(\"some\"),\n    );\n    utils::assert_output(cmd, \"clap-test --help\", REQUIRE_EQUALS, false);\n}\n\n#[test]\nfn propagate_vals_down() {\n    let m = Command::new(\"myprog\")\n        .arg(arg!([cmd] \"command to run\").global(true))\n        .subcommand(Command::new(\"foo\"))\n        .try_get_matches_from(vec![\"myprog\", \"set\", \"foo\"]);\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<String>(\"cmd\").map(|v| v.as_str()), Some(\"set\"));\n    let sub_m = m.subcommand_matches(\"foo\").unwrap();\n    assert_eq!(\n        sub_m.get_one::<String>(\"cmd\").map(|v| v.as_str()),\n        Some(\"set\")\n    );\n}\n\n#[test]\nfn allow_missing_positional() {\n    let m = Command::new(\"test\")\n        .allow_missing_positional(true)\n        .arg(arg!([src] \"some file\").default_value(\"src\"))\n        .arg(arg!(<dest> \"some file\"))\n        .try_get_matches_from(vec![\"test\", \"file\"]);\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<String>(\"src\").map(|v| v.as_str()), Some(\"src\"));\n    assert_eq!(\n        m.get_one::<String>(\"dest\").map(|v| v.as_str()),\n        Some(\"file\")\n    );\n}\n\n#[test]\nfn allow_missing_positional_no_default() {\n    let m = Command::new(\"test\")\n        .allow_missing_positional(true)\n        .arg(arg!([src] \"some file\"))\n        .arg(arg!(<dest> \"some file\"))\n        .try_get_matches_from(vec![\"test\", \"file\"]);\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<String>(\"src\").map(|v| v.as_str()), None);\n    assert_eq!(\n        m.get_one::<String>(\"dest\").map(|v| v.as_str()),\n        Some(\"file\")\n    );\n}\n\n#[test]\nfn missing_positional_no_hyphen() {\n    let r = Command::new(\"bench\")\n        .allow_missing_positional(true)\n        .arg(arg!([BENCH] \"some bench\"))\n        .arg(arg!([ARGS] ... \"some args\"))\n        .try_get_matches_from(vec![\"bench\", \"foo\", \"arg1\", \"arg2\", \"arg3\"]);\n    assert!(r.is_ok(), \"{:?}\", r.unwrap_err().kind());\n\n    let m = r.unwrap();\n\n    let expected_bench = Some(\"foo\");\n    let expected_args = vec![\"arg1\", \"arg2\", \"arg3\"];\n\n    assert_eq!(\n        m.get_one::<String>(\"BENCH\").map(|v| v.as_str()),\n        expected_bench\n    );\n    assert_eq!(\n        m.get_many::<String>(\"ARGS\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        &*expected_args\n    );\n}\n\n#[test]\nfn missing_positional_hyphen() {\n    let r = Command::new(\"bench\")\n        .allow_missing_positional(true)\n        .arg(arg!([BENCH] \"some bench\"))\n        .arg(arg!([ARGS] ... \"some args\"))\n        .try_get_matches_from(vec![\"bench\", \"--\", \"arg1\", \"arg2\", \"arg3\"]);\n    assert!(r.is_ok(), \"{:?}\", r.unwrap_err().kind());\n\n    let m = r.unwrap();\n\n    let expected_bench = None;\n    let expected_args = vec![\"arg1\", \"arg2\", \"arg3\"];\n\n    assert_eq!(\n        m.get_one::<String>(\"BENCH\").map(|v| v.as_str()),\n        expected_bench\n    );\n    assert_eq!(\n        m.get_many::<String>(\"ARGS\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        &*expected_args\n    );\n}\n\n#[test]\nfn missing_positional_hyphen_far_back() {\n    let r = Command::new(\"bench\")\n        .allow_missing_positional(true)\n        .arg(arg!([BENCH1] \"some bench\"))\n        .arg(arg!([BENCH2] \"some bench\"))\n        .arg(arg!([BENCH3] \"some bench\"))\n        .arg(arg!([ARGS] ... \"some args\"))\n        .try_get_matches_from(vec![\"bench\", \"foo\", \"--\", \"arg1\", \"arg2\", \"arg3\"]);\n    assert!(r.is_ok(), \"{:?}\", r.unwrap_err().kind());\n\n    let m = r.unwrap();\n\n    let expected_bench1 = Some(\"foo\");\n    let expected_bench2 = None;\n    let expected_bench3 = None;\n    let expected_args = vec![\"arg1\", \"arg2\", \"arg3\"];\n\n    assert_eq!(\n        m.get_one::<String>(\"BENCH1\").map(|v| v.as_str()),\n        expected_bench1\n    );\n    assert_eq!(\n        m.get_one::<String>(\"BENCH2\").map(|v| v.as_str()),\n        expected_bench2\n    );\n    assert_eq!(\n        m.get_one::<String>(\"BENCH3\").map(|v| v.as_str()),\n        expected_bench3\n    );\n    assert_eq!(\n        m.get_many::<String>(\"ARGS\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        &*expected_args\n    );\n}\n\n#[test]\nfn missing_positional_hyphen_req_error() {\n    let r = Command::new(\"bench\")\n        .allow_missing_positional(true)\n        .arg(arg!([BENCH1] \"some bench\"))\n        .arg(arg!(<BENCH2> \"some bench\"))\n        .arg(arg!([ARGS] ... \"some args\"))\n        .try_get_matches_from(vec![\"bench\", \"foo\", \"--\", \"arg1\", \"arg2\", \"arg3\"]);\n    assert!(r.is_err());\n    assert_eq!(r.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn issue_1066_allow_leading_hyphen_and_unknown_args_option() {\n    let res = Command::new(\"prog\")\n        .arg(\n            arg!(--\"some-argument\" <val>)\n                .required(true)\n                .allow_hyphen_values(true),\n        )\n        .try_get_matches_from(vec![\"prog\", \"-fish\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn issue_1437_allow_hyphen_values_for_positional_arg() {\n    let m = Command::new(\"tmp\")\n        .arg(\n            Arg::new(\"pat\")\n                .allow_hyphen_values(true)\n                .required(true)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from([\"tmp\", \"-file\"])\n        .unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"pat\").map(|v| v.as_str()),\n        Some(\"-file\")\n    );\n}\n\n#[test]\nfn issue_3880_allow_long_flag_hyphen_value_for_positional_arg() {\n    let m = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"pat\")\n                .allow_hyphen_values(true)\n                .required(true)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from([\"\", \"--file\"])\n        .unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"pat\").map(|v| v.as_str()),\n        Some(\"--file\")\n    );\n}\n\n#[test]\nfn issue_1093_allow_ext_sc() {\n    let cmd = Command::new(\"clap-test\")\n        .version(\"v1.4.8\")\n        .allow_external_subcommands(true);\n    utils::assert_output(cmd, \"clap-test --help\", ALLOW_EXT_SC, false);\n}\n\n#[test]\nfn allow_ext_sc_empty_args() {\n    let res = Command::new(\"clap-test\")\n        .version(\"v1.4.8\")\n        .allow_external_subcommands(true)\n        .try_get_matches_from(vec![\"clap-test\", \"external-cmd\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n\n    match res.unwrap().subcommand() {\n        Some((name, args)) => {\n            assert_eq!(name, \"external-cmd\");\n            assert_eq!(\n                args.get_many::<OsString>(\"\").unwrap().collect::<Vec<_>>(),\n                Vec::<&OsString>::new(),\n            );\n        }\n        _ => unreachable!(),\n    }\n}\n\n#[test]\nfn allow_ext_sc_when_sc_required() {\n    let res = Command::new(\"clap-test\")\n        .version(\"v1.4.8\")\n        .allow_external_subcommands(true)\n        .subcommand_required(true)\n        .try_get_matches_from(vec![\"clap-test\", \"external-cmd\", \"foo\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n\n    match res.unwrap().subcommand() {\n        Some((name, args)) => {\n            assert_eq!(name, \"external-cmd\");\n            assert_eq!(\n                args.get_many::<OsString>(\"\")\n                    .unwrap()\n                    .cloned()\n                    .collect::<Vec<_>>(),\n                vec![OsString::from(\"foo\")]\n            );\n        }\n        _ => unreachable!(),\n    }\n}\n\n#[test]\nfn external_subcommand_looks_like_built_in() {\n    let res = Command::new(\"cargo\")\n        .version(\"1.26.0\")\n        .allow_external_subcommands(true)\n        .subcommand(Command::new(\"install\"))\n        .try_get_matches_from(vec![\"cargo\", \"install-update\", \"foo\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    match m.subcommand() {\n        Some((name, args)) => {\n            assert_eq!(name, \"install-update\");\n            assert_eq!(\n                args.get_many::<OsString>(\"\")\n                    .unwrap()\n                    .cloned()\n                    .collect::<Vec<_>>(),\n                vec![OsString::from(\"foo\")]\n            );\n        }\n        _ => panic!(\"external_subcommand didn't work\"),\n    }\n}\n\n#[test]\nfn built_in_subcommand_escaped() {\n    let res = Command::new(\"cargo\")\n        .version(\"1.26.0\")\n        .allow_external_subcommands(true)\n        .subcommand(Command::new(\"install\"))\n        .try_get_matches_from(vec![\"cargo\", \"--\", \"install\", \"foo\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    match m.subcommand() {\n        Some((name, args)) => {\n            assert_eq!(name, \"install\");\n            assert_eq!(\n                args.get_many::<OsString>(\"\")\n                    .unwrap()\n                    .cloned()\n                    .collect::<Vec<_>>(),\n                vec![OsString::from(\"foo\")]\n            );\n        }\n        _ => panic!(\"external_subcommand didn't work\"),\n    }\n}\n\n#[test]\nfn aaos_opts_w_other_overrides() {\n    // opts with other overrides\n    let res = Command::new(\"posix\")\n        .args_override_self(true)\n        .arg(arg!(--opt <val> \"some option\").action(ArgAction::Set))\n        .arg(\n            arg!(--other <val> \"some other option\")\n                .overrides_with(\"opt\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=some\", \"--other=test\", \"--opt=other\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert!(!m.contains_id(\"other\"));\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"other\")\n    );\n}\n\n#[test]\nfn aaos_opts_w_other_overrides_rev() {\n    // opts with other overrides, rev\n    let res = Command::new(\"posix\")\n        .args_override_self(true)\n        .arg(\n            arg!(--opt <val> \"some option\")\n                .required(true)\n                .action(ArgAction::Set),\n        )\n        .arg(\n            arg!(--other <val> \"some other option\")\n                .required(true)\n                .overrides_with(\"opt\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=some\", \"--opt=other\", \"--other=val\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"opt\"));\n    assert!(m.contains_id(\"other\"));\n    assert_eq!(\n        m.get_one::<String>(\"other\").map(|v| v.as_str()),\n        Some(\"val\")\n    );\n}\n\n#[test]\nfn aaos_opts_w_other_overrides_2() {\n    // opts with other overrides\n    let res = Command::new(\"posix\")\n        .args_override_self(true)\n        .arg(\n            arg!(--opt <val> \"some option\")\n                .overrides_with(\"other\")\n                .action(ArgAction::Set),\n        )\n        .arg(arg!(--other <val> \"some other option\").action(ArgAction::Set))\n        .try_get_matches_from(vec![\"\", \"--opt=some\", \"--other=test\", \"--opt=other\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert!(!m.contains_id(\"other\"));\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"other\")\n    );\n}\n\n#[test]\nfn aaos_opts_w_other_overrides_rev_2() {\n    // opts with other overrides, rev\n    let res = Command::new(\"posix\")\n        .args_override_self(true)\n        .arg(\n            arg!(--opt <val> \"some option\")\n                .required(true)\n                .overrides_with(\"other\")\n                .action(ArgAction::Set),\n        )\n        .arg(\n            arg!(--other <val> \"some other option\")\n                .required(true)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=some\", \"--opt=other\", \"--other=val\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"opt\"));\n    assert!(m.contains_id(\"other\"));\n    assert_eq!(\n        m.get_one::<String>(\"other\").map(|v| v.as_str()),\n        Some(\"val\")\n    );\n}\n\n#[test]\nfn aaos_opts_w_override_as_conflict_1() {\n    // opts with other overrides, rev\n    let res = Command::new(\"posix\")\n        .arg(\n            arg!(--opt <val> \"some option\")\n                .required(true)\n                .overrides_with(\"other\")\n                .action(ArgAction::Set),\n        )\n        .arg(\n            arg!(--other <val> \"some other option\")\n                .required(true)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=some\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert!(!m.contains_id(\"other\"));\n    assert_eq!(m.get_one::<String>(\"opt\").map(|v| v.as_str()), Some(\"some\"));\n}\n\n#[test]\nfn aaos_opts_w_override_as_conflict_2() {\n    // opts with other overrides, rev\n    let res = Command::new(\"posix\")\n        .arg(\n            arg!(--opt <val> \"some option\")\n                .required(true)\n                .overrides_with(\"other\")\n                .action(ArgAction::Set),\n        )\n        .arg(\n            arg!(--other <val> \"some other option\")\n                .required(true)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"--other=some\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"opt\"));\n    assert!(m.contains_id(\"other\"));\n    assert_eq!(\n        m.get_one::<String>(\"other\").map(|v| v.as_str()),\n        Some(\"some\")\n    );\n}\n\n#[test]\nfn aaos_opts_mult_req_delims() {\n    // opts with multiple and require delims\n    let res = Command::new(\"posix\")\n        .arg(\n            arg!(--opt <val> ... \"some option\")\n                .action(ArgAction::Set)\n                .value_delimiter(',')\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=some\", \"--opt=other\", \"--opt=one,two\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(\n        m.get_many::<String>(\"opt\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"some\", \"other\", \"one\", \"two\"]\n    );\n}\n\n#[test]\nfn aaos_opts_mult() {\n    // opts with multiple\n    let res = Command::new(\"posix\")\n        .arg(\n            arg!(--opt <val> ... \"some option\")\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\n            \"\",\n            \"--opt\",\n            \"first\",\n            \"overrides\",\n            \"--opt\",\n            \"some\",\n            \"other\",\n            \"val\",\n        ]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(\n        m.get_many::<String>(\"opt\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"first\", \"overrides\", \"some\", \"other\", \"val\"]\n    );\n}\n\n#[test]\nfn aaos_pos_mult() {\n    // opts with multiple\n    let res = Command::new(\"posix\")\n        .arg(arg!([val] ... \"some pos\"))\n        .try_get_matches_from(vec![\"\", \"some\", \"other\", \"value\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"val\"));\n    assert_eq!(\n        m.get_many::<String>(\"val\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"some\", \"other\", \"value\"]\n    );\n}\n\n#[test]\nfn aaos_option_use_delim_false() {\n    let m = Command::new(\"posix\")\n        .args_override_self(true)\n        .arg(\n            arg!(--opt <val> \"some option\")\n                .required(true)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=some,other\", \"--opt=one,two\"])\n        .unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(\n        m.get_many::<String>(\"opt\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"one,two\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"color\")]\nfn color_is_global() {\n    let mut cmd = Command::new(\"myprog\")\n        .color(clap::ColorChoice::Never)\n        .subcommand(Command::new(\"foo\"));\n    cmd.build();\n    assert_eq!(cmd.get_color(), clap::ColorChoice::Never);\n\n    let sub = cmd.get_subcommands().collect::<Vec<_>>()[0];\n    assert_eq!(sub.get_color(), clap::ColorChoice::Never);\n}\n"
  },
  {
    "path": "tests/builder/arg_aliases.rs",
    "content": "use super::utils;\n\nuse clap::{arg, Arg, ArgAction, Command};\n\n#[test]\nfn single_alias_of_option() {\n    let a = Command::new(\"single_alias\")\n        .arg(\n            Arg::new(\"alias\")\n                .long(\"alias\")\n                .action(ArgAction::Set)\n                .help(\"single alias\")\n                .alias(\"new-opt\"),\n        )\n        .try_get_matches_from(vec![\"\", \"--new-opt\", \"cool\"]);\n    assert!(a.is_ok(), \"{}\", a.unwrap_err());\n    let a = a.unwrap();\n    assert!(a.contains_id(\"alias\"));\n    assert_eq!(\n        a.get_one::<String>(\"alias\").map(|v| v.as_str()).unwrap(),\n        \"cool\"\n    );\n}\n\n#[test]\nfn multiple_aliases_of_option() {\n    let a = Command::new(\"multiple_aliases\").arg(\n        Arg::new(\"aliases\")\n            .long(\"aliases\")\n            .action(ArgAction::Set)\n            .help(\"multiple aliases\")\n            .aliases([\"alias1\", \"alias2\", \"alias3\"]),\n    );\n    let long = a\n        .clone()\n        .try_get_matches_from(vec![\"\", \"--aliases\", \"value\"]);\n    assert!(long.is_ok(), \"{}\", long.unwrap_err());\n    let long = long.unwrap();\n\n    let als1 = a\n        .clone()\n        .try_get_matches_from(vec![\"\", \"--alias1\", \"value\"]);\n    assert!(als1.is_ok(), \"{}\", als1.unwrap_err());\n    let als1 = als1.unwrap();\n\n    let als2 = a\n        .clone()\n        .try_get_matches_from(vec![\"\", \"--alias2\", \"value\"]);\n    assert!(als2.is_ok(), \"{}\", als2.unwrap_err());\n    let als2 = als2.unwrap();\n\n    let als3 = a\n        .clone()\n        .try_get_matches_from(vec![\"\", \"--alias3\", \"value\"]);\n    assert!(als3.is_ok(), \"{}\", als3.unwrap_err());\n    let als3 = als3.unwrap();\n\n    assert!(long.contains_id(\"aliases\"));\n    assert!(als1.contains_id(\"aliases\"));\n    assert!(als2.contains_id(\"aliases\"));\n    assert!(als3.contains_id(\"aliases\"));\n    assert_eq!(\n        long.get_one::<String>(\"aliases\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"value\"\n    );\n    assert_eq!(\n        als1.get_one::<String>(\"aliases\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"value\"\n    );\n    assert_eq!(\n        als2.get_one::<String>(\"aliases\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"value\"\n    );\n    assert_eq!(\n        als3.get_one::<String>(\"aliases\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"value\"\n    );\n}\n\n#[test]\nfn get_aliases() {\n    let a = Arg::new(\"aliases\")\n        .long(\"aliases\")\n        .action(ArgAction::Set)\n        .help(\"multiple aliases\")\n        .aliases([\"alias1\", \"alias2\", \"alias3\"])\n        .short_aliases(['a', 'b', 'c'])\n        .visible_aliases([\"alias4\", \"alias5\", \"alias6\"])\n        .visible_short_aliases(['d', 'e', 'f']);\n\n    assert!(a.get_short_and_visible_aliases().is_none());\n    assert_eq!(\n        a.get_long_and_visible_aliases().unwrap(),\n        [\"aliases\", \"alias4\", \"alias5\", \"alias6\"]\n    );\n    assert_eq!(\n        a.get_visible_aliases().unwrap(),\n        [\"alias4\", \"alias5\", \"alias6\"]\n    );\n    assert_eq!(\n        a.get_all_aliases().unwrap(),\n        [\"alias1\", \"alias2\", \"alias3\", \"alias4\", \"alias5\", \"alias6\"]\n    );\n    assert_eq!(a.get_visible_short_aliases().unwrap(), vec!['d', 'e', 'f']);\n    assert_eq!(\n        a.get_all_short_aliases().unwrap(),\n        vec!['a', 'b', 'c', 'd', 'e', 'f']\n    );\n}\n\n#[test]\nfn single_alias_of_flag() {\n    let a = Command::new(\"test\")\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .alias(\"alias\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"\", \"--alias\"]);\n    assert!(a.is_ok(), \"{}\", a.unwrap_err());\n    let a = a.unwrap();\n    assert!(*a.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn multiple_aliases_of_flag() {\n    let a = Command::new(\"test\").arg(\n        Arg::new(\"flag\")\n            .long(\"flag\")\n            .aliases([\"invisible\", \"set\", \"of\", \"cool\", \"aliases\"])\n            .action(ArgAction::SetTrue),\n    );\n\n    let flag = a.clone().try_get_matches_from(vec![\"\", \"--flag\"]);\n    assert!(flag.is_ok(), \"{}\", flag.unwrap_err());\n    let flag = flag.unwrap();\n\n    let inv = a.clone().try_get_matches_from(vec![\"\", \"--invisible\"]);\n    assert!(inv.is_ok(), \"{}\", inv.unwrap_err());\n    let inv = inv.unwrap();\n\n    let cool = a.clone().try_get_matches_from(vec![\"\", \"--cool\"]);\n    assert!(cool.is_ok(), \"{}\", cool.unwrap_err());\n    let cool = cool.unwrap();\n\n    let als = a.clone().try_get_matches_from(vec![\"\", \"--aliases\"]);\n    assert!(als.is_ok(), \"{}\", als.unwrap_err());\n    let als = als.unwrap();\n\n    assert!(*flag.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*inv.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*cool.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*als.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn alias_on_a_subcommand_option() {\n    let m = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\").arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .action(ArgAction::Set)\n                    .alias(\"opt\")\n                    .help(\"testing testing\"),\n            ),\n        )\n        .arg(Arg::new(\"other\").long(\"other\").aliases([\"o1\", \"o2\", \"o3\"]))\n        .try_get_matches_from(vec![\"test\", \"some\", \"--opt\", \"awesome\"])\n        .unwrap();\n\n    assert!(m.subcommand_matches(\"some\").is_some());\n    let sub_m = m.subcommand_matches(\"some\").unwrap();\n    assert!(sub_m.contains_id(\"test\"));\n    assert_eq!(\n        sub_m.get_one::<String>(\"test\").map(|v| v.as_str()).unwrap(),\n        \"awesome\"\n    );\n}\n\n#[test]\nfn invisible_arg_aliases_help_output() {\n    static SC_INVISIBLE_ALIAS_HELP: &str = \"\\\nSome help\n\nUsage: ct test [OPTIONS]\n\nOptions:\n  -o, --opt <opt>  \n  -f, --flag       \n  -h, --help       Print help\n  -V, --version    Print version\n\";\n\n    let cmd = Command::new(\"ct\").author(\"Salim Afiune\").subcommand(\n        Command::new(\"test\")\n            .about(\"Some help\")\n            .version(\"1.2\")\n            .arg(\n                Arg::new(\"opt\")\n                    .long(\"opt\")\n                    .short('o')\n                    .action(ArgAction::Set)\n                    .aliases([\"invisible\", \"als1\", \"more\"]),\n            )\n            .arg(arg!(-f - -flag).aliases([\"unseeable\", \"flg1\", \"anyway\"])),\n    );\n    utils::assert_output(cmd, \"ct test --help\", SC_INVISIBLE_ALIAS_HELP, false);\n}\n\n#[test]\nfn visible_arg_aliases_help_output() {\n    static SC_VISIBLE_ALIAS_HELP: &str = \"\\\nSome help\n\nUsage: ct test [OPTIONS]\n\nOptions:\n  -o, --opt <opt>  [aliases: --visible]\n  -f, --flag       [aliases: --v_flg, --flag2, --flg3]\n  -h, --help       Print help\n  -V, --version    Print version\n\";\n\n    let cmd = Command::new(\"ct\").author(\"Salim Afiune\").subcommand(\n        Command::new(\"test\")\n            .about(\"Some help\")\n            .version(\"1.2\")\n            .arg(\n                Arg::new(\"opt\")\n                    .long(\"opt\")\n                    .short('o')\n                    .action(ArgAction::Set)\n                    .alias(\"invisible\")\n                    .visible_alias(\"visible\"),\n            )\n            .arg(\n                Arg::new(\"flg\")\n                    .long(\"flag\")\n                    .short('f')\n                    .action(ArgAction::SetTrue)\n                    .visible_aliases([\"v_flg\", \"flag2\", \"flg3\"]),\n            ),\n    );\n    utils::assert_output(cmd, \"ct test --help\", SC_VISIBLE_ALIAS_HELP, false);\n}\n"
  },
  {
    "path": "tests/builder/arg_aliases_short.rs",
    "content": "use super::utils;\n\nuse clap::{arg, Arg, ArgAction, Command};\n\n#[test]\nfn single_short_alias_of_option() {\n    let a = Command::new(\"single_alias\")\n        .arg(\n            Arg::new(\"alias\")\n                .long(\"alias\")\n                .action(ArgAction::Set)\n                .help(\"single short alias\")\n                .short_alias('a'),\n        )\n        .try_get_matches_from(vec![\"\", \"-a\", \"cool\"]);\n    assert!(a.is_ok(), \"{}\", a.unwrap_err());\n    let a = a.unwrap();\n    assert!(a.contains_id(\"alias\"));\n    assert_eq!(\n        a.get_one::<String>(\"alias\").map(|v| v.as_str()).unwrap(),\n        \"cool\"\n    );\n}\n\n#[test]\nfn multiple_short_aliases_of_option() {\n    let a = Command::new(\"multiple_aliases\").arg(\n        Arg::new(\"aliases\")\n            .long(\"aliases\")\n            .action(ArgAction::Set)\n            .help(\"multiple aliases\")\n            .short_aliases(['1', '2', '3']),\n    );\n    let long = a\n        .clone()\n        .try_get_matches_from(vec![\"\", \"--aliases\", \"value\"]);\n    assert!(long.is_ok(), \"{}\", long.unwrap_err());\n    let long = long.unwrap();\n\n    let als1 = a.clone().try_get_matches_from(vec![\"\", \"-1\", \"value\"]);\n    assert!(als1.is_ok(), \"{}\", als1.unwrap_err());\n    let als1 = als1.unwrap();\n\n    let als2 = a.clone().try_get_matches_from(vec![\"\", \"-2\", \"value\"]);\n    assert!(als2.is_ok(), \"{}\", als2.unwrap_err());\n    let als2 = als2.unwrap();\n\n    let als3 = a.clone().try_get_matches_from(vec![\"\", \"-3\", \"value\"]);\n    assert!(als3.is_ok(), \"{}\", als3.unwrap_err());\n    let als3 = als3.unwrap();\n\n    assert!(long.contains_id(\"aliases\"));\n    assert!(als1.contains_id(\"aliases\"));\n    assert!(als2.contains_id(\"aliases\"));\n    assert!(als3.contains_id(\"aliases\"));\n    assert_eq!(\n        long.get_one::<String>(\"aliases\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"value\"\n    );\n    assert_eq!(\n        als1.get_one::<String>(\"aliases\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"value\"\n    );\n    assert_eq!(\n        als2.get_one::<String>(\"aliases\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"value\"\n    );\n    assert_eq!(\n        als3.get_one::<String>(\"aliases\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"value\"\n    );\n}\n\n#[test]\nfn single_short_alias_of_flag() {\n    let a = Command::new(\"test\")\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .short_alias('f')\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"\", \"-f\"]);\n    assert!(a.is_ok(), \"{}\", a.unwrap_err());\n    let a = a.unwrap();\n    assert!(*a.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn multiple_short_aliases_of_flag() {\n    let a = Command::new(\"test\").arg(\n        Arg::new(\"flag\")\n            .long(\"flag\")\n            .short_aliases(['a', 'b', 'c', 'd', 'e'])\n            .action(ArgAction::SetTrue),\n    );\n\n    let flag = a.clone().try_get_matches_from(vec![\"\", \"--flag\"]);\n    assert!(flag.is_ok(), \"{}\", flag.unwrap_err());\n    let flag = flag.unwrap();\n\n    let als1 = a.clone().try_get_matches_from(vec![\"\", \"-a\"]);\n    assert!(als1.is_ok(), \"{}\", als1.unwrap_err());\n    let als1 = als1.unwrap();\n\n    let als2 = a.clone().try_get_matches_from(vec![\"\", \"-b\"]);\n    assert!(als2.is_ok(), \"{}\", als2.unwrap_err());\n    let als2 = als2.unwrap();\n\n    let als3 = a.clone().try_get_matches_from(vec![\"\", \"-c\"]);\n    assert!(als3.is_ok(), \"{}\", als3.unwrap_err());\n    let als3 = als3.unwrap();\n\n    assert!(*flag.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*als1.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*als2.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*als3.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn short_alias_on_a_subcommand_option() {\n    let m = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\").arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .action(ArgAction::Set)\n                    .short_alias('o')\n                    .help(\"testing testing\"),\n            ),\n        )\n        .arg(\n            Arg::new(\"other\")\n                .long(\"other\")\n                .short_aliases(['1', '2', '3']),\n        )\n        .try_get_matches_from(vec![\"test\", \"some\", \"-o\", \"awesome\"])\n        .unwrap();\n\n    assert!(m.subcommand_matches(\"some\").is_some());\n    let sub_m = m.subcommand_matches(\"some\").unwrap();\n    assert!(sub_m.contains_id(\"test\"));\n    assert_eq!(\n        sub_m.get_one::<String>(\"test\").map(|v| v.as_str()).unwrap(),\n        \"awesome\"\n    );\n}\n\n#[test]\nfn invisible_short_arg_aliases_help_output() {\n    static SC_INVISIBLE_ALIAS_HELP: &str = \"\\\nSome help\n\nUsage: ct test [OPTIONS]\n\nOptions:\n  -o, --opt <opt>  \n  -f, --flag       \n  -h, --help       Print help\n  -V, --version    Print version\n\";\n\n    let cmd = Command::new(\"ct\").author(\"Salim Afiune\").subcommand(\n        Command::new(\"test\")\n            .about(\"Some help\")\n            .version(\"1.2\")\n            .arg(\n                Arg::new(\"opt\")\n                    .long(\"opt\")\n                    .short('o')\n                    .action(ArgAction::Set)\n                    .short_aliases(['a', 'b', 'c']),\n            )\n            .arg(arg!(-f - -flag).short_aliases(['x', 'y', 'z'])),\n    );\n    utils::assert_output(cmd, \"ct test --help\", SC_INVISIBLE_ALIAS_HELP, false);\n}\n\n#[test]\nfn visible_short_arg_aliases_help_output() {\n    static SC_VISIBLE_ALIAS_HELP: &str = \"\\\nSome help\n\nUsage: ct test [OPTIONS]\n\nOptions:\n  -o, --opt <opt>  [aliases: -v]\n  -f, --flag       [aliases: -a, -b, -🦆, --flag1]\n  -h, --help       Print help\n  -V, --version    Print version\n\";\n\n    let cmd = Command::new(\"ct\").author(\"Salim Afiune\").subcommand(\n        Command::new(\"test\")\n            .about(\"Some help\")\n            .version(\"1.2\")\n            .arg(\n                Arg::new(\"opt\")\n                    .long(\"opt\")\n                    .short('o')\n                    .action(ArgAction::Set)\n                    .short_alias('i')\n                    .visible_short_alias('v'),\n            )\n            .arg(\n                Arg::new(\"flg\")\n                    .long(\"flag\")\n                    .short('f')\n                    .action(ArgAction::SetTrue)\n                    .visible_alias(\"flag1\")\n                    .visible_short_aliases(['a', 'b', '🦆']),\n            ),\n    );\n    utils::assert_output(cmd, \"ct test --help\", SC_VISIBLE_ALIAS_HELP, false);\n}\n"
  },
  {
    "path": "tests/builder/arg_matches.rs",
    "content": "use clap::{arg, value_parser, Command};\nuse clap::{Arg, ArgAction};\n\n#[test]\nfn ids() {\n    let m = Command::new(\"test\")\n        .arg(arg!(--color <when>).value_parser([\"auto\", \"always\", \"never\"]))\n        .arg(arg!(--config <path>).value_parser(value_parser!(std::path::PathBuf)))\n        .try_get_matches_from([\"test\", \"--config=config.toml\", \"--color=auto\"])\n        .unwrap();\n    assert_eq!(\n        m.ids().map(|id| id.as_str()).collect::<Vec<_>>(),\n        [\"config\", \"color\"]\n    );\n    assert_eq!(m.ids().len(), 2);\n}\n\n#[test]\nfn ids_ignore_unused() {\n    let m = Command::new(\"test\")\n        .arg(arg!(--color <when>).value_parser([\"auto\", \"always\", \"never\"]))\n        .arg(arg!(--config <path>).value_parser(value_parser!(std::path::PathBuf)))\n        .try_get_matches_from([\"test\", \"--config=config.toml\"])\n        .unwrap();\n    assert_eq!(\n        m.ids().map(|id| id.as_str()).collect::<Vec<_>>(),\n        [\"config\"]\n    );\n    assert_eq!(m.ids().len(), 1);\n}\n\n#[test]\nfn ids_ignore_overridden() {\n    let m = Command::new(\"test\")\n        .arg(arg!(--color <when>).value_parser([\"auto\", \"always\", \"never\"]))\n        .arg(\n            arg!(--config <path>)\n                .value_parser(value_parser!(std::path::PathBuf))\n                .overrides_with(\"color\"),\n        )\n        .try_get_matches_from([\"test\", \"--config=config.toml\", \"--color=auto\"])\n        .unwrap();\n    assert_eq!(m.ids().map(|id| id.as_str()).collect::<Vec<_>>(), [\"color\"]);\n    assert_eq!(m.ids().len(), 1);\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"Unknown argument or group id.  Make sure you are using the argument id and not the short or long flags\"]\nfn arg_matches_if_present_wrong_arg() {\n    let m = Command::new(\"test\")\n        .arg(Arg::new(\"flag\").short('f').action(ArgAction::SetTrue))\n        .try_get_matches_from([\"test\", \"-f\"])\n        .unwrap();\n\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    m.contains_id(\"f\");\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"Mismatch between definition and access of `o`. Unknown argument or group id.  Make sure you are using the argument id and not the short or long flags\"]\nfn arg_matches_value_of_wrong_arg() {\n    let m = Command::new(\"test\")\n        .arg(Arg::new(\"opt\").short('o').action(ArgAction::Set))\n        .try_get_matches_from([\"test\", \"-o\", \"val\"])\n        .unwrap();\n\n    assert_eq!(m.get_one::<String>(\"opt\").map(|v| v.as_str()), Some(\"val\"));\n    m.get_one::<String>(\"o\").map(|v| v.as_str());\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"`seed` is not a name of a subcommand.\"]\nfn arg_matches_subcommand_matches_wrong_sub() {\n    let m = Command::new(\"test\")\n        .subcommand(Command::new(\"speed\"))\n        .try_get_matches_from([\"test\", \"speed\"])\n        .unwrap();\n\n    assert!(m.subcommand_matches(\"speed\").is_some());\n    m.subcommand_matches(\"seed\");\n}\n\n#[test]\nfn args_present_positional() {\n    let c = Command::new(\"test\").arg(Arg::new(\"positional\"));\n\n    let m = c.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert!(!m.args_present());\n\n    let m = c.clone().try_get_matches_from([\"test\", \"value\"]).unwrap();\n    assert!(m.args_present());\n}\n\n#[test]\nfn args_present_flag() {\n    let c = Command::new(\"test\").arg(Arg::new(\"flag\").long(\"flag\").action(ArgAction::SetTrue));\n\n    let m = c.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert!(!m.args_present());\n\n    let m = c.clone().try_get_matches_from([\"test\", \"--flag\"]).unwrap();\n    assert!(m.args_present());\n}\n\n#[test]\nfn args_present_subcommand() {\n    let c = Command::new(\"test\").subcommand(Command::new(\"sub\"));\n\n    let m = c.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert!(!m.args_present());\n\n    let m = c.clone().try_get_matches_from([\"test\", \"sub\"]).unwrap();\n    assert!(!m.args_present());\n}\n"
  },
  {
    "path": "tests/builder/borrowed.rs",
    "content": "use clap::{Arg, Command};\n\n#[test]\nfn borrowed_args() {\n    let arg = Arg::new(\"some\").short('s').long(\"some\").help(\"other help\");\n    let arg2 = Arg::new(\"some2\")\n        .short('S')\n        .long(\"some-thing\")\n        .help(\"other help\");\n    let result = Command::new(\"sub_command_negate\")\n        .arg(Arg::new(\"test\").index(1))\n        .arg(&arg)\n        .arg(&arg2)\n        .subcommand(Command::new(\"sub1\").arg(&arg))\n        .try_get_matches_from(vec![\"prog\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n}\n"
  },
  {
    "path": "tests/builder/cargo.rs",
    "content": "#![cfg(feature = \"cargo\")]\n\nuse clap::{\n    crate_authors, crate_description, crate_name, crate_version, error::ErrorKind, Command,\n};\nuse snapbox::str;\n\nuse crate::utils;\n\n#[test]\nfn crate_version() {\n    let res = Command::new(\"prog\")\n        .version(crate_version!())\n        .help_template(utils::FULL_TEMPLATE)\n        .try_get_matches_from(vec![\"prog\", \"--version\"]);\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::DisplayVersion);\n    assert_eq!(\n        err.to_string(),\n        format!(\"prog {}\\n\", env!(\"CARGO_PKG_VERSION\"))\n    );\n}\n\n#[test]\nfn crate_description() {\n    let res = Command::new(\"prog\")\n        .version(\"1\")\n        .about(crate_description!())\n        .help_template(utils::FULL_TEMPLATE)\n        .try_get_matches_from(vec![\"prog\", \"--help\"]);\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(err, ErrorKind::DisplayHelp, str![[r#\"\nprog 1\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: prog\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]], false);\n}\n\n#[test]\nfn crate_authors() {\n    let res = Command::new(\"prog\")\n        .version(\"1\")\n        .author(crate_authors!())\n        .help_template(utils::FULL_TEMPLATE)\n        .try_get_matches_from(vec![\"prog\", \"--help\"]);\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(err, ErrorKind::DisplayHelp, str![[r#\"\nprog 1\n\n\nUsage: prog\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]], false);\n}\n\n#[test]\nfn crate_authors_with_sep() {\n    let res = Command::new(\"prog\")\n        .version(\"1\")\n        .author(crate_authors!(\", \"))\n        .help_template(utils::FULL_TEMPLATE)\n        .try_get_matches_from(vec![\"prog\", \"--help\"]);\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(err, ErrorKind::DisplayHelp, str![[r#\"\nprog 1\n\n\nUsage: prog\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]], false);\n}\n\n#[test]\nfn crate_name() {\n    let res = Command::new(crate_name!())\n        .help_template(utils::FULL_TEMPLATE)\n        .version(\"3.0\")\n        .try_get_matches_from(vec![\"clap\", \"--version\"]);\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(err, ErrorKind::DisplayVersion, str![[r#\"\nclap 3.0\n\n\"#]], false);\n}\n"
  },
  {
    "path": "tests/builder/command.rs",
    "content": "#![cfg(feature = \"cargo\")]\n\nuse clap::{command, error::ErrorKind};\n\nuse crate::utils;\n\nstatic EVERYTHING: &str = \"clap {{version}}\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: clap\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n#[test]\nfn command() {\n    let res = command!()\n        .help_template(utils::FULL_TEMPLATE)\n        .try_get_matches_from(vec![\"clap\", \"--help\"]);\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::DisplayHelp);\n    assert_eq!(\n        err.to_string(),\n        EVERYTHING.replace(\"{{version}}\", env!(\"CARGO_PKG_VERSION\"))\n    );\n}\n"
  },
  {
    "path": "tests/builder/conflicts.rs",
    "content": "use clap::{arg, error::ErrorKind, Arg, ArgAction, ArgGroup, Command};\n\n#[cfg(feature = \"error-context\")]\nuse super::utils;\n\n#[test]\nfn flag_conflict() {\n    let result = Command::new(\"flag_conflict\")\n        .arg(arg!(-f --flag \"some flag\").conflicts_with(\"other\"))\n        .arg(arg!(-o --other \"some flag\"))\n        .try_get_matches_from(vec![\"myprog\", \"-f\", \"-o\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n}\n\n#[test]\nfn flag_conflict_2() {\n    let result = Command::new(\"flag_conflict\")\n        .arg(arg!(-f --flag \"some flag\").conflicts_with(\"other\"))\n        .arg(arg!(-o --other \"some flag\"))\n        .try_get_matches_from(vec![\"myprog\", \"-o\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n}\n\n#[test]\nfn flag_conflict_with_all() {\n    let result = Command::new(\"flag_conflict\")\n        .arg(arg!(-f --flag \"some flag\").conflicts_with_all([\"other\"]))\n        .arg(arg!(-o --other \"some flag\"))\n        .try_get_matches_from(vec![\"myprog\", \"-o\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n}\n\n#[test]\nfn exclusive_flag() {\n    let cmd = Command::new(\"flag_conflict\")\n        .arg(arg!(-f --flag \"some flag\").exclusive(true))\n        .arg(arg!(-o --other \"some flag\"));\n    let result = cmd.clone().try_get_matches_from(vec![\"myprog\", \"-f\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n\n    let result = cmd.clone().try_get_matches_from(vec![\"myprog\", \"-o\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n}\n\n#[test]\nfn exclusive_option() {\n    let result = Command::new(\"flag_conflict\")\n        .arg(arg!(-f --flag <VALUE> \"some flag\").exclusive(true))\n        .arg(arg!(-o --other <VALUE> \"some flag\"))\n        .try_get_matches_from(vec![\"myprog\", \"-o=val1\", \"-f=val2\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n}\n\n#[test]\nfn not_exclusive_with_defaults() {\n    let result = Command::new(\"flag_conflict\")\n        .arg(arg!(-f --flag <VALUE> \"some flag\").exclusive(true))\n        .arg(\n            arg!(-o --other <VALUE> \"some flag\")\n                .required(false)\n                .default_value(\"val1\"),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"-f=val2\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n}\n\n#[test]\nfn not_exclusive_with_group() {\n    let cmd = Command::new(\"test\")\n        .group(ArgGroup::new(\"test\").arg(\"foo\"))\n        .arg(\n            Arg::new(\"foo\")\n                .long(\"foo\")\n                .exclusive(true)\n                .action(ArgAction::SetTrue),\n        );\n    let result = cmd.try_get_matches_from(vec![\"test\", \"--foo\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n}\n\n#[test]\nfn default_doesnt_activate_exclusive() {\n    let result = Command::new(\"flag_conflict\")\n        .arg(\n            arg!(-f --flag <VALUE> \"some flag\")\n                .exclusive(true)\n                .default_value(\"val2\"),\n        )\n        .arg(arg!(-o --other <VALUE> \"some flag\").default_value(\"val1\"))\n        .try_get_matches_from(vec![\"myprog\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n}\n\n#[test]\nfn arg_conflicts_with_group() {\n    let mut cmd = Command::new(\"group_conflict\")\n        .arg(arg!(-f --flag \"some flag\").conflicts_with(\"gr\"))\n        .group(ArgGroup::new(\"gr\").arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some \"some arg\"))\n        .arg(arg!(--other \"other arg\"));\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--other\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"-f\", \"--some\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--some\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--other\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--flag\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n}\n\n#[test]\nfn arg_conflicts_with_group_with_multiple_sources() {\n    let mut cmd = Command::new(\"group_conflict\")\n        .arg(clap::arg!(-f --flag \"some flag\").conflicts_with(\"gr\"))\n        .group(ArgGroup::new(\"gr\").multiple(true))\n        .arg(clap::arg!(--some <name> \"some arg\").group(\"gr\"))\n        .arg(\n            clap::arg!(--other <secs> \"other arg\")\n                .default_value(\"1000\")\n                .group(\"gr\"),\n        );\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"-f\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--some\", \"usb1\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--some\", \"usb1\", \"--other\", \"40\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"-f\", \"--some\", \"usb1\"]);\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n}\n\n#[test]\nfn group_conflicts_with_arg() {\n    let mut cmd = Command::new(\"group_conflict\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .group(\n            ArgGroup::new(\"gr\")\n                .arg(\"some\")\n                .arg(\"other\")\n                .conflicts_with(\"flag\"),\n        )\n        .arg(arg!(--some \"some arg\"))\n        .arg(arg!(--other \"other arg\"));\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--other\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"-f\", \"--some\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--some\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--other\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--flag\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n}\n\n#[test]\nfn arg_conflicts_with_required_group() {\n    let mut cmd = Command::new(\"group_conflict\")\n        .arg(arg!(-f --flag \"some flag\").conflicts_with(\"gr\"))\n        .group(ArgGroup::new(\"gr\").required(true).arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some \"some arg\"))\n        .arg(arg!(--other \"other arg\"));\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--other\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"-f\", \"--some\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--some\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--other\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n}\n\n#[test]\nfn arg_conflicts_with_group_with_required_memeber() {\n    let mut cmd = Command::new(\"group_conflict\")\n        .arg(arg!(-f --flag \"some flag\").conflicts_with(\"gr\"))\n        .group(ArgGroup::new(\"gr\").arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some \"some arg\").required(true))\n        .arg(arg!(--other \"other arg\"));\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--other\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"-f\", \"--some\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--some\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--flag\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n}\n\n#[test]\nfn required_group_conflicts_with_arg() {\n    let mut cmd = Command::new(\"group_conflict\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .group(\n            ArgGroup::new(\"gr\")\n                .required(true)\n                .arg(\"some\")\n                .arg(\"other\")\n                .conflicts_with(\"flag\"),\n        )\n        .arg(arg!(--some \"some arg\"))\n        .arg(arg!(--other \"other arg\"));\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--other\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"-f\", \"--some\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--some\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n\n    let result = cmd.try_get_matches_from_mut(vec![\"myprog\", \"--other\"]);\n    if let Err(err) = result {\n        panic!(\"{err}\");\n    }\n}\n\n#[test]\nfn get_arg_conflicts_with_group() {\n    let flag = arg!(--flag).conflicts_with(\"gr\");\n    let mut cmd = Command::new(\"group_conflict\")\n        .arg(&flag)\n        .group(ArgGroup::new(\"gr\").arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some))\n        .arg(arg!(--other));\n\n    cmd.build();\n\n    let result = cmd.get_arg_conflicts_with(&flag);\n\n    assert_eq!(result.len(), 2);\n    assert_eq!(result[0].get_id(), \"some\");\n    assert_eq!(result[1].get_id(), \"other\");\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn conflict_output() {\n    static CONFLICT_ERR: &str = \"\\\nerror: the argument '--flag...' cannot be used with '-F'\n\nUsage: clap-test --flag... --long-option-2 <option2> <positional> <positional2> [positional3]...\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(\n        utils::complex_app(),\n        \"clap-test val1 fa --flag --long-option-2 val2 -F\",\n        CONFLICT_ERR,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn conflict_output_rev() {\n    static CONFLICT_ERR_REV: &str = \"\\\nerror: the argument '-F' cannot be used with '--flag...'\n\nUsage: clap-test -F --long-option-2 <option2> <positional> <positional2> [positional3]...\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(\n        utils::complex_app(),\n        \"clap-test val1 fa -F --long-option-2 val2 --flag\",\n        CONFLICT_ERR_REV,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn conflict_output_repeat() {\n    static ERR: &str = \"\\\nerror: the argument '-F' cannot be used multiple times\n\nUsage: clap-test [OPTIONS] [positional] [positional2] [positional3]... [COMMAND]\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(utils::complex_app(), \"clap-test -F -F\", ERR, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn conflict_output_with_required() {\n    static CONFLICT_ERR: &str = \"\\\nerror: the argument '--flag...' cannot be used with '-F'\n\nUsage: clap-test --flag... --long-option-2 <option2> <positional> <positional2> [positional3]...\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(\n        utils::complex_app(),\n        \"clap-test val1 --flag --long-option-2 val2 -F\",\n        CONFLICT_ERR,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn conflict_output_rev_with_required() {\n    static CONFLICT_ERR_REV: &str = \"\\\nerror: the argument '-F' cannot be used with '--flag...'\n\nUsage: clap-test -F --long-option-2 <option2> <positional> <positional2> [positional3]...\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(\n        utils::complex_app(),\n        \"clap-test val1 -F --long-option-2 val2 --flag\",\n        CONFLICT_ERR_REV,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn conflict_output_three_conflicting() {\n    static CONFLICT_ERR_THREE: &str = \"\\\nerror: the argument '--one' cannot be used with:\n  --two\n  --three\n\nUsage: three_conflicting_arguments --one\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"three_conflicting_arguments\")\n        .arg(\n            Arg::new(\"one\")\n                .long(\"one\")\n                .action(ArgAction::SetTrue)\n                .conflicts_with_all([\"two\", \"three\"]),\n        )\n        .arg(\n            Arg::new(\"two\")\n                .long(\"two\")\n                .action(ArgAction::SetTrue)\n                .conflicts_with_all([\"one\", \"three\"]),\n        )\n        .arg(\n            Arg::new(\"three\")\n                .long(\"three\")\n                .action(ArgAction::SetTrue)\n                .conflicts_with_all([\"one\", \"two\"]),\n        );\n    utils::assert_output(\n        cmd,\n        \"three_conflicting_arguments --one --two --three\",\n        CONFLICT_ERR_THREE,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn two_conflicting_arguments() {\n    let a = Command::new(\"two_conflicting_arguments\")\n        .arg(\n            Arg::new(\"develop\")\n                .long(\"develop\")\n                .action(ArgAction::SetTrue)\n                .conflicts_with(\"production\"),\n        )\n        .arg(\n            Arg::new(\"production\")\n                .long(\"production\")\n                .action(ArgAction::SetTrue)\n                .conflicts_with(\"develop\"),\n        )\n        .try_get_matches_from(vec![\"\", \"--develop\", \"--production\"]);\n\n    assert!(a.is_err());\n    let a = a.unwrap_err();\n    assert!(\n        a.to_string()\n            .contains(\"the argument \\'--develop\\' cannot be used with \\'--production\\'\"),\n        \"{}\",\n        a\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn three_conflicting_arguments() {\n    let a = Command::new(\"three_conflicting_arguments\")\n        .arg(\n            Arg::new(\"one\")\n                .long(\"one\")\n                .action(ArgAction::SetTrue)\n                .conflicts_with_all([\"two\", \"three\"]),\n        )\n        .arg(\n            Arg::new(\"two\")\n                .long(\"two\")\n                .action(ArgAction::SetTrue)\n                .conflicts_with_all([\"one\", \"three\"]),\n        )\n        .arg(\n            Arg::new(\"three\")\n                .long(\"three\")\n                .action(ArgAction::SetTrue)\n                .conflicts_with_all([\"one\", \"two\"]),\n        )\n        .try_get_matches_from(vec![\"\", \"--one\", \"--two\", \"--three\"]);\n\n    assert!(a.is_err());\n    let a = a.unwrap_err();\n    assert!(\n        a.to_string()\n            .contains(\"the argument \\'--one\\' cannot be used with:\"),\n        \"{}\",\n        a\n    );\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Argument 'config' cannot conflict with itself\"]\nfn self_conflicting_arg() {\n    let _ = Command::new(\"prog\")\n        .arg(Arg::new(\"config\").long(\"config\").conflicts_with(\"config\"))\n        .try_get_matches_from(vec![\"\", \"--config\"]);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Argument or group 'extra' specified in 'conflicts_with*' for 'config' does not exist\"]\nfn conflicts_with_invalid_arg() {\n    let _ = Command::new(\"prog\")\n        .arg(Arg::new(\"config\").long(\"config\").conflicts_with(\"extra\"))\n        .try_get_matches_from(vec![\"\", \"--config\"]);\n}\n\n#[test]\nfn conflict_with_unused_default() {\n    let result = Command::new(\"conflict\")\n        .arg(arg!(-o --opt <opt> \"some opt\").default_value(\"default\"))\n        .arg(\n            arg!(-f --flag \"some flag\")\n                .conflicts_with(\"opt\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"-f\"]);\n\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn conflicts_with_alongside_default() {\n    let result = Command::new(\"conflict\")\n        .arg(\n            arg!(-o --opt <opt> \"some opt\")\n                .default_value(\"default\")\n                .conflicts_with(\"flag\"),\n        )\n        .arg(arg!(-f --flag \"some flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"myprog\", \"-f\"]);\n\n    assert!(\n        result.is_ok(),\n        \"conflicts_with should ignore default_value: {:?}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn group_in_conflicts_with() {\n    let result = Command::new(\"conflict\")\n        .arg(\n            Arg::new(\"opt\")\n                .long(\"opt\")\n                .default_value(\"default\")\n                .group(\"one\"),\n        )\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .conflicts_with(\"one\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--flag\"]);\n\n    assert!(\n        result.is_ok(),\n        \"conflicts_with on an arg group should ignore default_value: {:?}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn group_conflicts_with_default_value() {\n    let result = Command::new(\"conflict\")\n        .arg(\n            Arg::new(\"opt\")\n                .long(\"opt\")\n                .default_value(\"default\")\n                .group(\"one\"),\n        )\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .group(\"one\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--flag\"]);\n\n    assert!(\n        result.is_ok(),\n        \"arg group count should ignore default_value: {:?}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn group_conflicts_with_default_arg() {\n    let result = Command::new(\"conflict\")\n        .arg(Arg::new(\"opt\").long(\"opt\").default_value(\"default\"))\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .group(\"one\")\n                .action(ArgAction::SetTrue),\n        )\n        .group(ArgGroup::new(\"one\").conflicts_with(\"opt\"))\n        .try_get_matches_from(vec![\"myprog\", \"--flag\"]);\n\n    assert!(\n        result.is_ok(),\n        \"arg group conflicts_with should ignore default_value: {:?}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn exclusive_with_required() {\n    let cmd = Command::new(\"bug\")\n        .arg(\n            Arg::new(\"test\")\n                .long(\"test\")\n                .action(ArgAction::SetTrue)\n                .exclusive(true),\n        )\n        .arg(Arg::new(\"input\").action(ArgAction::Set).required(true));\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--test\", \"required\"])\n        .unwrap_err();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"required\"])\n        .unwrap();\n\n    cmd.clone().try_get_matches_from([\"bug\", \"--test\"]).unwrap();\n}\n\n#[test]\nfn exclusive_with_required_unless_present() {\n    let cmd = Command::new(\"bug\")\n        .arg(\n            Arg::new(\"exclusive\")\n                .long(\"exclusive\")\n                .action(ArgAction::SetTrue)\n                .exclusive(true),\n        )\n        .arg(\n            Arg::new(\"required\")\n                .long(\"required\")\n                .action(ArgAction::SetTrue)\n                .required_unless_present(\"alternative\"),\n        )\n        .arg(\n            Arg::new(\"alternative\")\n                .long(\"alternative\")\n                .action(ArgAction::SetTrue),\n        );\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--required\"])\n        .unwrap();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--alternative\"])\n        .unwrap();\n\n    cmd.clone().try_get_matches_from([\"bug\"]).unwrap_err();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--exclusive\", \"--required\"])\n        .unwrap_err();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--exclusive\"])\n        .unwrap();\n}\n\n#[test]\nfn exclusive_with_required_unless_present_any() {\n    let cmd = Command::new(\"bug\")\n        .arg(\n            Arg::new(\"exclusive\")\n                .long(\"exclusive\")\n                .action(ArgAction::SetTrue)\n                .exclusive(true),\n        )\n        .arg(\n            Arg::new(\"required\")\n                .long(\"required\")\n                .action(ArgAction::SetTrue)\n                .required_unless_present_any([\"alternative\"]),\n        )\n        .arg(\n            Arg::new(\"alternative\")\n                .long(\"alternative\")\n                .action(ArgAction::SetTrue),\n        );\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--required\"])\n        .unwrap();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--alternative\"])\n        .unwrap();\n\n    cmd.clone().try_get_matches_from([\"bug\"]).unwrap_err();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--exclusive\", \"--required\"])\n        .unwrap_err();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--exclusive\"])\n        .unwrap();\n}\n\n#[test]\nfn exclusive_with_required_unless_present_all() {\n    let cmd = Command::new(\"bug\")\n        .arg(\n            Arg::new(\"exclusive\")\n                .long(\"exclusive\")\n                .action(ArgAction::SetTrue)\n                .exclusive(true),\n        )\n        .arg(\n            Arg::new(\"required\")\n                .long(\"required\")\n                .action(ArgAction::SetTrue)\n                .required_unless_present_all([\"alternative\"]),\n        )\n        .arg(\n            Arg::new(\"alternative\")\n                .long(\"alternative\")\n                .action(ArgAction::SetTrue),\n        );\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--required\"])\n        .unwrap();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--alternative\"])\n        .unwrap();\n\n    cmd.clone().try_get_matches_from([\"bug\"]).unwrap_err();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--exclusive\", \"--required\"])\n        .unwrap_err();\n\n    cmd.clone()\n        .try_get_matches_from([\"bug\", \"--exclusive\"])\n        .unwrap();\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn option_conflicts_with_subcommand() {\n    static CONFLICT_ERR: &str = \"\\\nerror: the subcommand 'sub1' cannot be used with '--place <place id>'\n\nUsage: test [OPTIONS]\n       test <COMMAND>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"test\")\n        .args_conflicts_with_subcommands(true)\n        .arg(arg!(-p --place <\"place id\"> \"Place ID to open\"))\n        .subcommand(Command::new(\"sub1\"));\n\n    utils::assert_output(cmd, \"test --place id sub1\", CONFLICT_ERR, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn positional_conflicts_with_subcommand() {\n    static CONFLICT_ERR: &str = \"\\\nerror: the subcommand 'sub1' cannot be used with '<arg1>'\n\nUsage: test <arg1>\n       test <COMMAND>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"test\")\n        .args_conflicts_with_subcommands(true)\n        .arg(arg!(<arg1> \"some arg\"))\n        .subcommand(Command::new(\"sub1\"));\n\n    utils::assert_output(cmd, \"test value1 sub1\", CONFLICT_ERR, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn flag_conflicts_with_subcommand_long_flag() {\n    static CONFLICT_ERR: &str = \"\\\nerror: the subcommand 'sub' cannot be used with '--hello'\n\nUsage: test [OPTIONS]\n       test <COMMAND>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"test\")\n        .args_conflicts_with_subcommands(true)\n        .arg(arg!(--hello))\n        .subcommand(Command::new(\"sub\").long_flag(\"sub\"));\n\n    utils::assert_output(cmd, \"test --hello --sub\", CONFLICT_ERR, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn flag_conflicts_with_subcommand_short_flag() {\n    static CONFLICT_ERR: &str = \"\\\nerror: the subcommand 'sub' cannot be used with '--hello'\n\nUsage: test [OPTIONS]\n       test <COMMAND>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"test\")\n        .args_conflicts_with_subcommands(true)\n        .arg(arg!(--hello))\n        .subcommand(Command::new(\"sub\").short_flag('s'));\n\n    utils::assert_output(cmd, \"test --hello -s\", CONFLICT_ERR, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn positional_conflicts_with_subcommand_precedent() {\n    static CONFLICT_ERR: &str = \"\\\nerror: the subcommand 'sub' cannot be used with '<arg1>'\n\nUsage: test <arg1>\n       test <COMMAND>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"test\")\n        .args_conflicts_with_subcommands(true)\n        .subcommand_precedence_over_arg(true)\n        .arg(arg!(<arg1> \"some arg\"))\n        .subcommand(Command::new(\"sub\"));\n\n    utils::assert_output(cmd, \"test hello sub\", CONFLICT_ERR, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn flag_conflicts_with_subcommand_precedent() {\n    static CONFLICT_ERR: &str = \"\\\nerror: the subcommand 'sub' cannot be used with '--hello'\n\nUsage: test [OPTIONS]\n       test <COMMAND>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"test\")\n        .args_conflicts_with_subcommands(true)\n        .subcommand_precedence_over_arg(true)\n        .arg(arg!(--hello))\n        .subcommand(Command::new(\"sub\"));\n\n    utils::assert_output(cmd, \"test --hello sub\", CONFLICT_ERR, true);\n}\n\n#[test]\nfn subcommand_conflict_negates_required() {\n    let cmd = Command::new(\"test\")\n        .args_conflicts_with_subcommands(true)\n        .subcommand(Command::new(\"config\"))\n        .arg(arg!(-p --place <\"place id\"> \"Place ID to open\").required(true));\n\n    let result = cmd.try_get_matches_from([\"test\", \"config\"]);\n    assert!(\n        result.is_ok(),\n        \"args_conflicts_with_subcommands should ignore required: {}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n    assert_eq!(m.subcommand_name().unwrap(), \"config\");\n}\n\n#[test]\nfn args_negate_subcommands_one_level() {\n    let res = Command::new(\"disablehelp\")\n        .args_conflicts_with_subcommands(true)\n        .subcommand_negates_reqs(true)\n        .arg(arg!(<arg1> \"some arg\"))\n        .arg(arg!(<arg2> \"some arg\"))\n        .subcommand(\n            Command::new(\"sub1\").subcommand(Command::new(\"sub2\").subcommand(Command::new(\"sub3\"))),\n        )\n        .try_get_matches_from(vec![\"\", \"pickles\", \"sub1\"]);\n    assert!(res.is_ok(), \"error: {:?}\", res.unwrap_err().kind());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"arg2\").map(|v| v.as_str()),\n        Some(\"sub1\")\n    );\n}\n\n#[test]\nfn args_negate_subcommands_two_levels() {\n    let res = Command::new(\"disablehelp\")\n        .args_conflicts_with_subcommands(true)\n        .subcommand_negates_reqs(true)\n        .arg(arg!(<arg1> \"some arg\"))\n        .arg(arg!(<arg2> \"some arg\"))\n        .subcommand(\n            Command::new(\"sub1\")\n                .args_conflicts_with_subcommands(true)\n                .subcommand_negates_reqs(true)\n                .arg(arg!(<arg> \"some\"))\n                .arg(arg!(<arg2> \"some\"))\n                .subcommand(Command::new(\"sub2\").subcommand(Command::new(\"sub3\"))),\n        )\n        .try_get_matches_from(vec![\"\", \"sub1\", \"arg\", \"sub2\"]);\n    assert!(res.is_ok(), \"error: {:?}\", res.unwrap_err().kind());\n    let m = res.unwrap();\n    assert_eq!(\n        m.subcommand_matches(\"sub1\")\n            .unwrap()\n            .get_one::<String>(\"arg2\")\n            .map(|v| v.as_str()),\n        Some(\"sub2\")\n    );\n}\n\n#[test]\nfn group_conrflicts_with_subcommands() {\n    let c = Command::new(\"test\")\n        .args_conflicts_with_subcommands(true)\n        .arg(arg!(-g --directory <PATH>).global(true))\n        .arg(arg!(<start>))\n        .group(ArgGroup::new(\"Cli\").arg(\"directory\").arg(\"start\"))\n        .subcommand(Command::new(\"delete\").short_flag('d'));\n    let res = c.try_get_matches_from([\"test\", \"-g\", \"./\", \"-d\"]);\n    assert!(res.is_err());\n    let err = res.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n}\n"
  },
  {
    "path": "tests/builder/default_missing_vals.rs",
    "content": "use clap::{arg, Arg, ArgAction, Command};\n\n#[test]\nfn opt_missing() {\n    let r = Command::new(\"df\")\n        .arg(\n            Arg::new(\"color\")\n                .long(\"color\")\n                .default_value(\"auto\")\n                .num_args(0..=1)\n                .require_equals(true)\n                .default_missing_value(\"always\"),\n        )\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"auto\"\n    );\n    assert_eq!(\n        m.value_source(\"color\").unwrap(),\n        clap::parser::ValueSource::DefaultValue\n    );\n    assert_eq!(m.index_of(\"color\"), Some(1));\n}\n\n#[test]\nfn opt_present_with_missing_value() {\n    let r = Command::new(\"df\")\n        .arg(\n            Arg::new(\"color\")\n                .long(\"color\")\n                .default_value(\"auto\")\n                .num_args(0..=1)\n                .require_equals(true)\n                .default_missing_value(\"always\"),\n        )\n        .try_get_matches_from(vec![\"\", \"--color\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"always\"\n    );\n    assert_eq!(\n        m.value_source(\"color\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n    assert_eq!(m.index_of(\"color\"), Some(2));\n}\n\n#[test]\nfn opt_present_with_value() {\n    let r = Command::new(\"df\")\n        .arg(\n            Arg::new(\"color\")\n                .long(\"color\")\n                .default_value(\"auto\")\n                .num_args(0..=1)\n                .require_equals(true)\n                .default_missing_value(\"always\"),\n        )\n        .try_get_matches_from(vec![\"\", \"--color=never\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"never\"\n    );\n    assert_eq!(\n        m.value_source(\"color\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n    assert_eq!(m.index_of(\"color\"), Some(2));\n}\n\n#[test]\nfn opt_present_with_empty_value() {\n    let r = Command::new(\"df\")\n        .arg(\n            Arg::new(\"color\")\n                .long(\"color\")\n                .default_value(\"auto\")\n                .require_equals(true)\n                .default_missing_value(\"always\"),\n        )\n        .try_get_matches_from(vec![\"\", \"--color=\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"\"\n    );\n    assert_eq!(\n        m.value_source(\"color\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n    assert_eq!(m.index_of(\"color\"), Some(2));\n}\n\n//## `default_value`/`default_missing_value` non-interaction checks\n\n#[test]\nfn opt_default() {\n    // assert no change to usual argument handling when adding default_missing_value()\n    let r = Command::new(\"cmd\")\n        .arg(\n            arg!(o: -o [opt] \"some opt\")\n                .default_value(\"default\")\n                .default_missing_value(\"default_missing\"),\n        )\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.get_one::<String>(\"o\").map(|v| v.as_str()).unwrap(),\n        \"default\"\n    );\n}\n\n#[test]\nfn opt_default_user_override() {\n    // assert no change to usual argument handling when adding default_missing_value()\n    let r = Command::new(\"cmd\")\n        .arg(\n            arg!(o: -o [opt] \"some opt\")\n                .default_value(\"default\")\n                .default_missing_value(\"default_missing\"),\n        )\n        .try_get_matches_from(vec![\"\", \"-o=value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.get_one::<String>(\"o\").map(|v| v.as_str()).unwrap(),\n        \"value\"\n    );\n}\n\n#[test]\nfn default_missing_value_per_occurrence() {\n    // assert no change to usual argument handling when adding default_missing_value()\n    let r = Command::new(\"cmd\")\n        .arg(\n            arg!(o: -o [opt] ... \"some opt\")\n                .default_value(\"default\")\n                .default_missing_value(\"default_missing\"),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"-o=value\", \"-o\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"o\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        vec![\"default_missing\", \"value\", \"default_missing\"]\n    );\n}\n\n#[test]\n#[allow(clippy::bool_assert_comparison)]\nfn default_missing_value_flag_value() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"flag\")\n            .long(\"flag\")\n            .action(ArgAction::Set)\n            .num_args(0..=1)\n            .default_value(\"false\")\n            .default_missing_value(\"true\"),\n    );\n\n    let m = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()),\n        Some(\"false\")\n    );\n    assert_eq!(\n        m.value_source(\"flag\").unwrap(),\n        clap::parser::ValueSource::DefaultValue\n    );\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--flag\"])\n        .unwrap();\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()),\n        Some(\"true\")\n    );\n    assert_eq!(\n        m.value_source(\"flag\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--flag=true\"])\n        .unwrap();\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()),\n        Some(\"true\")\n    );\n    assert_eq!(\n        m.value_source(\"flag\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n\n    let m = cmd.try_get_matches_from([\"test\", \"--flag=false\"]).unwrap();\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()),\n        Some(\"false\")\n    );\n    assert_eq!(\n        m.value_source(\"flag\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n}\n\n#[test]\nfn delimited_missing_value() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"flag\")\n            .long(\"flag\")\n            .default_value(\"one,two\")\n            .default_missing_value(\"three,four\")\n            .num_args(0..)\n            .value_delimiter(',')\n            .require_equals(true),\n    );\n\n    let m = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"flag\")\n            .unwrap()\n            .map(|s| s.as_str())\n            .collect::<Vec<_>>(),\n        vec![\"one\", \"two\"]\n    );\n\n    let m = cmd.try_get_matches_from([\"test\", \"--flag\"]).unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"flag\")\n            .unwrap()\n            .map(|s| s.as_str())\n            .collect::<Vec<_>>(),\n        vec![\"three\", \"four\"]\n    );\n}\n\n#[test]\nfn valid_index() {\n    let m = Command::new(\"df\")\n        .arg(\n            Arg::new(\"color\")\n                .long(\"color\")\n                .default_value(\"auto\")\n                .num_args(0..=1)\n                .require_equals(true)\n                .default_missing_value(\"always\"),\n        )\n        .arg(Arg::new(\"sync\").long(\"sync\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"df\", \"--color\", \"--sync\"])\n        .unwrap();\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"always\"\n    );\n    assert_eq!(\n        m.value_source(\"color\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n\n    // Make sure the index reflects `--color`s position and not something else\n    assert_eq!(m.index_of(\"color\"), Some(2));\n}\n"
  },
  {
    "path": "tests/builder/default_vals.rs",
    "content": "use std::ffi::OsStr;\nuse std::ffi::OsString;\n\nuse clap::builder::ArgPredicate;\n#[cfg(feature = \"error-context\")]\nuse clap::error::ErrorKind;\nuse clap::{arg, value_parser, Arg, ArgAction, Command};\nuse snapbox::str;\n\n#[cfg(feature = \"error-context\")]\nuse super::utils;\n\n#[test]\nfn opts() {\n    let r = Command::new(\"df\")\n        .arg(arg!(o: -o <opt> \"some opt\").default_value(\"default\"))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.value_source(\"o\").unwrap(),\n        clap::parser::ValueSource::DefaultValue\n    );\n    assert_eq!(\n        m.get_one::<String>(\"o\").map(|v| v.as_str()).unwrap(),\n        \"default\"\n    );\n}\n\n#[test]\nfn default_has_index() {\n    let r = Command::new(\"df\")\n        .arg(arg!(o: -o <opt> \"some opt\").default_value(\"default\"))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert_eq!(m.index_of(\"o\"), Some(1));\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn opt_without_value_fail() {\n    let r = Command::new(\"df\")\n        .arg(\n            arg!(o: -o <opt> \"some opt\")\n                .default_value(\"default\")\n                .value_parser(clap::builder::NonEmptyStringValueParser::new()),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\"]);\n    assert!(r.is_err());\n    let err = r.unwrap_err();\n    utils::assert_error(err, ErrorKind::InvalidValue, str![[r#\"\nerror: a value is required for '-o <opt>' but none was supplied\n\nFor more information, try '--help'.\n\n\"#]], true);\n}\n\n#[test]\nfn opt_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\").default_value(\"default\"))\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(\n        m.value_source(\"opt\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()).unwrap(),\n        \"value\"\n    );\n}\n\n#[test]\nfn positionals() {\n    let r = Command::new(\"df\")\n        .arg(arg!([arg] \"some opt\").default_value(\"default\"))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.value_source(\"arg\").unwrap(),\n        clap::parser::ValueSource::DefaultValue\n    );\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"default\"\n    );\n}\n\n#[test]\nfn positional_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!([arg] \"some arg\").default_value(\"default\"))\n        .try_get_matches_from(vec![\"\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.value_source(\"arg\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"value\"\n    );\n}\n\n// OsStr Default Values\n\n#[test]\nfn osstr_opts() {\n    use std::ffi::OsStr;\n    let expected = OsStr::new(\"default\");\n\n    let r = Command::new(\"df\")\n        .arg(arg!(o: -o <opt> \"some opt\").default_value(expected))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.get_one::<String>(\"o\").map(|v| v.as_str()).unwrap(),\n        expected\n    );\n}\n\n#[test]\nfn osstr_opt_user_override() {\n    use std::ffi::OsStr;\n    let default = OsStr::new(\"default\");\n\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\").default_value(default))\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()).unwrap(),\n        \"value\"\n    );\n}\n\n#[test]\nfn osstr_positionals() {\n    use std::ffi::OsStr;\n    let expected = OsStr::new(\"default\");\n\n    let r = Command::new(\"df\")\n        .arg(arg!([arg] \"some opt\").default_value(expected))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        expected\n    );\n}\n\n#[test]\nfn osstr_positional_user_override() {\n    use std::ffi::OsStr;\n    let default = OsStr::new(\"default\");\n\n    let r = Command::new(\"df\")\n        .arg(arg!([arg] \"some arg\").default_value(default))\n        .try_get_matches_from(vec![\"\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"value\"\n    );\n}\n\n// --- Default if arg is present\n\n#[test]\nfn default_if_arg_present_no_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\").required(true))\n        .arg(arg!([arg] \"some arg\").default_value_if(\n            \"opt\",\n            ArgPredicate::IsPresent,\n            Some(\"default\"),\n        ))\n        .try_get_matches_from(vec![\"\", \"--opt\", \"some\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"default\"\n    );\n}\n\n#[test]\nfn default_if_arg_present_no_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!([arg] \"some arg\").default_value_if(\n            \"opt\",\n            ArgPredicate::IsPresent,\n            Some(\"default\"),\n        ))\n        .try_get_matches_from(vec![\"\", \"--opt\", \"some\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn default_if_arg_present_no_arg_with_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", ArgPredicate::IsPresent, Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"first\"\n    );\n}\n\n#[test]\nfn default_if_arg_present_with_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", ArgPredicate::IsPresent, Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"some\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"default\"\n    );\n}\n\n#[test]\nfn default_if_arg_present_with_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", ArgPredicate::IsPresent, Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"some\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn default_if_arg_present_no_arg_with_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", ArgPredicate::IsPresent, Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n// Conditional Default Values\n\n#[test]\nfn default_if_arg_present_with_value_no_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!([arg] \"some arg\").default_value_if(\"opt\", \"value\", Some(\"default\")))\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"default\"\n    );\n}\n\n#[test]\nfn default_values_if_arg_present_with_value_no_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values_if(\"opt\", \"value\", [\"df1\",\"df2\"]),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"df1\", \"df2\"]\n    );\n}\n\n#[test]\nfn default_if_arg_present_with_value_no_default_fail() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!([arg] \"some arg\").default_value_if(\"opt\", \"value\", Some(\"default\")))\n        .try_get_matches_from(vec![\"\", \"--opt\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(!m.contains_id(\"arg\"));\n    assert!(m.get_one::<String>(\"arg\").map(|v| v.as_str()).is_none());\n}\n\n#[test]\nfn default_values_if_arg_present_with_value_no_default_fail() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values_if(\"opt\", \"value\", [\"df1\", \"df2\"]),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(!m.contains_id(\"args\"));\n    assert!(m.get_many::<String>(\"args\").is_none());\n}\n\n#[test]\nfn default_if_arg_present_with_value_no_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!([arg] \"some arg\").default_value_if(\"opt\", \"some\", Some(\"default\")))\n        .try_get_matches_from(vec![\"\", \"--opt\", \"some\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn default_values_if_arg_present_with_value_no_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values_if(\"opt\", \"value\", [\"df1\", \"df2\"])\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\", \"--args\", \"old\",\"new\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"old\",\"new\"]\n    );\n}\n\n#[test]\nfn default_if_arg_present_with_value_no_arg_with_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", \"some\", Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"first\"\n    );\n}\n\n#[test]\nfn default_values_if_arg_present_with_value_no_arg_with_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\",\"second\"])\n                .default_values_if(\"opt\", \"value\", [\"df1\", \"df2\"])\n        )\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"first\",\"second\"]\n    );\n}\n\n#[test]\nfn default_if_arg_present_with_value_no_arg_with_default_fail() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", \"some\", Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"first\"\n    );\n}\n\n#[test]\nfn default_values_if_arg_present_with_value_no_arg_with_default_fail() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\",\"second\"])\n                .default_values_if(\"opt\", \"value\", [\"df1\", \"df2\"])\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"first\",\"second\"]\n    );\n}\n\n#[test]\nfn default_if_arg_present_with_value_with_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", \"some\", Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"some\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"default\"\n    );\n}\n\n#[test]\nfn default_values_if_arg_present_with_value_with_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\",\"second\"])\n                .default_values_if(\"opt\", \"value\", [\"df1\", \"df2\"])\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"df1\",\"df2\"]\n    );\n}\n\n#[test]\nfn default_if_arg_present_with_value_with_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", \"some\", Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"some\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn default_values_if_arg_present_with_value_with_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\",\"second\"])\n                .default_values_if(\"opt\", \"value\", [\"df1\", \"df2\"])\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\", \"--args\", \"other1\", \"other2\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"other1\",\"other2\"]\n    );\n}\n\n#[test]\nfn default_if_arg_present_no_arg_with_value_with_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", \"some\", Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn default_values_if_arg_present_no_arg_with_value_with_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\",\"second\"])\n                .default_values_if(\"opt\", \"value\", [\"df1\", \"df2\"])\n        )\n        .try_get_matches_from(vec![\"\", \"--args\", \"other1\", \"other2\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"other1\",\"other2\"]\n    );\n}\n\n#[test]\nfn default_if_arg_present_no_arg_with_value_with_default_user_override_fail() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_if(\"opt\", \"some\", Some(\"default\")),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn default_values_if_arg_present_no_arg_with_value_with_default_user_override_fail() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\",\"second\"])\n                .default_values_if(\"opt\", \"value\", [\"df1\", \"df2\"])\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"some\", \"--args\", \"other1\", \"other2\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"other1\",\"other2\"]\n    );\n}\n\n// Unsetting the default\n\n#[test]\nfn no_default_if_arg_present_with_value_no_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!([arg] \"some arg\").default_value_if(\"opt\", \"value\", None))\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(!m.contains_id(\"arg\"));\n}\n\n#[test]\nfn no_default_if_arg_present_with_value_with_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"default\")\n                .default_value_if(\"opt\", \"value\", None),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(!m.contains_id(\"arg\"));\n    assert!(m.get_one::<String>(\"arg\").map(|v| v.as_str()).is_none());\n}\n\n#[test]\nfn no_default_if_arg_present_with_value_with_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"default\")\n                .default_value_if(\"opt\", \"value\", None),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn no_default_values_if_arg_present_with_value_with_default_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\", \"second\"])\n                .default_values_if(\"opt\", \"value\", [\"df1\",\"df2\"])\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"value\", \"--args\", \"other1\", \"other2\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"other1\",\"other2\"]\n    );\n}\n\n#[test]\nfn no_default_if_arg_present_no_arg_with_value_with_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"default\")\n                .default_value_if(\"opt\", \"value\", None),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"default\"\n    );\n}\n\n#[test]\nfn no_default_values_if_arg_present_no_arg_with_value_with_default() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\", \"second\"])\n                .default_values_if(\"opt\", \"value\", [\"df1\",\"df2\"])\n        )\n        .try_get_matches_from(vec![\"\", \"--opt\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"first\",\"second\"]\n    );\n}\n\n// Multiple conditions\n\n#[test]\nfn default_ifs_arg_present() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!(--flag \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_ifs([\n                    (\"opt\", ArgPredicate::from(\"some\"), Some(\"default\")),\n                    (\"flag\", ArgPredicate::IsPresent, Some(\"flg\")),\n                ]),\n        )\n        .try_get_matches_from(vec![\"\", \"--flag\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"flg\"\n    );\n}\n\n#[test]\nfn default_values_ifs_arg_present() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!(--flag \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\", \"second\"])\n                .default_values_ifs([\n                    (\"opt\", ArgPredicate::from(\"some\"), [\"d1\", \"d2\"]),\n                    (\"flag\", ArgPredicate::IsPresent, [\"d3\", \"d4\"]),\n                ])\n        )\n        .try_get_matches_from(vec![\"\", \"--flag\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"d3\",\"d4\"]\n    );\n}\n\n#[test]\nfn no_default_ifs_arg_present() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!(--flag \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_ifs([\n                    (\"opt\", ArgPredicate::from(\"some\"), Some(\"default\")),\n                    (\"flag\", ArgPredicate::IsPresent, None),\n                ]),\n        )\n        .try_get_matches_from(vec![\"\", \"--flag\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(!m.contains_id(\"arg\"));\n    assert!(m.get_one::<String>(\"arg\").map(|v| v.as_str()).is_none());\n}\n\n#[test]\nfn default_ifs_arg_present_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!(--flag \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_ifs([\n                    (\"opt\", ArgPredicate::from(\"some\"), Some(\"default\")),\n                    (\"flag\", ArgPredicate::IsPresent, Some(\"flg\")),\n                ]),\n        )\n        .try_get_matches_from(vec![\"\", \"--flag\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"value\"\n    );\n}\n\n#[test]\nfn default_values_ifs_arg_present_user_override() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!(--flag \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\", \"second\"])\n                .default_values_ifs([\n                    (\"opt\", ArgPredicate::from(\"some\"), [\"d1\", \"d2\"]),\n                    (\"flag\", ArgPredicate::IsPresent, [\"d3\", \"d4\"]),\n                ])\n        )\n        .try_get_matches_from(vec![\"\", \"--flag\", \"--args\", \"value1\", \"value2\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"value1\",\"value2\"]\n    );\n}\n\n#[test]\nfn default_ifs_arg_present_order() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!(--flag \"some arg\"))\n        .arg(\n            arg!([arg] \"some arg\")\n                .default_value(\"first\")\n                .default_value_ifs([\n                    (\"opt\", ArgPredicate::from(\"some\"), Some(\"default\")),\n                    (\"flag\", ArgPredicate::IsPresent, Some(\"flg\")),\n                ]),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=some\", \"--flag\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"default\"\n    );\n}\n\n#[test]\nfn default_values_ifs_arg_present_order() {\n    let r = Command::new(\"df\")\n        .arg(arg!(--opt <FILE> \"some arg\"))\n        .arg(arg!(--flag \"some arg\"))\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .default_values([\"first\", \"second\"])\n                .default_values_ifs([\n                    (\"opt\", ArgPredicate::from(\"some\"), [\"d1\", \"d2\"]),\n                    (\"flag\", ArgPredicate::IsPresent, [\"d3\", \"d4\"]),\n                ])\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=some\", \"--flag\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"args\"));\n    assert_eq!(\n        m.get_many::<String>(\"args\").unwrap().collect::<Vec<_>>(),\n        [\"d1\",\"d2\"]\n    );\n}\n\n#[test]\nfn default_value_ifs_os() {\n    let cmd = Command::new(\"my_cargo\")\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .value_parser(value_parser!(OsString))\n                .action(ArgAction::Set),\n        )\n        .arg(\n            Arg::new(\"other\")\n                .long(\"other\")\n                .value_parser(value_parser!(OsString))\n                .default_value_ifs([(\"flag\", \"标记2\", OsStr::new(\"flag=标记2\"))]),\n        );\n    let result = cmd.try_get_matches_from([\"my_cargo\", \"--flag\", \"标记2\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let m = result.unwrap();\n    assert_eq!(\n        m.get_one::<OsString>(\"flag\").map(OsString::as_os_str),\n        Some(OsStr::new(\"标记2\"))\n    );\n    assert_eq!(\n        m.get_one::<OsString>(\"other\").map(OsString::as_os_str),\n        Some(OsStr::new(\"flag=标记2\")),\n    );\n}\n\n#[test]\nfn default_values_ifs_os() {\n    let cmd = Command::new(\"my_cargo\")\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .value_parser(value_parser!(OsString))\n                .action(ArgAction::Set),\n        )\n        .arg(\n            Arg::new(\"args\")\n                .long(\"args\")\n                .num_args(2)\n                .value_parser(value_parser!(OsString))\n                .default_values([\"默认1\", \"默认2\"])\n                .default_values_ifs([(\"flag\", \"标记1\", [OsStr::new(\"标记2\"),OsStr::new(\"标记3\")])])\n        );\n    let result = cmd.try_get_matches_from([\"my_cargo\", \"--flag\", \"标记1\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let m = result.unwrap();\n    assert_eq!(\n        m.get_one::<OsString>(\"flag\").map(OsString::as_os_str),\n        Some(OsStr::new(\"标记1\"))\n    );\n    assert_eq!(\n        m.get_many::<OsString>(\"args\").unwrap().map(OsString::as_os_str).collect::<Vec<_>>(),\n        [\"标记2\",\"标记3\"]\n    );\n}\n\n// Interaction with requires\n\n#[test]\nfn conditional_reqs_pass() {\n    let m = Command::new(\"Test cmd\")\n        .arg(\n            Arg::new(\"target\")\n                .action(ArgAction::Set)\n                .default_value(\"file\")\n                .long(\"target\"),\n        )\n        .arg(\n            Arg::new(\"input\")\n                .action(ArgAction::Set)\n                .required(true)\n                .long(\"input\"),\n        )\n        .arg(\n            Arg::new(\"output\")\n                .action(ArgAction::Set)\n                .required_if_eq(\"target\", \"file\")\n                .long(\"output\"),\n        )\n        .try_get_matches_from(vec![\"test\", \"--input\", \"some\", \"--output\", \"other\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"output\").map(|v| v.as_str()),\n        Some(\"other\")\n    );\n    assert_eq!(\n        m.get_one::<String>(\"input\").map(|v| v.as_str()),\n        Some(\"some\")\n    );\n}\n\n#[test]\nfn multiple_defaults() {\n    let r = Command::new(\"diff\")\n        .arg(\n            Arg::new(\"files\")\n                .long(\"files\")\n                .num_args(2)\n                .default_values([\"old\", \"new\"]),\n        )\n        .try_get_matches_from(vec![\"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\").unwrap().collect::<Vec<_>>(),\n        vec![\"old\", \"new\"]\n    );\n}\n\n#[test]\nfn multiple_defaults_override() {\n    let r = Command::new(\"diff\")\n        .arg(\n            Arg::new(\"files\")\n                .long(\"files\")\n                .num_args(2)\n                .default_values([\"old\", \"new\"]),\n        )\n        .try_get_matches_from(vec![\"\", \"--files\", \"other\", \"mine\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\").unwrap().collect::<Vec<_>>(),\n        vec![\"other\", \"mine\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn default_vals_donnot_show_in_smart_usage() {\n    let cmd = Command::new(\"bug\")\n        .arg(\n            Arg::new(\"foo\")\n                .long(\"config\")\n                .action(ArgAction::Set)\n                .default_value(\"bar\"),\n        )\n        .arg(Arg::new(\"input\").required(true));\n\n    utils::assert_output(\n        cmd,\n        \"bug\",\n        \"\\\nerror: the following required arguments were not provided:\n  <input>\n\nUsage: bug <input>\n\nFor more information, try '--help'.\n\",\n        true,\n    );\n}\n\n#[test]\nfn issue_1050_num_vals_and_defaults() {\n    let res = Command::new(\"hello\")\n        .arg(\n            Arg::new(\"exit-code\")\n                .long(\"exit-code\")\n                .action(ArgAction::Set)\n                .num_args(1)\n                .default_value(\"0\"),\n        )\n        .try_get_matches_from(vec![\"hello\", \"--exit-code=1\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"exit-code\").map(|v| v.as_str()),\n        Some(\"1\")\n    );\n}\n\n#[test]\nfn required_groups_with_default_values() {\n    use clap::{Arg, ArgGroup, Command};\n\n    let cmd = Command::new(\"test\")\n        .arg(Arg::new(\"arg\").default_value(\"value\"))\n        .group(ArgGroup::new(\"group\").args([\"arg\"]).required(true));\n\n    let result = cmd.clone().try_get_matches_from([\"test\"]);\n    assert!(result.is_err());\n\n    let result = cmd.clone().try_get_matches_from([\"test\", \"value\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let m = result.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert!(m.contains_id(\"group\"));\n}\n\n#[test]\nfn required_args_with_default_values() {\n    use clap::{Arg, Command};\n\n    let cmd = Command::new(\"test\").arg(Arg::new(\"arg\").required(true).default_value(\"value\"));\n\n    let result = cmd.clone().try_get_matches_from([\"test\"]);\n    assert!(result.is_err());\n\n    let result = cmd.clone().try_get_matches_from([\"test\", \"value\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let m = result.unwrap();\n    assert!(m.contains_id(\"arg\"));\n}\n\n#[test]\nfn valid_delimited_default_values() {\n    use clap::{Arg, Command};\n\n    Command::new(\"test\")\n        .arg(\n            Arg::new(\"arg\")\n                .value_parser(clap::value_parser!(u32))\n                .value_delimiter(',')\n                .default_value(\"1,2,3\"),\n        )\n        .debug_assert();\n}\n\n#[test]\nfn with_value_delimiter() {\n    let cmd = Command::new(\"multiple_values\").arg(\n        Arg::new(\"option\")\n            .long(\"option\")\n            .help(\"multiple options\")\n            .value_delimiter(';')\n            .default_value(\"first;second\"),\n    );\n\n    let matches = cmd.try_get_matches_from(vec![\"\"]).unwrap();\n\n    assert_eq!(\n        matches\n            .get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"first\", \"second\"]\n    );\n}\n\n#[test]\nfn missing_with_value_delimiter() {\n    let cmd = Command::new(\"program\").arg(\n        Arg::new(\"option\")\n            .long(\"option\")\n            .value_delimiter(';')\n            .num_args(0..=1)\n            .default_missing_values([\"value1;value2;value3\", \"value4;value5\"]),\n    );\n\n    let matches = cmd\n        .try_get_matches_from(vec![\"program\", \"--option\"])\n        .unwrap();\n\n    assert_eq!(\n        matches\n            .get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"value1\", \"value2\", \"value3\", \"value4\", \"value5\"]\n    );\n}\n\n#[test]\nfn default_independent_of_trailing() {\n    let cmd = Command::new(\"test\")\n        .dont_delimit_trailing_values(true)\n        .arg(Arg::new(\"pos\").required(true))\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .default_value(\"one,two\")\n                .value_delimiter(','),\n        );\n\n    // Baseline behavior\n    let m = cmd\n        .clone()\n        .try_get_matches_from(vec![\"program\", \"here\"])\n        .unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"pos\").map(|v| v.as_str()).unwrap(),\n        \"here\"\n    );\n    assert_eq!(\n        m.get_many::<String>(\"flag\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"one\", \"two\"]\n    );\n\n    // Trailing-values behavior should match the baseline\n    let m = cmd\n        .try_get_matches_from(vec![\"program\", \"--\", \"here\"])\n        .unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"pos\").map(|v| v.as_str()).unwrap(),\n        \"here\"\n    );\n    assert_eq!(\n        m.get_many::<String>(\"flag\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"one\", \"two\"]\n    );\n}\n\n"
  },
  {
    "path": "tests/builder/delimiters.rs",
    "content": "use clap::{Arg, ArgAction, Command};\n\n#[test]\nfn opt_default_no_delim() {\n    let m = Command::new(\"no_delim\")\n        .arg(Arg::new(\"option\").long(\"option\").action(ArgAction::Set))\n        .try_get_matches_from(vec![\"\", \"--option\", \"val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_one::<String>(\"option\").map(|v| v.as_str()).unwrap(),\n        \"val1,val2,val3\"\n    );\n}\n\n#[test]\nfn opt_eq_no_delim() {\n    let m = Command::new(\"no_delim\")\n        .arg(Arg::new(\"option\").long(\"option\").action(ArgAction::Set))\n        .try_get_matches_from(vec![\"\", \"--option=val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_one::<String>(\"option\").map(|v| v.as_str()).unwrap(),\n        \"val1,val2,val3\"\n    );\n}\n\n#[test]\nfn opt_s_eq_no_delim() {\n    let m = Command::new(\"no_delim\")\n        .arg(Arg::new(\"option\").short('o').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"\", \"-o=val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_one::<String>(\"option\").map(|v| v.as_str()).unwrap(),\n        \"val1,val2,val3\"\n    );\n}\n\n#[test]\nfn opt_s_default_no_delim() {\n    let m = Command::new(\"no_delim\")\n        .arg(Arg::new(\"option\").short('o').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_one::<String>(\"option\").map(|v| v.as_str()).unwrap(),\n        \"val1,val2,val3\"\n    );\n}\n\n#[test]\nfn opt_s_no_space_no_delim() {\n    let m = Command::new(\"no_delim\")\n        .arg(Arg::new(\"option\").short('o').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_one::<String>(\"option\").map(|v| v.as_str()).unwrap(),\n        \"val1,val2,val3\"\n    );\n}\n\n#[test]\nfn opt_s_no_space_mult_no_delim() {\n    let m = Command::new(\"no_delim\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .action(ArgAction::Set)\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_one::<String>(\"option\").map(|v| v.as_str()).unwrap(),\n        \"val1,val2,val3\"\n    );\n}\n\n#[test]\nfn opt_eq_mult_def_delim() {\n    let m = Command::new(\"no_delim\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"opt\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .value_delimiter(','),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n"
  },
  {
    "path": "tests/builder/derive_order.rs",
    "content": "use super::utils;\n\nuse std::str;\n\nuse clap::{Arg, ArgAction, Command};\n\n#[test]\nfn no_derive_order() {\n    static NO_DERIVE_ORDER: &str = \"\\\nUsage: test [OPTIONS]\n\nOptions:\n      --flag_a               second flag\n      --flag_b               first flag\n  -h, --help                 Print help\n      --option_a <option_a>  second option\n      --option_b <option_b>  first option\n  -V, --version              Print version\n\";\n\n    let cmd = Command::new(\"test\")\n        .version(\"1.2\")\n        .next_display_order(None)\n        .args([\n            Arg::new(\"flag_b\")\n                .long(\"flag_b\")\n                .help(\"first flag\")\n                .action(ArgAction::SetTrue),\n            Arg::new(\"option_b\")\n                .long(\"option_b\")\n                .action(ArgAction::Set)\n                .help(\"first option\"),\n            Arg::new(\"flag_a\")\n                .long(\"flag_a\")\n                .help(\"second flag\")\n                .action(ArgAction::SetTrue),\n            Arg::new(\"option_a\")\n                .long(\"option_a\")\n                .action(ArgAction::Set)\n                .help(\"second option\"),\n        ]);\n\n    utils::assert_output(cmd, \"test --help\", NO_DERIVE_ORDER, false);\n}\n\n#[test]\nfn derive_order() {\n    static UNIFIED_HELP_AND_DERIVE: &str = \"\\\nUsage: test [OPTIONS]\n\nOptions:\n      --flag_b               first flag\n      --option_b <option_b>  first option\n      --flag_a               second flag\n      --option_a <option_a>  second option\n  -h, --help                 Print help\n  -V, --version              Print version\n\";\n\n    let cmd = Command::new(\"test\").version(\"1.2\").args([\n        Arg::new(\"flag_b\")\n            .long(\"flag_b\")\n            .help(\"first flag\")\n            .action(ArgAction::SetTrue),\n        Arg::new(\"option_b\")\n            .long(\"option_b\")\n            .action(ArgAction::Set)\n            .help(\"first option\"),\n        Arg::new(\"flag_a\")\n            .long(\"flag_a\")\n            .help(\"second flag\")\n            .action(ArgAction::SetTrue),\n        Arg::new(\"option_a\")\n            .long(\"option_a\")\n            .action(ArgAction::Set)\n            .help(\"second option\"),\n    ]);\n\n    utils::assert_output(cmd, \"test --help\", UNIFIED_HELP_AND_DERIVE, false);\n}\n\n#[test]\nfn derive_order_next_order() {\n    static HELP: &str = \"\\\nUsage: test [OPTIONS]\n\nOptions:\n      --flag_b               first flag\n      --option_b <option_b>  first option\n  -h, --help                 Print help\n  -V, --version              Print version\n      --flag_a               second flag\n      --option_a <option_a>  second option\n\";\n\n    let cmd = Command::new(\"test\")\n        .version(\"1.2\")\n        .next_display_order(10000)\n        .arg(\n            Arg::new(\"flag_a\")\n                .long(\"flag_a\")\n                .help(\"second flag\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"option_a\")\n                .long(\"option_a\")\n                .action(ArgAction::Set)\n                .help(\"second option\"),\n        )\n        .next_display_order(10)\n        .arg(\n            Arg::new(\"flag_b\")\n                .long(\"flag_b\")\n                .help(\"first flag\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"option_b\")\n                .long(\"option_b\")\n                .action(ArgAction::Set)\n                .help(\"first option\"),\n        );\n\n    utils::assert_output(cmd, \"test --help\", HELP, false);\n}\n\n#[test]\nfn derive_order_no_next_order() {\n    static HELP: &str = \"\\\nUsage: test [OPTIONS]\n\nOptions:\n      --flag_a               first flag\n      --flag_b               second flag\n  -h, --help                 Print help\n      --option_a <option_a>  first option\n      --option_b <option_b>  second option\n  -V, --version              Print version\n\";\n\n    let cmd = Command::new(\"test\")\n        .version(\"1.2\")\n        .next_display_order(None)\n        .arg(\n            Arg::new(\"flag_a\")\n                .long(\"flag_a\")\n                .help(\"first flag\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"option_a\")\n                .long(\"option_a\")\n                .action(ArgAction::Set)\n                .help(\"first option\"),\n        )\n        .arg(\n            Arg::new(\"flag_b\")\n                .long(\"flag_b\")\n                .help(\"second flag\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"option_b\")\n                .long(\"option_b\")\n                .action(ArgAction::Set)\n                .help(\"second option\"),\n        );\n\n    utils::assert_output(cmd, \"test --help\", HELP, false);\n}\n\n#[test]\nfn derive_order_subcommand_propagate() {\n    static UNIFIED_DERIVE_SC_PROP: &str = \"\\\nUsage: test sub [OPTIONS]\n\nOptions:\n      --flag_b               first flag\n      --option_b <option_b>  first option\n      --flag_a               second flag\n      --option_a <option_a>  second option\n  -h, --help                 Print help\n  -V, --version              Print version\n\";\n\n    let cmd = Command::new(\"test\").subcommand(\n        Command::new(\"sub\").version(\"1.2\").args([\n            Arg::new(\"flag_b\")\n                .long(\"flag_b\")\n                .help(\"first flag\")\n                .action(ArgAction::SetTrue),\n            Arg::new(\"option_b\")\n                .long(\"option_b\")\n                .action(ArgAction::Set)\n                .help(\"first option\"),\n            Arg::new(\"flag_a\")\n                .long(\"flag_a\")\n                .help(\"second flag\")\n                .action(ArgAction::SetTrue),\n            Arg::new(\"option_a\")\n                .long(\"option_a\")\n                .action(ArgAction::Set)\n                .help(\"second option\"),\n        ]),\n    );\n\n    utils::assert_output(cmd, \"test sub --help\", UNIFIED_DERIVE_SC_PROP, false);\n}\n\n#[test]\nfn derive_order_subcommand_propagate_with_explicit_display_order() {\n    static UNIFIED_DERIVE_SC_PROP_EXPLICIT_ORDER: &str = \"\\\nUsage: test sub [OPTIONS]\n\nOptions:\n      --flag_a               second flag\n      --flag_b               first flag\n      --option_b <option_b>  first option\n      --option_a <option_a>  second option\n  -h, --help                 Print help\n  -V, --version              Print version\n\";\n\n    let cmd = Command::new(\"test\").subcommand(\n        Command::new(\"sub\").version(\"1.2\").args([\n            Arg::new(\"flag_b\")\n                .long(\"flag_b\")\n                .help(\"first flag\")\n                .action(ArgAction::SetTrue),\n            Arg::new(\"option_b\")\n                .long(\"option_b\")\n                .action(ArgAction::Set)\n                .help(\"first option\"),\n            Arg::new(\"flag_a\")\n                .long(\"flag_a\")\n                .help(\"second flag\")\n                .display_order(0)\n                .action(ArgAction::SetTrue),\n            Arg::new(\"option_a\")\n                .long(\"option_a\")\n                .action(ArgAction::Set)\n                .help(\"second option\"),\n        ]),\n    );\n\n    utils::assert_output(\n        cmd,\n        \"test sub --help\",\n        UNIFIED_DERIVE_SC_PROP_EXPLICIT_ORDER,\n        false,\n    );\n}\n\n#[test]\nfn subcommand_sorted_display_order() {\n    static SUBCMD_ALPHA_ORDER: &str = \"\\\nUsage: test [COMMAND]\n\nCommands:\n  a1    blah a1\n  b1    blah b1\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n    let app_subcmd_alpha_order = Command::new(\"test\")\n        .version(\"1\")\n        .next_display_order(None)\n        .subcommands(vec![\n            Command::new(\"b1\")\n                .about(\"blah b1\")\n                .arg(Arg::new(\"test\").short('t').action(ArgAction::SetTrue)),\n            Command::new(\"a1\")\n                .about(\"blah a1\")\n                .arg(Arg::new(\"roster\").short('r').action(ArgAction::SetTrue)),\n        ]);\n\n    utils::assert_output(\n        app_subcmd_alpha_order,\n        \"test --help\",\n        SUBCMD_ALPHA_ORDER,\n        false,\n    );\n}\n\n#[test]\nfn subcommand_derived_display_order() {\n    static SUBCMD_DECL_ORDER: &str = \"\\\nUsage: test [COMMAND]\n\nCommands:\n  b1    blah b1\n  a1    blah a1\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n    let app_subcmd_decl_order = Command::new(\"test\").version(\"1\").subcommands(vec![\n        Command::new(\"b1\")\n            .about(\"blah b1\")\n            .arg(Arg::new(\"test\").short('t').action(ArgAction::SetTrue)),\n        Command::new(\"a1\")\n            .about(\"blah a1\")\n            .arg(Arg::new(\"roster\").short('r').action(ArgAction::SetTrue)),\n    ]);\n\n    utils::assert_output(\n        app_subcmd_decl_order,\n        \"test --help\",\n        SUBCMD_DECL_ORDER,\n        false,\n    );\n}\n"
  },
  {
    "path": "tests/builder/display_order.rs",
    "content": "use super::utils;\n\nuse clap::Command;\n\n#[test]\nfn very_large_display_order() {\n    let cmd = Command::new(\"test\").subcommand(Command::new(\"sub\").display_order(usize::MAX));\n\n    utils::assert_output(\n        cmd,\n        \"test --help\",\n        \"\\\nUsage: test [COMMAND]\n\nCommands:\n  help  Print this message or the help of the given subcommand(s)\n  sub   \n\nOptions:\n  -h, --help  Print help\n\",\n        false,\n    );\n}\n"
  },
  {
    "path": "tests/builder/double_require.rs",
    "content": "use clap::{error::ErrorKind, Arg, ArgAction, Command};\nuse snapbox::str;\n\nuse crate::utils;\n\nfn cmd() -> Command {\n    Command::new(\"prog\")\n        .arg(\n            Arg::new(\"a\")\n                .short('a')\n                .action(ArgAction::SetTrue)\n                .required_unless_present_any([\"b\", \"c\"])\n                .conflicts_with_all([\"b\", \"c\"]),\n        )\n        .arg(\n            Arg::new(\"b\")\n                .short('b')\n                .action(ArgAction::SetTrue)\n                .required_unless_present(\"a\")\n                .requires(\"c\"),\n        )\n        .arg(\n            Arg::new(\"c\")\n                .short('c')\n                .action(ArgAction::SetTrue)\n                .required_unless_present(\"a\")\n                .requires(\"b\"),\n        )\n}\n\n#[test]\nfn valid_cases() {\n    let res = cmd().try_get_matches_from(vec![\"\", \"-a\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let res = cmd().clone().try_get_matches_from(vec![\"\", \"-b\", \"-c\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let res = cmd().try_get_matches_from(vec![\"\", \"-c\", \"-b\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn help_text() {\n    let res = cmd().try_get_matches_from(vec![\"prog\", \"--help\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(err, ErrorKind::DisplayHelp, str![[r#\"\nUsage: prog [OPTIONS]\n\nOptions:\n  -a          \n  -b          \n  -c          \n  -h, --help  Print help\n\n\"#]], false);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn no_duplicate_error() {\n    let res = cmd().try_get_matches_from(vec![\"\", \"-b\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::MissingRequiredArgument,\n        str![[r#\"\nerror: the following required arguments were not provided:\n  -c\n\nUsage: prog -b -c\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n\n    let res = cmd().try_get_matches_from(vec![\"\", \"-c\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::MissingRequiredArgument,\n        str![[r#\"\nerror: the following required arguments were not provided:\n  -b\n\nUsage: prog -c -b\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n"
  },
  {
    "path": "tests/builder/empty_values.rs",
    "content": "use clap::{error::ErrorKind, Arg, ArgAction, Command};\n\n#[cfg(feature = \"error-context\")]\nuse super::utils;\n\n#[test]\nfn empty_values() {\n    let m = Command::new(\"config\")\n        .arg(Arg::new(\"config\").long(\"config\").action(ArgAction::Set))\n        .try_get_matches_from([\"config\", \"--config\", \"\"])\n        .unwrap();\n    assert_eq!(m.get_one::<String>(\"config\").map(|v| v.as_str()), Some(\"\"));\n}\n\n#[test]\nfn empty_values_with_equals() {\n    let m = Command::new(\"config\")\n        .arg(Arg::new(\"config\").long(\"config\").action(ArgAction::Set))\n        .try_get_matches_from([\"config\", \"--config=\"])\n        .unwrap();\n    assert_eq!(m.get_one::<String>(\"config\").map(|v| v.as_str()), Some(\"\"));\n\n    let m = Command::new(\"config\")\n        .arg(Arg::new(\"config\").short('c').action(ArgAction::Set))\n        .try_get_matches_from([\"config\", \"-c=\"])\n        .unwrap();\n    assert_eq!(m.get_one::<String>(\"config\").map(|v| v.as_str()), Some(\"\"));\n}\n\n#[test]\nfn no_empty_values() {\n    let m = Command::new(\"config\")\n        .arg(\n            Arg::new(\"config\")\n                .long(\"config\")\n                .action(ArgAction::Set)\n                .value_parser(clap::builder::NonEmptyStringValueParser::new()),\n        )\n        .try_get_matches_from([\"config\", \"--config\", \"\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n\n    let m = Command::new(\"config\")\n        .arg(\n            Arg::new(\"config\")\n                .short('c')\n                .action(ArgAction::Set)\n                .value_parser(clap::builder::NonEmptyStringValueParser::new()),\n        )\n        .try_get_matches_from([\"config\", \"-c\", \"\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\nfn no_empty_values_with_equals() {\n    let m = Command::new(\"config\")\n        .arg(\n            Arg::new(\"config\")\n                .long(\"config\")\n                .action(ArgAction::Set)\n                .value_parser(clap::builder::NonEmptyStringValueParser::new()),\n        )\n        .try_get_matches_from([\"config\", \"--config=\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n\n    let m = Command::new(\"config\")\n        .arg(\n            Arg::new(\"config\")\n                .short('c')\n                .action(ArgAction::Set)\n                .value_parser(clap::builder::NonEmptyStringValueParser::new()),\n        )\n        .try_get_matches_from([\"config\", \"-c=\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\nfn no_empty_values_without_equals() {\n    let m = Command::new(\"config\")\n        .arg(\n            Arg::new(\"config\")\n                .long(\"config\")\n                .action(ArgAction::Set)\n                .value_parser(clap::builder::NonEmptyStringValueParser::new()),\n        )\n        .try_get_matches_from([\"config\", \"--config\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n\n    let m = Command::new(\"config\")\n        .arg(\n            Arg::new(\"config\")\n                .short('c')\n                .action(ArgAction::Set)\n                .value_parser(clap::builder::NonEmptyStringValueParser::new()),\n        )\n        .try_get_matches_from([\"config\", \"-c\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn no_empty_values_without_equals_but_requires_equals() {\n    let cmd = Command::new(\"config\").arg(\n        Arg::new(\"config\")\n            .long(\"config\")\n            .action(ArgAction::Set)\n            .value_parser(clap::builder::NonEmptyStringValueParser::new())\n            .require_equals(true),\n    );\n    let m = cmd.clone().try_get_matches_from([\"config\", \"--config\"]);\n    // Should error on no equals rather than empty value.\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::NoEquals);\n\n    static NO_EUQALS_ERROR: &str =\n        \"error: equal sign is needed when assigning values to '--config=<config>'\n\nUsage: config [OPTIONS]\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(cmd, \"config --config\", NO_EUQALS_ERROR, true);\n}\n"
  },
  {
    "path": "tests/builder/env.rs",
    "content": "#![cfg(feature = \"env\")]\n\nuse std::env;\nuse std::ffi::OsStr;\n\nuse clap::{arg, builder::FalseyValueParser, Arg, ArgAction, Command};\n\n#[test]\nfn env() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.value_source(\"arg\").unwrap(),\n        clap::parser::ValueSource::EnvVariable\n    );\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"env\"\n    );\n}\n\n#[test]\nfn env_bool_literal() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_FLAG_TRUE\", \"On\");\n        env::set_var(\"CLP_TEST_FLAG_FALSE\", \"nO\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            Arg::new(\"present\")\n                .short('p')\n                .env(\"CLP_TEST_FLAG_TRUE\")\n                .action(ArgAction::SetTrue)\n                .value_parser(FalseyValueParser::new()),\n        )\n        .arg(\n            Arg::new(\"negated\")\n                .short('n')\n                .env(\"CLP_TEST_FLAG_FALSE\")\n                .action(ArgAction::SetTrue)\n                .value_parser(FalseyValueParser::new()),\n        )\n        .arg(\n            Arg::new(\"absent\")\n                .short('a')\n                .env(\"CLP_TEST_FLAG_ABSENT\")\n                .action(ArgAction::SetTrue)\n                .value_parser(FalseyValueParser::new()),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(*m.get_one::<bool>(\"present\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"negated\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"absent\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn env_os() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_OS\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(OsStr::new(\"CLP_TEST_ENV_OS\"))\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"env\"\n    );\n}\n\n#[test]\nfn no_env() {\n    // All the other tests use the presence of the Environment variable...\n    // we need another variable just in case one of the others is running at the same time...\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::remove_var(\"CLP_TEST_ENV_NONE\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_NONE\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(!m.contains_id(\"arg\"));\n    assert_eq!(m.value_source(\"arg\"), None);\n    assert_eq!(m.get_one::<String>(\"arg\").map(|v| v.as_str()), None);\n}\n\n#[test]\nfn no_env_no_takes_value() {\n    // All the other tests use the presence of the Environment variable...\n    // we need another variable just in case one of the others is running at the same time...\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::remove_var(\"CLP_TEST_ENV_NONE\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(arg!([arg] \"some opt\").env(\"CLP_TEST_ENV_NONE\"))\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(!m.contains_id(\"arg\"));\n    assert_eq!(m.value_source(\"arg\"), None);\n    assert_eq!(m.get_one::<String>(\"arg\").map(|v| v.as_str()), None);\n}\n\n#[test]\nfn with_default() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_WD\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_WD\")\n                .action(ArgAction::Set)\n                .default_value(\"default\"),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.value_source(\"arg\").unwrap(),\n        clap::parser::ValueSource::EnvVariable\n    );\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"env\"\n    );\n}\n\n#[test]\nfn opt_user_override() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_OR\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!(--arg [FILE] \"some arg\")\n                .env(\"CLP_TEST_ENV_OR\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"--arg\", \"opt\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.value_source(\"arg\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"opt\"\n    );\n\n    // see https://github.com/clap-rs/clap/issues/1835\n    let values: Vec<_> = m\n        .get_many::<String>(\"arg\")\n        .unwrap()\n        .map(|v| v.as_str())\n        .collect();\n    assert_eq!(values, vec![\"opt\"]);\n}\n\n#[test]\nfn positionals() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_P\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_P\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.value_source(\"arg\").unwrap(),\n        clap::parser::ValueSource::EnvVariable\n    );\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"env\"\n    );\n}\n\n#[test]\nfn positionals_user_override() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_POR\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_POR\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"opt\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.value_source(\"arg\").unwrap(),\n        clap::parser::ValueSource::CommandLine\n    );\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"opt\"\n    );\n\n    // see https://github.com/clap-rs/clap/issues/1835\n    let values: Vec<_> = m\n        .get_many::<String>(\"arg\")\n        .unwrap()\n        .map(|v| v.as_str())\n        .collect();\n    assert_eq!(values, vec![\"opt\"]);\n}\n\n#[test]\nfn multiple_one() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_MO\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_MO\")\n                .action(ArgAction::Set)\n                .value_delimiter(',')\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_many::<String>(\"arg\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        vec![\"env\"]\n    );\n}\n\n#[test]\nfn multiple_three() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_MULTI1\", \"env1,env2,env3\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_MULTI1\")\n                .action(ArgAction::Set)\n                .value_delimiter(',')\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_many::<String>(\"arg\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        vec![\"env1\", \"env2\", \"env3\"]\n    );\n}\n\n#[test]\nfn multiple_no_delimiter() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_MULTI2\", \"env1 env2 env3\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_MULTI2\")\n                .action(ArgAction::Set)\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_many::<String>(\"arg\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        vec![\"env1 env2 env3\"]\n    );\n}\n\n#[test]\nfn possible_value() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_PV\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_PV\")\n                .action(ArgAction::Set)\n                .value_parser([\"env\"]),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"env\"\n    );\n}\n\n#[test]\nfn not_possible_value() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_NPV\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_NPV\")\n                .action(ArgAction::Set)\n                .value_parser([\"never\"]),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_err());\n}\n\n#[test]\nfn value_parser() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_VDOR\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_VDOR\")\n                .action(ArgAction::Set)\n                .value_parser(|s: &str| -> Result<String, String> {\n                    if s == \"env\" {\n                        Ok(s.to_owned())\n                    } else {\n                        Err(\"not equal\".to_owned())\n                    }\n                }),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"env\"\n    );\n}\n\n#[test]\nfn value_parser_output() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_VO\", \"42\");\n    }\n\n    let m = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_VO\")\n                .action(ArgAction::Set)\n                .value_parser(clap::value_parser!(i32)),\n        )\n        .try_get_matches_from(vec![\"\"])\n        .unwrap();\n\n    assert_eq!(*m.get_one::<i32>(\"arg\").unwrap(), 42);\n}\n\n#[test]\nfn value_parser_invalid() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"CLP_TEST_ENV_IV\", \"env\");\n    }\n\n    let r = Command::new(\"df\")\n        .arg(\n            arg!([arg] \"some opt\")\n                .env(\"CLP_TEST_ENV_IV\")\n                .action(ArgAction::Set)\n                .value_parser(|s: &str| -> Result<String, String> {\n                    if s != \"env\" {\n                        Ok(s.to_owned())\n                    } else {\n                        Err(\"is equal\".to_string())\n                    }\n                }),\n        )\n        .try_get_matches_from(vec![\"\"]);\n\n    assert!(r.is_err());\n}\n"
  },
  {
    "path": "tests/builder/error.rs",
    "content": "use clap::{arg, builder::ArgAction, error::ErrorKind, value_parser, Arg, Command};\nuse snapbox::str;\n\nuse crate::utils::assert_error;\n\n#[test]\nfn app_error() {\n    let message = str![[r#\"\nerror: failed for mysterious reasons\n\nUsage: test [OPTIONS] --all\n\nFor more information, try '--help'.\n\n\"#]];\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"all\")\n                .short('a')\n                .long(\"all\")\n                .required(true)\n                .action(ArgAction::SetTrue)\n                .help(\"Also do versioning for private crates (will not be published)\"),\n        )\n        .arg(\n            Arg::new(\"exact\")\n                .long(\"exact\")\n                .help(\"Specify inter dependency version numbers exactly with `=`\"),\n        )\n        .arg(\n            Arg::new(\"no_git_commit\")\n                .long(\"no-git-commit\")\n                .help(\"Do not commit version changes\"),\n        )\n        .arg(\n            Arg::new(\"no_git_push\")\n                .long(\"no-git-push\")\n                .help(\"Do not push generated commit and tags to git remote\"),\n        );\n    let mut cmd = cmd;\n    let expected_kind = ErrorKind::InvalidValue;\n    let err = cmd.error(expected_kind, \"failed for mysterious reasons\");\n    assert_error(err, expected_kind, message, true);\n}\n\n#[test]\nfn value_validation_has_newline() {\n    let res = Command::new(\"test\")\n        .arg(\n            arg!(<PORT>)\n                .value_parser(value_parser!(usize))\n                .help(\"Network port to use\"),\n        )\n        .try_get_matches_from([\"test\", \"foo\"]);\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    assert!(\n        err.to_string().ends_with('\\n'),\n        \"Errors should have a trailing newline, got {:?}\",\n        err.to_string()\n    );\n}\n\n#[test]\nfn kind_prints_help() {\n    let cmd = Command::new(\"test\");\n    let res = cmd\n        .try_get_matches_from([\"test\", \"--help\"])\n        .map_err(|e| e.apply::<clap::error::KindFormatter>());\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::DisplayHelp;\n    let message = str![[r#\"\nUsage: test\n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    assert_error(err, expected_kind, message, false);\n}\n\n#[test]\nfn kind_formats_validation_error() {\n    let cmd = Command::new(\"test\");\n    let res = cmd\n        .try_get_matches_from([\"test\", \"unused\"])\n        .map_err(|e| e.apply::<clap::error::KindFormatter>());\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::UnknownArgument;\n    let message = str![[r#\"\nerror: unexpected argument found\n\n\"#]];\n    assert_error(err, expected_kind, message, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn rich_formats_validation_error() {\n    let cmd = Command::new(\"test\");\n    let res = cmd.try_get_matches_from([\"test\", \"unused\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::UnknownArgument;\n    let message = str![[r#\"\nerror: unexpected argument 'unused' found\n\nUsage: test\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_error(err, expected_kind, message, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn suggest_trailing() {\n    let cmd = Command::new(\"rg\").arg(arg!([PATTERN]));\n\n    let res = cmd.try_get_matches_from([\"rg\", \"--foo\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::UnknownArgument;\n    let message = str![[r#\"\nerror: unexpected argument '--foo' found\n\n  tip: to pass '--foo' as a value, use '-- --foo'\n\nUsage: rg [PATTERN]\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_error(err, expected_kind, message, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn suggest_trailing_last() {\n    let cmd = Command::new(\"cargo\")\n        .arg(arg!([TESTNAME]).last(true))\n        .arg(arg!(--\"ignore-rust-version\"));\n\n    let res = cmd.try_get_matches_from([\"cargo\", \"--ignored\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::UnknownArgument;\n    let message = str![[r#\"\nerror: unexpected argument '--ignored' found\n\n  tip: a similar argument exists: '--ignore-rust-version'\n  tip: to pass '--ignored' as a value, use '-- --ignored'\n\nUsage: cargo --ignore-rust-version [-- <TESTNAME>]\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_error(err, expected_kind, message, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn trailing_already_in_use() {\n    let cmd = Command::new(\"rg\").arg(arg!([PATTERN]));\n\n    let res = cmd.try_get_matches_from([\"rg\", \"--\", \"--foo\", \"--foo\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::UnknownArgument;\n    let message = str![[r#\"\nerror: unexpected argument '--foo' found\n\nUsage: rg [PATTERN]\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_error(err, expected_kind, message, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn cant_use_trailing() {\n    let cmd = Command::new(\"test\");\n\n    let res = cmd.try_get_matches_from([\"test\", \"--foo\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::UnknownArgument;\n    let message = str![[r#\"\nerror: unexpected argument '--foo' found\n\nUsage: test\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_error(err, expected_kind, message, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn edit_error() {\n    use clap::error::{ContextKind, ContextValue};\n    use snapbox::assert_data_eq;\n\n    let cmd = Command::new(\"rg\").arg(arg!([PATTERN]));\n\n    let res = cmd.try_get_matches_from([\"rg\", \"--foo\"]);\n    assert!(res.is_err());\n    let mut err = res.unwrap_err();\n\n    let orig_message = str![[r#\"\nerror: unexpected argument '--foo' found\n\n  tip: to pass '--foo' as a value, use '-- --foo'\n\nUsage: rg [PATTERN]\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_data_eq!(err.to_string(), orig_message);\n\n    assert!(err.remove(ContextKind::Suggested).is_some());\n    assert!(err.remove(ContextKind::Suggested).is_none());\n    assert!(err\n        .insert(\n            ContextKind::SuggestedArg,\n            ContextValue::String(\"--bar\".to_string())\n        )\n        .is_none());\n    let edited_message = str![[r#\"\nerror: unexpected argument '--foo' found\n\n  tip: a similar argument exists: '--bar'\n\nUsage: rg [PATTERN]\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_data_eq!(err.to_string(), edited_message);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\n#[cfg(feature = \"suggestions\")]\nfn cant_use_trailing_subcommand() {\n    let cmd = Command::new(\"test\").subcommand(Command::new(\"bar\"));\n\n    let res = cmd.try_get_matches_from([\"test\", \"baz\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::InvalidSubcommand;\n    let message = str![[r#\"\nerror: unrecognized subcommand 'baz'\n\n  tip: a similar subcommand exists: 'bar'\n\nUsage: test [COMMAND]\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_error(err, expected_kind, message, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\n#[cfg(feature = \"suggestions\")]\nfn unknown_argument_option() {\n    let cmd = Command::new(\"test\").args([\n        Arg::new(\"current-dir\").short('C'),\n        Arg::new(\"current-dir-unknown\")\n            .long(\"cwd\")\n            .aliases([\"current-dir\", \"directory\", \"working-directory\", \"root\"])\n            .value_parser(\n                clap::builder::UnknownArgumentValueParser::suggest_arg(\"-C\")\n                    .and_suggest(\"not much else to say\"),\n            )\n            .hide(true),\n    ]);\n\n    let res = cmd.clone().try_get_matches_from([\"test\"]);\n    assert!(res.is_ok());\n\n    let res = cmd.try_get_matches_from([\"test\", \"--cwd\", \"..\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::UnknownArgument;\n    let message = str![[r#\"\nerror: unexpected argument '--cwd <current-dir-unknown>' found\n\n  tip: a similar argument exists: '-C'\n  tip: not much else to say\n\nUsage: test [OPTIONS]\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_error(err, expected_kind, message, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\n#[cfg(feature = \"suggestions\")]\nfn unknown_argument_flag() {\n    let cmd = Command::new(\"test\").args([\n        Arg::new(\"ignore-rust-version\").long(\"ignore-rust-version\"),\n        Arg::new(\"libtest-ignore\")\n            .long(\"ignored\")\n            .action(ArgAction::SetTrue)\n            .value_parser(\n                clap::builder::UnknownArgumentValueParser::suggest_arg(\"-- --ignored\")\n                    .and_suggest(\"not much else to say\"),\n            )\n            .hide(true),\n    ]);\n\n    let res = cmd.clone().try_get_matches_from([\"test\"]);\n    assert!(res.is_ok());\n\n    let res = cmd.try_get_matches_from([\"test\", \"--ignored\"]);\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    let expected_kind = ErrorKind::UnknownArgument;\n    let message = str![[r#\"\nerror: unexpected argument '--ignored' found\n\n  tip: a similar argument exists: '-- --ignored'\n  tip: not much else to say\n\nUsage: test [OPTIONS]\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_error(err, expected_kind, message, true);\n}\n"
  },
  {
    "path": "tests/builder/flag_subcommands.rs",
    "content": "use super::utils;\n\nuse clap::{arg, error::ErrorKind, Arg, ArgAction, Command};\n\n#[test]\nfn flag_subcommand_normal() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\").short_flag('S').long_flag(\"some\").arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .help(\"testing testing\")\n                    .action(ArgAction::SetTrue),\n            ),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"some\", \"--test\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"test\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_subcommand_normal_with_alias_vis_and_hidden() {\n    let cmd = Command::new(\"myprog\").subcommand(\n        Command::new(\"some\")\n            .short_flag('S')\n            .long_flag(\"S\")\n            .arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .help(\"testing testing\")\n                    .action(ArgAction::SetTrue),\n            )\n            .alias(\"result\")\n            .aliases([\"subc-do-stuff\", \"subc-do-tests\"])\n            .visible_alias(\"many\")\n            .visible_aliases([\"several\", \"few\"]),\n    );\n\n    for i in [\n        \"some\",\n        \"result\",\n        \"subc-do-stuff\",\n        \"subc-do-tests\",\n        \"many\",\n        \"several\",\n        \"few\",\n    ] {\n        let app = cmd.clone();\n        let matches = app\n            .try_get_matches_from(vec![\"myprog\", i, \"--test\"])\n            .unwrap();\n        assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n        let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n        assert!(*sub_matches\n            .get_one::<bool>(\"test\")\n            .expect(\"defaulted by clap\"));\n    }\n}\n\n#[test]\nfn flag_subcommand_normal_with_alias() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\")\n                .short_flag('S')\n                .long_flag(\"S\")\n                .arg(\n                    Arg::new(\"test\")\n                        .short('t')\n                        .long(\"test\")\n                        .help(\"testing testing\")\n                        .action(ArgAction::SetTrue),\n                )\n                .alias(\"result\"),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"result\", \"--test\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"test\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_subcommand_short() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\").short_flag('S').arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .help(\"testing testing\")\n                    .action(ArgAction::SetTrue),\n            ),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"-S\", \"--test\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"test\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_subcommand_short_with_args() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\").short_flag('S').arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .help(\"testing testing\")\n                    .action(ArgAction::SetTrue),\n            ),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"-St\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"test\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_subcommand_short_with_alias() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\")\n                .short_flag('S')\n                .arg(\n                    Arg::new(\"test\")\n                        .short('t')\n                        .long(\"test\")\n                        .help(\"testing testing\")\n                        .action(ArgAction::SetTrue),\n                )\n                .short_flag_alias('M')\n                .short_flag_alias('B'),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"-Bt\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"test\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_subcommand_short_with_alias_same_as_short_flag() {\n    let matches = Command::new(\"test\")\n        .subcommand(Command::new(\"some\").short_flag('S').short_flag_alias('S'))\n        .try_get_matches_from(vec![\"myprog\", \"-S\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n}\n\n#[test]\nfn flag_subcommand_long_with_alias_same_as_long_flag() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\")\n                .long_flag(\"sync\")\n                .long_flag_alias(\"sync\"),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--sync\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n}\n\n#[test]\nfn flag_subcommand_short_with_aliases_vis_and_hidden() {\n    let cmd = Command::new(\"test\").subcommand(\n        Command::new(\"some\")\n            .short_flag('S')\n            .arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .help(\"testing testing\"),\n            )\n            .visible_short_flag_alias('X')\n            .visible_short_flag_aliases(['M', 'B'])\n            .short_flag_alias('C'),\n    );\n    let app1 = cmd.clone();\n    let matches1 = app1.try_get_matches_from(vec![\"test\", \"-M\"]).unwrap();\n    assert_eq!(matches1.subcommand_name().unwrap(), \"some\");\n\n    let app2 = cmd.clone();\n    let matches2 = app2.try_get_matches_from(vec![\"test\", \"-C\"]).unwrap();\n    assert_eq!(matches2.subcommand_name().unwrap(), \"some\");\n\n    let app3 = cmd.clone();\n    let matches3 = app3.try_get_matches_from(vec![\"test\", \"-B\"]).unwrap();\n    assert_eq!(matches3.subcommand_name().unwrap(), \"some\");\n\n    let app4 = cmd.clone();\n    let matches4 = app4.try_get_matches_from(vec![\"test\", \"-X\"]).unwrap();\n    assert_eq!(matches4.subcommand_name().unwrap(), \"some\");\n}\n\n#[test]\nfn flag_subcommand_long_with_aliases_vis_and_hidden() {\n    let cmd = Command::new(\"test\").subcommand(\n        Command::new(\"some\")\n            .long_flag(\"sync\")\n            .arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .help(\"testing testing\"),\n            )\n            .visible_long_flag_alias(\"several\")\n            .visible_long_flag_aliases([\"result\", \"someall\"])\n            .long_flag_alias(\"flag\"),\n    );\n    let app1 = cmd.clone();\n    let matches1 = app1.try_get_matches_from(vec![\"test\", \"--result\"]).unwrap();\n    assert_eq!(matches1.subcommand_name().unwrap(), \"some\");\n\n    let app2 = cmd.clone();\n    let matches2 = app2.try_get_matches_from(vec![\"test\", \"--flag\"]).unwrap();\n    assert_eq!(matches2.subcommand_name().unwrap(), \"some\");\n\n    let app3 = cmd.clone();\n    let matches3 = app3\n        .try_get_matches_from(vec![\"test\", \"--someall\"])\n        .unwrap();\n    assert_eq!(matches3.subcommand_name().unwrap(), \"some\");\n\n    let app4 = cmd.clone();\n    let matches4 = app4\n        .try_get_matches_from(vec![\"test\", \"--several\"])\n        .unwrap();\n    assert_eq!(matches4.subcommand_name().unwrap(), \"some\");\n}\n\n#[test]\nfn flag_subcommand_short_with_aliases() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\")\n                .short_flag('S')\n                .arg(\n                    Arg::new(\"test\")\n                        .short('t')\n                        .long(\"test\")\n                        .help(\"testing testing\")\n                        .action(ArgAction::SetTrue),\n                )\n                .short_flag_aliases(['M', 'B']),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"-Bt\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"test\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\n#[should_panic]\nfn flag_subcommand_short_with_alias_hyphen() {\n    let _ = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\")\n                .short_flag('S')\n                .arg(\n                    Arg::new(\"test\")\n                        .short('t')\n                        .long(\"test\")\n                        .help(\"testing testing\"),\n                )\n                .short_flag_alias('-'),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"-Bt\"])\n        .unwrap();\n}\n\n#[test]\n#[should_panic]\nfn flag_subcommand_short_with_aliases_hyphen() {\n    let _ = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\")\n                .short_flag('S')\n                .arg(\n                    Arg::new(\"test\")\n                        .short('t')\n                        .long(\"test\")\n                        .help(\"testing testing\"),\n                )\n                .short_flag_aliases(['-', '-', '-']),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"-Bt\"])\n        .unwrap();\n}\n\n#[test]\nfn flag_subcommand_short_after_long_arg() {\n    let m = Command::new(\"pacman\")\n        .subcommand(\n            Command::new(\"sync\")\n                .short_flag('S')\n                .arg(Arg::new(\"clean\").short('c').action(ArgAction::SetTrue)),\n        )\n        .arg(Arg::new(\"arg\").long(\"arg\").action(ArgAction::Set))\n        .try_get_matches_from(vec![\"pacman\", \"--arg\", \"foo\", \"-Sc\"])\n        .unwrap();\n    let subm = m.subcommand_matches(\"sync\");\n    assert!(subm.is_some());\n    let subm = subm.unwrap();\n    assert!(*subm.get_one::<bool>(\"clean\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_subcommand_long() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\").long_flag(\"some\").arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .help(\"testing testing\")\n                    .action(ArgAction::SetTrue),\n            ),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--some\", \"--test\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"test\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_subcommand_long_with_alias() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\")\n                .long_flag(\"some\")\n                .arg(\n                    Arg::new(\"test\")\n                        .short('t')\n                        .long(\"test\")\n                        .help(\"testing testing\")\n                        .action(ArgAction::SetTrue),\n                )\n                .long_flag_alias(\"result\"),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--result\", \"--test\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"test\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_subcommand_long_with_aliases() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\")\n                .long_flag(\"some\")\n                .arg(\n                    Arg::new(\"test\")\n                        .short('t')\n                        .long(\"test\")\n                        .help(\"testing testing\")\n                        .action(ArgAction::SetTrue),\n                )\n                .long_flag_aliases([\"result\", \"someall\"]),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--result\", \"--test\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"test\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_subcommand_multiple() {\n    let matches = Command::new(\"test\")\n        .subcommand(\n            Command::new(\"some\")\n                .short_flag('S')\n                .long_flag(\"some\")\n                .arg(arg!(-f --flag \"some flag\").action(ArgAction::SetTrue))\n                .arg(arg!(-p --print \"print something\").action(ArgAction::SetTrue))\n                .subcommand(\n                    Command::new(\"result\")\n                        .short_flag('R')\n                        .long_flag(\"result\")\n                        .arg(arg!(-f --flag \"some flag\").action(ArgAction::SetTrue))\n                        .arg(arg!(-p --print \"print something\").action(ArgAction::SetTrue)),\n                ),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"-SfpRfp\"])\n        .unwrap();\n    assert_eq!(matches.subcommand_name().unwrap(), \"some\");\n    let sub_matches = matches.subcommand_matches(\"some\").unwrap();\n    assert!(*sub_matches\n        .get_one::<bool>(\"flag\")\n        .expect(\"defaulted by clap\"));\n    assert!(*sub_matches\n        .get_one::<bool>(\"print\")\n        .expect(\"defaulted by clap\"));\n    assert_eq!(sub_matches.subcommand_name().unwrap(), \"result\");\n    let result_matches = sub_matches.subcommand_matches(\"result\").unwrap();\n    assert!(*result_matches\n        .get_one::<bool>(\"flag\")\n        .expect(\"defaulted by clap\"));\n    assert!(*result_matches\n        .get_one::<bool>(\"print\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"the \\'-f\\' short flag for the \\'test\\' argument conflicts with the short flag for \\'some\\' subcommand\"]\nfn flag_subcommand_short_conflict_with_arg() {\n    let _ = Command::new(\"test\")\n        .subcommand(Command::new(\"some\").short_flag('f').long_flag(\"some\"))\n        .arg(Arg::new(\"test\").short('f'))\n        .try_get_matches_from(vec![\"myprog\", \"-f\"])\n        .unwrap();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"the \\'-f\\' short flag is specified for both \\'some\\' and \\'result\\' subcommands\"]\nfn flag_subcommand_short_conflict_with_alias() {\n    let _ = Command::new(\"test\")\n        .subcommand(Command::new(\"some\").short_flag('f').long_flag(\"some\"))\n        .subcommand(Command::new(\"result\").short_flag('t').short_flag_alias('f'))\n        .try_get_matches_from(vec![\"myprog\", \"-f\"])\n        .unwrap();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"the \\'--flag\\' long flag is specified for both \\'some\\' and \\'result\\' subcommands\"]\nfn flag_subcommand_long_conflict_with_alias() {\n    let _ = Command::new(\"test\")\n        .subcommand(Command::new(\"some\").long_flag(\"flag\"))\n        .subcommand(\n            Command::new(\"result\")\n                .long_flag(\"test\")\n                .long_flag_alias(\"flag\"),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--flag\"])\n        .unwrap();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"the \\'-f\\' short flag for the \\'test\\' argument conflicts with the short flag for \\'some\\' subcommand\"]\nfn flag_subcommand_short_conflict_with_arg_alias() {\n    let _ = Command::new(\"test\")\n        .subcommand(Command::new(\"some\").short_flag('f').long_flag(\"some\"))\n        .arg(Arg::new(\"test\").short('t').short_alias('f'))\n        .try_get_matches_from(vec![\"myprog\", \"-f\"])\n        .unwrap();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"the \\'--some\\' long flag for the \\'test\\' argument conflicts with the short flag for \\'some\\' subcommand\"]\nfn flag_subcommand_long_conflict_with_arg_alias() {\n    let _ = Command::new(\"test\")\n        .subcommand(Command::new(\"some\").short_flag('f').long_flag(\"some\"))\n        .arg(Arg::new(\"test\").long(\"test\").alias(\"some\"))\n        .try_get_matches_from(vec![\"myprog\", \"--some\"])\n        .unwrap();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"the \\'--flag\\' long flag for the \\'flag\\' argument conflicts with the short flag for \\'some\\' subcommand\"]\nfn flag_subcommand_long_conflict_with_arg() {\n    let _ = Command::new(\"test\")\n        .subcommand(Command::new(\"some\").short_flag('a').long_flag(\"flag\"))\n        .arg(Arg::new(\"flag\").long(\"flag\"))\n        .try_get_matches_from(vec![\"myprog\", \"--flag\"])\n        .unwrap();\n}\n\n#[test]\n#[should_panic = \"the '--help' long flag for the 'help' argument conflicts with the short flag for 'help' subcommand\"]\nfn flag_subcommand_conflict_with_help() {\n    let _ = Command::new(\"test\")\n        .subcommand(Command::new(\"help\").short_flag('h').long_flag(\"help\"))\n        .try_get_matches_from(vec![\"myprog\", \"--help\"])\n        .unwrap();\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"the '--version' long flag for the 'version' argument conflicts with the short flag for 'ver' subcommand\"]\nfn flag_subcommand_conflict_with_version() {\n    let _ = Command::new(\"test\")\n        .version(\"1.0.0\")\n        .subcommand(Command::new(\"ver\").short_flag('V').long_flag(\"version\"))\n        .try_get_matches_from(vec![\"myprog\", \"--version\"])\n        .unwrap();\n}\n\n#[test]\nfn flag_subcommand_long_infer_pass() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\").long_flag(\"test\"))\n        .try_get_matches_from(vec![\"prog\", \"--te\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\n#[cfg(not(feature = \"suggestions\"))]\n#[test]\nfn flag_subcommand_long_infer_fail() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\").long_flag(\"test\"))\n        .subcommand(Command::new(\"temp\").long_flag(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"--te\"]);\n    assert!(m.is_err(), \"{:#?}\", m.unwrap());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[cfg(feature = \"suggestions\")]\n#[test]\nfn flag_subcommand_long_infer_fail() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\").long_flag(\"test\"))\n        .subcommand(Command::new(\"temp\").long_flag(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"--te\"]);\n    assert!(m.is_err(), \"{:#?}\", m.unwrap());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn flag_subcommand_long_infer_pass_close() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\").long_flag(\"test\"))\n        .subcommand(Command::new(\"temp\").long_flag(\"temp\"))\n        .try_get_matches_from(vec![\"prog\", \"--tes\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\n#[test]\nfn flag_subcommand_long_infer_exact_match() {\n    let m = Command::new(\"prog\")\n        .infer_subcommands(true)\n        .subcommand(Command::new(\"test\").long_flag(\"test\"))\n        .subcommand(Command::new(\"testa\").long_flag(\"testa\"))\n        .subcommand(Command::new(\"testb\").long_flag(\"testb\"))\n        .try_get_matches_from(vec![\"prog\", \"--test\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\nstatic FLAG_SUBCOMMAND_HELP: &str = \"\\\nQuery the package database.\n\nUsage: pacman {query|--query|-Q} [OPTIONS]\n\nOptions:\n  -s, --search <search>...  search locally installed packages for matching strings\n  -i, --info <info>...      view package information\n  -h, --help                Print help\n\";\n\n#[test]\nfn flag_subcommand_long_short_normal_usage_string() {\n    let cmd = Command::new(\"pacman\")\n        .about(\"package manager utility\")\n        .version(\"5.2.1\")\n        .subcommand_required(true)\n        .author(\"Pacman Development Team\")\n        // Query subcommand\n        //\n        // Only a few of its arguments are implemented below.\n        .subcommand(\n            Command::new(\"query\")\n                .short_flag('Q')\n                .long_flag(\"query\")\n                .about(\"Query the package database.\")\n                .arg(\n                    Arg::new(\"search\")\n                        .short('s')\n                        .long(\"search\")\n                        .help(\"search locally installed packages for matching strings\")\n                        .conflicts_with(\"info\")\n                        .action(ArgAction::Set)\n                        .num_args(1..),\n                )\n                .arg(\n                    Arg::new(\"info\")\n                        .long(\"info\")\n                        .short('i')\n                        .conflicts_with(\"search\")\n                        .help(\"view package information\")\n                        .action(ArgAction::Set)\n                        .num_args(1..),\n                ),\n        );\n    utils::assert_output(cmd, \"pacman -Qh\", FLAG_SUBCOMMAND_HELP, false);\n}\n\nstatic FLAG_SUBCOMMAND_NO_SHORT_HELP: &str = \"\\\nQuery the package database.\n\nUsage: pacman {query|--query} [OPTIONS]\n\nOptions:\n  -s, --search <search>...  search locally installed packages for matching strings\n  -i, --info <info>...      view package information\n  -h, --help                Print help\n\";\n\n#[test]\nfn flag_subcommand_long_normal_usage_string() {\n    let cmd = Command::new(\"pacman\")\n        .about(\"package manager utility\")\n        .version(\"5.2.1\")\n        .subcommand_required(true)\n        .author(\"Pacman Development Team\")\n        // Query subcommand\n        //\n        // Only a few of its arguments are implemented below.\n        .subcommand(\n            Command::new(\"query\")\n                .long_flag(\"query\")\n                .about(\"Query the package database.\")\n                .arg(\n                    Arg::new(\"search\")\n                        .short('s')\n                        .long(\"search\")\n                        .help(\"search locally installed packages for matching strings\")\n                        .conflicts_with(\"info\")\n                        .action(ArgAction::Set)\n                        .num_args(1..),\n                )\n                .arg(\n                    Arg::new(\"info\")\n                        .long(\"info\")\n                        .short('i')\n                        .conflicts_with(\"search\")\n                        .help(\"view package information\")\n                        .action(ArgAction::Set)\n                        .num_args(1..),\n                ),\n        );\n    utils::assert_output(\n        cmd,\n        \"pacman query --help\",\n        FLAG_SUBCOMMAND_NO_SHORT_HELP,\n        false,\n    );\n}\n\nstatic FLAG_SUBCOMMAND_NO_LONG_HELP: &str = \"\\\nQuery the package database.\n\nUsage: pacman {query|-Q} [OPTIONS]\n\nOptions:\n  -s, --search <search>...  search locally installed packages for matching strings\n  -i, --info <info>...      view package information\n  -h, --help                Print help\n\";\n\n#[test]\nfn flag_subcommand_short_normal_usage_string() {\n    let cmd = Command::new(\"pacman\")\n        .about(\"package manager utility\")\n        .version(\"5.2.1\")\n        .subcommand_required(true)\n        .author(\"Pacman Development Team\")\n        // Query subcommand\n        //\n        // Only a few of its arguments are implemented below.\n        .subcommand(\n            Command::new(\"query\")\n                .short_flag('Q')\n                .about(\"Query the package database.\")\n                .arg(\n                    Arg::new(\"search\")\n                        .short('s')\n                        .long(\"search\")\n                        .help(\"search locally installed packages for matching strings\")\n                        .conflicts_with(\"info\")\n                        .action(ArgAction::Set)\n                        .num_args(1..),\n                )\n                .arg(\n                    Arg::new(\"info\")\n                        .long(\"info\")\n                        .short('i')\n                        .conflicts_with(\"search\")\n                        .help(\"view package information\")\n                        .action(ArgAction::Set)\n                        .num_args(1..),\n                ),\n        );\n    utils::assert_output(\n        cmd,\n        \"pacman query --help\",\n        FLAG_SUBCOMMAND_NO_LONG_HELP,\n        false,\n    );\n}\n"
  },
  {
    "path": "tests/builder/flags.rs",
    "content": "use clap::{arg, Arg, ArgAction, Command};\n\n#[cfg(feature = \"error-context\")]\nuse super::utils;\n\n#[test]\nfn flag_using_short() {\n    let m = Command::new(\"flag\")\n        .args([\n            arg!(-f --flag \"some flag\").action(ArgAction::SetTrue),\n            arg!(-c --color \"some other flag\").action(ArgAction::SetTrue),\n        ])\n        .try_get_matches_from(vec![\"\", \"-f\", \"-c\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn lots_o_flags_sep() {\n    let r = Command::new(\"opts\")\n        .args_override_self(true)\n        .arg(arg!(o: -o ... \"some flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\n            \"\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\", \"-o\",\n            \"-o\", \"-o\", \"-o\",\n        ]);\n    assert!(r.is_ok(), \"{:?}\", r.unwrap_err().kind());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert!(*m.get_one::<bool>(\"o\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn lots_o_flags_combined() {\n    let r = Command::new(\"opts\")\n        .args_override_self(true)\n        .arg(arg!(o: -o ... \"some flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\n            \"\",\n            \"-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\",\n            \"-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\",\n            \"-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\",\n            \"-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\",\n            \"-ooooooooooooooooooooooooooooooooooooooooo\",\n        ]);\n    assert!(r.is_ok(), \"{:?}\", r.unwrap_err().kind());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert!(*m.get_one::<bool>(\"o\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_using_long() {\n    let m = Command::new(\"flag\")\n        .args([\n            arg!(--flag \"some flag\").action(ArgAction::SetTrue),\n            arg!(--color \"some other flag\").action(ArgAction::SetTrue),\n        ])\n        .try_get_matches_from(vec![\"\", \"--flag\", \"--color\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn flag_using_long_with_literals() {\n    use clap::error::ErrorKind;\n\n    let m = Command::new(\"flag\")\n        .arg(\n            Arg::new(\"rainbow\")\n                .long(\"rainbow\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"\", \"--rainbow=false\"]);\n    assert!(m.is_err(), \"{:#?}\", m.unwrap());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::TooManyValues);\n}\n\n#[test]\nfn flag_using_mixed() {\n    let m = Command::new(\"flag\")\n        .args([\n            arg!(-f --flag \"some flag\").action(ArgAction::SetTrue),\n            arg!(-c --color \"some other flag\").action(ArgAction::SetTrue),\n        ])\n        .try_get_matches_from(vec![\"\", \"-f\", \"--color\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n\n    let m = Command::new(\"flag\")\n        .args([\n            arg!(-f --flag \"some flag\").action(ArgAction::SetTrue),\n            arg!(-c --color \"some other flag\").action(ArgAction::SetTrue),\n        ])\n        .try_get_matches_from(vec![\"\", \"--flag\", \"-c\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn multiple_flags_in_single() {\n    let m = Command::new(\"multe_flags\")\n        .args([\n            arg!(-f --flag \"some flag\").action(ArgAction::SetTrue),\n            arg!(-c --color \"some other flag\").action(ArgAction::SetTrue),\n            arg!(-d --debug \"another other flag\").action(ArgAction::SetTrue),\n        ])\n        .try_get_matches_from(vec![\"\", \"-fcd\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"debug\").expect(\"defaulted by clap\"));\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn unexpected_value_error() {\n    const USE_FLAG_AS_ARGUMENT: &str = \"\\\nerror: unexpected value 'foo' for '--a-flag' found; no more were expected\n\nUsage: mycat --a-flag [filename]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"mycat\")\n        .arg(Arg::new(\"filename\"))\n        .arg(Arg::new(\"a-flag\").long(\"a-flag\").action(ArgAction::SetTrue));\n\n    utils::assert_output(cmd, \"mycat --a-flag=foo\", USE_FLAG_AS_ARGUMENT, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn issue_1284_argument_in_flag_style() {\n    const USE_FLAG_AS_ARGUMENT: &str = \"\\\nerror: unexpected argument '--another-flag' found\n\n  tip: to pass '--another-flag' as a value, use '-- --another-flag'\n\nUsage: mycat [OPTIONS] [filename]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"mycat\")\n        .arg(Arg::new(\"filename\"))\n        .arg(Arg::new(\"a-flag\").long(\"a-flag\").action(ArgAction::SetTrue));\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from(vec![\"\", \"--\", \"--another-flag\"])\n        .unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"filename\").map(|v| v.as_str()),\n        Some(\"--another-flag\")\n    );\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from(vec![\"\", \"--a-flag\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"a-flag\").expect(\"defaulted by clap\"));\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from(vec![\"\", \"--\", \"--a-flag\"])\n        .unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"filename\").map(|v| v.as_str()),\n        Some(\"--a-flag\")\n    );\n\n    utils::assert_output(cmd, \"mycat --another-flag\", USE_FLAG_AS_ARGUMENT, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn issue_2308_multiple_dashes() {\n    static MULTIPLE_DASHES: &str = \"\\\nerror: unexpected argument '-----' found\n\n  tip: to pass '-----' as a value, use '-- -----'\n\nUsage: test <arg>\n\nFor more information, try '--help'.\n\";\n    let cmd = Command::new(\"test\").arg(Arg::new(\"arg\").action(ArgAction::Set).required(true));\n\n    utils::assert_output(cmd, \"test -----\", MULTIPLE_DASHES, true);\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"Argument filename: long \\\"--filename\\\" must not start with a `-`, that will be handled by the parser\"]\nfn leading_dash_stripped() {\n    let cmd = Command::new(\"mycat\").arg(Arg::new(\"filename\").long(\"--filename\"));\n    cmd.debug_assert();\n}\n\n#[test]\nfn optional_value() {\n    let cmd = Command::new(\"flag\").args([arg!(-f --flag \"some flag\")\n        .action(ArgAction::SetTrue)\n        .num_args(0..=1)]);\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\"]).unwrap();\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\", \"-f\"]).unwrap();\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from(vec![\"\", \"-f\", \"false\"])\n        .unwrap();\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from(vec![\"\", \"-f\", \"true\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n"
  },
  {
    "path": "tests/builder/global_args.rs",
    "content": "use clap::{arg, Arg, ArgAction, Command};\n\n#[test]\nfn issue_1076() {\n    let mut cmd = Command::new(\"myprog\")\n        .arg(\n            Arg::new(\"GLOBAL_ARG\")\n                .long(\"global-arg\")\n                .help(\"Specifies something needed by the subcommands\")\n                .global(true)\n                .action(ArgAction::Set)\n                .default_value(\"default_value\"),\n        )\n        .arg(\n            Arg::new(\"GLOBAL_FLAG\")\n                .long(\"global-flag\")\n                .help(\"Specifies something needed by the subcommands\")\n                .global(true)\n                .action(ArgAction::Set),\n        )\n        .subcommand(Command::new(\"outer\").subcommand(Command::new(\"inner\")));\n    let _ = cmd.try_get_matches_from_mut(vec![\"myprog\"]);\n    let _ = cmd.try_get_matches_from_mut(vec![\"myprog\"]);\n    let _ = cmd.try_get_matches_from_mut(vec![\"myprog\"]);\n}\n\n#[test]\nfn propagate_global_arg_in_subcommand_to_subsubcommand_1385() {\n    let m1 = Command::new(\"foo\")\n        .subcommand(\n            Command::new(\"sub1\")\n                .arg(\n                    Arg::new(\"arg1\")\n                        .long(\"arg1\")\n                        .action(ArgAction::Set)\n                        .global(true),\n                )\n                .subcommand(Command::new(\"sub1a\")),\n        )\n        .try_get_matches_from([\"foo\", \"sub1\", \"--arg1\", \"v1\", \"sub1a\"])\n        .unwrap();\n    assert_eq!(\n        \"v1\",\n        m1.subcommand_matches(\"sub1\")\n            .unwrap()\n            .subcommand_matches(\"sub1a\")\n            .unwrap()\n            .get_one::<String>(\"arg1\")\n            .map(|v| v.as_str())\n            .unwrap()\n    );\n}\n\n#[test]\nfn propagate_global_arg_to_subcommand_in_subsubcommand_2053() {\n    let m = Command::new(\"opts\")\n        .arg(arg!(--\"global-flag\").global(true))\n        .arg(arg!(--\"global-str\" <str>).global(true))\n        .subcommand(\n            Command::new(\"test\")\n                .arg(arg!(--\"sub-flag\").global(true))\n                .arg(arg!(--\"sub-str\" <str>).global(true))\n                .subcommand(Command::new(\"test\")),\n        )\n        .try_get_matches_from([\n            \"cmd\",\n            \"test\",\n            \"test\",\n            \"--global-flag\",\n            \"--global-str\",\n            \"hello\",\n            \"--sub-flag\",\n            \"--sub-str\",\n            \"world\",\n        ])\n        .unwrap();\n    assert_eq!(\n        Some(\"world\"),\n        m.subcommand_matches(\"test\")\n            .unwrap()\n            .get_one::<String>(\"sub-str\")\n            .map(|v| v.as_str())\n    );\n}\n\n#[test]\nfn global_arg_available_in_subcommand() {\n    let m = Command::new(\"opt\")\n        .args([\n            Arg::new(\"global\")\n                .global(true)\n                .long(\"global\")\n                .action(ArgAction::SetTrue),\n            Arg::new(\"not\")\n                .global(false)\n                .long(\"not\")\n                .action(ArgAction::SetTrue),\n        ])\n        .subcommand(Command::new(\"ping\"))\n        .try_get_matches_from([\"opt\", \"ping\", \"--global\"])\n        .unwrap();\n\n    assert!(*m.get_one::<bool>(\"global\").expect(\"defaulted by clap\"));\n    assert!(*m\n        .subcommand_matches(\"ping\")\n        .unwrap()\n        .get_one::<bool>(\"global\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn deeply_nested_discovery() {\n    let cmd = Command::new(\"a\")\n        .arg(arg!(--\"long-a\").global(true).action(ArgAction::SetTrue))\n        .subcommand(\n            Command::new(\"b\")\n                .arg(arg!(--\"long-b\").global(true).action(ArgAction::SetTrue))\n                .subcommand(\n                    Command::new(\"c\")\n                        .arg(arg!(--\"long-c\").global(true).action(ArgAction::SetTrue))\n                        .subcommand(Command::new(\"d\")),\n                ),\n        );\n\n    let m = cmd\n        .try_get_matches_from([\"a\", \"b\", \"c\", \"d\", \"--long-a\", \"--long-b\", \"--long-c\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"long-a\").expect(\"defaulted by clap\"));\n    let m = m.subcommand_matches(\"b\").unwrap();\n    assert!(*m.get_one::<bool>(\"long-b\").expect(\"defaulted by clap\"));\n    let m = m.subcommand_matches(\"c\").unwrap();\n    assert!(*m.get_one::<bool>(\"long-c\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn global_overrides_default() {\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"name\")\n                .long(\"name\")\n                .global(true)\n                .action(ArgAction::Set)\n                .default_value(\"from_default\"),\n        )\n        .subcommand(Command::new(\"sub\"));\n\n    let m = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"name\").unwrap().as_str(),\n        \"from_default\"\n    );\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--name\", \"from_arg\"])\n        .unwrap();\n    assert_eq!(m.get_one::<String>(\"name\").unwrap().as_str(), \"from_arg\");\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--name\", \"from_arg\", \"sub\"])\n        .unwrap();\n    assert_eq!(m.get_one::<String>(\"name\").unwrap().as_str(), \"from_arg\");\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"sub\", \"--name\", \"from_arg\"])\n        .unwrap();\n    assert_eq!(m.get_one::<String>(\"name\").unwrap().as_str(), \"from_arg\");\n}\n\n#[test]\n#[cfg(feature = \"env\")]\nfn global_overrides_env() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        std::env::set_var(\"GLOBAL_OVERRIDES_ENV\", \"from_env\");\n    }\n\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"name\")\n                .long(\"name\")\n                .global(true)\n                .action(ArgAction::Set)\n                .env(\"GLOBAL_OVERRIDES_ENV\"),\n        )\n        .subcommand(Command::new(\"sub\"));\n\n    let m = cmd.clone().try_get_matches_from([\"test\"]).unwrap();\n    assert_eq!(m.get_one::<String>(\"name\").unwrap().as_str(), \"from_env\");\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--name\", \"from_arg\"])\n        .unwrap();\n    assert_eq!(m.get_one::<String>(\"name\").unwrap().as_str(), \"from_arg\");\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--name\", \"from_arg\", \"sub\"])\n        .unwrap();\n    assert_eq!(m.get_one::<String>(\"name\").unwrap().as_str(), \"from_arg\");\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"sub\", \"--name\", \"from_arg\"])\n        .unwrap();\n    assert_eq!(m.get_one::<String>(\"name\").unwrap().as_str(), \"from_arg\");\n}\n"
  },
  {
    "path": "tests/builder/groups.rs",
    "content": "use clap::{arg, error::ErrorKind, Arg, ArgAction, ArgGroup, Command, Id};\nuse snapbox::str;\n\nuse super::utils;\n\n#[test]\nfn required_group_missing_arg() {\n    let result = Command::new(\"group\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .arg(arg!( -c --color \"some other flag\"))\n        .group(ArgGroup::new(\"req\").args([\"flag\", \"color\"]).required(true))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command group: Argument group 'req' contains non-existent argument\"]\nfn non_existing_arg() {\n    let _ = Command::new(\"group\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .arg(arg!(-c --color \"some other flag\"))\n        .group(ArgGroup::new(\"req\").args([\"flg\", \"color\"]).required(true))\n        .try_get_matches_from(vec![\"\"]);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command group: Argument group name must be unique\\n\\n\\t'req' is already in use\"]\nfn unique_group_name() {\n    let _ = Command::new(\"group\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .arg(arg!(-c --color \"some other flag\"))\n        .group(ArgGroup::new(\"req\").args([\"flag\"]).required(true))\n        .group(ArgGroup::new(\"req\").args([\"color\"]).required(true))\n        .try_get_matches_from(vec![\"\"]);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command group: Argument group name 'a' must not conflict with argument name\"]\nfn groups_new_of_arg_name() {\n    let _ = Command::new(\"group\")\n        .arg(Arg::new(\"a\").long(\"a\").group(\"a\"))\n        .try_get_matches_from(vec![\"\", \"--a\"]);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command group: Argument group name 'a' must not conflict with argument name\"]\nfn arg_group_new_of_arg_name() {\n    let _ = Command::new(\"group\")\n        .arg(Arg::new(\"a\").long(\"a\").group(\"a\"))\n        .group(ArgGroup::new(\"a\"))\n        .try_get_matches_from(vec![\"\", \"--a\"]);\n}\n\n#[test]\nfn group_single_value() {\n    let res = Command::new(\"group\")\n        .arg(arg!(-c --color [color] \"some option\"))\n        .arg(arg!(-n --hostname <name> \"another option\"))\n        .group(ArgGroup::new(\"grp\").args([\"hostname\", \"color\"]))\n        .try_get_matches_from(vec![\"\", \"-c\", \"blue\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n\n    let m = res.unwrap();\n    assert!(m.contains_id(\"grp\"));\n    assert_eq!(m.get_one::<Id>(\"grp\").map(|v| v.as_str()).unwrap(), \"color\");\n}\n\n#[test]\nfn group_empty() {\n    let res = Command::new(\"group\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .arg(arg!(-c --color [color] \"some option\"))\n        .arg(arg!(-n --hostname <name> \"another option\"))\n        .group(ArgGroup::new(\"grp\").args([\"hostname\", \"color\", \"flag\"]))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"grp\"));\n    assert!(m.get_one::<String>(\"grp\").map(|v| v.as_str()).is_none());\n}\n\n#[test]\nfn group_required_flags_empty() {\n    let result = Command::new(\"group\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .arg(arg!(-c --color \"some option\"))\n        .arg(arg!(-n --hostname <name> \"another option\"))\n        .group(\n            ArgGroup::new(\"grp\")\n                .required(true)\n                .args([\"hostname\", \"color\", \"flag\"]),\n        )\n        .try_get_matches_from(vec![\"\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn group_multi_value_single_arg() {\n    let res = Command::new(\"group\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .arg(arg!(-c --color <color> \"some option\").num_args(1..))\n        .arg(arg!(-n --hostname <name> \"another option\"))\n        .group(ArgGroup::new(\"grp\").args([\"hostname\", \"color\", \"flag\"]))\n        .try_get_matches_from(vec![\"\", \"-c\", \"blue\", \"red\", \"green\"]);\n    assert!(res.is_ok(), \"{:?}\", res.unwrap_err().kind());\n\n    let m = res.unwrap();\n    assert!(m.contains_id(\"grp\"));\n    assert_eq!(m.get_one::<Id>(\"grp\").map(|v| v.as_str()).unwrap(), \"color\");\n}\n\n#[test]\nfn empty_group() {\n    let r = Command::new(\"empty_group\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .group(ArgGroup::new(\"vers\").required(true))\n        .try_get_matches_from(vec![\"empty_prog\"]);\n    assert!(r.is_err());\n    let err = r.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn req_group_usage_string() {\n    let cmd = Command::new(\"req_group\")\n        .arg(arg!([base] \"Base commit\"))\n        .arg(arg!(\n            -d --delete \"Remove the base commit information\"\n        ))\n        .group(\n            ArgGroup::new(\"base_or_delete\")\n                .args([\"base\", \"delete\"])\n                .required(true),\n        );\n\n    utils::assert_output(\n        cmd,\n        \"clap-test\",\n        str![[r#\"\nerror: the following required arguments were not provided:\n  <base|--delete>\n\nUsage: clap-test <base|--delete>\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn req_group_with_conflict_usage_string() {\n    let cmd = Command::new(\"req_group\")\n        .arg(arg!([base] \"Base commit\").conflicts_with(\"delete\"))\n        .arg(arg!(\n            -d --delete \"Remove the base commit information\"\n        ))\n        .group(\n            ArgGroup::new(\"base_or_delete\")\n                .args([\"base\", \"delete\"])\n                .required(true),\n        );\n\n    utils::assert_output(\n        cmd,\n        \"clap-test --delete base\",\n        str![[r#\"\nerror: the argument '--delete' cannot be used with '[base]'\n\nUsage: clap-test <base|--delete>\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn req_group_with_conflict_usage_string_only_options() {\n    let cmd = Command::new(\"req_group\")\n        .arg(arg!(-a --all \"All\").conflicts_with(\"delete\"))\n        .arg(arg!(\n            -d --delete \"Remove the base commit information\"\n        ))\n        .group(\n            ArgGroup::new(\"all_or_delete\")\n                .args([\"all\", \"delete\"])\n                .required(true),\n        );\n    utils::assert_output(\n        cmd,\n        \"clap-test --delete --all\",\n        str![[r#\"\nerror: the argument '--delete' cannot be used with '--all'\n\nUsage: clap-test <--all|--delete>\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn conflict_with_group() {\n    let cmd = Command::new(\"prog\")\n        .group(ArgGroup::new(\"group\").multiple(true))\n        .arg(arg!(--a).group(\"group\"))\n        .arg(arg!(--b).group(\"group\"))\n        .arg(arg!(--conflict).conflicts_with(\"group\"));\n\n    utils::assert_output(\n        cmd,\n        \"prog --a --conflict\",\n        str![[r#\"\nerror: the argument '--conflict' cannot be used with:\n  --a\n  --b\n\nUsage: prog --conflict\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn required_group_multiple_args() {\n    let result = Command::new(\"group\")\n        .arg(arg!(-f --flag \"some flag\").action(ArgAction::SetTrue))\n        .arg(arg!(-c --color \"some other flag\").action(ArgAction::SetTrue))\n        .group(\n            ArgGroup::new(\"req\")\n                .args([\"flag\", \"color\"])\n                .required(true)\n                .multiple(true),\n        )\n        .try_get_matches_from(vec![\"group\", \"-f\", \"-c\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let m = result.unwrap();\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert_eq!(\n        &*m.get_many::<Id>(\"req\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"flag\", \"color\"]\n    );\n}\n\n#[test]\nfn group_multiple_args_error() {\n    let result = Command::new(\"group\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .arg(arg!(-c --color \"some other flag\"))\n        .group(ArgGroup::new(\"req\").args([\"flag\", \"color\"]))\n        .try_get_matches_from(vec![\"group\", \"-f\", \"-c\"]);\n    assert!(result.is_err());\n    let err = result.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n}\n\n#[test]\nfn group_overrides_required() {\n    let command = Command::new(\"group\")\n        .arg(arg!(--foo <FOO>).required(true))\n        .arg(arg!(--bar <BAR>).required(true))\n        .group(ArgGroup::new(\"group\").args([\"foo\", \"bar\"]).required(true));\n    let result = command.try_get_matches_from(vec![\"group\", \"--foo\", \"value\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let m = result.unwrap();\n    assert!(m.contains_id(\"foo\"));\n    assert!(!m.contains_id(\"bar\"));\n}\n\n#[test]\nfn group_usage_use_val_name() {\n    let cmd = Command::new(\"prog\")\n        .arg(Arg::new(\"a\").value_name(\"A\"))\n        .group(ArgGroup::new(\"group\").arg(\"a\").required(true));\n    utils::assert_output(\n        cmd,\n        \"prog --help\",\n        str![[r#\"\nUsage: prog <A>\n\nArguments:\n  [A]  \n\nOptions:\n  -h, --help  Print help\n\n\"#]],\n        false,\n    );\n}\n\n#[test]\nfn group_acts_like_arg() {\n    let result = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"debug\")\n                .long(\"debug\")\n                .group(\"mode\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"verbose\")\n                .long(\"verbose\")\n                .group(\"mode\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"prog\", \"--debug\"]);\n\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let m = result.unwrap();\n    assert!(m.contains_id(\"mode\"));\n    assert_eq!(m.get_one::<Id>(\"mode\").unwrap(), \"debug\");\n}\n\n#[test]\nfn conflict_with_overlapping_group_in_error() {\n    let cmd = Command::new(\"prog\")\n        .group(ArgGroup::new(\"all\").multiple(true))\n        .arg(arg!(--major).group(\"vers\").group(\"all\"))\n        .arg(arg!(--minor).group(\"vers\").group(\"all\"))\n        .arg(arg!(--other).group(\"all\"));\n\n    utils::assert_output(\n        cmd,\n        \"prog --major --minor\",\n        str![[r#\"\nerror: the argument '--major' cannot be used with '--minor'\n\nUsage: prog --major\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn requires_group_with_overlapping_group_in_error() {\n    let cmd = Command::new(\"prog\")\n        .group(ArgGroup::new(\"all\").multiple(true))\n        .group(ArgGroup::new(\"input\").required(true))\n        .arg(arg!(--in).group(\"input\").group(\"all\"))\n        .arg(arg!(--spec).group(\"input\").group(\"all\"))\n        .arg(arg!(--config).requires(\"input\").group(\"all\"));\n\n    utils::assert_output(\n        cmd,\n        \"prog --config\",\n        str![[r#\"\nerror: the following required arguments were not provided:\n  <--in|--spec>\n\nUsage: prog --config <--in|--spec>\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n/* This is used to be fixed in a hack, we need to find a better way to fix it.\n#[test]\nfn issue_1794() {\n    let cmd = clap::Command::new(\"hello\")\n        .bin_name(\"deno\")\n        .arg(Arg::new(\"option1\").long(\"option1\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"pos1\").action(ArgAction::Set))\n        .arg(Arg::new(\"pos2\").action(ArgAction::Set))\n        .group(\n            ArgGroup::new(\"arg1\")\n                .args([\"pos1\", \"option1\"])\n                .required(true),\n        );\n\n    let m = cmd.clone().try_get_matches_from([\"cmd\", \"pos1\", \"pos2\"]).unwrap();\n    assert_eq!(m.get_one::<String>(\"pos1\").map(|v| v.as_str()), Some(\"pos1\"));\n    assert_eq!(m.get_one::<String>(\"pos2\").map(|v| v.as_str()), Some(\"pos2\"));\n    assert!(!*m.get_one::<bool>(\"option1\").expect(\"defaulted by clap\"));\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"cmd\", \"--option1\", \"positional\"]).unwrap();\n    assert_eq!(m.get_one::<String>(\"pos1\").map(|v| v.as_str()), None);\n    assert_eq!(m.get_one::<String>(\"pos2\").map(|v| v.as_str()), Some(\"positional\"));\n    assert!(*m.get_one::<bool>(\"option1\").expect(\"defaulted by clap\"));\n}\n*/\n"
  },
  {
    "path": "tests/builder/help.rs",
    "content": "#![cfg(feature = \"help\")]\n\nuse clap::{arg, builder::PossibleValue, error::ErrorKind, Arg, ArgAction, ArgGroup, Command};\nuse snapbox::assert_data_eq;\nuse snapbox::str;\n\nuse super::utils;\n\nfn setup() -> Command {\n    Command::new(\"test\")\n        .author(\"Kevin K.\")\n        .about(\"tests stuff\")\n        .version(\"1.3\")\n}\n\nfn empty_args() -> impl IntoIterator<Item = String> {\n    std::iter::empty()\n}\n\n#[test]\nfn help_short() {\n    let m = setup().try_get_matches_from(vec![\"myprog\", \"-h\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::DisplayHelp);\n}\n\n#[test]\nfn help_long() {\n    let m = setup().try_get_matches_from(vec![\"myprog\", \"--help\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::DisplayHelp);\n}\n\n#[test]\nfn help_no_subcommand() {\n    let m = setup().try_get_matches_from(vec![\"myprog\", \"help\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn help_subcommand() {\n    let m = setup()\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"tests things\")\n                .arg(arg!(-v --verbose \"with verbosity\")),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"help\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::DisplayHelp);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn help_multi_subcommand_error() {\n    let cmd = Command::new(\"ctest\").subcommand(\n        Command::new(\"subcmd\").subcommand(\n            Command::new(\"multi\")\n                .about(\"tests subcommands\")\n                .author(\"Kevin K. <kbknapp@gmail.com>\")\n                .version(\"0.1\")\n                .arg(arg!(\n                    -f --flag                    \"tests flags\"\n                ))\n                .arg(\n                    arg!(\n                        -o --option <scoption>    \"tests options\"\n                    )\n                    .required(false)\n                    .num_args(1..)\n                    .action(ArgAction::Append),\n                ),\n        ),\n    );\n    let err = cmd\n        .try_get_matches_from([\"ctest\", \"help\", \"subcmd\", \"multi\", \"foo\"])\n        .unwrap_err();\n\n    assert_data_eq!(\n        err.to_string(),\n        str![[r#\"\nerror: unrecognized subcommand 'foo'\n\nUsage: ctest subcmd multi [OPTIONS]\n\nFor more information, try '--help'.\n\n\"#]]\n    );\n}\n\n#[test]\nfn req_last_arg_usage() {\n    let cmd = Command::new(\"example\")\n        .version(\"1.0\")\n        .arg(Arg::new(\"FIRST\").help(\"First\").num_args(1..).required(true))\n        .arg(\n            Arg::new(\"SECOND\")\n                .help(\"Second\")\n                .num_args(1..)\n                .required(true)\n                .last(true),\n        );\n    let expected = str![[r#\"\nUsage: example <FIRST>... -- <SECOND>...\n\nArguments:\n  <FIRST>...   First\n  <SECOND>...  Second\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"example --help\", expected, false);\n}\n\n#[test]\nfn args_with_last_usage() {\n    let cmd = Command::new(\"flamegraph\")\n        .version(\"0.1\")\n        .arg(\n            Arg::new(\"verbose\")\n                .help(\"Prints out more stuff.\")\n                .short('v')\n                .long(\"verbose\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"timeout\")\n                .help(\"Timeout in seconds.\")\n                .short('t')\n                .long(\"timeout\")\n                .value_name(\"SECONDS\"),\n        )\n        .arg(\n            Arg::new(\"frequency\")\n                .help(\"The sampling frequency.\")\n                .short('f')\n                .long(\"frequency\")\n                .value_name(\"HERTZ\"),\n        )\n        .arg(\n            Arg::new(\"binary path\")\n                .help(\"The path of the binary to be profiled. for a binary.\")\n                .value_name(\"BINFILE\"),\n        )\n        .arg(\n            Arg::new(\"pass through args\")\n                .help(\"Any arguments you wish to pass to the being profiled.\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .last(true)\n                .value_name(\"ARGS\"),\n        );\n    let expected = str![[r#\"\nUsage: flamegraph [OPTIONS] [BINFILE] [-- <ARGS>...]\n\nArguments:\n  [BINFILE]  The path of the binary to be profiled. for a binary.\n  [ARGS]...  Any arguments you wish to pass to the being profiled.\n\nOptions:\n  -v, --verbose            Prints out more stuff.\n  -t, --timeout <SECONDS>  Timeout in seconds.\n  -f, --frequency <HERTZ>  The sampling frequency.\n  -h, --help               Print help\n  -V, --version            Print version\n\n\"#]];\n    utils::assert_output(cmd, \"flamegraph --help\", expected, false);\n}\n\n#[test]\nfn subcommand_short_help() {\n    let m = utils::complex_app().try_get_matches_from(vec![\"clap-test\", \"subcmd\", \"-h\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::DisplayHelp);\n}\n\n#[test]\nfn subcommand_long_help() {\n    let m = utils::complex_app().try_get_matches_from(vec![\"clap-test\", \"subcmd\", \"--help\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::DisplayHelp);\n}\n\n#[test]\nfn subcommand_help_rev() {\n    let m = utils::complex_app().try_get_matches_from(vec![\"clap-test\", \"help\", \"subcmd\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::DisplayHelp);\n}\n\n#[test]\nfn complex_help_output() {\n    let expected = str![[r#\"\nclap-test v1.4.8\nKevin K. <kbknapp@gmail.com>\ntests clap library\n\nUsage: clap-test [OPTIONS] [positional] [positional2] [positional3]... [COMMAND]\n\nCommands:\n  subcmd  tests subcommands\n  help    Print this message or the help of the given subcommand(s)\n\nArguments:\n  [positional]      tests positionals\n  [positional2]     tests positionals with exclusions\n  [positional3]...  tests specific values [possible values: vi, emacs]\n\nOptions:\n  -o, --option <opt>...                  tests options\n  -f, --flag...                          tests flags\n  -F                                     tests flags with exclusions\n      --long-option-2 <option2>          tests long options with exclusions\n  -O, --option3 <option3>                specific vals [possible values: fast, slow]\n      --multvals <one> <two>             Tests multiple values, not mult occs\n      --multvalsmo <one> <two>           Tests multiple values, and mult occs\n      --minvals2 <minvals> <minvals>...  Tests 2 min vals\n      --maxvals3 <maxvals>...            Tests 3 max vals\n      --optvaleq[=<optval>]              Tests optional value, require = sign\n      --optvalnoeq [<optval>]            Tests optional value\n  -h, --help                             Print help\n  -V, --version                          Print version\n\n\"#]];\n    utils::assert_output(utils::complex_app(), \"clap-test --help\", expected, false);\n}\n\n#[test]\nfn after_and_before_help_output() {\n    let cmd = Command::new(\"clap-test\")\n        .version(\"v1.4.8\")\n        .about(\"tests clap library\")\n        .before_help(\"some text that comes before the help\")\n        .after_help(\"some text that comes after the help\");\n\n    let expected = str![[r#\"\nsome text that comes before the help\n\ntests clap library\n\nUsage: clap-test\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\nsome text that comes after the help\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"clap-test -h\", expected, false);\n\n    let expected = str![[r#\"\nsome text that comes before the help\n\ntests clap library\n\nUsage: clap-test\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\nsome text that comes after the help\n\n\"#]];\n    utils::assert_output(cmd, \"clap-test --help\", expected, false);\n}\n\n#[test]\nfn after_and_before_long_help_output() {\n    let cmd = Command::new(\"clap-test\")\n        .version(\"v1.4.8\")\n        .about(\"tests clap library\")\n        .before_help(\"some text that comes before the help\")\n        .after_help(\"some text that comes after the help\")\n        .before_long_help(\"some longer text that comes before the help\")\n        .after_long_help(\"some longer text that comes after the help\");\n\n    let expected = str![[r#\"\nsome longer text that comes before the help\n\ntests clap library\n\nUsage: clap-test\n\nOptions:\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\nsome longer text that comes after the help\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"clap-test --help\", expected, false);\n\n    let expected = str![[r#\"\nsome text that comes before the help\n\ntests clap library\n\nUsage: clap-test\n\nOptions:\n  -h, --help     Print help (see more with '--help')\n  -V, --version  Print version\n\nsome text that comes after the help\n\n\"#]];\n    utils::assert_output(cmd, \"clap-test -h\", expected, false);\n}\n\n#[test]\nfn multi_level_sc_help() {\n    let cmd = Command::new(\"ctest\").subcommand(\n        Command::new(\"subcmd\").subcommand(\n            Command::new(\"multi\")\n                .about(\"tests subcommands\")\n                .author(\"Kevin K. <kbknapp@gmail.com>\")\n                .version(\"0.1\")\n                .arg(arg!(\n                    -f --flag                    \"tests flags\"\n                ))\n                .arg(\n                    arg!(\n                        -o --option <scoption>    \"tests options\"\n                    )\n                    .required(false)\n                    .num_args(1..)\n                    .action(ArgAction::Append),\n                ),\n        ),\n    );\n\n    let expected = str![[r#\"\ntests subcommands\n\nUsage: ctest subcmd multi [OPTIONS]\n\nOptions:\n  -f, --flag                  tests flags\n  -o, --option <scoption>...  tests options\n  -h, --help                  Print help\n  -V, --version               Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest help subcmd multi\", expected, false);\n}\n\n#[test]\nfn no_wrap_default_help() {\n    let cmd = Command::new(\"ctest\").version(\"1.0\").term_width(0);\n\n    let expected = str![[r#\"\nUsage: ctest\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\nfn try_help_default() {\n    let cmd = Command::new(\"ctest\").version(\"1.0\").term_width(0);\n\n    let expected = str![[r#\"\nerror: unexpected argument 'bar' found\n\nUsage: ctest\n\nFor more information, try '--help'.\n\n\"#]];\n    utils::assert_output(cmd, \"ctest bar\", expected, true);\n}\n\n#[test]\nfn try_help_custom_flag() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"1.0\")\n        .disable_help_flag(true)\n        .arg(\n            Arg::new(\"help\")\n                .long(\"help\")\n                .short('h')\n                .action(ArgAction::Help),\n        )\n        .term_width(0);\n\n    let expected = str![[r#\"\nerror: unexpected argument 'bar' found\n\nUsage: ctest\n\nFor more information, try '--help'.\n\n\"#]];\n    utils::assert_output(cmd, \"ctest bar\", expected, true);\n}\n\n#[test]\nfn try_help_custom_flag_short() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"1.0\")\n        .disable_help_flag(true)\n        .arg(Arg::new(\"help\").short('h').action(ArgAction::HelpShort))\n        .term_width(0);\n\n    let expected = str![[r#\"\nerror: unexpected argument 'bar' found\n\nUsage: ctest\n\nFor more information, try '-h'.\n\n\"#]];\n    utils::assert_output(cmd, \"ctest bar\", expected, true);\n}\n\n#[test]\nfn try_help_custom_flag_long() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"1.0\")\n        .disable_help_flag(true)\n        .arg(Arg::new(\"help\").long(\"help\").action(ArgAction::HelpShort))\n        .term_width(0);\n\n    let expected = str![[r#\"\nerror: unexpected argument 'bar' found\n\nUsage: ctest\n\nFor more information, try '--help'.\n\n\"#]];\n    utils::assert_output(cmd, \"ctest bar\", expected, true);\n}\n\n#[test]\nfn try_help_custom_flag_no_action() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"1.0\")\n        .disable_help_flag(true)\n        // Note `ArgAction::Help` is excluded\n        .arg(Arg::new(\"help\").long(\"help\").global(true))\n        .term_width(0);\n\n    let expected = str![[r#\"\nerror: unexpected argument 'bar' found\n\nUsage: ctest\n\n\"#]];\n    utils::assert_output(cmd, \"ctest bar\", expected, true);\n}\n\n#[test]\nfn try_help_subcommand_default() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"1.0\")\n        .subcommand(Command::new(\"foo\"))\n        .term_width(0);\n\n    let expected = str![[r#\"\nerror: unrecognized subcommand 'bar'\n\nUsage: ctest [COMMAND]\n\nFor more information, try '--help'.\n\n\"#]];\n    utils::assert_output(cmd, \"ctest bar\", expected, true);\n}\n\n#[test]\nfn try_help_subcommand_custom_flag() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"1.0\")\n        .disable_help_flag(true)\n        .arg(\n            Arg::new(\"help\")\n                .long(\"help\")\n                .short('h')\n                .action(ArgAction::Help)\n                .global(true),\n        )\n        .subcommand(Command::new(\"foo\"))\n        .term_width(0);\n\n    let expected = str![[r#\"\nerror: unrecognized subcommand 'bar'\n\nUsage: ctest [COMMAND]\n\nFor more information, try '--help'.\n\n\"#]];\n    utils::assert_output(cmd, \"ctest bar\", expected, true);\n}\n\n#[test]\nfn try_help_subcommand_custom_flag_no_action() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"1.0\")\n        .disable_help_flag(true)\n        // Note `ArgAction::Help` is excluded\n        .arg(Arg::new(\"help\").long(\"help\").global(true))\n        .subcommand(Command::new(\"foo\"))\n        .term_width(0);\n\n    let expected = str![[r#\"\nerror: unrecognized subcommand 'bar'\n\nUsage: ctest [COMMAND]\n\nFor more information, try 'help'.\n\n\"#]];\n    utils::assert_output(cmd, \"ctest bar\", expected, true);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn wrapped_help() {\n    let cmd = Command::new(\"test\")\n        .term_width(67)\n        .arg(\n            Arg::new(\"all\")\n                .short('a')\n                .long(\"all\")\n                .action(ArgAction::SetTrue)\n                .help(\"Also do versioning for private crates (will not be published)\"),\n        )\n        .arg(\n            Arg::new(\"exact\")\n                .long(\"exact\")\n                .action(ArgAction::SetTrue)\n                .help(\"Specify inter dependency version numbers exactly with `=`\"),\n        )\n        .arg(\n            Arg::new(\"no_git_commit\")\n                .long(\"no-git-commit\")\n                .action(ArgAction::SetTrue)\n                .help(\"Do not commit version changes\"),\n        )\n        .arg(\n            Arg::new(\"no_git_push\")\n                .long(\"no-git-push\")\n                .action(ArgAction::SetTrue)\n                .help(\"Do not push generated commit and tags to git remote\"),\n        )\n        .subcommand(\n            Command::new(\"sub1\")\n                .about(\"One two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen\")\n        );\n\n    let expected = str![[r#\"\nUsage: test [OPTIONS] [COMMAND]\n\nCommands:\n  sub1  One two three four five six seven eight nine ten eleven\n        twelve thirteen fourteen fifteen\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -a, --all            Also do versioning for private crates (will\n                       not be published)\n      --exact          Specify inter dependency version numbers\n                       exactly with `=`\n      --no-git-commit  Do not commit version changes\n      --no-git-push    Do not push generated commit and tags to git\n                       remote\n  -h, --help           Print help\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn unwrapped_help() {\n    let cmd = Command::new(\"test\")\n        .term_width(68)\n        .arg(\n            Arg::new(\"all\")\n                .short('a')\n                .long(\"all\")\n                .action(ArgAction::SetTrue)\n                .help(\"Also do versioning for private crates (will not be published)\"),\n        )\n        .arg(\n            Arg::new(\"exact\")\n                .long(\"exact\")\n                .action(ArgAction::SetTrue)\n                .help(\"Specify inter dependency version numbers exactly with `=`\"),\n        )\n        .arg(\n            Arg::new(\"no_git_commit\")\n                .long(\"no-git-commit\")\n                .action(ArgAction::SetTrue)\n                .help(\"Do not commit version changes\"),\n        )\n        .arg(\n            Arg::new(\"no_git_push\")\n                .long(\"no-git-push\")\n                .action(ArgAction::SetTrue)\n                .help(\"Do not push generated commit and tags to git remote\"),\n        )\n        .subcommand(\n            Command::new(\"sub1\")\n                .about(\"One two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen\")\n        );\n\n    let expected = str![[r#\"\nUsage: test [OPTIONS] [COMMAND]\n\nCommands:\n  sub1  One two three four five six seven eight nine ten eleven\n        twelve thirteen fourteen fifteen\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -a, --all            Also do versioning for private crates (will\n                       not be published)\n      --exact          Specify inter dependency version numbers\n                       exactly with `=`\n      --no-git-commit  Do not commit version changes\n      --no-git-push    Do not push generated commit and tags to git\n                       remote\n  -h, --help           Print help\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn possible_value_wrapped_help() {\n    let cmd = Command::new(\"test\")\n        .term_width(67)\n        .arg(\n            Arg::new(\"possible_values\")\n                .long(\"possible-values\")\n                .action(ArgAction::Set)\n                .value_parser([\n                    PossibleValue::new(\"short_name\")\n                        .help(\"Long enough help message, barely warrant wrapping\"),\n                    PossibleValue::new(\"second\").help(\"Short help gets handled the same\"),\n                ]),\n        )\n        .arg(\n            Arg::new(\"possible_values_with_new_line\")\n                .long(\"possible-values-with-new-line\")\n                .action(ArgAction::Set)\n                .value_parser([\n                    PossibleValue::new(\"long enough name to trigger new line\").help(\n                        \"Really long enough help message to clearly warrant wrapping believe me\",\n                    ),\n                    PossibleValue::new(\"second\"),\n                ]),\n        )\n        .arg(\n            Arg::new(\"possible_values_without_new_line\")\n                .long(\"possible-values-without-new-line\")\n                .action(ArgAction::Set)\n                .value_parser([\n                    PossibleValue::new(\"name\").help(\"Short enough help message with no wrapping\"),\n                    PossibleValue::new(\"second\").help(\"short help\"),\n                ]),\n        );\n\n    let expected = str![[r#\"\nUsage: test [OPTIONS]\n\nOptions:\n      --possible-values <possible_values>\n          Possible values:\n          - short_name: Long enough help message, barely warrant\n            wrapping\n          - second:     Short help gets handled the same\n\n      --possible-values-with-new-line <possible_values_with_new_line>\n          Possible values:\n          - long enough name to trigger new line: Really long\n            enough help message to clearly warrant wrapping believe\n            me\n          - second\n\n      --possible-values-without-new-line <possible_values_without_new_line>\n          Possible values:\n          - name:   Short enough help message with no wrapping\n          - second: short help\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn complex_subcommand_help_output() {\n    let a = utils::complex_app();\n\n    let expected = str![[r#\"\nclap-test-subcmd 0.1\nKevin K. <kbknapp@gmail.com>\ntests subcommands\n\nUsage: clap-test subcmd [OPTIONS] [scpositional]\n\nArguments:\n  [scpositional]  tests positionals\n\nOptions:\n  -o, --option <scoption>...   tests options\n  -f, --flag...                tests flags\n  -s, --subcmdarg <subcmdarg>  tests other args\n  -h, --help                   Print help\n  -V, --version                Print version\n\n\"#]];\n    utils::assert_output(a, \"clap-test subcmd --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn issue_626_unicode_cutoff() {\n    let cmd = Command::new(\"ctest\").version(\"0.1\").term_width(70).arg(\n        Arg::new(\"cafe\")\n            .short('c')\n            .long(\"cafe\")\n            .value_name(\"FILE\")\n            .help(\n                \"A coffeehouse, coffee shop, or café is an establishment \\\n             which primarily serves hot coffee, related coffee beverages \\\n             (e.g., café latte, cappuccino, espresso), tea, and other hot \\\n             beverages. Some coffeehouses also serve cold beverages such as \\\n             iced coffee and iced tea. Many cafés also serve some type of \\\n             food, such as light snacks, muffins, or pastries.\",\n            )\n            .action(ArgAction::Set),\n    );\n\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe <FILE>  A coffeehouse, coffee shop, or café is an\n                     establishment which primarily serves hot coffee,\n                     related coffee beverages (e.g., café latte,\n                     cappuccino, espresso), tea, and other hot\n                     beverages. Some coffeehouses also serve cold\n                     beverages such as iced coffee and iced tea. Many\n                     cafés also serve some type of food, such as light\n                     snacks, muffins, or pastries.\n  -h, --help         Print help\n  -V, --version      Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\nfn hide_possible_vals() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"0.1\")\n        .arg(\n            Arg::new(\"pos\")\n                .short('p')\n                .long(\"pos\")\n                .value_name(\"VAL\")\n                .value_parser([\"fast\", \"slow\"])\n                .help(\"Some vals\")\n                .action(ArgAction::Set),\n        )\n        .arg(\n            Arg::new(\"cafe\")\n                .short('c')\n                .long(\"cafe\")\n                .value_name(\"FILE\")\n                .hide_possible_values(true)\n                .value_parser([\"fast\", \"slow\"])\n                .help(\"A coffeehouse, coffee shop, or café.\")\n                .action(ArgAction::Set),\n        );\n\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS]\n\nOptions:\n  -p, --pos <VAL>    Some vals [possible values: fast, slow]\n  -c, --cafe <FILE>  A coffeehouse, coffee shop, or café.\n  -h, --help         Print help\n  -V, --version      Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\nfn hide_single_possible_val() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"0.1\")\n        .arg(\n            Arg::new(\"pos\")\n                .short('p')\n                .long(\"pos\")\n                .value_name(\"VAL\")\n                .value_parser([\n                    \"fast\".into(),\n                    \"slow\".into(),\n                    PossibleValue::new(\"secret speed\").hide(true),\n                ])\n                .help(\"Some vals\")\n                .action(ArgAction::Set),\n        )\n        .arg(\n            Arg::new(\"cafe\")\n                .short('c')\n                .long(\"cafe\")\n                .value_name(\"FILE\")\n                .help(\"A coffeehouse, coffee shop, or café.\")\n                .action(ArgAction::Set),\n        );\n\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS]\n\nOptions:\n  -p, --pos <VAL>    Some vals [possible values: fast, slow]\n  -c, --cafe <FILE>  A coffeehouse, coffee shop, or café.\n  -h, --help         Print help\n  -V, --version      Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\nfn possible_vals_with_help() {\n    let app = Command::new(\"ctest\")\n        .version(\"0.1\")\n        .arg(\n            Arg::new(\"pos\")\n                .short('p')\n                .long(\"pos\")\n                .value_name(\"VAL\")\n                .value_parser([\n                    PossibleValue::new(\"fast\"),\n                    PossibleValue::new(\"slow\").help(\"not as fast\"),\n                    PossibleValue::new(\"secret speed\").hide(true),\n                ])\n                .help(\"Some vals\")\n                .action(ArgAction::Set),\n        )\n        .arg(\n            Arg::new(\"cafe\")\n                .short('c')\n                .long(\"cafe\")\n                .value_name(\"FILE\")\n                .help(\"A coffeehouse, coffee shop, or café.\")\n                .action(ArgAction::Set),\n        );\n\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS]\n\nOptions:\n  -p, --pos <VAL>\n          Some vals\n\n          Possible values:\n          - fast\n          - slow: not as fast\n\n  -c, --cafe <FILE>\n          A coffeehouse, coffee shop, or café.\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\n\"#]];\n    utils::assert_output(app, \"ctest --help\", expected, false);\n}\n\n#[cfg(feature = \"wrap_help\")]\nfn setup_aliases() -> Command {\n    Command::new(\"ctest\")\n        .version(\"0.1\")\n        .arg(\n            Arg::new(\"dest\")\n                .short('d')\n                .long(\"destination\")\n                .value_name(\"FILE\")\n                .help(\"File to save into\")\n                .long_help(\"The Filepath to save into the result\")\n                .short_alias('q')\n                .short_aliases(['w', 'e'])\n                .alias(\"arg-alias\")\n                .aliases([\"do-stuff\", \"do-tests\"])\n                .visible_short_alias('t')\n                .visible_short_aliases(['i', 'o'])\n                .visible_alias(\"file\")\n                .visible_aliases([\"into\", \"to\"])\n                .action(ArgAction::Set),\n        )\n        .subcommand(\n            Command::new(\"rev\")\n                .short_flag('r')\n                .long_flag(\"inplace\")\n                .about(\"In place\")\n                .long_about(\"Change mode to work in place on source\")\n                .alias(\"subc-alias\")\n                .aliases([\"subc-do-stuff\", \"subc-do-tests\"])\n                .short_flag_alias('j')\n                .short_flag_aliases(['k', 'l'])\n                .long_flag_alias(\"subc-long-flag-alias\")\n                .long_flag_aliases([\"subc-long-do-stuff\", \"subc-long-do-tests\"])\n                .visible_alias(\"source\")\n                .visible_aliases([\"from\", \"onsource\"])\n                .visible_short_flag_alias('s')\n                .visible_short_flag_aliases(['f', 'g'])\n                .visible_long_flag_alias(\"origin\")\n                .visible_long_flag_aliases([\"path\", \"tryfrom\"])\n                .arg(\n                    Arg::new(\"input\")\n                        .value_name(\"INPUT\")\n                        .help(\"The source file\"),\n                ),\n        )\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn visible_aliases_with_short_help() {\n    let app = setup_aliases().term_width(80);\n\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS] [COMMAND]\n\nCommands:\n  rev, -r, --inplace  In place [aliases: -s, -f, -g, --origin, --path,\n                      --tryfrom, source, from, onsource]\n  help                Print this message or the help of the given subcommand(s)\n\nOptions:\n  -d, --destination <FILE>  File to save into [aliases: -t, -i, -o, --file,\n                            --into, --to]\n  -h, --help                Print help (see more with '--help')\n  -V, --version             Print version\n\n\"#]];\n    utils::assert_output(app, \"ctest -h\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn visible_aliases_with_long_help() {\n    let app = setup_aliases().term_width(80);\n\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS] [COMMAND]\n\nCommands:\n  rev, -r, --inplace  In place [aliases: -s, -f, -g, --origin, --path,\n                      --tryfrom, source, from, onsource]\n  help                Print this message or the help of the given subcommand(s)\n\nOptions:\n  -d, --destination <FILE>\n          The Filepath to save into the result\n          \n          [aliases: -t, -i, -o, --file, --into, --to]\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\n\"#]];\n    utils::assert_output(app, \"ctest --help\", expected, false);\n}\n\n#[test]\nfn hidden_possible_vals() {\n    let app = Command::new(\"ctest\").arg(\n        Arg::new(\"pos\")\n            .hide_possible_values(true)\n            .value_parser([\n                PossibleValue::new(\"fast\"),\n                PossibleValue::new(\"slow\").help(\"not as fast\"),\n            ])\n            .action(ArgAction::Set),\n    );\n\n    let expected = str![[r#\"\nUsage: ctest [pos]\n\nArguments:\n  [pos]  \n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(app, \"ctest --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn issue_626_panic() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"0.1\")\n        .term_width(52)\n        .arg(Arg::new(\"cafe\")\n           .short('c')\n           .long(\"cafe\")\n           .value_name(\"FILE\")\n           .help(\"La culture du café est très développée dans de nombreux pays à climat chaud d'Amérique, \\\n           d'Afrique et d'Asie, dans des plantations qui sont cultivées pour les marchés d'exportation. \\\n           Le café est souvent une contribution majeure aux exportations des régions productrices.\")\n           .action(ArgAction::Set));\n\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe <FILE>\n          La culture du café est très développée\n          dans de nombreux pays à climat chaud\n          d'Amérique, d'Afrique et d'Asie, dans des\n          plantations qui sont cultivées pour les\n          marchés d'exportation. Le café est souvent\n          une contribution majeure aux exportations\n          des régions productrices.\n  -h, --help\n          Print help\n  -V, --version\n          Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn issue_626_variable_panic() {\n    for i in 10..320 {\n        let _ = Command::new(\"ctest\")\n            .version(\"0.1\")\n            .term_width(i)\n            .arg(Arg::new(\"cafe\")\n               .short('c')\n               .long(\"cafe\")\n               .value_name(\"FILE\")\n               .help(\"La culture du café est très développée dans de nombreux pays à climat chaud d'Amérique, \\\n               d'Afrique et d'Asie, dans des plantations qui sont cultivées pour les marchés d'exportation. \\\n               Le café est souvent une contribution majeure aux exportations des régions productrices.\")\n               .action(ArgAction::Set))\n            .try_get_matches_from(vec![\"ctest\", \"--help\"]);\n    }\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn final_word_wrapping() {\n    let cmd = Command::new(\"ctest\").version(\"0.1\").term_width(24);\n\n    let expected = str![[r#\"\nUsage: ctest\n\nOptions:\n  -h, --help\n          Print help\n  -V, --version\n          Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn wrapping_newline_chars() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"0.1\")\n        .term_width(60)\n        .arg(Arg::new(\"mode\").help(\n            \"x, max, maximum   20 characters, contains symbols.\\n\\\n             l, long           Copy-friendly, 14 characters, contains symbols.\\n\\\n             m, med, medium    Copy-friendly, 8 characters, contains symbols.\\n\",\n        ));\n\n    let expected = str![[r#\"\nUsage: ctest [mode]\n\nArguments:\n  [mode]  x, max, maximum   20 characters, contains symbols.\n          l, long           Copy-friendly, 14 characters,\n          contains symbols.\n          m, med, medium    Copy-friendly, 8 characters,\n          contains symbols.\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn wrapped_indentation() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"0.1\")\n        .term_width(60)\n        .arg(Arg::new(\"mode\").help(\n            \"Some values:\n  - l, long           Copy-friendly, 14 characters, contains symbols.\n  - m, med, medium    Copy-friendly, 8 characters, contains symbols.\",\n        ));\n\n    let expected = str![[r#\"\nUsage: ctest [mode]\n\nArguments:\n  [mode]  Some values:\n            - l, long           Copy-friendly, 14\n            characters, contains symbols.\n            - m, med, medium    Copy-friendly, 8 characters,\n            contains symbols.\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn wrapping_newline_variables() {\n    let cmd = Command::new(\"ctest\")\n        .version(\"0.1\")\n        .term_width(60)\n        .arg(Arg::new(\"mode\").help(\n            \"x, max, maximum   20 characters, contains symbols.{n}\\\n             l, long           Copy-friendly, 14 characters, contains symbols.{n}\\\n             m, med, medium    Copy-friendly, 8 characters, contains symbols.{n}\",\n        ));\n\n    let expected = str![[r#\"\nUsage: ctest [mode]\n\nArguments:\n  [mode]  x, max, maximum   20 characters, contains symbols.\n          l, long           Copy-friendly, 14 characters,\n          contains symbols.\n          m, med, medium    Copy-friendly, 8 characters,\n          contains symbols.\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn dont_wrap_urls() {\n    let cmd = Command::new(\"Example\")\n        .term_width(30)\n        .subcommand(Command::new(\"update\").arg(\n            Arg::new(\"force-non-host\")\n                .help(\"Install toolchains that require an emulator. See https://github.com/rust-lang/rustup/wiki/Non-host-toolchains\")\n                .long(\"force-non-host\")\n                .action(ArgAction::SetTrue))\n    );\n\n    let expected = str![[r#\"\nUsage: Example update [OPTIONS]\n\nOptions:\n      --force-non-host\n          Install toolchains\n          that require an\n          emulator. See\n          https://github.com/rust-lang/rustup/wiki/Non-host-toolchains\n  -h, --help\n          Print help\n\n\"#]];\n    utils::assert_output(cmd, \"Example update --help\", expected, false);\n}\n\n#[test]\nfn old_newline_chars() {\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"mode\")\n            .short('m')\n            .action(ArgAction::SetTrue)\n            .help(\"Some help with some wrapping\\n(Defaults to something)\"),\n    );\n\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS]\n\nOptions:\n  -m             Some help with some wrapping\n                 (Defaults to something)\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\nfn old_newline_variables() {\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"mode\")\n            .short('m')\n            .action(ArgAction::SetTrue)\n            .help(\"Some help with some wrapping{n}(Defaults to something)\"),\n    );\n\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS]\n\nOptions:\n  -m             Some help with some wrapping\n                 (Defaults to something)\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn issue_688_hide_pos_vals() {\n    #[cfg(not(feature = \"unstable-v5\"))]\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS]\n\nOptions:\n      --filter <filter>  Sets the filter, or sampling method, to use for interpolation when resizing the particle\n                         images. The default is Linear (Bilinear). [possible values: Nearest, Linear, Cubic, Gaussian,\n                         Lanczos3]\n  -h, --help             Print help\n  -V, --version          Print version\n\n\"#]];\n\n    #[cfg(feature = \"unstable-v5\")]\n    let expected = str![[r#\"\nUsage: ctest [OPTIONS]\n\nOptions:\n      --filter <filter>  Sets the filter, or sampling method, to use for interpolation when resizing\n                         the particle images. The default is Linear (Bilinear). [possible values:\n                         Nearest, Linear, Cubic, Gaussian, Lanczos3]\n  -h, --help             Print help\n  -V, --version          Print version\n\n\"#]];\n\n    let filter_values = [\"Nearest\", \"Linear\", \"Cubic\", \"Gaussian\", \"Lanczos3\"];\n\n    let app1 = Command::new(\"ctest\")\n        .version(\"0.1\")\n\t\t\t.term_width(120)\n\t\t\t.hide_possible_values(true)\n\t\t\t.arg(Arg::new(\"filter\")\n\t\t\t\t.help(\"Sets the filter, or sampling method, to use for interpolation when resizing the particle \\\n            images. The default is Linear (Bilinear). [possible values: Nearest, Linear, Cubic, Gaussian, Lanczos3]\")\n\t\t\t\t.long(\"filter\")\n\t\t\t\t.value_parser(filter_values)\n\t\t\t\t.action(ArgAction::Set));\n\n    utils::assert_output(app1, \"ctest --help\", expected.clone(), false);\n\n    let app2 = Command::new(\"ctest\")\n        .version(\"0.1\")\n\t\t\t.term_width(120)\n\t\t\t.arg(Arg::new(\"filter\")\n\t\t\t\t.help(\"Sets the filter, or sampling method, to use for interpolation when resizing the particle \\\n            images. The default is Linear (Bilinear).\")\n\t\t\t\t.long(\"filter\")\n\t\t\t\t.value_parser(filter_values)\n\t\t\t\t.action(ArgAction::Set));\n\n    utils::assert_output(app2, \"ctest --help\", expected.clone(), false);\n\n    let app3 = Command::new(\"ctest\")\n        .version(\"0.1\")\n\t\t\t.term_width(120)\n\t\t\t.arg(Arg::new(\"filter\")\n\t\t\t\t.help(\"Sets the filter, or sampling method, to use for interpolation when resizing the particle \\\n            images. The default is Linear (Bilinear). [possible values: Nearest, Linear, Cubic, Gaussian, Lanczos3]\")\n\t\t\t\t.long(\"filter\")\n\t\t\t\t.action(ArgAction::Set));\n\n    utils::assert_output(app3, \"ctest --help\", expected.clone(), false);\n}\n\n#[test]\nfn issue_702_multiple_values() {\n    let cmd = Command::new(\"myapp\")\n        .version(\"1.0\")\n        .author(\"foo\")\n        .about(\"bar\")\n        .arg(Arg::new(\"arg1\").help(\"some option\"))\n        .arg(\n            Arg::new(\"arg2\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .help(\"some option\"),\n        )\n        .arg(\n            Arg::new(\"some\")\n                .help(\"some option\")\n                .short('s')\n                .long(\"some\")\n                .action(ArgAction::Set),\n        )\n        .arg(\n            Arg::new(\"other\")\n                .help(\"some other option\")\n                .short('o')\n                .long(\"other\")\n                .action(ArgAction::Set),\n        )\n        .arg(\n            Arg::new(\"label\")\n                .help(\"a label\")\n                .short('l')\n                .long(\"label\")\n                .num_args(1..)\n                .action(ArgAction::Set),\n        );\n\n    let expected = str![[r#\"\nbar\n\nUsage: myapp [OPTIONS] [arg1] [arg2]...\n\nArguments:\n  [arg1]     some option\n  [arg2]...  some option\n\nOptions:\n  -s, --some <some>       some option\n  -o, --other <other>     some other option\n  -l, --label <label>...  a label\n  -h, --help              Print help\n  -V, --version           Print version\n\n\"#]];\n    utils::assert_output(cmd, \"myapp --help\", expected, false);\n}\n\n#[test]\nfn long_about() {\n    let cmd = Command::new(\"myapp\")\n        .version(\"1.0\")\n        .author(\"foo\")\n        .about(\"bar\")\n        .long_about(\n            \"something really really long, with\\nmultiple lines of text\\nthat should be displayed\",\n        )\n        .arg(Arg::new(\"arg1\").help(\"some option\"));\n\n    let expected = str![[r#\"\nsomething really really long, with\nmultiple lines of text\nthat should be displayed\n\nUsage: myapp [arg1]\n\nArguments:\n  [arg1]\n          some option\n\nOptions:\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\n\"#]];\n    utils::assert_output(cmd, \"myapp --help\", expected, false);\n}\n\n#[test]\nfn explicit_short_long_help() {\n    let cmd = Command::new(\"myapp\")\n        .disable_help_flag(true)\n        .version(\"1.0\")\n        .author(\"foo\")\n        .about(\"bar\")\n        .long_about(\n            \"something really really long, with\\nmultiple lines of text\\nthat should be displayed\",\n        )\n        .arg(Arg::new(\"arg1\").help(\"some option\"))\n        .arg(Arg::new(\"short\").short('?').action(ArgAction::HelpShort))\n        .arg(\n            Arg::new(\"long\")\n                .short('h')\n                .long(\"help\")\n                .action(ArgAction::HelpLong),\n        );\n\n    let expected = str![[r#\"\nbar\n\nUsage: myapp [arg1]\n\nArguments:\n  [arg1]  some option\n\nOptions:\n  -?             \n  -h, --help     \n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"myapp -?\", expected, false);\n\n    let expected = str![[r#\"\nsomething really really long, with\nmultiple lines of text\nthat should be displayed\n\nUsage: myapp [arg1]\n\nArguments:\n  [arg1]\n          some option\n\nOptions:\n  -?\n          \n\n  -h, --help\n          \n\n  -V, --version\n          Print version\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"myapp -h\", expected, false);\n\n    let expected = str![[r#\"\nsomething really really long, with\nmultiple lines of text\nthat should be displayed\n\nUsage: myapp [arg1]\n\nArguments:\n  [arg1]\n          some option\n\nOptions:\n  -?\n          \n\n  -h, --help\n          \n\n  -V, --version\n          Print version\n\n\"#]];\n    utils::assert_output(cmd, \"myapp --help\", expected, false);\n}\n\n#[test]\nfn ripgrep_usage() {\n    let cmd = Command::new(\"ripgrep\").version(\"0.5\").override_usage(\n        \"rg [OPTIONS] <pattern> [<path> ...]\n       rg [OPTIONS] [-e PATTERN | -f FILE ]... [<path> ...]\n       rg [OPTIONS] --files [<path> ...]\n       rg [OPTIONS] --type-list\",\n    );\n\n    let expected = str![[r#\"\nUsage: rg [OPTIONS] <pattern> [<path> ...]\n       rg [OPTIONS] [-e PATTERN | -f FILE ]... [<path> ...]\n       rg [OPTIONS] --files [<path> ...]\n       rg [OPTIONS] --type-list\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"rg --help\", expected, false);\n}\n\n#[test]\nfn ripgrep_usage_using_templates() {\n    #[cfg(not(feature = \"unstable-v5\"))]\n    let cmd = Command::new(\"ripgrep\")\n        .version(\"0.5\")\n        .override_usage(\n            \"\\\n       rg [OPTIONS] <pattern> [<path> ...]\n       rg [OPTIONS] [-e PATTERN | -f FILE ]... [<path> ...]\n       rg [OPTIONS] --files [<path> ...]\n       rg [OPTIONS] --type-list\",\n        )\n        .help_template(\n            \"\\\n{bin} {version}\n\nUsage: {usage}\n\nOptions:\n{options}\",\n        );\n\n    #[cfg(feature = \"unstable-v5\")]\n    let cmd = Command::new(\"ripgrep\")\n        .version(\"0.5\")\n        .override_usage(\n            \"\\\n       rg [OPTIONS] <pattern> [<path> ...]\n       rg [OPTIONS] [-e PATTERN | -f FILE ]... [<path> ...]\n       rg [OPTIONS] --files [<path> ...]\n       rg [OPTIONS] --type-list\",\n        )\n        .help_template(\n            \"\\\n{name} {version}\n\nUsage: {usage}\n\nOptions:\n{options}\",\n        );\n\n    let expected = str![[r#\"\nripgrep 0.5\n\nUsage: rg [OPTIONS] <pattern> [<path> ...]\n       rg [OPTIONS] [-e PATTERN | -f FILE ]... [<path> ...]\n       rg [OPTIONS] --files [<path> ...]\n       rg [OPTIONS] --type-list\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"rg --help\", expected, false);\n}\n\n#[test]\nfn sc_negates_reqs() {\n    let cmd = Command::new(\"prog\")\n        .version(\"1.0\")\n        .subcommand_negates_reqs(true)\n        .arg(arg!(-o --opt <FILE> \"tests options\").required(true))\n        .arg(Arg::new(\"PATH\").help(\"help\"))\n        .subcommand(Command::new(\"test\"));\n\n    let expected = str![[r#\"\nUsage: prog --opt <FILE> [PATH]\n       prog [PATH] <COMMAND>\n\nCommands:\n  test  \n  help  Print this message or the help of the given subcommand(s)\n\nArguments:\n  [PATH]  help\n\nOptions:\n  -o, --opt <FILE>  tests options\n  -h, --help        Print help\n  -V, --version     Print version\n\n\"#]];\n    utils::assert_output(cmd, \"prog --help\", expected, false);\n}\n\n#[test]\nfn hide_args() {\n    let cmd = Command::new(\"prog\")\n        .version(\"1.0\")\n        .arg(arg!(-f --flag \"testing flags\"))\n        .arg(arg!(-o --opt <FILE> \"tests options\"))\n        .arg(Arg::new(\"pos\").hide(true));\n\n    let expected = str![[r#\"\nUsage: prog [OPTIONS]\n\nOptions:\n  -f, --flag        testing flags\n  -o, --opt <FILE>  tests options\n  -h, --help        Print help\n  -V, --version     Print version\n\n\"#]];\n    utils::assert_output(cmd, \"prog --help\", expected, false);\n}\n\n#[test]\nfn args_negate_sc() {\n    let cmd = Command::new(\"prog\")\n        .version(\"1.0\")\n        .args_conflicts_with_subcommands(true)\n        .arg(arg!(-f --flag \"testing flags\"))\n        .arg(arg!(-o --opt <FILE> \"tests options\"))\n        .arg(Arg::new(\"PATH\").help(\"help\"))\n        .subcommand(Command::new(\"test\"));\n\n    let expected = str![[r#\"\nUsage: prog [OPTIONS] [PATH]\n       prog <COMMAND>\n\nCommands:\n  test  \n  help  Print this message or the help of the given subcommand(s)\n\nArguments:\n  [PATH]  help\n\nOptions:\n  -f, --flag        testing flags\n  -o, --opt <FILE>  tests options\n  -h, --help        Print help\n  -V, --version     Print version\n\n\"#]];\n    utils::assert_output(cmd, \"prog --help\", expected, false);\n}\n\n#[test]\nfn issue_1046_hide_scs() {\n    let cmd = Command::new(\"prog\")\n        .version(\"1.0\")\n        .arg(arg!(-f --flag \"testing flags\"))\n        .arg(arg!(-o --opt <FILE> \"tests options\"))\n        .arg(Arg::new(\"PATH\").help(\"some\"))\n        .subcommand(Command::new(\"test\").hide(true));\n\n    let expected = str![[r#\"\nUsage: prog [OPTIONS] [PATH]\n\nArguments:\n  [PATH]  some\n\nOptions:\n  -f, --flag        testing flags\n  -o, --opt <FILE>  tests options\n  -h, --help        Print help\n  -V, --version     Print version\n\n\"#]];\n    utils::assert_output(cmd, \"prog --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn issue_777_wrap_all_things() {\n    let cmd = Command::new(\"A cmd with a crazy very long long long name hahaha\")\n        .version(\"1.0\")\n        .author(\"Some Very Long Name and crazy long email <email@server.com>\")\n        .about(\"Show how the about text is not wrapped\")\n        .help_template(utils::FULL_TEMPLATE)\n        .term_width(35);\n\n    let expected = str![[r#\"\nA cmd with a crazy very long long\nlong name hahaha 1.0\nSome Very Long Name and crazy long\nemail <email@server.com>\nShow how the about text is not\nwrapped\n\nUsage: ctest\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest --help\", expected, false);\n}\n\n#[test]\nfn dont_strip_padding_issue_5083() {\n    let cmd = Command::new(\"test\")\n        .help_template(\"{subcommands}\")\n        .subcommands([\n            Command::new(\"one\"),\n            Command::new(\"two\"),\n            Command::new(\"three\"),\n        ]);\n\n    let expected = str![[r#\"\n  one    \n  two    \n  three  \n  help   Print this message or the help of the given subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn override_help_short() {\n    let cmd = Command::new(\"test\")\n        .version(\"0.1\")\n        .arg(arg!(-H --help \"Print help\").action(ArgAction::Help))\n        .disable_help_flag(true);\n\n    let expected = str![[r#\"\nUsage: test\n\nOptions:\n  -H, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"test --help\", expected, false);\n\n    let expected = str![[r#\"\nUsage: test\n\nOptions:\n  -H, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"test -H\", expected, false);\n}\n\n#[test]\nfn override_help_long() {\n    let cmd = Command::new(\"test\")\n        .version(\"0.1\")\n        .arg(arg!(-h --hell \"Print help\").action(ArgAction::Help))\n        .disable_help_flag(true);\n\n    let expected = str![[r#\"\nUsage: test\n\nOptions:\n  -h, --hell     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"test --hell\", expected, false);\n\n    let expected = str![[r#\"\nUsage: test\n\nOptions:\n  -h, --hell     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"test -h\", expected, false);\n}\n\n#[test]\nfn override_help_about() {\n    let cmd = Command::new(\"test\")\n        .version(\"0.1\")\n        .arg(arg!(-h --help \"Print custom help information\").action(ArgAction::Help))\n        .disable_help_flag(true);\n\n    let expected = str![[r#\"\nUsage: test\n\nOptions:\n  -h, --help     Print custom help information\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"test --help\", expected, false);\n\n    let expected = str![[r#\"\nUsage: test\n\nOptions:\n  -h, --help     Print custom help information\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"test -h\", expected, false);\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"Command conflict: Argument names must be unique, but 'help' is in use by more than one argument or group (call `cmd.disable_help_flag(true)` to remove the auto-generated `--help`)\"]\nfn arg_id_conflict_with_help() {\n    Command::new(\"conflict\")\n        .arg(Arg::new(\"help\").short('?').action(ArgAction::SetTrue))\n        .build();\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"Command conflict: Short option names must be unique for each argument, but '-h' is in use by both 'home' and 'help' (call `cmd.disable_help_flag(true)` to remove the auto-generated `--help`)\"]\nfn arg_short_conflict_with_help() {\n    Command::new(\"conflict\")\n        .arg(Arg::new(\"home\").short('h').action(ArgAction::SetTrue))\n        .build();\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"Command conflict: Long option names must be unique for each argument, but '--help' is in use by both 'custom-help' and 'help' (call `cmd.disable_help_flag(true)` to remove the auto-generated `--help`)\"]\nfn arg_long_conflict_with_help() {\n    Command::new(\"conflict\")\n        .arg(\n            Arg::new(\"custom-help\")\n                .long(\"help\")\n                .action(ArgAction::SetTrue),\n        )\n        .build();\n}\n\n#[test]\nfn last_arg_mult_usage() {\n    let cmd = Command::new(\"last\")\n        .version(\"0.1\")\n        .arg(Arg::new(\"TARGET\").required(true).help(\"some\"))\n        .arg(Arg::new(\"CORPUS\").help(\"some\"))\n        .arg(\n            Arg::new(\"ARGS\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .last(true)\n                .help(\"some\"),\n        );\n\n    let expected = str![[r#\"\nUsage: last <TARGET> [CORPUS] [-- <ARGS>...]\n\nArguments:\n  <TARGET>   some\n  [CORPUS]   some\n  [ARGS]...  some\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"last --help\", expected, false);\n}\n\n#[test]\nfn last_arg_mult_usage_req() {\n    let cmd = Command::new(\"last\")\n        .version(\"0.1\")\n        .arg(Arg::new(\"TARGET\").required(true).help(\"some\"))\n        .arg(Arg::new(\"CORPUS\").help(\"some\"))\n        .arg(\n            Arg::new(\"ARGS\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .last(true)\n                .required(true)\n                .help(\"some\"),\n        );\n\n    let expected = str![[r#\"\nUsage: last <TARGET> [CORPUS] -- <ARGS>...\n\nArguments:\n  <TARGET>   some\n  [CORPUS]   some\n  <ARGS>...  some\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"last --help\", expected, false);\n}\n\n#[test]\nfn last_arg_mult_usage_req_with_sc() {\n    let cmd = Command::new(\"last\")\n        .version(\"0.1\")\n        .subcommand_negates_reqs(true)\n        .arg(Arg::new(\"TARGET\").required(true).help(\"some\"))\n        .arg(Arg::new(\"CORPUS\").help(\"some\"))\n        .arg(\n            Arg::new(\"ARGS\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .last(true)\n                .required(true)\n                .help(\"some\"),\n        )\n        .subcommand(Command::new(\"test\").about(\"some\"));\n\n    let expected = str![[r#\"\nUsage: last <TARGET> [CORPUS] -- <ARGS>...\n       last [TARGET] [CORPUS] <COMMAND>\n\nCommands:\n  test  some\n  help  Print this message or the help of the given subcommand(s)\n\nArguments:\n  <TARGET>   some\n  [CORPUS]   some\n  <ARGS>...  some\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"last --help\", expected, false);\n}\n\n#[test]\nfn last_arg_mult_usage_with_sc() {\n    let cmd = Command::new(\"last\")\n        .version(\"0.1\")\n        .args_conflicts_with_subcommands(true)\n        .arg(Arg::new(\"TARGET\").required(true).help(\"some\"))\n        .arg(Arg::new(\"CORPUS\").help(\"some\"))\n        .arg(\n            Arg::new(\"ARGS\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .last(true)\n                .help(\"some\"),\n        )\n        .subcommand(Command::new(\"test\").about(\"some\"));\n\n    let expected = str![[r#\"\nUsage: last <TARGET> [CORPUS] [-- <ARGS>...]\n       last <COMMAND>\n\nCommands:\n  test  some\n  help  Print this message or the help of the given subcommand(s)\n\nArguments:\n  <TARGET>   some\n  [CORPUS]   some\n  [ARGS]...  some\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"last --help\", expected, false);\n}\n\n#[test]\nfn hide_default_val() {\n    let app1 = Command::new(\"default\").version(\"0.1\").term_width(120).arg(\n        Arg::new(\"argument\")\n            .help(\"Pass an argument to the program. [default: default-argument]\")\n            .long(\"arg\")\n            .default_value(\"default-argument\")\n            .hide_default_value(true),\n    );\n\n    let expected = str![[r#\"\nUsage: default [OPTIONS]\n\nOptions:\n      --arg <argument>  Pass an argument to the program. [default: default-argument]\n  -h, --help            Print help\n  -V, --version         Print version\n\n\"#]];\n    utils::assert_output(app1, \"default --help\", expected, false);\n\n    let app2 = Command::new(\"default\").version(\"0.1\").term_width(120).arg(\n        Arg::new(\"argument\")\n            .help(\"Pass an argument to the program.\")\n            .long(\"arg\")\n            .default_value(\"default-argument\"),\n    );\n\n    let expected = str![[r#\"\nUsage: default [OPTIONS]\n\nOptions:\n      --arg <argument>  Pass an argument to the program. [default: default-argument]\n  -h, --help            Print help\n  -V, --version         Print version\n\n\"#]];\n    utils::assert_output(app2, \"default --help\", expected, false);\n}\n\n#[test]\nfn empty_default_value() {\n    let app = Command::new(\"default\").version(\"0.1\").term_width(120).arg(\n        Arg::new(\"argument\")\n            .help(\"Pass an argument to the program.\")\n            .long(\"arg\")\n            .default_value(\"\"),\n    );\n\n    let expected = str![[r#\"\nUsage: default [OPTIONS]\n\nOptions:\n      --arg <argument>  Pass an argument to the program. [default: \"\"]\n  -h, --help            Print help\n  -V, --version         Print version\n\n\"#]];\n    utils::assert_output(app, \"default --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn escaped_whitespace_values() {\n    let app1 = Command::new(\"default\").version(\"0.1\").term_width(120).arg(\n        Arg::new(\"argument\")\n            .help(\"Pass an argument to the program.\")\n            .long(\"arg\")\n            .default_value(\"\\n\")\n            .value_parser([\"normal\", \" \", \"\\n\", \"\\t\", \"other\"]),\n    );\n\n    #[cfg(not(feature = \"unstable-v5\"))]\n    let expected = str![[r#\"\nUsage: default [OPTIONS]\n\nOptions:\n      --arg <argument>  Pass an argument to the program. [default: \"\\n\"] [possible values: normal, \" \", \"\\n\", \"\\t\",\n                        other]\n  -h, --help            Print help\n  -V, --version         Print version\n\n\"#]];\n\n    #[cfg(feature = \"unstable-v5\")]\n    let expected = str![[r#\"\nUsage: default [OPTIONS]\n\nOptions:\n      --arg <argument>  Pass an argument to the program. [default: \"\\n\"] [possible values: normal, \"\n                        \", \"\\n\", \"\\t\", other]\n  -h, --help            Print help\n  -V, --version         Print version\n\n\"#]];\n\n    utils::assert_output(app1, \"default --help\", expected, false);\n}\n\nfn issue_1112_setup() -> Command {\n    Command::new(\"test\")\n        .version(\"1.3\")\n        .disable_help_flag(true)\n        .arg(\n            Arg::new(\"help1\")\n                .long(\"help\")\n                .short('h')\n                .help(\"some help\")\n                .action(ArgAction::SetTrue),\n        )\n        .subcommand(\n            Command::new(\"foo\").arg(\n                Arg::new(\"help1\")\n                    .long(\"help\")\n                    .short('h')\n                    .help(\"some help\")\n                    .action(ArgAction::SetTrue),\n            ),\n        )\n}\n\n#[test]\nfn prefer_user_help_long_1112() {\n    let m = issue_1112_setup().try_get_matches_from(vec![\"test\", \"--help\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(*m.get_one::<bool>(\"help1\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn prefer_user_help_short_1112() {\n    let m = issue_1112_setup().try_get_matches_from(vec![\"test\", \"-h\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(*m.get_one::<bool>(\"help1\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn prefer_user_subcmd_help_long_1112() {\n    let m = issue_1112_setup().try_get_matches_from(vec![\"test\", \"foo\", \"--help\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(*m\n        .subcommand_matches(\"foo\")\n        .unwrap()\n        .get_one::<bool>(\"help1\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn prefer_user_subcmd_help_short_1112() {\n    let m = issue_1112_setup().try_get_matches_from(vec![\"test\", \"foo\", \"-h\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m\n        .subcommand_matches(\"foo\")\n        .unwrap()\n        .get_one::<bool>(\"help1\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn issue_1052_require_delim_help() {\n    let cmd = Command::new(\"test\")\n        .author(\"Kevin K.\")\n        .about(\"tests stuff\")\n        .version(\"1.3\")\n        .arg(\n            arg!(-f --fake <s> \"some help\")\n                .required(true)\n                .value_names([\"some\", \"val\"])\n                .action(ArgAction::Set)\n                .value_delimiter(':'),\n        );\n\n    let expected = str![[r#\"\ntests stuff\n\nUsage: test --fake <some> <val>\n\nOptions:\n  -f, --fake <some> <val>  some help\n  -h, --help               Print help\n  -V, --version            Print version\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn custom_headers_headers() {\n    let cmd = Command::new(\"blorp\")\n        .author(\"Will M.\")\n        .about(\"does stuff\")\n        .version(\"1.4\")\n        .arg(\n            arg!(-f --fake <s> \"some help\")\n                .required(true)\n                .value_names([\"some\", \"val\"])\n                .action(ArgAction::Set)\n                .value_delimiter(':'),\n        )\n        .next_help_heading(Some(\"NETWORKING\"))\n        .arg(\n            Arg::new(\"no-proxy\")\n                .short('n')\n                .long(\"no-proxy\")\n                .action(ArgAction::SetTrue)\n                .help(\"Do not use system proxy settings\"),\n        )\n        .args([Arg::new(\"port\").long(\"port\").action(ArgAction::SetTrue)]);\n\n    let expected = str![[r#\"\ndoes stuff\n\nUsage: test [OPTIONS] --fake <some> <val>\n\nOptions:\n  -f, --fake <some> <val>  some help\n  -h, --help               Print help\n  -V, --version            Print version\n\nNETWORKING:\n  -n, --no-proxy  Do not use system proxy settings\n      --port\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn multiple_custom_help_headers() {\n    let cmd = Command::new(\"blorp\")\n        .author(\"Will M.\")\n        .about(\"does stuff\")\n        .version(\"1.4\")\n        .arg(\n            arg!(-f --fake <s> \"some help\")\n                .required(true)\n                .value_names([\"some\", \"val\"])\n                .action(ArgAction::Set)\n                .value_delimiter(':'),\n        )\n        .next_help_heading(Some(\"NETWORKING\"))\n        .arg(\n            Arg::new(\"no-proxy\")\n                .short('n')\n                .long(\"no-proxy\")\n                .action(ArgAction::SetTrue)\n                .help(\"Do not use system proxy settings\"),\n        )\n        .next_help_heading(Some(\"SPECIAL\"))\n        .arg(\n            arg!(-b --\"birthday-song\" <song> \"Change which song is played for birthdays\")\n                .required(true)\n                .help_heading(Some(\"OVERRIDE SPECIAL\")),\n        )\n        .arg(arg!(--style <style> \"Choose musical style to play the song\").help_heading(None))\n        .arg(\n            arg!(\n                -v --\"birthday-song-volume\" <volume> \"Change the volume of the birthday song\"\n            )\n            .required(true),\n        )\n        .next_help_heading(None)\n        .arg(\n            Arg::new(\"server-addr\")\n                .short('a')\n                .long(\"server-addr\")\n                .action(ArgAction::SetTrue)\n                .help(\"Set server address\")\n                .help_heading(Some(\"NETWORKING\")),\n        )\n        .arg(\n            Arg::new(\"speed\")\n                .long(\"speed\")\n                .short('s')\n                .value_name(\"SPEED\")\n                .value_parser([\"fast\", \"slow\"])\n                .help(\"How fast?\")\n                .action(ArgAction::Set),\n        );\n\n    let expected = str![[r#\"\ndoes stuff\n\nUsage: test [OPTIONS] --fake <some> <val> --birthday-song <song> --birthday-song-volume <volume>\n\nOptions:\n  -f, --fake <some> <val>  some help\n      --style <style>      Choose musical style to play the song\n  -s, --speed <SPEED>      How fast? [possible values: fast, slow]\n  -h, --help               Print help\n  -V, --version            Print version\n\nNETWORKING:\n  -n, --no-proxy     Do not use system proxy settings\n  -a, --server-addr  Set server address\n\nOVERRIDE SPECIAL:\n  -b, --birthday-song <song>  Change which song is played for birthdays\n\nSPECIAL:\n  -v, --birthday-song-volume <volume>  Change the volume of the birthday song\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn custom_help_headers_hide_args() {\n    let cmd = Command::new(\"blorp\")\n        .author(\"Will M.\")\n        .about(\"does stuff\")\n        .version(\"1.4\")\n        .next_help_heading(Some(\"NETWORKING\"))\n        .arg(\n            Arg::new(\"no-proxy\")\n                .short('n')\n                .long(\"no-proxy\")\n                .help(\"Do not use system proxy settings\")\n                .hide_short_help(true),\n        )\n        .next_help_heading(Some(\"SPECIAL\"))\n        .arg(\n            arg!(-b --song <song> \"Change which song is played for birthdays\")\n                .required(true)\n                .help_heading(Some(\"OVERRIDE SPECIAL\")),\n        )\n        .arg(\n            arg!(\n                -v --\"song-volume\" <volume> \"Change the volume of the birthday song\"\n            )\n            .required(true),\n        )\n        .next_help_heading(None)\n        .arg(\n            Arg::new(\"server-addr\")\n                .short('a')\n                .long(\"server-addr\")\n                .help(\"Set server address\")\n                .help_heading(Some(\"NETWORKING\"))\n                .hide_short_help(true),\n        );\n\n    let expected = str![[r#\"\ndoes stuff\n\nUsage: test [OPTIONS] --song <song> --song-volume <volume>\n\nOptions:\n  -h, --help     Print help (see more with '--help')\n  -V, --version  Print version\n\nOVERRIDE SPECIAL:\n  -b, --song <song>  Change which song is played for birthdays\n\nSPECIAL:\n  -v, --song-volume <volume>  Change the volume of the birthday song\n\n\"#]];\n    utils::assert_output(cmd, \"test -h\", expected, false);\n}\n\n#[test]\nfn show_long_about_issue_897() {\n    let cmd = Command::new(\"ctest\").version(\"0.1\").subcommand(\n        Command::new(\"foo\")\n            .version(\"0.1\")\n            .about(\"About foo\")\n            .long_about(\"Long about foo\"),\n    );\n\n    let expected = str![[r#\"\nLong about foo\n\nUsage: ctest foo\n\nOptions:\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest foo --help\", expected, false);\n}\n\n#[test]\nfn show_short_about_issue_897() {\n    let cmd = Command::new(\"ctest\").version(\"0.1\").subcommand(\n        Command::new(\"foo\")\n            .version(\"0.1\")\n            .about(\"About foo\")\n            .long_about(\"Long about foo\"),\n    );\n\n    let expected = str![[r#\"\nAbout foo\n\nUsage: ctest foo\n\nOptions:\n  -h, --help     Print help (see more with '--help')\n  -V, --version  Print version\n\n\"#]];\n    utils::assert_output(cmd, \"ctest foo -h\", expected, false);\n}\n\n#[test]\nfn issue_1364_no_short_options() {\n    let cmd = Command::new(\"demo\")\n        .arg(Arg::new(\"foo\").short('f').action(ArgAction::SetTrue))\n        .arg(\n            Arg::new(\"baz\")\n                .short('z')\n                .value_name(\"BAZ\")\n                .hide_short_help(true),\n        )\n        .arg(\n            Arg::new(\"files\")\n                .value_name(\"FILES\")\n                .action(ArgAction::Set)\n                .num_args(1..),\n        );\n\n    let expected = str![[r#\"\nUsage: demo [OPTIONS] [FILES]...\n\nArguments:\n  [FILES]...  \n\nOptions:\n  -f          \n  -h, --help  Print help (see more with '--help')\n\n\"#]];\n    utils::assert_output(cmd, \"demo -h\", expected, false);\n}\n\n#[test]\nfn short_with_value() {\n    let cmd = Command::new(\"demo\").arg(\n        Arg::new(\"baz\")\n            .short('z')\n            .value_name(\"BAZ\")\n            .help(\"Short only\")\n            .help_heading(\"Baz\"),\n    );\n\n    let expected = str![[r#\"\nUsage: demo [OPTIONS]\n\nOptions:\n  -h, --help  Print help\n\nBaz:\n  -z <BAZ>  Short only\n\n\"#]];\n    utils::assert_output(cmd, \"demo -h\", expected, false);\n}\n\n#[test]\nfn short_with_count() {\n    let cmd = Command::new(\"demo\").arg(\n        Arg::new(\"baz\")\n            .short('z')\n            .action(ArgAction::Count)\n            .help(\"Short only\")\n            .help_heading(\"Baz\"),\n    );\n\n    let expected = str![[r#\"\nUsage: demo [OPTIONS]\n\nOptions:\n  -h, --help  Print help\n\nBaz:\n  -z...  Short only\n\n\"#]];\n    utils::assert_output(cmd, \"demo -h\", expected, false);\n}\n\n#[test]\nfn issue_1487() {\n    let cmd = Command::new(\"test\")\n        .arg(Arg::new(\"arg1\").group(\"group1\"))\n        .arg(Arg::new(\"arg2\").group(\"group1\"))\n        .group(\n            ArgGroup::new(\"group1\")\n                .args([\"arg1\", \"arg2\"])\n                .required(true),\n        );\n\n    let expected = str![[r#\"\nUsage: ctest <arg1|arg2>\n\nArguments:\n  [arg1]  \n  [arg2]  \n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"ctest -h\", expected, false);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command::help_expected is enabled for the Command\"]\nfn help_required_but_not_given() {\n    Command::new(\"myapp\")\n        .help_expected(true)\n        .arg(Arg::new(\"foo\"))\n        .try_get_matches_from(empty_args())\n        .unwrap();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command::help_expected is enabled for the Command\"]\nfn help_required_but_not_given_settings_after_args() {\n    Command::new(\"myapp\")\n        .arg(Arg::new(\"foo\"))\n        .help_expected(true)\n        .try_get_matches_from(empty_args())\n        .unwrap();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command::help_expected is enabled for the Command\"]\nfn help_required_but_not_given_for_one_of_two_arguments() {\n    Command::new(\"myapp\")\n        .help_expected(true)\n        .arg(Arg::new(\"foo\"))\n        .arg(Arg::new(\"bar\").help(\"It does bar stuff\"))\n        .try_get_matches_from(empty_args())\n        .unwrap();\n}\n\n#[test]\n#[should_panic = \"List of such arguments: delete\"]\nfn help_required_globally() {\n    Command::new(\"myapp\")\n        .help_expected(true)\n        .arg(Arg::new(\"foo\").help(\"It does foo stuff\"))\n        .subcommand(\n            Command::new(\"bar\")\n                .arg(Arg::new(\"create\").help(\"creates bar\"))\n                .arg(Arg::new(\"delete\")),\n        )\n        .try_get_matches_from(empty_args())\n        .unwrap();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command::help_expected is enabled for the Command\"]\nfn help_required_globally_but_not_given_for_subcommand() {\n    Command::new(\"myapp\")\n        .help_expected(true)\n        .arg(Arg::new(\"foo\").help(\"It does foo stuff\"))\n        .subcommand(\n            Command::new(\"bar\")\n                .arg(Arg::new(\"create\").help(\"creates bar\"))\n                .arg(Arg::new(\"delete\")),\n        )\n        .try_get_matches_from(empty_args())\n        .unwrap();\n}\n\n#[test]\nfn help_required_and_given_for_subcommand() {\n    Command::new(\"myapp\")\n        .help_expected(true)\n        .arg(Arg::new(\"foo\").help(\"It does foo stuff\"))\n        .subcommand(\n            Command::new(\"bar\")\n                .arg(Arg::new(\"create\").help(\"creates bar\"))\n                .arg(Arg::new(\"delete\").help(\"deletes bar\")),\n        )\n        .try_get_matches_from(empty_args())\n        .unwrap();\n}\n\n#[test]\nfn help_required_and_given() {\n    Command::new(\"myapp\")\n        .help_expected(true)\n        .arg(Arg::new(\"foo\").help(\"It does foo stuff\"))\n        .try_get_matches_from(empty_args())\n        .unwrap();\n}\n\n#[test]\nfn help_required_and_no_args() {\n    Command::new(\"myapp\")\n        .help_expected(true)\n        .try_get_matches_from(empty_args())\n        .unwrap();\n}\n\n#[test]\nfn issue_1642_long_help_spacing() {\n    let cmd = Command::new(\"prog\").arg(\n        Arg::new(\"cfg\")\n            .long(\"config\")\n            .action(ArgAction::SetTrue)\n            .long_help(\n                \"The config file used by the myprog must be in JSON format\nwith only valid keys and may not contain other nonsense\nthat cannot be read by this program. Obviously I'm going on\nand on, so I'll stop now.\",\n            ),\n    );\n\n    let expected = str![[r#\"\nUsage: prog [OPTIONS]\n\nOptions:\n      --config\n          The config file used by the myprog must be in JSON format\n          with only valid keys and may not contain other nonsense\n          that cannot be read by this program. Obviously I'm going on\n          and on, so I'll stop now.\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]];\n    utils::assert_output(cmd, \"prog --help\", expected, false);\n}\n\nconst AFTER_HELP_NO_ARGS: &str = \"\\\nUsage: myapp\n\nThis is after help.\n\";\n\n#[test]\nfn after_help_no_args() {\n    let mut cmd = Command::new(\"myapp\")\n        .version(\"1.0\")\n        .disable_help_flag(true)\n        .disable_version_flag(true)\n        .after_help(\"This is after help.\");\n\n    let help = cmd.render_help().to_string();\n\n    assert_eq!(help, AFTER_HELP_NO_ARGS);\n}\n\n#[test]\nfn help_subcmd_help() {\n    let cmd = Command::new(\"myapp\")\n        .subcommand(Command::new(\"subcmd\").subcommand(Command::new(\"multi\").version(\"1.0\")));\n\n    let expected = str![[r#\"\nPrint this message or the help of the given subcommand(s)\n\nUsage: myapp help [COMMAND]...\n\nArguments:\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"myapp help help\", expected, false);\n}\n\n#[test]\nfn subcmd_help_subcmd_help() {\n    let cmd = Command::new(\"myapp\")\n        .subcommand(Command::new(\"subcmd\").subcommand(Command::new(\"multi\").version(\"1.0\")));\n\n    let expected = str![[r#\"\nPrint this message or the help of the given subcommand(s)\n\nUsage: myapp subcmd help [COMMAND]...\n\nArguments:\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"myapp subcmd help help\", expected, false);\n}\n\n#[test]\nfn global_args_should_show_on_toplevel_help_message() {\n    let cmd = Command::new(\"myapp\")\n        .arg(\n            Arg::new(\"someglobal\")\n                .short('g')\n                .long(\"some-global\")\n                .global(true),\n        )\n        .subcommand(Command::new(\"subcmd\").subcommand(Command::new(\"multi\").version(\"1.0\")));\n\n    let expected = str![[r#\"\nUsage: myapp [OPTIONS] [COMMAND]\n\nCommands:\n  subcmd  \n  help    Print this message or the help of the given subcommand(s)\n\nOptions:\n  -g, --some-global <someglobal>  \n  -h, --help                      Print help\n\n\"#]];\n    utils::assert_output(cmd, \"myapp help\", expected, false);\n}\n\n#[test]\nfn global_args_should_not_show_on_help_message_for_help_help() {\n    let cmd = Command::new(\"myapp\")\n        .arg(\n            Arg::new(\"someglobal\")\n                .short('g')\n                .long(\"some-global\")\n                .global(true),\n        )\n        .subcommand(Command::new(\"subcmd\").subcommand(Command::new(\"multi\").version(\"1.0\")));\n\n    let expected = str![[r#\"\nPrint this message or the help of the given subcommand(s)\n\nUsage: myapp help [COMMAND]...\n\nArguments:\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"myapp help help\", expected, false);\n}\n\n#[test]\nfn global_args_should_show_on_help_message_for_subcommand() {\n    let cmd = Command::new(\"myapp\")\n        .arg(\n            Arg::new(\"someglobal\")\n                .short('g')\n                .long(\"some-global\")\n                .global(true),\n        )\n        .subcommand(Command::new(\"subcmd\").subcommand(Command::new(\"multi\").version(\"1.0\")));\n\n    let expected = str![[r#\"\nUsage: myapp subcmd [OPTIONS] [COMMAND]\n\nCommands:\n  multi  \n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n  -g, --some-global <someglobal>  \n  -h, --help                      Print help\n\n\"#]];\n    utils::assert_output(cmd, \"myapp help subcmd\", expected, false);\n}\n\n#[test]\nfn global_args_should_show_on_help_message_for_nested_subcommand() {\n    let cmd = Command::new(\"myapp\")\n        .arg(\n            Arg::new(\"someglobal\")\n                .short('g')\n                .long(\"some-global\")\n                .global(true),\n        )\n        .subcommand(Command::new(\"subcmd\").subcommand(Command::new(\"multi\").version(\"1.0\")));\n\n    let expected = str![[r#\"\nUsage: myapp subcmd multi [OPTIONS]\n\nOptions:\n  -g, --some-global <someglobal>  \n  -h, --help                      Print help\n  -V, --version                   Print version\n\n\"#]];\n    utils::assert_output(cmd, \"myapp help subcmd multi\", expected, false);\n}\n\n#[test]\nfn option_usage_order() {\n    let cmd = Command::new(\"order\").args([\n        Arg::new(\"a\").short('a').action(ArgAction::SetTrue),\n        Arg::new(\"B\").short('B').action(ArgAction::SetTrue),\n        Arg::new(\"b\").short('b').action(ArgAction::SetTrue),\n        Arg::new(\"save\").short('s').action(ArgAction::SetTrue),\n        Arg::new(\"select_file\")\n            .long(\"select_file\")\n            .action(ArgAction::SetTrue),\n        Arg::new(\"select_folder\")\n            .long(\"select_folder\")\n            .action(ArgAction::SetTrue),\n        Arg::new(\"x\").short('x').action(ArgAction::SetTrue),\n    ]);\n\n    let expected = str![[r#\"\nUsage: order [OPTIONS]\n\nOptions:\n  -a                   \n  -B                   \n  -b                   \n  -s                   \n      --select_file    \n      --select_folder  \n  -x                   \n  -h, --help           Print help\n\n\"#]];\n    utils::assert_output(cmd, \"order --help\", expected, false);\n}\n\n#[test]\nfn prefer_about_over_long_about_in_subcommands_list() {\n    let cmd = Command::new(\"about-in-subcommands-list\").subcommand(\n        Command::new(\"sub\")\n            .long_about(\"long about sub\")\n            .about(\"short about sub\"),\n    );\n\n    let expected = str![[r#\"\nUsage: about-in-subcommands-list [COMMAND]\n\nCommands:\n  sub   short about sub\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"about-in-subcommands-list --help\", expected, false);\n}\n\n#[test]\nfn issue_1794_usage() {\n    let cmd = Command::new(\"hello\")\n        .bin_name(\"deno\")\n        .arg(\n            Arg::new(\"option1\")\n                .long(\"option1\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(Arg::new(\"pos1\").action(ArgAction::Set))\n        .group(\n            ArgGroup::new(\"arg1\")\n                .args([\"pos1\", \"option1\"])\n                .required(true),\n        )\n        .arg(Arg::new(\"pos2\").action(ArgAction::Set));\n\n    let expected = str![[r#\"\nUsage: deno <pos1|--option1> [pos2]\n\nArguments:\n  [pos1]  \n  [pos2]  \n\nOptions:\n      --option1  \n  -h, --help     Print help\n\n\"#]];\n    utils::assert_output(cmd, \"deno --help\", expected, false);\n}\n\n#[test]\nfn custom_heading_pos() {\n    let cmd = Command::new(\"test\")\n        .version(\"1.4\")\n        .arg(Arg::new(\"gear\").help(\"Which gear\"))\n        .next_help_heading(Some(\"NETWORKING\"))\n        .arg(Arg::new(\"speed\").help(\"How fast\"));\n\n    let expected = str![[r#\"\nUsage: test [gear] [speed]\n\nArguments:\n  [gear]  Which gear\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\nNETWORKING:\n  [speed]  How fast\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn only_custom_heading_opts_no_args() {\n    let cmd = Command::new(\"test\")\n        .version(\"1.4\")\n        .disable_version_flag(true)\n        .disable_help_flag(true)\n        .arg(arg!(--help).action(ArgAction::Help).hide(true))\n        .next_help_heading(Some(\"NETWORKING\"))\n        .arg(arg!(-s --speed <SPEED> \"How fast\"));\n\n    let expected = str![[r#\"\nUsage: test [OPTIONS]\n\nNETWORKING:\n  -s, --speed <SPEED>  How fast\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn only_custom_heading_pos_no_args() {\n    let cmd = Command::new(\"test\")\n        .version(\"1.4\")\n        .disable_version_flag(true)\n        .disable_help_flag(true)\n        .arg(arg!(--help).action(ArgAction::Help).hide(true))\n        .next_help_heading(Some(\"NETWORKING\"))\n        .arg(Arg::new(\"speed\").help(\"How fast\"));\n\n    let expected = str![[r#\"\nUsage: test [speed]\n\nNETWORKING:\n  [speed]  How fast\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn issue_2508_number_of_values_with_single_value_name() {\n    let cmd = Command::new(\"my_app\")\n        .arg(Arg::new(\"some_arg\").long(\"some_arg\").num_args(2))\n        .arg(\n            Arg::new(\"some_arg_issue\")\n                .long(\"some_arg_issue\")\n                .num_args(2)\n                .value_name(\"ARG\"),\n        );\n\n    let expected = str![[r#\"\nUsage: my_app [OPTIONS]\n\nOptions:\n      --some_arg <some_arg> <some_arg>  \n      --some_arg_issue <ARG> <ARG>      \n  -h, --help                            Print help\n\n\"#]];\n    utils::assert_output(cmd, \"my_app --help\", expected, false);\n}\n\n#[test]\nfn missing_positional_final_required() {\n    let cmd = Command::new(\"test\")\n        .allow_missing_positional(true)\n        .arg(Arg::new(\"arg1\"))\n        .arg(Arg::new(\"arg2\").required(true));\n\n    let expected = str![[r#\"\nUsage: test [arg1] <arg2>\n\nArguments:\n  [arg1]  \n  <arg2>  \n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn missing_positional_final_multiple() {\n    let cmd = Command::new(\"test\")\n        .allow_missing_positional(true)\n        .arg(Arg::new(\"foo\"))\n        .arg(Arg::new(\"bar\"))\n        .arg(Arg::new(\"baz\").action(ArgAction::Set).num_args(1..));\n\n    let expected = str![[r#\"\nUsage: test [foo] [bar] [baz]...\n\nArguments:\n  [foo]     \n  [bar]     \n  [baz]...  \n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn positional_multiple_values_is_dotted() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"foo\")\n            .required(true)\n            .action(ArgAction::Set)\n            .num_args(1..),\n    );\n\n    let expected = str![[r#\"\nUsage: test <foo>...\n\nArguments:\n  <foo>...  \n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"foo\")\n            .required(true)\n            .action(ArgAction::Set)\n            .value_name(\"BAR\")\n            .num_args(1..),\n    );\n\n    let expected = str![[r#\"\nUsage: test <BAR>...\n\nArguments:\n  <BAR>...  \n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn positional_multiple_occurrences_is_dotted() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"foo\")\n            .required(true)\n            .action(ArgAction::Set)\n            .num_args(1..)\n            .action(ArgAction::Append),\n    );\n\n    let expected = str![[r#\"\nUsage: test <foo>...\n\nArguments:\n  <foo>...  \n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"foo\")\n            .required(true)\n            .action(ArgAction::Set)\n            .value_name(\"BAR\")\n            .num_args(1..)\n            .action(ArgAction::Append),\n    );\n\n    let expected = str![[r#\"\nUsage: test <BAR>...\n\nArguments:\n  <BAR>...  \n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn too_few_value_names_is_dotted() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"foo\")\n            .long(\"foo\")\n            .required(true)\n            .action(ArgAction::Set)\n            .num_args(3)\n            .value_names([\"one\", \"two\"]),\n    );\n\n    let expected = str![[r#\"\nUsage: test --foo <one> <two>...\n\nOptions:\n      --foo <one> <two>...  \n  -h, --help                Print help\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\n#[should_panic = \"Argument foo: Too many value names (2) compared to `num_args` (1)\"]\nfn too_many_value_names_panics() {\n    Command::new(\"test\")\n        .arg(\n            Arg::new(\"foo\")\n                .long(\"foo\")\n                .required(true)\n                .action(ArgAction::Set)\n                .num_args(1)\n                .value_names([\"one\", \"two\"]),\n        )\n        .debug_assert();\n}\n\n#[test]\nfn help_enum_arg_with_no_description() {\n    let cmd = Command::new(\"test\").arg(\n        Arg::new(\"config\")\n            .action(ArgAction::Set)\n            // .help(\"No help description for this argument\")\n            .short('c')\n            .long(\"config\")\n            .value_name(\"MODE\")\n            .value_parser([\n                PossibleValue::new(\"fast\"),\n                PossibleValue::new(\"slow\").help(\"slower than fast\"),\n                PossibleValue::new(\"secret speed\").hide(true),\n            ])\n            .default_value(\"fast\"),\n    );\n\n    let expected = str![[r#\"\nUsage: test [OPTIONS]\n\nOptions:\n  -c, --config <MODE>\n          Possible values:\n          - fast\n          - slow: slower than fast\n          \n          [default: fast]\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]];\n    utils::assert_output(cmd, \"test --help\", expected, false);\n}\n\n#[test]\nfn disabled_help_flag() {\n    let res = Command::new(\"foo\")\n        .subcommand(Command::new(\"sub\"))\n        .disable_help_flag(true)\n        .try_get_matches_from(\"foo a\".split(' '));\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::InvalidSubcommand);\n}\n\n#[test]\nfn disabled_help_flag_and_subcommand() {\n    let res = Command::new(\"foo\")\n        .subcommand(Command::new(\"sub\"))\n        .disable_help_flag(true)\n        .disable_help_subcommand(true)\n        .try_get_matches_from(\"foo help\".split(' '));\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::InvalidSubcommand);\n    assert!(\n        err.to_string().ends_with('\\n'),\n        \"Errors should have a trailing newline, got {:?}\",\n        err.to_string()\n    );\n}\n\n#[test]\nfn override_help_subcommand() {\n    let cmd = Command::new(\"bar\")\n        .subcommand(Command::new(\"help\").arg(Arg::new(\"arg\").action(ArgAction::Set)))\n        .subcommand(Command::new(\"not_help\").arg(Arg::new(\"arg\").action(ArgAction::Set)))\n        .disable_help_subcommand(true);\n    let matches = cmd.try_get_matches_from([\"bar\", \"help\", \"foo\"]).unwrap();\n    assert_eq!(\n        matches\n            .subcommand_matches(\"help\")\n            .unwrap()\n            .get_one::<String>(\"arg\")\n            .map(|v| v.as_str()),\n        Some(\"foo\")\n    );\n}\n\n#[test]\nfn override_help_flag_using_long() {\n    let cmd = Command::new(\"foo\")\n        .subcommand(Command::new(\"help\").long_flag(\"help\"))\n        .disable_help_flag(true)\n        .disable_help_subcommand(true);\n    let matches = cmd.try_get_matches_from([\"foo\", \"--help\"]).unwrap();\n    assert!(matches.subcommand_matches(\"help\").is_some());\n}\n\n#[test]\nfn override_help_flag_using_short() {\n    let cmd = Command::new(\"foo\")\n        .disable_help_flag(true)\n        .disable_help_subcommand(true)\n        .subcommand(Command::new(\"help\").short_flag('h'));\n    let matches = cmd.try_get_matches_from([\"foo\", \"-h\"]).unwrap();\n    assert!(matches.subcommand_matches(\"help\").is_some());\n}\n\n#[test]\nfn subcommand_help_doesnt_have_useless_help_flag() {\n    // The main care-about is that the docs and behavior match.  Since the `help` subcommand\n    // currently ignores the `--help` flag, the output shouldn't have it.\n    let cmd = Command::new(\"example\").subcommand(Command::new(\"test\").about(\"Subcommand\"));\n\n    let expected = str![[r#\"\nPrint this message or the help of the given subcommand(s)\n\nUsage: example help [COMMAND]...\n\nArguments:\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"example help help\", expected, false);\n}\n\n#[test]\nfn disable_help_flag_affects_help_subcommand() {\n    let mut cmd = Command::new(\"test_app\")\n        .disable_help_flag(true)\n        .subcommand(Command::new(\"test\").about(\"Subcommand\"));\n    cmd.build();\n\n    let args = cmd\n        .find_subcommand(\"help\")\n        .unwrap()\n        .get_arguments()\n        .map(|a| a.get_id().as_str())\n        .collect::<Vec<_>>();\n    assert!(\n        !args.contains(&\"help\"),\n        \"`help` should not be present: {args:?}\"\n    );\n}\n\n#[test]\nfn dont_propagate_version_to_help_subcommand() {\n    let cmd = Command::new(\"example\")\n        .version(\"1.0\")\n        .propagate_version(true)\n        .subcommand(Command::new(\"subcommand\"));\n\n    let expected = str![[r#\"\nPrint this message or the help of the given subcommand(s)\n\nUsage: example help [COMMAND]...\n\nArguments:\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"example help help\", expected, false);\n\n    cmd.debug_assert();\n}\n\n#[test]\nfn help_without_short() {\n    let mut cmd = Command::new(\"test\")\n        .arg(arg!(-h --hex <NUM>).required(true))\n        .arg(arg!(--help).action(ArgAction::Help))\n        .disable_help_flag(true);\n\n    cmd.build();\n    let help = cmd.get_arguments().find(|a| a.get_id() == \"help\").unwrap();\n    assert_eq!(help.get_short(), None);\n\n    let m = cmd.try_get_matches_from([\"test\", \"-h\", \"0x100\"]).unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"hex\").map(|v| v.as_str()),\n        Some(\"0x100\")\n    );\n}\n\n#[test]\nfn parent_cmd_req_in_usage_with_help_flag() {\n    let cmd = Command::new(\"parent\")\n        .version(\"0.1\")\n        .arg(Arg::new(\"TARGET\").required(true).help(\"some\"))\n        .arg(\n            Arg::new(\"ARGS\")\n                .action(ArgAction::Set)\n                .required(true)\n                .help(\"some\"),\n        )\n        .subcommand(Command::new(\"test\").about(\"some\"));\n\n    let expected = str![[r#\"\nsome\n\nUsage: parent <TARGET> <ARGS> test\n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"parent test --help\", expected, false);\n}\n\n#[test]\nfn parent_cmd_req_in_usage_with_help_subcommand() {\n    let cmd = Command::new(\"parent\")\n        .version(\"0.1\")\n        .arg(Arg::new(\"TARGET\").required(true).help(\"some\"))\n        .arg(\n            Arg::new(\"ARGS\")\n                .action(ArgAction::Set)\n                .required(true)\n                .help(\"some\"),\n        )\n        .subcommand(Command::new(\"test\").about(\"some\"));\n\n    let expected = str![[r#\"\nsome\n\nUsage: parent <TARGET> <ARGS> test\n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"parent help test\", expected, false);\n}\n\n#[test]\nfn parent_cmd_req_in_usage_with_render_help() {\n    let mut cmd = Command::new(\"parent\")\n        .version(\"0.1\")\n        .arg(Arg::new(\"TARGET\").required(true).help(\"some\"))\n        .arg(\n            Arg::new(\"ARGS\")\n                .action(ArgAction::Set)\n                .required(true)\n                .help(\"some\"),\n        )\n        .subcommand(Command::new(\"test\").about(\"some\"));\n    cmd.build();\n    let subcmd = cmd.find_subcommand_mut(\"test\").unwrap();\n\n    let help = subcmd.render_help().to_string();\n    assert_data_eq!(\n        help,\n        str![[r#\"\nsome\n\nUsage: parent <TARGET> <ARGS> test\n\nOptions:\n  -h, --help  Print help\n\n\"#]]\n    );\n}\n\n#[test]\nfn parent_cmd_req_ignored_when_negates_reqs() {\n    let cmd = Command::new(\"ctest\")\n        .arg(arg!(<input>))\n        .subcommand_negates_reqs(true)\n        .subcommand(Command::new(\"subcmd\"));\n\n    let expected = str![[r#\"\nUsage: ctest subcmd\n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"ctest subcmd --help\", expected, false);\n}\n\n#[test]\nfn parent_cmd_req_ignored_when_conflicts() {\n    let cmd = Command::new(\"ctest\")\n        .arg(arg!(<input>))\n        .args_conflicts_with_subcommands(true)\n        .subcommand(Command::new(\"subcmd\"));\n\n    let expected = str![[r#\"\nUsage: ctest subcmd\n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output(cmd, \"ctest subcmd --help\", expected, false);\n}\n\n#[test]\nfn no_wrap_help() {\n    static MULTI_SC_HELP: &str = \"\\\ntests subcommands\n\nUsage: ctest subcmd multi [OPTIONS]\n\nOptions:\n  -f, --flag                  tests flags\n  -o, --option <scoption>...  tests options\n  -h, --help                  Print help\n  -V, --version               Print version\n\";\n    let cmd = Command::new(\"ctest\")\n        .term_width(0)\n        .override_help(MULTI_SC_HELP);\n\n    utils::assert_output(cmd, \"ctest --help\", MULTI_SC_HELP, false);\n}\n\n#[test]\nfn display_name_default() {\n    let mut cmd = Command::new(\"app\").bin_name(\"app.exe\");\n    cmd.build();\n    assert_eq!(cmd.get_display_name(), None);\n}\n\n#[test]\nfn display_name_explicit() {\n    let mut cmd = Command::new(\"app\")\n        .bin_name(\"app.exe\")\n        .display_name(\"app.display\");\n    cmd.build();\n    assert_eq!(cmd.get_display_name(), Some(\"app.display\"));\n}\n\n#[test]\nfn display_name_subcommand_default() {\n    let mut cmd = Command::new(\"parent\").subcommand(Command::new(\"child\").bin_name(\"child.exe\"));\n    cmd.build();\n    assert_eq!(\n        cmd.find_subcommand(\"child\").unwrap().get_display_name(),\n        Some(\"parent-child\")\n    );\n}\n\n#[test]\nfn display_name_subcommand_explicit() {\n    let mut cmd = Command::new(\"parent\").subcommand(\n        Command::new(\"child\")\n            .bin_name(\"child.exe\")\n            .display_name(\"child.display\"),\n    );\n    cmd.build();\n    assert_eq!(\n        cmd.find_subcommand(\"child\").unwrap().get_display_name(),\n        Some(\"child.display\")\n    );\n}\n\n#[test]\nfn flatten_basic() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(Arg::new(\"parent\").long(\"parent\"))\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"test command\")\n                .arg(Arg::new(\"child\").long(\"child\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent test [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\nparent test:\ntest command\n      --child <child>  \n  -h, --help           Print help\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_short_help() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(\n            Arg::new(\"parent\")\n                .long(\"parent\")\n                .help(\"foo\")\n                .long_help(\"bar\"),\n        )\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"test command\")\n                .long_about(\"long some\")\n                .arg(Arg::new(\"child\").long(\"child\").help(\"foo\").long_help(\"bar\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent test [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>  foo\n  -h, --help             Print help (see more with '--help')\n\nparent test:\ntest command\n      --child <child>  foo\n  -h, --help           Print help (see more with '--help')\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_long_help() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(\n            Arg::new(\"parent\")\n                .long(\"parent\")\n                .help(\"foo\")\n                .long_help(\"bar\"),\n        )\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"test command\")\n                .long_about(\"long some\")\n                .arg(Arg::new(\"child\").long(\"child\").help(\"foo\").long_help(\"bar\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent test [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>\n          bar\n\n  -h, --help\n          Print help (see a summary with '-h')\n\nparent test:\ntest command\n      --child <child>\n          bar\n\n  -h, --help\n          Print help (see a summary with '-h')\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...\n          Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent --help\", expected, false);\n}\n\n#[test]\nfn flatten_help_cmd() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(\n            Arg::new(\"parent\")\n                .long(\"parent\")\n                .help(\"foo\")\n                .long_help(\"bar\"),\n        )\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"test command\")\n                .long_about(\"long some\")\n                .arg(Arg::new(\"child\").long(\"child\").help(\"foo\").long_help(\"bar\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent test [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>\n          bar\n\n  -h, --help\n          Print help (see a summary with '-h')\n\nparent test:\ntest command\n      --child <child>\n          bar\n\n  -h, --help\n          Print help (see a summary with '-h')\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...\n          Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent help\", expected, false);\n}\n\n#[test]\nfn flatten_with_global() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(Arg::new(\"parent\").long(\"parent\").global(true))\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"test command\")\n                .arg(Arg::new(\"child\").long(\"child\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent test [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\nparent test:\ntest command\n      --child <child>  \n  -h, --help           Print help\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_arg_required() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(Arg::new(\"parent\").long(\"parent\").required(true))\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"test command\")\n                .arg(Arg::new(\"child\").long(\"child\").required(true)),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent --parent <parent>\n       parent --parent <parent> test --child <child>\n       parent --parent <parent> help [COMMAND]...\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\nparent --parent <parent> test:\ntest command\n      --child <child>  \n  -h, --help           Print help\n\nparent --parent <parent> help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_with_external_subcommand() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .allow_external_subcommands(true)\n        .arg(Arg::new(\"parent\").long(\"parent\"))\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"test command\")\n                .arg(Arg::new(\"child\").long(\"child\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent test [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\nparent test:\ntest command\n      --child <child>  \n  -h, --help           Print help\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_without_subcommands() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(Arg::new(\"parent\").long(\"parent\"));\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_with_subcommand_required() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .subcommand_required(true)\n        .arg(Arg::new(\"parent\").long(\"parent\"))\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"test command\")\n                .arg(Arg::new(\"child\").long(\"child\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent test [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\nparent test:\ntest command\n      --child <child>  \n  -h, --help           Print help\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_with_args_conflicts_with_subcommands() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .subcommand_required(true)\n        .args_conflicts_with_subcommands(true)\n        .arg(Arg::new(\"parent\").long(\"parent\"))\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"test command\")\n                .arg(Arg::new(\"child\").long(\"child\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent test [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\nparent test:\ntest command\n      --child <child>  \n  -h, --help           Print help\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_single_hidden_command() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(Arg::new(\"parent\").long(\"parent\"))\n        .subcommand(\n            Command::new(\"child1\")\n                .hide(true)\n                .about(\"child1 command\")\n                .arg(Arg::new(\"child\").long(\"child1\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_hidden_command() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(Arg::new(\"parent\").long(\"parent\"))\n        .subcommand(\n            Command::new(\"child1\")\n                .about(\"child1 command\")\n                .arg(Arg::new(\"child\").long(\"child1\")),\n        )\n        .subcommand(\n            Command::new(\"child2\")\n                .about(\"child2 command\")\n                .arg(Arg::new(\"child\").long(\"child2\")),\n        )\n        .subcommand(\n            Command::new(\"child3\")\n                .hide(true)\n                .about(\"child3 command\")\n                .arg(Arg::new(\"child\").long(\"child3\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent child1 [OPTIONS]\n       parent child2 [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\nparent child1:\nchild1 command\n      --child1 <child>  \n  -h, --help            Print help\n\nparent child2:\nchild2 command\n      --child2 <child>  \n  -h, --help            Print help\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_recursive() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(Arg::new(\"parent\").long(\"parent\"))\n        .subcommand(\n            Command::new(\"child1\")\n                .flatten_help(true)\n                .about(\"child1 command\")\n                .arg(Arg::new(\"child\").long(\"child1\"))\n                .subcommand(\n                    Command::new(\"grandchild1\")\n                        .flatten_help(true)\n                        .about(\"grandchild1 command\")\n                        .arg(Arg::new(\"grandchild\").long(\"grandchild1\"))\n                        .subcommand(\n                            Command::new(\"greatgrandchild1\")\n                                .about(\"greatgrandchild1 command\")\n                                .arg(Arg::new(\"greatgrandchild\").long(\"greatgrandchild1\")),\n                        )\n                        .subcommand(\n                            Command::new(\"greatgrandchild2\")\n                                .about(\"greatgrandchild2 command\")\n                                .arg(Arg::new(\"greatgrandchild\").long(\"greatgrandchild2\")),\n                        )\n                        .subcommand(\n                            Command::new(\"greatgrandchild3\")\n                                .about(\"greatgrandchild3 command\")\n                                .arg(Arg::new(\"greatgrandchild\").long(\"greatgrandchild3\")),\n                        ),\n                )\n                .subcommand(\n                    Command::new(\"grandchild2\")\n                        .about(\"grandchild2 command\")\n                        .arg(Arg::new(\"grandchild\").long(\"grandchild2\")),\n                )\n                .subcommand(\n                    Command::new(\"grandchild3\")\n                        .about(\"grandchild3 command\")\n                        .arg(Arg::new(\"grandchild\").long(\"grandchild3\")),\n                ),\n        )\n        .subcommand(\n            Command::new(\"child2\")\n                .about(\"child2 command\")\n                .arg(Arg::new(\"child\").long(\"child2\")),\n        )\n        .subcommand(\n            Command::new(\"child3\")\n                .hide(true)\n                .about(\"child3 command\")\n                .arg(Arg::new(\"child\").long(\"child3\"))\n                .subcommand(\n                    Command::new(\"grandchild1\")\n                        .flatten_help(true)\n                        .about(\"grandchild1 command\")\n                        .arg(Arg::new(\"grandchild\").long(\"grandchild1\"))\n                        .subcommand(\n                            Command::new(\"greatgrandchild1\")\n                                .about(\"greatgrandchild1 command\")\n                                .arg(Arg::new(\"greatgrandchild\").long(\"greatgrandchild1\")),\n                        )\n                        .subcommand(\n                            Command::new(\"greatgrandchild2\")\n                                .about(\"greatgrandchild2 command\")\n                                .arg(Arg::new(\"greatgrandchild\").long(\"greatgrandchild2\")),\n                        )\n                        .subcommand(\n                            Command::new(\"greatgrandchild3\")\n                                .about(\"greatgrandchild3 command\")\n                                .arg(Arg::new(\"greatgrandchild\").long(\"greatgrandchild3\")),\n                        ),\n                )\n                .subcommand(\n                    Command::new(\"grandchild2\")\n                        .about(\"grandchild2 command\")\n                        .arg(Arg::new(\"grandchild\").long(\"grandchild2\")),\n                )\n                .subcommand(\n                    Command::new(\"grandchild3\")\n                        .about(\"grandchild3 command\")\n                        .arg(Arg::new(\"grandchild\").long(\"grandchild3\")),\n                ),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent child1 [OPTIONS]\n       parent child1 grandchild1 [OPTIONS]\n       parent child1 grandchild1 greatgrandchild1 [OPTIONS]\n       parent child1 grandchild1 greatgrandchild2 [OPTIONS]\n       parent child1 grandchild1 greatgrandchild3 [OPTIONS]\n       parent child1 grandchild1 help [COMMAND]\n       parent child1 grandchild2 [OPTIONS]\n       parent child1 grandchild3 [OPTIONS]\n       parent child1 help [COMMAND]\n       parent child2 [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\nparent child1:\nchild1 command\n      --child1 <child>  \n  -h, --help            Print help\n\nparent child1 grandchild1:\ngrandchild1 command\n      --grandchild1 <grandchild>  \n  -h, --help                      Print help\n\nparent child1 grandchild1 greatgrandchild1:\ngreatgrandchild1 command\n      --greatgrandchild1 <greatgrandchild>  \n  -h, --help                                Print help\n\nparent child1 grandchild1 greatgrandchild2:\ngreatgrandchild2 command\n      --greatgrandchild2 <greatgrandchild>  \n  -h, --help                                Print help\n\nparent child1 grandchild1 greatgrandchild3:\ngreatgrandchild3 command\n      --greatgrandchild3 <greatgrandchild>  \n  -h, --help                                Print help\n\nparent child1 grandchild1 help:\nPrint this message or the help of the given subcommand(s)\n\nparent child1 grandchild2:\ngrandchild2 command\n      --grandchild2 <grandchild>  \n  -h, --help                      Print help\n\nparent child1 grandchild3:\ngrandchild3 command\n      --grandchild3 <grandchild>  \n  -h, --help                      Print help\n\nparent child1 help:\nPrint this message or the help of the given subcommand(s)\n\nparent child2:\nchild2 command\n      --child2 <child>  \n  -h, --help            Print help\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn flatten_not_recursive() {\n    let cmd = Command::new(\"parent\")\n        .flatten_help(true)\n        .about(\"parent command\")\n        .arg(Arg::new(\"parent\").long(\"parent\"))\n        .subcommand(\n            Command::new(\"child1\")\n                .about(\"child1 command\")\n                .arg(Arg::new(\"child\").long(\"child1\"))\n                .subcommand(\n                    Command::new(\"grandchild1\")\n                        .about(\"grandchild1 command\")\n                        .arg(Arg::new(\"grandchild\").long(\"grandchild1\")),\n                )\n                .subcommand(\n                    Command::new(\"grandchild2\")\n                        .about(\"grandchild2 command\")\n                        .arg(Arg::new(\"grandchild\").long(\"grandchild2\")),\n                )\n                .subcommand(\n                    Command::new(\"grandchild3\")\n                        .about(\"grandchild3 command\")\n                        .arg(Arg::new(\"grandchild\").long(\"grandchild3\")),\n                ),\n        )\n        .subcommand(\n            Command::new(\"child2\")\n                .about(\"child2 command\")\n                .arg(Arg::new(\"child\").long(\"child2\")),\n        )\n        .subcommand(\n            Command::new(\"child3\")\n                .about(\"child3 command\")\n                .arg(Arg::new(\"child\").long(\"child3\")),\n        );\n\n    let expected = str![[r#\"\nparent command\n\nUsage: parent [OPTIONS]\n       parent child1 [OPTIONS] [COMMAND]\n       parent child2 [OPTIONS]\n       parent child3 [OPTIONS]\n       parent help [COMMAND]...\n\nOptions:\n      --parent <parent>  \n  -h, --help             Print help\n\nparent child1:\nchild1 command\n      --child1 <child>  \n  -h, --help            Print help\n\nparent child2:\nchild2 command\n      --child2 <child>  \n  -h, --help            Print help\n\nparent child3:\nchild3 command\n      --child3 <child>  \n  -h, --help            Print help\n\nparent help:\nPrint this message or the help of the given subcommand(s)\n  [COMMAND]...  Print help for the subcommand(s)\n\n\"#]];\n    utils::assert_output(cmd, \"parent -h\", expected, false);\n}\n\n#[test]\nfn mixed_argument_types() {\n    let cmd = Command::new(\"myprog\")\n        .about(\"mixed arguments\")\n        .next_help_heading(\"Mixed\")\n        .arg(arg!(-b --both \"Both long and short\"))\n        .arg(arg!(--long \"Long only\"))\n        .arg(arg!(<POSITIONAL> \"Positional\"));\n\n    let expected = str![[r#\"\nmixed arguments\n\nUsage: myprog [OPTIONS] <POSITIONAL>\n\nOptions:\n  -h, --help  Print help\n\nMixed:\n  -b, --both    Both long and short\n      --long    Long only\n  <POSITIONAL>  Positional\n\n\"#]];\n    utils::assert_output(cmd, \"myprog --help\", expected, false);\n}\n\n#[test]\nfn mixed_argument_types_short_positional() {\n    let cmd = Command::new(\"myprog\")\n        .about(\"mixed arguments\")\n        .next_help_heading(\"Mixed\")\n        .arg(arg!(-b --both \"Both long and short\"))\n        .arg(arg!(--long \"Long only\"))\n        .arg(arg!(<S> \"Short positional\"));\n\n    let expected = str![[r#\"\nmixed arguments\n\nUsage: myprog [OPTIONS] <S>\n\nOptions:\n  -h, --help  Print help\n\nMixed:\n  -b, --both  Both long and short\n      --long  Long only\n  <S>         Short positional\n\n\"#]];\n    utils::assert_output(cmd, \"myprog --help\", expected, false);\n}\n\n#[test]\nfn mixed_argument_types_no_short() {\n    let cmd = Command::new(\"myprog\")\n        .about(\"mixed arguments\")\n        .next_help_heading(\"Mixed\")\n        .arg(arg!(--long \"Long only\"))\n        .arg(arg!(<POSITIONAL> \"Positional\"));\n\n    let expected = str![[r#\"\nmixed arguments\n\nUsage: myprog [OPTIONS] <POSITIONAL>\n\nOptions:\n  -h, --help  Print help\n\nMixed:\n      --long    Long only\n  <POSITIONAL>  Positional\n\n\"#]];\n    utils::assert_output(cmd, \"myprog --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn next_line_command_short() {\n    let value_name = \"V\";\n    let text = \"Hello\";\n\n    let cmd = Command::new(\"test\")\n        .term_width(120)\n        .next_line_help(true)\n        .args([\n            Arg::new(\"default\")\n                .long(\"default\")\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n            Arg::new(\"next_line_help_false\")\n                .long(\"next_line_help_false\")\n                .next_line_help(false)\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n            Arg::new(\"next_line_help_true\")\n                .long(\"next_line_help_true\")\n                .next_line_help(true)\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n        ])\n        .subcommands([\n            Command::new(\"default\").about(text).long_about(text),\n            Command::new(\"next_line_help_false\")\n                .next_line_help(false)\n                .about(text)\n                .long_about(text),\n            Command::new(\"next_line_help_true\")\n                .next_line_help(true)\n                .about(text)\n                .long_about(text),\n        ]);\n\n    let expected = str![[r#\"\nUsage: myprog [OPTIONS] [COMMAND]\n\nCommands:\n  default\n          Hello\n  next_line_help_false\n          Hello\n  next_line_help_true\n          Hello\n  help\n          Print this message or the help of the given subcommand(s)\n\nOptions:\n      --default <V>\n          Hello\n      --next_line_help_false <V>\n          Hello\n      --next_line_help_true <V>\n          Hello\n  -h, --help\n          Print help (see more with '--help')\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"myprog -h\", expected, false);\n\n    let expected = str![[r#\"\nUsage: myprog [OPTIONS] [COMMAND]\n\nCommands:\n  default\n          Hello\n  next_line_help_false\n          Hello\n  next_line_help_true\n          Hello\n  help\n          Print this message or the help of the given subcommand(s)\n\nOptions:\n      --default <V>\n          Hello\n\n      --next_line_help_false <V>\n          Hello\n\n      --next_line_help_true <V>\n          Hello\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]];\n    utils::assert_output(cmd, \"myprog --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn next_line_arg_short() {\n    let value_name = \"V\";\n    let text = \"Hello\";\n\n    let cmd = Command::new(\"test\")\n        .term_width(120)\n        .next_line_help(true)\n        .args([\n            Arg::new(\"default\")\n                .long(\"default\")\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n            Arg::new(\"next_line_help_false\")\n                .long(\"next_line_help_false\")\n                .next_line_help(false)\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n            Arg::new(\"next_line_help_true\")\n                .long(\"next_line_help_true\")\n                .next_line_help(true)\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n        ])\n        .subcommands([\n            Command::new(\"default\").about(text).long_about(text),\n            Command::new(\"next_line_help_false\")\n                .next_line_help(false)\n                .about(text)\n                .long_about(text),\n            Command::new(\"next_line_help_true\")\n                .next_line_help(true)\n                .about(text)\n                .long_about(text),\n        ]);\n\n    let expected = str![[r#\"\nUsage: myprog [OPTIONS] [COMMAND]\n\nCommands:\n  default\n          Hello\n  next_line_help_false\n          Hello\n  next_line_help_true\n          Hello\n  help\n          Print this message or the help of the given subcommand(s)\n\nOptions:\n      --default <V>\n          Hello\n      --next_line_help_false <V>\n          Hello\n      --next_line_help_true <V>\n          Hello\n  -h, --help\n          Print help (see more with '--help')\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"myprog -h\", expected, false);\n\n    let expected = str![[r#\"\nUsage: myprog [OPTIONS] [COMMAND]\n\nCommands:\n  default\n          Hello\n  next_line_help_false\n          Hello\n  next_line_help_true\n          Hello\n  help\n          Print this message or the help of the given subcommand(s)\n\nOptions:\n      --default <V>\n          Hello\n\n      --next_line_help_false <V>\n          Hello\n\n      --next_line_help_true <V>\n          Hello\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]];\n    utils::assert_output(cmd, \"myprog --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn next_line_command_wrapped() {\n    let value_name = \"SOME_LONG_VALUE\";\n    let text = \"Also do versioning for private crates (will not be published)\n\nSpecify inter dependency version numbers exactly with `=`\n\nDo not commit version changes\n\nDo not push generated commit and tags to git remote\n\";\n\n    let cmd = Command::new(\"test\")\n        .term_width(67)\n        .next_line_help(true)\n        .args([\n            Arg::new(\"default\")\n                .long(\"default\")\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n            Arg::new(\"next_line_help_false\")\n                .long(\"next_line_help_false\")\n                .next_line_help(false)\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n            Arg::new(\"next_line_help_true\")\n                .long(\"next_line_help_true\")\n                .next_line_help(true)\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n        ])\n        .subcommands([\n            Command::new(\"default\").about(text).long_about(text),\n            Command::new(\"next_line_help_false\")\n                .next_line_help(false)\n                .about(text)\n                .long_about(text),\n            Command::new(\"next_line_help_true\")\n                .next_line_help(true)\n                .about(text)\n                .long_about(text),\n        ]);\n\n    let expected = str![[r#\"\nUsage: myprog [OPTIONS] [COMMAND]\n\nCommands:\n  default\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  next_line_help_false\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  next_line_help_true\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  help\n          Print this message or the help of the given subcommand(s)\n\nOptions:\n      --default <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n      --next_line_help_false <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n      --next_line_help_true <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  -h, --help\n          Print help (see more with '--help')\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"myprog -h\", expected, false);\n\n    let expected = str![[r#\"\nUsage: myprog [OPTIONS] [COMMAND]\n\nCommands:\n  default\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  next_line_help_false\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  next_line_help_true\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  help\n          Print this message or the help of the given subcommand(s)\n\nOptions:\n      --default <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n\n      --next_line_help_false <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n\n      --next_line_help_true <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]];\n    utils::assert_output(cmd, \"myprog --help\", expected, false);\n}\n\n#[test]\n#[cfg(feature = \"wrap_help\")]\nfn next_line_arg_wrapped() {\n    let value_name = \"SOME_LONG_VALUE\";\n    let text = \"Also do versioning for private crates (will not be published)\n\nSpecify inter dependency version numbers exactly with `=`\n\nDo not commit version changes\n\nDo not push generated commit and tags to git remote\n\";\n\n    let cmd = Command::new(\"test\")\n        .term_width(67)\n        .next_line_help(true)\n        .args([\n            Arg::new(\"default\")\n                .long(\"default\")\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n            Arg::new(\"next_line_help_false\")\n                .long(\"next_line_help_false\")\n                .next_line_help(false)\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n            Arg::new(\"next_line_help_true\")\n                .long(\"next_line_help_true\")\n                .next_line_help(true)\n                .value_name(value_name)\n                .help(text)\n                .long_help(text),\n        ])\n        .subcommands([\n            Command::new(\"default\").about(text).long_about(text),\n            Command::new(\"next_line_help_false\")\n                .next_line_help(false)\n                .about(text)\n                .long_about(text),\n            Command::new(\"next_line_help_true\")\n                .next_line_help(true)\n                .about(text)\n                .long_about(text),\n        ]);\n\n    let expected = str![[r#\"\nUsage: myprog [OPTIONS] [COMMAND]\n\nCommands:\n  default\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  next_line_help_false\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  next_line_help_true\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  help\n          Print this message or the help of the given subcommand(s)\n\nOptions:\n      --default <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n      --next_line_help_false <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n      --next_line_help_true <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  -h, --help\n          Print help (see more with '--help')\n\n\"#]];\n    utils::assert_output(cmd.clone(), \"myprog -h\", expected, false);\n\n    let expected = str![[r#\"\nUsage: myprog [OPTIONS] [COMMAND]\n\nCommands:\n  default\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  next_line_help_false\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  next_line_help_true\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n  help\n          Print this message or the help of the given subcommand(s)\n\nOptions:\n      --default <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n\n      --next_line_help_false <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n\n      --next_line_help_true <SOME_LONG_VALUE>\n          Also do versioning for private crates (will not be\n          published)\n          \n          Specify inter dependency version numbers exactly with `=`\n          \n          Do not commit version changes\n          \n          Do not push generated commit and tags to git remote\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]];\n    utils::assert_output(cmd, \"myprog --help\", expected, false);\n}\n"
  },
  {
    "path": "tests/builder/help_env.rs",
    "content": "#![cfg(feature = \"env\")]\n\nuse std::env;\n\nuse clap::{Arg, ArgAction, Command};\n\nuse super::utils;\n\nstatic HIDE_ENV: &str = \"\\\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe <FILE>  A coffeehouse, coffee shop, or café.\n  -h, --help         Print help\n  -V, --version      Print version\n\";\n\nstatic SHOW_ENV: &str = \"\\\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe <FILE>  A coffeehouse, coffee shop, or café. [env: ENVVAR=MYVAL]\n  -h, --help         Print help\n  -V, --version      Print version\n\";\n\nstatic HIDE_ENV_VALS: &str = \"\\\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe <FILE>  A coffeehouse, coffee shop, or café. [env: ENVVAR]\n  -h, --help         Print help\n  -V, --version      Print version\n\";\n\nstatic SHOW_ENV_VALS: &str = \"\\\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe <FILE>  A coffeehouse, coffee shop, or café. [env: ENVVAR=MYVAL]\n  -h, --help         Print help\n  -V, --version      Print version\n\";\n\nstatic HIDE_ENV_FLAG: &str = \"\\\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe     A coffeehouse, coffee shop, or café.\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\nstatic SHOW_ENV_FLAG: &str = \"\\\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe     A coffeehouse, coffee shop, or café. [env: ENVVAR=MYVAL]\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\nstatic HIDE_ENV_VALS_FLAG: &str = \"\\\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe     A coffeehouse, coffee shop, or café. [env: ENVVAR]\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\nstatic SHOW_ENV_VALS_FLAG: &str = \"\\\nUsage: ctest [OPTIONS]\n\nOptions:\n  -c, --cafe     A coffeehouse, coffee shop, or café. [env: ENVVAR=MYVAL]\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n#[test]\nfn hide_env() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"ENVVAR\", \"MYVAL\");\n    }\n\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"cafe\")\n            .short('c')\n            .long(\"cafe\")\n            .value_name(\"FILE\")\n            .hide_env(true)\n            .env(\"ENVVAR\")\n            .help(\"A coffeehouse, coffee shop, or café.\")\n            .action(ArgAction::Set),\n    );\n\n    utils::assert_output(cmd, \"ctest --help\", HIDE_ENV, false);\n}\n\n#[test]\nfn show_env() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"ENVVAR\", \"MYVAL\");\n    }\n\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"cafe\")\n            .short('c')\n            .long(\"cafe\")\n            .value_name(\"FILE\")\n            .env(\"ENVVAR\")\n            .help(\"A coffeehouse, coffee shop, or café.\")\n            .action(ArgAction::Set),\n    );\n\n    utils::assert_output(cmd, \"ctest --help\", SHOW_ENV, false);\n}\n\n#[test]\nfn hide_env_vals() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"ENVVAR\", \"MYVAL\");\n    }\n\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"cafe\")\n            .short('c')\n            .long(\"cafe\")\n            .value_name(\"FILE\")\n            .hide_env_values(true)\n            .env(\"ENVVAR\")\n            .help(\"A coffeehouse, coffee shop, or café.\")\n            .action(ArgAction::Set),\n    );\n\n    utils::assert_output(cmd, \"ctest --help\", HIDE_ENV_VALS, false);\n}\n\n#[test]\nfn show_env_vals() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"ENVVAR\", \"MYVAL\");\n    }\n\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"cafe\")\n            .short('c')\n            .long(\"cafe\")\n            .value_name(\"FILE\")\n            .env(\"ENVVAR\")\n            .help(\"A coffeehouse, coffee shop, or café.\")\n            .action(ArgAction::Set),\n    );\n\n    utils::assert_output(cmd, \"ctest --help\", SHOW_ENV_VALS, false);\n}\n\n#[test]\nfn hide_env_flag() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"ENVVAR\", \"MYVAL\");\n    }\n\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"cafe\")\n            .short('c')\n            .long(\"cafe\")\n            .action(ArgAction::SetTrue)\n            .hide_env(true)\n            .env(\"ENVVAR\")\n            .help(\"A coffeehouse, coffee shop, or café.\"),\n    );\n\n    utils::assert_output(cmd, \"ctest --help\", HIDE_ENV_FLAG, false);\n}\n\n#[test]\nfn show_env_flag() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"ENVVAR\", \"MYVAL\");\n    }\n\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"cafe\")\n            .short('c')\n            .long(\"cafe\")\n            .action(ArgAction::SetTrue)\n            .env(\"ENVVAR\")\n            .help(\"A coffeehouse, coffee shop, or café.\"),\n    );\n\n    utils::assert_output(cmd, \"ctest --help\", SHOW_ENV_FLAG, false);\n}\n\n#[test]\nfn hide_env_vals_flag() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"ENVVAR\", \"MYVAL\");\n    }\n\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"cafe\")\n            .short('c')\n            .long(\"cafe\")\n            .action(ArgAction::SetTrue)\n            .hide_env_values(true)\n            .env(\"ENVVAR\")\n            .help(\"A coffeehouse, coffee shop, or café.\"),\n    );\n\n    utils::assert_output(cmd, \"ctest --help\", HIDE_ENV_VALS_FLAG, false);\n}\n\n#[test]\nfn show_env_vals_flag() {\n    // SAFETY: pure rust, nothing going through libc\n    unsafe {\n        env::set_var(\"ENVVAR\", \"MYVAL\");\n    }\n\n    let cmd = Command::new(\"ctest\").version(\"0.1\").arg(\n        Arg::new(\"cafe\")\n            .short('c')\n            .long(\"cafe\")\n            .action(ArgAction::SetTrue)\n            .env(\"ENVVAR\")\n            .help(\"A coffeehouse, coffee shop, or café.\"),\n    );\n\n    utils::assert_output(cmd, \"ctest --help\", SHOW_ENV_VALS_FLAG, false);\n}\n"
  },
  {
    "path": "tests/builder/hidden_args.rs",
    "content": "use super::utils;\n\nuse clap::{arg, builder::PossibleValue, Arg, ArgAction, Command};\n\nstatic HIDDEN_ARGS: &str = \"\\\ntests stuff\n\nUsage: test [OPTIONS]\n\nOptions:\n  -F, --flag2         some other flag\n      --option <opt>  some option\n  -h, --help          Print help\n  -V, --version       Print version\n\";\n\n#[test]\nfn hide_args() {\n    let cmd = Command::new(\"test\")\n        .author(\"Kevin K.\")\n        .about(\"tests stuff\")\n        .version(\"1.4\")\n        .args([\n            arg!(-f --flag \"some flag\").hide(true),\n            arg!(-F --flag2 \"some other flag\"),\n            arg!(--option <opt> \"some option\"),\n            Arg::new(\"DUMMY\").hide(true),\n        ]);\n    utils::assert_output(cmd, \"test --help\", HIDDEN_ARGS, false);\n}\n\nstatic HIDDEN_SHORT_ARGS: &str = \"\\\nhides short args\n\nUsage: test [OPTIONS]\n\nOptions:\n  -v, --visible  This text should be visible\n  -h, --help     Print help (see more with '--help')\n  -V, --version  Print version\n\";\n\n/// Ensure hide with short option\n#[test]\nfn hide_short_args() {\n    let cmd = Command::new(\"test\")\n        .about(\"hides short args\")\n        .author(\"Steve P.\")\n        .version(\"2.31.2\")\n        .args([\n            Arg::new(\"cfg\")\n                .short('c')\n                .long(\"config\")\n                .hide_short_help(true)\n                .action(ArgAction::SetTrue)\n                .help(\"Some help text describing the --config arg\"),\n            Arg::new(\"visible\")\n                .short('v')\n                .long(\"visible\")\n                .action(ArgAction::SetTrue)\n                .help(\"This text should be visible\"),\n        ]);\n\n    utils::assert_output(cmd, \"test -h\", HIDDEN_SHORT_ARGS, false);\n}\n\n/// Ensure visible with opposite option\n#[test]\nfn hide_short_args_long_help() {\n    static HIDDEN_SHORT_ARGS_LONG_HELP: &str = \"\\\nhides short args\n\nUsage: test [OPTIONS]\n\nOptions:\n  -c, --config\n          Some help text describing the --config arg\n\n  -v, --visible\n          This text should be visible\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\";\n\n    let cmd = Command::new(\"test\")\n        .about(\"hides short args\")\n        .author(\"Steve P.\")\n        .version(\"2.31.2\")\n        .args([\n            Arg::new(\"cfg\")\n                .short('c')\n                .long(\"config\")\n                .hide_short_help(true)\n                .action(ArgAction::SetTrue)\n                .help(\"Some help text describing the --config arg\"),\n            Arg::new(\"visible\")\n                .short('v')\n                .long(\"visible\")\n                .action(ArgAction::SetTrue)\n                .help(\"This text should be visible\"),\n        ]);\n\n    utils::assert_output(cmd, \"test --help\", HIDDEN_SHORT_ARGS_LONG_HELP, false);\n}\n\nstatic HIDDEN_LONG_ARGS: &str = \"\\\nhides long args\n\nUsage: test [OPTIONS]\n\nOptions:\n  -v, --visible\n          This text should be visible\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\";\n\n#[test]\nfn hide_long_args() {\n    let cmd = Command::new(\"test\")\n        .about(\"hides long args\")\n        .author(\"Steve P.\")\n        .version(\"2.31.2\")\n        .args([\n            Arg::new(\"cfg\")\n                .short('c')\n                .long(\"config\")\n                .hide_long_help(true)\n                .action(ArgAction::SetTrue)\n                .help(\"Some help text describing the --config arg\"),\n            Arg::new(\"visible\")\n                .short('v')\n                .long(\"visible\")\n                .action(ArgAction::SetTrue)\n                .help(\"This text should be visible\"),\n        ]);\n\n    utils::assert_output(cmd, \"test --help\", HIDDEN_LONG_ARGS, false);\n}\n\nstatic HIDDEN_LONG_ARGS_SHORT_HELP: &str = \"\\\nhides long args\n\nUsage: test [OPTIONS]\n\nOptions:\n  -c, --config   Some help text describing the --config arg\n  -v, --visible  This text should be visible\n  -h, --help     Print help (see more with '--help')\n  -V, --version  Print version\n\";\n\n#[test]\nfn hide_long_args_short_help() {\n    let cmd = Command::new(\"test\")\n        .about(\"hides long args\")\n        .author(\"Steve P.\")\n        .version(\"2.31.2\")\n        .args([\n            Arg::new(\"cfg\")\n                .short('c')\n                .long(\"config\")\n                .hide_long_help(true)\n                .action(ArgAction::SetTrue)\n                .help(\"Some help text describing the --config arg\"),\n            Arg::new(\"visible\")\n                .short('v')\n                .long(\"visible\")\n                .action(ArgAction::SetTrue)\n                .help(\"This text should be visible\"),\n        ]);\n\n    utils::assert_output(cmd, \"test -h\", HIDDEN_LONG_ARGS_SHORT_HELP, false);\n}\n\nstatic HIDDEN_POS_ARGS: &str = \"\\\nUsage: test [another]\n\nArguments:\n  [another]  another pos\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n#[test]\nfn hide_pos_args() {\n    let cmd = Command::new(\"test\").version(\"1.4\").args([\n        Arg::new(\"pos\").help(\"some pos\").hide(true),\n        Arg::new(\"another\").help(\"another pos\"),\n    ]);\n\n    utils::assert_output(cmd, \"test --help\", HIDDEN_POS_ARGS, false);\n}\n\nstatic HIDDEN_SUBCMDS: &str = \"\\\nUsage: test\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n#[test]\nfn hide_subcmds() {\n    let cmd = Command::new(\"test\")\n        .version(\"1.4\")\n        .subcommand(Command::new(\"sub\").hide(true));\n\n    utils::assert_output(cmd, \"test --help\", HIDDEN_SUBCMDS, false);\n}\n\nstatic HIDDEN_OPT_ARGS_ONLY: &str = \"\\\nUsage: test\n\nAfter help\n\";\n\n#[test]\nfn hide_opt_args_only() {\n    let cmd = Command::new(\"test\")\n        .version(\"1.4\")\n        .after_help(\"After help\")\n        .disable_help_flag(true)\n        .disable_version_flag(true)\n        .arg(arg!(-h - -help).action(ArgAction::Help).hide(true))\n        .arg(arg!(-v - -version).hide(true))\n        .arg(arg!(--option <opt> \"some option\").hide(true));\n\n    utils::assert_output(cmd, \"test --help\", HIDDEN_OPT_ARGS_ONLY, false);\n}\n\nstatic HIDDEN_POS_ARGS_ONLY: &str = \"\\\nUsage: test\n\nAfter help\n\";\n\n#[test]\nfn hide_pos_args_only() {\n    let cmd = Command::new(\"test\")\n        .version(\"1.4\")\n        .after_help(\"After help\")\n        .disable_help_flag(true)\n        .disable_version_flag(true)\n        .arg(arg!(-h - -help).action(ArgAction::Help).hide(true))\n        .arg(arg!(-v - -version).hide(true))\n        .args([Arg::new(\"pos\").help(\"some pos\").hide(true)]);\n\n    utils::assert_output(cmd, \"test --help\", HIDDEN_POS_ARGS_ONLY, false);\n}\n\nstatic HIDDEN_SUBCMDS_ONLY: &str = \"\\\nUsage: test\n\nAfter help\n\";\n\n#[test]\nfn hide_subcmds_only() {\n    let cmd = Command::new(\"test\")\n        .version(\"1.4\")\n        .after_help(\"After help\")\n        .disable_help_flag(true)\n        .disable_version_flag(true)\n        .arg(arg!(-h - -help).action(ArgAction::Help).hide(true))\n        .arg(arg!(-v - -version).hide(true))\n        .subcommand(Command::new(\"sub\").hide(true));\n\n    utils::assert_output(cmd, \"test --help\", HIDDEN_SUBCMDS_ONLY, false);\n}\n\n#[test]\nfn hidden_arg_with_possible_value_with_help() {\n    // Normally the presence of a possible value with a help text triggers a\n    // change of the --help help text by appending `(see more with '--help')`\n    // or `(see a summary with '-h')`. When the argument is completely hidden\n    // we however do not want it to trigger that change.\n    static POS_VALS_HELP: &str = \"\\\nUsage: ctest\n\nOptions:\n  -h, --help  Print help\n\";\n    let app = Command::new(\"ctest\").arg(\n        Arg::new(\"pos\")\n            .hide(true)\n            .value_parser([\n                PossibleValue::new(\"fast\"),\n                PossibleValue::new(\"slow\").help(\"not as fast\"),\n            ])\n            .action(ArgAction::Set),\n    );\n    utils::assert_output(app, \"ctest --help\", POS_VALS_HELP, false);\n}\n"
  },
  {
    "path": "tests/builder/ignore_errors.rs",
    "content": "use clap::{arg, error::ErrorKind, parser::ValueSource, Arg, ArgAction, Command};\nuse snapbox::str;\n\nuse super::utils;\n\n#[test]\nfn single_short_arg_without_value() {\n    let cmd = Command::new(\"cmd\")\n        .ignore_errors(true)\n        .arg(arg!(\n            -c --config <FILE> \"Sets a custom config file\"\n        ))\n        .arg(arg!(--\"unset-flag\"));\n\n    let r = cmd.try_get_matches_from(vec![\"cmd\", \"-c\" /* missing: , \"config file\" */]);\n\n    assert!(r.is_ok(), \"unexpected error: {r:?}\");\n    let m = r.unwrap();\n    assert!(m.contains_id(\"config\"));\n    assert_eq!(m.get_one::<String>(\"config\").cloned(), None);\n    assert_eq!(m.get_one::<bool>(\"unset-flag\").copied(), Some(false));\n}\n\n#[test]\nfn single_long_arg_without_value() {\n    let cmd = Command::new(\"cmd\")\n        .ignore_errors(true)\n        .arg(arg!(\n            -c --config <FILE> \"Sets a custom config file\"\n        ))\n        .arg(arg!(--\"unset-flag\"));\n\n    let r = cmd.try_get_matches_from(vec![\"cmd\", \"--config\" /* missing: , \"config file\" */]);\n\n    assert!(r.is_ok(), \"unexpected error: {r:?}\");\n    let m = r.unwrap();\n    assert!(m.contains_id(\"config\"));\n    assert_eq!(m.get_one::<String>(\"config\").cloned(), None);\n    assert_eq!(m.get_one::<bool>(\"unset-flag\").copied(), Some(false));\n}\n\n#[test]\nfn multiple_args_and_final_arg_without_value() {\n    let cmd = Command::new(\"cmd\")\n        .ignore_errors(true)\n        .arg(arg!(\n            -c --config <FILE> \"Sets a custom config file\"\n        ))\n        .arg(arg!(\n            -x --stuff <FILE> \"Sets a custom stuff file\"\n        ))\n        .arg(arg!(f: -f \"Flag\").action(ArgAction::SetTrue))\n        .arg(arg!(--\"unset-flag\"));\n\n    let r = cmd.try_get_matches_from(vec![\n        \"cmd\", \"-c\", \"file\", \"-f\", \"-x\", /* missing: , \"some stuff\" */\n    ]);\n\n    assert!(r.is_ok(), \"unexpected error: {r:?}\");\n    let m = r.unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"config\").map(|v| v.as_str()),\n        Some(\"file\")\n    );\n    assert_eq!(m.get_one::<bool>(\"f\").copied(), Some(true));\n    assert_eq!(m.get_one::<String>(\"stuff\").map(|v| v.as_str()), None);\n    assert_eq!(m.get_one::<bool>(\"unset-flag\").copied(), Some(false));\n}\n\n#[test]\nfn multiple_args_and_intermittent_arg_without_value() {\n    let cmd = Command::new(\"cmd\")\n        .ignore_errors(true)\n        .arg(arg!(\n            -c --config <FILE> \"Sets a custom config file\"\n        ))\n        .arg(arg!(\n            -x --stuff <FILE> \"Sets a custom stuff file\"\n        ))\n        .arg(arg!(f: -f \"Flag\").action(ArgAction::SetTrue))\n        .arg(arg!(--\"unset-flag\"));\n\n    let r = cmd.try_get_matches_from(vec![\n        \"cmd\", \"-x\", /* missing: ,\"some stuff\" */\n        \"-c\", \"file\", \"-f\",\n    ]);\n\n    assert!(r.is_ok(), \"unexpected error: {r:?}\");\n    let m = r.unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"config\").map(|v| v.as_str()),\n        Some(\"file\")\n    );\n    assert_eq!(m.get_one::<bool>(\"f\").copied(), Some(true));\n    assert_eq!(m.get_one::<String>(\"stuff\").map(|v| v.as_str()), None);\n    assert_eq!(m.get_one::<bool>(\"unset-flag\").copied(), Some(false));\n}\n\n#[test]\nfn unexpected_argument() {\n    let cmd = Command::new(\"cmd\")\n        .ignore_errors(true)\n        .arg(arg!(\n            -c --config [FILE] \"Sets a custom config file\"\n        ))\n        .arg(arg!(--\"unset-flag\"));\n\n    let r = cmd.try_get_matches_from(vec![\"cmd\", \"-c\", \"config file\", \"unexpected\"]);\n\n    assert!(r.is_ok(), \"unexpected error: {r:?}\");\n    let m = r.unwrap();\n    assert!(m.contains_id(\"config\"));\n    assert_eq!(\n        m.get_one::<String>(\"config\").cloned(),\n        Some(\"config file\".to_owned())\n    );\n    assert_eq!(m.get_one::<bool>(\"unset-flag\").copied(), Some(false));\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn did_you_mean() {\n    let mut cmd = Command::new(\"cmd\").arg(arg!(--\"ignore-immutable\"));\n\n    // Verify we are in a \"did you mean\" error\n    let r = cmd.try_get_matches_from_mut(vec![\"cmd\", \"--ig\"]);\n    assert!(r.is_err());\n    let err = r.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::UnknownArgument,\n        str![[r#\"\nerror: unexpected argument '--ig' found\n\n  tip: a similar argument exists: '--ignore-immutable'\n\nUsage: cmd --ignore-immutable\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n\n    let r = cmd\n        .ignore_errors(true)\n        .try_get_matches_from(vec![\"cmd\", \"--ig\"]);\n    assert!(r.is_ok(), \"unexpected error: {r:?}\");\n    let m = r.unwrap();\n    assert!(m.contains_id(\"ignore-immutable\"), \"{m:#?}\");\n    assert_eq!(\n        m.value_source(\"ignore-immutable\"),\n        Some(ValueSource::DefaultValue)\n    );\n}\n\n#[test]\nfn subcommand() {\n    let cmd = Command::new(\"test\")\n        .ignore_errors(true)\n        .subcommand(\n            Command::new(\"some\")\n                .arg(\n                    Arg::new(\"test\")\n                        .short('t')\n                        .long(\"test\")\n                        .action(ArgAction::Set)\n                        .help(\"testing testing\"),\n                )\n                .arg(\n                    Arg::new(\"stuff\")\n                        .short('x')\n                        .long(\"stuff\")\n                        .action(ArgAction::Set)\n                        .help(\"stuf value\"),\n                )\n                .arg(arg!(--\"unset-flag\")),\n        )\n        .arg(Arg::new(\"other\").long(\"other\"))\n        .arg(arg!(--\"unset-flag\"));\n\n    let m = cmd\n        .try_get_matches_from(vec![\n            \"myprog\",\n            \"some\",\n            \"--test\", /* missing: ,\"some val\" */\n            \"-x\",\n            \"some other val\",\n        ])\n        .unwrap();\n\n    assert_eq!(m.subcommand_name().unwrap(), \"some\");\n    let sub_m = m.subcommand_matches(\"some\").unwrap();\n    assert!(\n        sub_m.contains_id(\"test\"),\n        \"expected subcommand to be present due to partial parsing\"\n    );\n    assert_eq!(sub_m.get_one::<String>(\"test\").map(|v| v.as_str()), None);\n    assert_eq!(\n        sub_m.get_one::<String>(\"stuff\").map(|v| v.as_str()),\n        Some(\"some other val\")\n    );\n    assert_eq!(sub_m.get_one::<bool>(\"unset-flag\").copied(), Some(false));\n\n    assert_eq!(m.get_one::<bool>(\"unset-flag\").copied(), Some(false));\n}\n\n#[test]\nfn help_flag() {\n    let cmd = Command::new(\"test\").ignore_errors(true);\n\n    utils::assert_output(\n        cmd,\n        \"test --help\",\n        str![[r#\"\nUsage: test\n\nOptions:\n  -h, --help  Print help\n\n\"#]],\n        false,\n    );\n}\n\n#[test]\nfn help_flag_subcommand() {\n    let cmd = Command::new(\"test\")\n        .subcommand(Command::new(\"sub\"))\n        .ignore_errors(true);\n\n    utils::assert_output(\n        cmd,\n        \"test sub --help\",\n        str![[r#\"\nUsage: test sub\n\nOptions:\n  -h, --help  Print help\n\n\"#]],\n        false,\n    );\n}\n\n#[test]\nfn version_flag() {\n    let cmd = Command::new(\"test\").ignore_errors(true).version(\"0.1\");\n\n    utils::assert_output(cmd, \"test --version\", \"test 0.1\\n\", false);\n}\n"
  },
  {
    "path": "tests/builder/indices.rs",
    "content": "use clap::{Arg, ArgAction, Command};\n\n#[test]\nfn indices_mult_opts() {\n    let m = Command::new(\"ind\")\n        .args_override_self(true)\n        .arg(\n            Arg::new(\"exclude\")\n                .short('e')\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .arg(\n            Arg::new(\"include\")\n                .short('i')\n                .action(ArgAction::Set)\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"ind\", \"-e\", \"A\", \"B\", \"-i\", \"B\", \"C\", \"-e\", \"C\"])\n        .unwrap();\n\n    assert_eq!(\n        m.indices_of(\"exclude\").unwrap().collect::<Vec<_>>(),\n        [2, 3, 8]\n    );\n    assert_eq!(m.indices_of(\"include\").unwrap().collect::<Vec<_>>(), [5, 6]);\n}\n\n#[test]\nfn index_mult_opts() {\n    let m = Command::new(\"ind\")\n        .args_override_self(true)\n        .arg(\n            Arg::new(\"exclude\")\n                .short('e')\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .arg(\n            Arg::new(\"include\")\n                .short('i')\n                .action(ArgAction::Set)\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"ind\", \"-e\", \"A\", \"B\", \"-i\", \"B\", \"C\", \"-e\", \"C\"])\n        .unwrap();\n\n    assert_eq!(m.index_of(\"exclude\"), Some(2));\n    assert_eq!(m.index_of(\"include\"), Some(5));\n}\n\n#[test]\nfn index_flag() {\n    let m = Command::new(\"ind\")\n        .args_override_self(true)\n        .arg(Arg::new(\"exclude\").short('e').action(ArgAction::SetTrue))\n        .arg(Arg::new(\"include\").short('i').action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"ind\", \"-e\", \"-i\"])\n        .unwrap();\n\n    assert_eq!(m.index_of(\"exclude\"), Some(1));\n    assert_eq!(m.index_of(\"include\"), Some(2));\n}\n\n#[test]\nfn index_flags() {\n    let m = Command::new(\"ind\")\n        .args_override_self(true)\n        .arg(Arg::new(\"exclude\").short('e').action(ArgAction::SetTrue))\n        .arg(Arg::new(\"include\").short('i').action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"ind\", \"-e\", \"-i\", \"-e\", \"-e\", \"-i\"])\n        .unwrap();\n\n    assert_eq!(m.index_of(\"exclude\"), Some(4));\n    assert_eq!(m.index_of(\"include\"), Some(5));\n}\n\n#[test]\nfn indices_mult_flags() {\n    let m = Command::new(\"ind\")\n        .args_override_self(true)\n        .arg(Arg::new(\"exclude\").short('e').action(ArgAction::SetTrue))\n        .arg(Arg::new(\"include\").short('i').action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"ind\", \"-e\", \"-i\", \"-e\", \"-e\", \"-i\"])\n        .unwrap();\n\n    assert_eq!(m.indices_of(\"exclude\").unwrap().collect::<Vec<_>>(), [4]);\n    assert_eq!(m.indices_of(\"include\").unwrap().collect::<Vec<_>>(), [5]);\n}\n\n#[test]\nfn indices_mult_flags_combined() {\n    let m = Command::new(\"ind\")\n        .args_override_self(true)\n        .arg(Arg::new(\"exclude\").short('e').action(ArgAction::SetTrue))\n        .arg(Arg::new(\"include\").short('i').action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"ind\", \"-eieei\"])\n        .unwrap();\n\n    assert_eq!(m.indices_of(\"exclude\").unwrap().collect::<Vec<_>>(), [4]);\n    assert_eq!(m.indices_of(\"include\").unwrap().collect::<Vec<_>>(), [5]);\n}\n\n#[test]\nfn indices_mult_flags_opt_combined() {\n    let m = Command::new(\"ind\")\n        .args_override_self(true)\n        .arg(Arg::new(\"exclude\").short('e').action(ArgAction::SetTrue))\n        .arg(Arg::new(\"include\").short('i').action(ArgAction::SetTrue))\n        .arg(Arg::new(\"option\").short('o').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"ind\", \"-eieeio\", \"val\"])\n        .unwrap();\n\n    assert_eq!(m.indices_of(\"exclude\").unwrap().collect::<Vec<_>>(), [4]);\n    assert_eq!(m.indices_of(\"include\").unwrap().collect::<Vec<_>>(), [5]);\n    assert_eq!(m.indices_of(\"option\").unwrap().collect::<Vec<_>>(), [7]);\n}\n\n#[test]\nfn indices_mult_flags_opt_combined_eq() {\n    let m = Command::new(\"ind\")\n        .args_override_self(true)\n        .arg(Arg::new(\"exclude\").short('e').action(ArgAction::SetTrue))\n        .arg(Arg::new(\"include\").short('i').action(ArgAction::SetTrue))\n        .arg(Arg::new(\"option\").short('o').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"ind\", \"-eieeio=val\"])\n        .unwrap();\n\n    assert_eq!(m.indices_of(\"exclude\").unwrap().collect::<Vec<_>>(), [4]);\n    assert_eq!(m.indices_of(\"include\").unwrap().collect::<Vec<_>>(), [5]);\n    assert_eq!(m.indices_of(\"option\").unwrap().collect::<Vec<_>>(), [7]);\n}\n\n#[test]\nfn indices_mult_opt_value_delim_eq() {\n    let m = Command::new(\"myapp\")\n        .args_override_self(true)\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .action(ArgAction::Set)\n                .value_delimiter(',')\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"myapp\", \"-o=val1,val2,val3\"])\n        .unwrap();\n    assert_eq!(\n        m.indices_of(\"option\").unwrap().collect::<Vec<_>>(),\n        [2, 3, 4]\n    );\n}\n\n#[test]\nfn indices_mult_opt_value_no_delim_eq() {\n    let m = Command::new(\"myapp\")\n        .args_override_self(true)\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .action(ArgAction::Set)\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"myapp\", \"-o=val1,val2,val3\"])\n        .unwrap();\n    assert_eq!(m.indices_of(\"option\").unwrap().collect::<Vec<_>>(), [2]);\n}\n\n#[test]\nfn indices_mult_opt_mult_flag() {\n    let m = Command::new(\"myapp\")\n        .args_override_self(true)\n        .arg(Arg::new(\"option\").short('o').action(ArgAction::Append))\n        .arg(Arg::new(\"flag\").short('f').action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"myapp\", \"-o\", \"val1\", \"-f\", \"-o\", \"val2\", \"-f\"])\n        .unwrap();\n\n    assert_eq!(m.indices_of(\"option\").unwrap().collect::<Vec<_>>(), [2, 5]);\n    assert_eq!(m.indices_of(\"flag\").unwrap().collect::<Vec<_>>(), [6]);\n}\n"
  },
  {
    "path": "tests/builder/macros.rs",
    "content": "use clap::arg;\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\n#[test]\nfn arg_long() {\n    let arg = arg!(--long);\n    assert_data_eq!(arg.get_id().to_debug(), str![[r#\"\n\"long\"\n\n\"#]]);\n    assert_data_eq!(arg.get_short().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_long().to_debug(), str![[r#\"\nSome(\n    \"long\",\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_action().to_debug(), str![[r#\"\nSetTrue\n\n\"#]]);\n    assert_data_eq!(arg.is_required_set().to_debug(), str![[r#\"\nfalse\n\n\"#]]);\n    assert_data_eq!(arg.get_value_names().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_help().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n}\n\n#[test]\n#[should_panic = \"Without a value or long flag, the `name:` prefix is required\"]\nfn arg_short() {\n    arg!(-s);\n}\n\n#[test]\nfn arg_long_dashed() {\n    let arg = arg!(--\"long-flag\");\n    assert_data_eq!(arg.get_id().to_debug(), str![[r#\"\n\"long-flag\"\n\n\"#]]);\n    assert_data_eq!(arg.get_short().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_long().to_debug(), str![[r#\"\nSome(\n    \"long-flag\",\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_action().to_debug(), str![[r#\"\nSetTrue\n\n\"#]]);\n    assert_data_eq!(arg.is_required_set().to_debug(), str![[r#\"\nfalse\n\n\"#]]);\n    assert_data_eq!(arg.get_value_names().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_help().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n}\n\n#[test]\nfn arg_long_optional_value() {\n    let arg = arg!(--long[VALUE]);\n    assert_data_eq!(arg.get_id().to_debug(), str![[r#\"\n\"long\"\n\n\"#]]);\n    assert_data_eq!(arg.get_short().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_long().to_debug(), str![[r#\"\nSome(\n    \"long\",\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_action().to_debug(), str![[r#\"\nSet\n\n\"#]]);\n    assert_data_eq!(arg.is_required_set().to_debug(), str![[r#\"\nfalse\n\n\"#]]);\n    assert_data_eq!(arg.get_value_names().to_debug(), str![[r#\"\nSome(\n    [\n        \"VALUE\",\n    ],\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_help().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n}\n\n#[test]\nfn arg_long_required_value() {\n    let arg = arg!(--long <VALUE>);\n    assert_data_eq!(arg.get_id().to_debug(), str![[r#\"\n\"long\"\n\n\"#]]);\n    assert_data_eq!(arg.get_short().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_long().to_debug(), str![[r#\"\nSome(\n    \"long\",\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_action().to_debug(), str![[r#\"\nSet\n\n\"#]]);\n    assert_data_eq!(arg.is_required_set().to_debug(), str![[r#\"\nfalse\n\n\"#]]);\n    assert_data_eq!(arg.get_value_names().to_debug(), str![[r#\"\nSome(\n    [\n        \"VALUE\",\n    ],\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_help().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n}\n\n#[test]\n#[should_panic = \"Multiple values not yet supported\"]\nfn arg_long_multiple_values() {\n    arg!(--long <VALUE1> <VALUE2> <VALUE3> [VALUE4] [VALUE5]);\n}\n\n#[test]\nfn arg_optional_value() {\n    let arg = arg!([VALUE]);\n    assert_data_eq!(arg.get_id().to_debug(), str![[r#\"\n\"VALUE\"\n\n\"#]]);\n    assert_data_eq!(arg.get_short().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_long().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_action().to_debug(), str![[r#\"\nSet\n\n\"#]]);\n    assert_data_eq!(arg.is_required_set().to_debug(), str![[r#\"\nfalse\n\n\"#]]);\n    assert_data_eq!(arg.get_value_names().to_debug(), str![[r#\"\nSome(\n    [\n        \"VALUE\",\n    ],\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_help().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n}\n\n#[test]\nfn arg_required_value() {\n    let arg = arg!(<VALUE>);\n    assert_data_eq!(arg.get_id().to_debug(), str![[r#\"\n\"VALUE\"\n\n\"#]]);\n    assert_data_eq!(arg.get_short().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_long().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_action().to_debug(), str![[r#\"\nSet\n\n\"#]]);\n    assert_data_eq!(arg.is_required_set().to_debug(), str![[r#\"\ntrue\n\n\"#]]);\n    assert_data_eq!(arg.get_value_names().to_debug(), str![[r#\"\nSome(\n    [\n        \"VALUE\",\n    ],\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_help().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n}\n\n#[test]\n#[should_panic = \"Multiple values not yet supported\"]\nfn arg_multiple_values() {\n    arg!(<VALUE1> <VALUE2> <VALUE3> [VALUE4] [VALUE5]);\n}\n\n#[test]\nfn arg_named_positional() {\n    let arg = arg!(name: <VALUE>);\n    assert_data_eq!(arg.get_id().to_debug(), str![[r#\"\n\"name\"\n\n\"#]]);\n    assert_data_eq!(arg.get_short().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_long().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_action().to_debug(), str![[r#\"\nSet\n\n\"#]]);\n    assert_data_eq!(arg.is_required_set().to_debug(), str![[r#\"\ntrue\n\n\"#]]);\n    assert_data_eq!(arg.get_value_names().to_debug(), str![[r#\"\nSome(\n    [\n        \"VALUE\",\n    ],\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_help().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n}\n\n#[test]\nfn arg_named_long() {\n    let arg = arg!(name: --long <VALUE>);\n    assert_data_eq!(arg.get_id().to_debug(), str![[r#\"\n\"name\"\n\n\"#]]);\n    assert_data_eq!(arg.get_short().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_long().to_debug(), str![[r#\"\nSome(\n    \"long\",\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_action().to_debug(), str![[r#\"\nSet\n\n\"#]]);\n    assert_data_eq!(arg.is_required_set().to_debug(), str![[r#\"\nfalse\n\n\"#]]);\n    assert_data_eq!(arg.get_value_names().to_debug(), str![[r#\"\nSome(\n    [\n        \"VALUE\",\n    ],\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_help().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n}\n\n#[test]\nfn arg_named_dashed() {\n    let arg = arg!(\"named-arg\": --long <VALUE>);\n    assert_data_eq!(arg.get_id().to_debug(), str![[r#\"\n\"named-arg\"\n\n\"#]]);\n    assert_data_eq!(arg.get_short().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n    assert_data_eq!(arg.get_long().to_debug(), str![[r#\"\nSome(\n    \"long\",\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_action().to_debug(), str![[r#\"\nSet\n\n\"#]]);\n    assert_data_eq!(arg.is_required_set().to_debug(), str![[r#\"\nfalse\n\n\"#]]);\n    assert_data_eq!(arg.get_value_names().to_debug(), str![[r#\"\nSome(\n    [\n        \"VALUE\",\n    ],\n)\n\n\"#]]);\n    assert_data_eq!(arg.get_help().to_debug(), str![[r#\"\nNone\n\n\"#]]);\n}\n"
  },
  {
    "path": "tests/builder/main.rs",
    "content": "#![allow(clippy::self_named_module_files)] // false positive\n#![cfg(feature = \"help\")]\n#![cfg(feature = \"usage\")]\n\nautomod::dir!(\"tests/builder\");\n"
  },
  {
    "path": "tests/builder/multiple_occurrences.rs",
    "content": "use clap::{arg, Arg, ArgAction, Command};\n\n#[test]\nfn multiple_occurrences_of_flags_long() {\n    let m = Command::new(\"mo_flags_long\")\n        .args_override_self(true)\n        .arg(arg!(--multflag \"allowed multiple flag\").action(ArgAction::SetTrue))\n        .arg(arg!(--flag \"disallowed multiple flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"--multflag\", \"--flag\", \"--multflag\"])\n        .unwrap();\n    assert!(m.contains_id(\"multflag\"));\n    assert_eq!(m.get_one::<bool>(\"multflag\").copied(), Some(true));\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(m.get_one::<bool>(\"flag\").copied(), Some(true));\n}\n\n#[test]\nfn multiple_occurrences_of_flags_short() {\n    let m = Command::new(\"mo_flags_short\")\n        .args_override_self(true)\n        .arg(arg!(-m --multflag \"allowed multiple flag\").action(ArgAction::SetTrue))\n        .arg(arg!(-f --flag \"disallowed multiple flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-m\", \"-f\", \"-m\"])\n        .unwrap();\n    assert!(m.contains_id(\"multflag\"));\n    assert_eq!(m.get_one::<bool>(\"multflag\").copied(), Some(true));\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(m.get_one::<bool>(\"flag\").copied(), Some(true));\n}\n\n#[test]\nfn multiple_occurrences_of_positional() {\n    let cmd = Command::new(\"test\").arg(Arg::new(\"multi\").num_args(1..).action(ArgAction::Append));\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\"])\n        .expect(\"zero occurrences work\");\n    assert!(!m.contains_id(\"multi\"));\n    assert!(m.get_many::<String>(\"multi\").is_none());\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"one\"])\n        .expect(\"single occurrence work\");\n    assert!(m.contains_id(\"multi\"));\n    assert_eq!(\n        m.get_many::<String>(\"multi\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"one\"]\n    );\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"one\", \"two\", \"three\", \"four\"])\n        .expect(\"many occurrences work\");\n    assert!(m.contains_id(\"multi\"));\n    assert_eq!(\n        m.get_many::<String>(\"multi\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"one\", \"two\", \"three\", \"four\"]\n    );\n}\n\n#[test]\nfn multiple_occurrences_of_flags_large_quantity() {\n    let cmd = Command::new(\"mo_flags_large_qty\")\n        .arg(arg!(-m --multflag \"allowed multiple flag\").action(ArgAction::Count));\n\n    let args: Vec<&str> = vec![\"\"].into_iter().chain(vec![\"-m\"; 200]).collect();\n    let m = cmd.clone().try_get_matches_from(args).unwrap();\n    assert!(m.contains_id(\"multflag\"));\n    assert_eq!(m.get_one::<u8>(\"multflag\").copied(), Some(200));\n\n    let args: Vec<&str> = vec![\"\"].into_iter().chain(vec![\"-m\"; 500]).collect();\n    let m = cmd.try_get_matches_from(args).unwrap();\n    assert!(m.contains_id(\"multflag\"));\n    assert_eq!(m.get_one::<u8>(\"multflag\").copied(), Some(u8::MAX));\n}\n\n#[cfg(feature = \"env\")]\n#[test]\nfn multiple_occurrences_of_before_env() {\n    let cmd = Command::new(\"mo_before_env\").arg(\n        Arg::new(\"verbose\")\n            .env(\"VERBOSE\")\n            .short('v')\n            .long(\"verbose\")\n            .action(ArgAction::Count),\n    );\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<u8>(\"verbose\").copied(), Some(0));\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\", \"-v\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<u8>(\"verbose\").copied(), Some(1));\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\", \"-vv\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<u8>(\"verbose\").copied(), Some(2));\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\", \"-vvv\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<u8>(\"verbose\").copied(), Some(3));\n}\n\n#[cfg(feature = \"env\")]\n#[test]\nfn multiple_occurrences_of_after_env() {\n    let cmd = Command::new(\"mo_after_env\").arg(\n        Arg::new(\"verbose\")\n            .short('v')\n            .long(\"verbose\")\n            .action(ArgAction::Count)\n            .env(\"VERBOSE\"),\n    );\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<u8>(\"verbose\").copied(), Some(0));\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\", \"-v\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<u8>(\"verbose\").copied(), Some(1));\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\", \"-vv\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<u8>(\"verbose\").copied(), Some(2));\n\n    let m = cmd.clone().try_get_matches_from(vec![\"\", \"-vvv\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(m.get_one::<u8>(\"verbose\").copied(), Some(3));\n}\n"
  },
  {
    "path": "tests/builder/multiple_values.rs",
    "content": "use clap::{error::ErrorKind, Arg, ArgAction, Command};\nuse snapbox::assert_data_eq;\nuse snapbox::str;\n\nuse crate::utils;\n\n#[test]\nfn option_long() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .help(\"multiple options\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\n            \"\", \"--option\", \"val1\", \"--option\", \"val2\", \"--option\", \"val3\",\n        ]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn option_short() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1\", \"-o\", \"val2\", \"-o\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn option_mixed() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\n            \"\", \"-o\", \"val1\", \"--option\", \"val2\", \"--option\", \"val3\", \"-o\", \"val4\",\n        ]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\", \"val4\"]\n    );\n}\n\n#[test]\nfn option_exact_exact() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(3)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\n            \"\", \"-o\", \"val1\", \"val2\", \"val3\", \"-o\", \"val4\", \"val5\", \"val6\",\n        ]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\", \"val4\", \"val5\", \"val6\"]\n    );\n}\n\n#[test]\nfn option_exact_exact_not_mult() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(3),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn option_exact_exact_mult() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(3)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\n            \"\", \"-o\", \"val1\", \"val2\", \"val3\", \"-o\", \"val4\", \"val5\", \"val6\",\n        ]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\", \"val4\", \"val5\", \"val6\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn option_exact_less() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(3)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1\", \"-o\", \"val2\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::WrongNumberOfValues,\n        str![[r#\"\nerror: 3 values required for '-o <option> <option> <option>' but 1 was provided\n\nUsage: multiple_values [OPTIONS]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn option_exact_more() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(3)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\n            \"\", \"-o\", \"val1\", \"-o\", \"val2\", \"-o\", \"val3\", \"-o\", \"val4\",\n        ]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::WrongNumberOfValues,\n        str![[r#\"\nerror: 3 values required for '-o <option> <option> <option>' but 1 was provided\n\nUsage: multiple_values [OPTIONS]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn option_min_exact() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(3..)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn option_min_less() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(3..)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1\", \"val2\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::TooFewValues,\n        str![[r#\"\nerror: 3 values required by '-o <option> <option> <option>...'; only 2 were provided\n\nUsage: multiple_values [OPTIONS]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn option_short_min_more_mult_occurs() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"arg\").required(true))\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(3..)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"pos\", \"-o\", \"val1\", \"val2\", \"val3\", \"val4\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\", \"val4\"]\n    );\n    assert_eq!(m.get_one::<String>(\"arg\").map(|v| v.as_str()), Some(\"pos\"));\n}\n\n#[test]\nfn option_short_min_more_single_occur() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"arg\").required(true))\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(3..),\n        )\n        .try_get_matches_from(vec![\"\", \"pos\", \"-o\", \"val1\", \"val2\", \"val3\", \"val4\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\", \"val4\"]\n    );\n    assert_eq!(m.get_one::<String>(\"arg\").map(|v| v.as_str()), Some(\"pos\"));\n}\n\n#[test]\nfn option_max_exact() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(1..=3)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn option_max_less() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(1..=3)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1\", \"val2\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn option_max_zero() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(1..=3)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::InvalidValue,\n        str![[r#\"\nerror: a value is required for '-o <option>...' but none was supplied\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn option_max_zero_eq() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(1..=3)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"-o=\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn option_max_more() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .num_args(1..=3)\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1\", \"val2\", \"val3\", \"val4\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    // Can end up being TooManyValues or UnknownArgument\n    utils::assert_error(\n        err,\n        ErrorKind::UnknownArgument,\n        str![[r#\"\nerror: unexpected argument 'val4' found\n\nUsage: multiple_values [OPTIONS]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn optional_value() {\n    let mut cmd = Command::new(\"test\").args_override_self(true).arg(\n        Arg::new(\"port\")\n            .short('p')\n            .value_name(\"NUM\")\n            .num_args(0..=1),\n    );\n\n    let r = cmd.try_get_matches_from_mut([\"test\", \"-p42\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"port\"));\n    assert_eq!(m.get_one::<String>(\"port\").unwrap(), \"42\");\n\n    let r = cmd.try_get_matches_from_mut([\"test\", \"-p\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"port\"));\n    assert!(m.get_one::<String>(\"port\").is_none());\n\n    let r = cmd.try_get_matches_from_mut([\"test\", \"-p\", \"24\", \"-p\", \"42\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"port\"));\n    assert_eq!(m.get_one::<String>(\"port\").unwrap(), \"42\");\n\n    let help = cmd.render_help().to_string();\n    assert_data_eq!(\n        help,\n        str![[r#\"\nUsage: test [OPTIONS]\n\nOptions:\n  -p [<NUM>]  \n  -h, --help  Print help\n\n\"#]]\n    );\n}\n\n#[test]\nfn positional() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"pos\")\n                .help(\"multiple positionals\")\n                .action(ArgAction::Set)\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"pos\"));\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn positional_exact_exact() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(3))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"pos\"));\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn positional_exact_less() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(3))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::WrongNumberOfValues,\n        str![[r#\"\nerror: 3 values required for '[pos] [pos] [pos]' but 2 were provided\n\nUsage: myprog [pos] [pos] [pos]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn positional_exact_more() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(3))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\", \"val3\", \"val4\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::WrongNumberOfValues,\n        str![[r#\"\nerror: 3 values required for '[pos] [pos] [pos]' but 4 were provided\n\nUsage: myprog [pos] [pos] [pos]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn positional_min_exact() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(3..))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"pos\"));\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn positional_min_less() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(3..))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::TooFewValues,\n        str![[r#\"\nerror: 3 values required by '[pos] [pos] [pos]...'; only 2 were provided\n\nUsage: myprog [pos] [pos] [pos]...\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn positional_min_more() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(3..))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\", \"val3\", \"val4\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"pos\"));\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\", \"val4\"]\n    );\n}\n\n#[test]\nfn positional_max_exact() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(1..=3))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"pos\"));\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn positional_max_less() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(1..=3))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"pos\"));\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn positional_max_more() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(1..=3))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\", \"val3\", \"val4\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::TooManyValues,\n        str![[r#\"\nerror: unexpected value 'val4' for '[pos]...' found; no more were expected\n\nUsage: myprog [pos]...\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn sep_long_equals() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .help(\"multiple options\")\n                .value_delimiter(','),\n        )\n        .try_get_matches_from(vec![\"\", \"--option=val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn sep_long_space() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .help(\"multiple options\")\n                .value_delimiter(','),\n        )\n        .try_get_matches_from(vec![\"\", \"--option\", \"val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn sep_short_equals() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .value_delimiter(','),\n        )\n        .try_get_matches_from(vec![\"\", \"-o=val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn sep_short_space() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .value_delimiter(','),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn sep_short_no_space() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .help(\"multiple options\")\n                .value_delimiter(','),\n        )\n        .try_get_matches_from(vec![\"\", \"-oval1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn sep_positional() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .help(\"multiple options\")\n                .value_delimiter(','),\n        )\n        .try_get_matches_from(vec![\"\", \"val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn different_sep() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .help(\"multiple options\")\n                .value_delimiter(';'),\n        )\n        .try_get_matches_from(vec![\"\", \"--option=val1;val2;val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn different_sep_positional() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .help(\"multiple options\")\n                .value_delimiter(';'),\n        )\n        .try_get_matches_from(vec![\"\", \"val1;val2;val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn no_sep() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .help(\"multiple options\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"--option=val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_one::<String>(\"option\").map(|v| v.as_str()).unwrap(),\n        \"val1,val2,val3\"\n    );\n}\n\n#[test]\nfn no_sep_positional() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .help(\"multiple options\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\"\", \"val1,val2,val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_one::<String>(\"option\").map(|v| v.as_str()).unwrap(),\n        \"val1,val2,val3\"\n    );\n}\n\n#[test]\nfn req_delimiter_long() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .num_args(1)\n                .value_delimiter(','),\n        )\n        .arg(\n            Arg::new(\"args\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .index(1),\n        )\n        .try_get_matches_from(vec![\"\", \"--option\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\"]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"args\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn req_delimiter_long_with_equal() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .num_args(1)\n                .value_delimiter(','),\n        )\n        .arg(\n            Arg::new(\"args\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .index(1),\n        )\n        .try_get_matches_from(vec![\"\", \"--option=val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\"]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"args\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn req_delimiter_short_with_space() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .num_args(1)\n                .value_delimiter(','),\n        )\n        .arg(\n            Arg::new(\"args\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .index(1),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\"]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"args\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn req_delimiter_short_with_no_space() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .num_args(1)\n                .value_delimiter(','),\n        )\n        .arg(\n            Arg::new(\"args\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .index(1),\n        )\n        .try_get_matches_from(vec![\"\", \"-oval1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\"]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"args\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn req_delimiter_short_with_equal() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .num_args(1)\n                .value_delimiter(','),\n        )\n        .arg(\n            Arg::new(\"args\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .index(1),\n        )\n        .try_get_matches_from(vec![\"\", \"-o=val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\"]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"args\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn req_delimiter_complex() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .short('o')\n                .num_args(1)\n                .action(ArgAction::Append)\n                .value_delimiter(','),\n        )\n        .arg(Arg::new(\"args\").num_args(1..).index(1))\n        .try_get_matches_from(vec![\n            \"\",\n            \"val1\",\n            \"-oval2\",\n            \"val3\",\n            \"-o\",\n            \"val4\",\n            \"val5\",\n            \"-o=val6\",\n            \"val7\",\n            \"--option=val8\",\n            \"val9\",\n            \"--option\",\n            \"val10\",\n            \"val11\",\n            \"-oval12,val13\",\n            \"val14\",\n            \"-o\",\n            \"val15,val16\",\n            \"val17\",\n            \"-o=val18,val19\",\n            \"val20\",\n            \"--option=val21,val22\",\n            \"val23\",\n            \"--option\",\n            \"val24,val25\",\n            \"val26\",\n        ]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\n            \"val2\", \"val4\", \"val6\", \"val8\", \"val10\", \"val12\", \"val13\", \"val15\", \"val16\", \"val18\",\n            \"val19\", \"val21\", \"val22\", \"val24\", \"val25\",\n        ]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"args\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\n            \"val1\", \"val3\", \"val5\", \"val7\", \"val9\", \"val11\", \"val14\", \"val17\", \"val20\", \"val23\",\n            \"val26\",\n        ]\n    );\n}\n\n// This tests a programmer error and will only succeed with debug_assertions\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Positional argument `[target]` *must* have `required(true)` or `last(true)` set \\\nbecause a prior positional argument (`<files>...`) has `num_args(1..)`\"]\nfn low_index_positional_not_required() {\n    let _ = Command::new(\"lip\")\n        .arg(\n            Arg::new(\"files\")\n                .index(1)\n                .action(ArgAction::Set)\n                .required(true)\n                .num_args(1..),\n        )\n        .arg(Arg::new(\"target\").index(2))\n        .try_get_matches_from(vec![\"\"]);\n}\n\n// This tests a programmer error and will only succeed with debug_assertions\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Only one positional argument with `.num_args(1..)` \\\nset is allowed per command, unless the second one also has .last(true) set\"]\nfn low_index_positional_last_multiple_too() {\n    let _ = Command::new(\"lip\")\n        .arg(\n            Arg::new(\"files\")\n                .index(1)\n                .action(ArgAction::Set)\n                .required(true)\n                .num_args(1..),\n        )\n        .arg(\n            Arg::new(\"target\")\n                .index(2)\n                .action(ArgAction::Set)\n                .required(true)\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"\"]);\n}\n\n// This tests a programmer error and will only succeed with debug_assertions\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Only the last positional argument, or second to \\\nlast positional argument may be set to `.num_args(1..)`\"]\nfn low_index_positional_too_far_back() {\n    let _ = Command::new(\"lip\")\n        .arg(\n            Arg::new(\"files\")\n                .index(1)\n                .action(ArgAction::Set)\n                .required(true)\n                .num_args(1..),\n        )\n        .arg(Arg::new(\"target\").required(true).index(2))\n        .arg(Arg::new(\"target2\").required(true).index(3))\n        .try_get_matches_from(vec![\"\"]);\n}\n\n#[test]\nfn low_index_positional() {\n    let m = Command::new(\"lip\")\n        .arg(\n            Arg::new(\"files\")\n                .index(1)\n                .action(ArgAction::Set)\n                .required(true)\n                .num_args(1..),\n        )\n        .arg(Arg::new(\"target\").index(2).required(true))\n        .try_get_matches_from(vec![\"lip\", \"file1\", \"file2\", \"file3\", \"target\"]);\n\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"files\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"file1\", \"file2\", \"file3\"]\n    );\n    assert!(m.contains_id(\"target\"));\n    assert_eq!(\n        m.get_one::<String>(\"target\").map(|v| v.as_str()).unwrap(),\n        \"target\"\n    );\n}\n\n#[test]\nfn low_index_positional_in_subcmd() {\n    let m = Command::new(\"lip\")\n        .subcommand(\n            Command::new(\"test\")\n                .arg(\n                    Arg::new(\"files\")\n                        .index(1)\n                        .action(ArgAction::Set)\n                        .required(true)\n                        .num_args(1..),\n                )\n                .arg(Arg::new(\"target\").index(2).required(true)),\n        )\n        .try_get_matches_from(vec![\"lip\", \"test\", \"file1\", \"file2\", \"file3\", \"target\"]);\n\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    let m = m.unwrap();\n    let sm = m.subcommand_matches(\"test\").unwrap();\n\n    assert!(sm.contains_id(\"files\"));\n    assert_eq!(\n        sm.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"file1\", \"file2\", \"file3\"]\n    );\n    assert!(sm.contains_id(\"target\"));\n    assert_eq!(\n        sm.get_one::<String>(\"target\").map(|v| v.as_str()).unwrap(),\n        \"target\"\n    );\n}\n\n#[test]\nfn low_index_positional_with_option() {\n    let m = Command::new(\"lip\")\n        .arg(\n            Arg::new(\"files\")\n                .required(true)\n                .index(1)\n                .action(ArgAction::Set)\n                .num_args(1..),\n        )\n        .arg(Arg::new(\"target\").index(2).required(true))\n        .arg(Arg::new(\"opt\").long(\"option\").action(ArgAction::Set))\n        .try_get_matches_from(vec![\n            \"lip\", \"file1\", \"file2\", \"file3\", \"target\", \"--option\", \"test\",\n        ]);\n\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"files\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"file1\", \"file2\", \"file3\"]\n    );\n    assert!(m.contains_id(\"target\"));\n    assert_eq!(\n        m.get_one::<String>(\"target\").map(|v| v.as_str()).unwrap(),\n        \"target\"\n    );\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()).unwrap(),\n        \"test\"\n    );\n}\n\n#[test]\nfn low_index_positional_with_flag() {\n    let m = Command::new(\"lip\")\n        .arg(\n            Arg::new(\"files\")\n                .index(1)\n                .action(ArgAction::Set)\n                .required(true)\n                .num_args(1..),\n        )\n        .arg(Arg::new(\"target\").index(2).required(true))\n        .arg(Arg::new(\"flg\").long(\"flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"lip\", \"file1\", \"file2\", \"file3\", \"target\", \"--flag\"]);\n\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"files\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"file1\", \"file2\", \"file3\"]\n    );\n    assert!(m.contains_id(\"target\"));\n    assert_eq!(\n        m.get_one::<String>(\"target\").map(|v| v.as_str()).unwrap(),\n        \"target\"\n    );\n    assert!(*m.get_one::<bool>(\"flg\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn low_index_positional_with_extra_flags() {\n    let cmd = Command::new(\"test\")\n        .arg(Arg::new(\"yes\").long(\"yes\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"one\").long(\"one\").action(ArgAction::Set))\n        .arg(Arg::new(\"two\").long(\"two\").action(ArgAction::Set))\n        .arg(Arg::new(\"input\").num_args(1..).required(true))\n        .arg(Arg::new(\"output\").required(true));\n    let m = cmd.try_get_matches_from([\n        \"test\", \"--one\", \"1\", \"--two\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\",\n    ]);\n\n    assert!(m.is_ok(), \"{:?}\", m.unwrap_err().kind());\n    let m = m.unwrap();\n\n    assert_eq!(\n        m.get_many::<String>(\"input\")\n            .unwrap()\n            .map(String::from)\n            .collect::<Vec<_>>(),\n        vec![\n            \"3\".to_owned(),\n            \"4\".to_owned(),\n            \"5\".to_owned(),\n            \"6\".to_owned(),\n            \"7\".to_owned()\n        ],\n    );\n    assert_eq!(m.get_one::<String>(\"output\").unwrap(), \"8\");\n    assert_eq!(m.get_one::<String>(\"one\").unwrap(), \"1\");\n    assert_eq!(m.get_one::<String>(\"two\").unwrap(), \"2\");\n    assert!(!m.get_flag(\"yes\"));\n}\n\n#[test]\nfn multiple_value_terminator_option() {\n    let mut cmd = Command::new(\"lip\")\n        .arg(\n            Arg::new(\"files\")\n                .short('f')\n                .value_terminator(\";\")\n                .action(ArgAction::Set)\n                .num_args(0..),\n        )\n        .arg(Arg::new(\"other\"))\n        .arg(Arg::new(\"stop\").short('X').action(ArgAction::SetTrue));\n\n    // Terminated\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"-f\", \";\", \"otherval\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert!(m.contains_id(\"other\"));\n    assert!(!m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        Vec::<String>::new(),\n    );\n    assert_eq!(\n        m.get_one::<String>(\"other\").map(|v| v.as_str()),\n        Some(\"otherval\")\n    );\n\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"-f\", \"val1\", \"val2\", \";\", \"otherval\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert!(m.contains_id(\"other\"));\n    assert!(!m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\"]\n    );\n    assert_eq!(\n        m.get_one::<String>(\"other\").map(|v| v.as_str()),\n        Some(\"otherval\")\n    );\n\n    // Unterminated\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"-f\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert!(!m.contains_id(\"other\"));\n    assert!(!m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        Vec::<String>::new(),\n    );\n\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"-f\", \"val1\", \"val2\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert!(!m.contains_id(\"other\"));\n    assert!(!m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\"]\n    );\n\n    // Terminated by flag\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"-f\", \"-X\", \"otherval\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert!(m.contains_id(\"other\"));\n    assert!(m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        Vec::<String>::new(),\n    );\n    assert_eq!(\n        m.get_one::<String>(\"other\").map(|v| v.as_str()),\n        Some(\"otherval\")\n    );\n\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"-f\", \"val1\", \"val2\", \"-X\", \"otherval\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert!(m.contains_id(\"other\"));\n    assert!(m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\"]\n    );\n    assert_eq!(\n        m.get_one::<String>(\"other\").map(|v| v.as_str()),\n        Some(\"otherval\")\n    );\n}\n\n#[test]\nfn multiple_value_terminator_positional() {\n    let mut cmd = Command::new(\"lip\")\n        .arg(\n            Arg::new(\"files\")\n                .value_terminator(\";\")\n                .action(ArgAction::Set)\n                .num_args(0..),\n        )\n        .arg(Arg::new(\"other\"))\n        .arg(Arg::new(\"stop\").short('X').action(ArgAction::SetTrue));\n\n    // Terminated\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \";\", \"otherval\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(!m.contains_id(\"files\"));\n    assert!(m.contains_id(\"other\"));\n    assert!(!m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_one::<String>(\"other\").map(|v| v.as_str()),\n        Some(\"otherval\")\n    );\n\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"val1\", \"val2\", \";\", \"otherval\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert!(m.contains_id(\"other\"));\n    assert!(!m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\"]\n    );\n    assert_eq!(\n        m.get_one::<String>(\"other\").map(|v| v.as_str()),\n        Some(\"otherval\")\n    );\n\n    // Unterminated\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(!m.contains_id(\"files\"));\n    assert!(!m.contains_id(\"other\"));\n    assert!(!m.get_flag(\"stop\"));\n\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"val1\", \"val2\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert!(!m.contains_id(\"other\"));\n    assert!(!m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\"]\n    );\n\n    // Terminated by flag\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"-X\", \"otherval\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert!(m.contains_id(\"files\"));\n    assert!(!m.contains_id(\"other\"));\n    assert!(m.get_flag(\"stop\"));\n    assert_eq!(\n        m.get_many::<String>(\"files\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"otherval\"]\n    );\n\n    let m = cmd.try_get_matches_from_mut(vec![\"lip\", \"val1\", \"val2\", \"-X\", \"otherval\"]);\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::ArgumentConflict,\n        str![[r#\"\nerror: the argument '[files]...' cannot be used multiple times\n\nUsage: lip [OPTIONS] [files]... [other]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn multiple_vals_with_hyphen() {\n    let res = Command::new(\"do\")\n        .arg(\n            Arg::new(\"cmds\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .allow_hyphen_values(true)\n                .value_terminator(\";\"),\n        )\n        .arg(Arg::new(\"location\"))\n        .try_get_matches_from(vec![\n            \"do\",\n            \"find\",\n            \"-type\",\n            \"f\",\n            \"-name\",\n            \"special\",\n            \";\",\n            \"/home/clap\",\n        ]);\n    assert!(res.is_ok(), \"{:?}\", res.unwrap_err().kind());\n\n    let m = res.unwrap();\n    let cmds: Vec<_> = m\n        .get_many::<String>(\"cmds\")\n        .unwrap()\n        .map(|v| v.as_str())\n        .collect();\n    assert_eq!(&cmds, &[\"find\", \"-type\", \"f\", \"-name\", \"special\"]);\n    assert_eq!(\n        m.get_one::<String>(\"location\").map(|v| v.as_str()),\n        Some(\"/home/clap\")\n    );\n}\n\n#[test]\nfn multiple_positional_multiple_values() {\n    let res = Command::new(\"do\")\n        .arg(\n            Arg::new(\"cmd1\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .allow_hyphen_values(true)\n                .value_terminator(\";\"),\n        )\n        .arg(\n            Arg::new(\"cmd2\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .allow_hyphen_values(true)\n                .value_terminator(\";\"),\n        )\n        .try_get_matches_from(vec![\n            \"do\",\n            \"find\",\n            \"-type\",\n            \"f\",\n            \"-name\",\n            \"special\",\n            \";\",\n            \"/home/clap\",\n            \"foo\",\n        ]);\n    assert!(res.is_ok(), \"{:?}\", res.unwrap_err().kind());\n\n    let m = res.unwrap();\n    let cmd1: Vec<_> = m\n        .get_many::<String>(\"cmd1\")\n        .unwrap()\n        .map(|v| v.as_str())\n        .collect();\n    assert_eq!(&cmd1, &[\"find\", \"-type\", \"f\", \"-name\", \"special\"]);\n    let cmd2: Vec<_> = m\n        .get_many::<String>(\"cmd2\")\n        .unwrap()\n        .map(|v| v.as_str())\n        .collect();\n    assert_eq!(&cmd2, &[\"/home/clap\", \"foo\"]);\n}\n\n#[test]\nfn value_terminator_has_higher_precedence_than_allow_hyphen_values() {\n    let res = Command::new(\"do\")\n        .arg(\n            Arg::new(\"cmd1\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .allow_hyphen_values(true)\n                .value_terminator(\"--foo\"),\n        )\n        .arg(\n            Arg::new(\"cmd2\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .allow_hyphen_values(true)\n                .value_terminator(\";\"),\n        )\n        .try_get_matches_from(vec![\n            \"do\",\n            \"find\",\n            \"-type\",\n            \"f\",\n            \"-name\",\n            \"special\",\n            \"--foo\",\n            \"/home/clap\",\n            \"foo\",\n        ]);\n    assert!(res.is_ok(), \"{:?}\", res.unwrap_err().kind());\n\n    let m = res.unwrap();\n    let cmd1: Vec<_> = m\n        .get_many::<String>(\"cmd1\")\n        .unwrap()\n        .map(|v| v.as_str())\n        .collect();\n    assert_eq!(&cmd1, &[\"find\", \"-type\", \"f\", \"-name\", \"special\"]);\n    let cmd2: Vec<_> = m\n        .get_many::<String>(\"cmd2\")\n        .unwrap()\n        .map(|v| v.as_str())\n        .collect();\n    assert_eq!(&cmd2, &[\"/home/clap\", \"foo\"]);\n}\n\n#[test]\nfn escape_like_value_terminator() {\n    let mut cmd = Command::new(\"do\")\n        .arg(\n            Arg::new(\"cmd1\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .value_terminator(\"--\"),\n        )\n        .arg(Arg::new(\"cmd2\").action(ArgAction::Set).num_args(1..));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"cmd1\"));\n    assert!(!m.contains_id(\"cmd2\"));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"--\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"cmd1\"));\n    assert!(!m.contains_id(\"cmd2\"));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"--\", \"after\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"cmd1\"));\n    assert_eq!(\n        m.get_many::<String>(\"cmd2\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"after\"]\n    );\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"before\", \"--\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"cmd1\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"before\"]\n    );\n    assert!(!m.contains_id(\"cmd2\"));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"before\", \"--\", \"after\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"cmd1\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"before\"]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"cmd2\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"after\"]\n    );\n}\n\n#[test]\nfn escape_like_value_terminator_and_allow_hyphen_values() {\n    let mut cmd = Command::new(\"do\")\n        .arg(\n            Arg::new(\"cmd1\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .allow_hyphen_values(true)\n                .value_terminator(\"--\"),\n        )\n        .arg(\n            Arg::new(\"cmd2\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .allow_hyphen_values(true)\n                .value_terminator(\";\"),\n        );\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"cmd1\"));\n    assert!(!m.contains_id(\"cmd2\"));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"--\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"cmd1\"));\n    assert!(!m.contains_id(\"cmd2\"));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"--\", \"after\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"cmd1\"));\n    assert_eq!(\n        m.get_many::<String>(\"cmd2\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"after\"]\n    );\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"before\", \"--\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"cmd1\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"before\"]\n    );\n    assert!(!m.contains_id(\"cmd2\"));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"before\", \"--\", \"after\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"cmd1\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"before\"]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"cmd2\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"after\"]\n    );\n\n    let res = cmd.try_get_matches_from_mut(vec![\n        \"do\",\n        \"find\",\n        \"-type\",\n        \"f\",\n        \"-name\",\n        \"special\",\n        \"--\",\n        \"/home/clap\",\n        \"foo\",\n    ]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"cmd1\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"find\", \"-type\", \"f\", \"-name\", \"special\"]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"cmd2\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"/home/clap\", \"foo\"]\n    );\n}\n\n#[test]\nfn escape_like_value_terminator_and_last() {\n    let mut cmd = Command::new(\"do\")\n        .arg(\n            Arg::new(\"cmd1\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .value_terminator(\"--\"),\n        )\n        .arg(\n            Arg::new(\"cmd2\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .last(true),\n        );\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"cmd1\"));\n    assert!(!m.contains_id(\"cmd2\"));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"--\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"cmd1\"));\n    assert!(!m.contains_id(\"cmd2\"));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"--\", \"after\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"cmd1\"));\n    assert_eq!(\n        m.get_many::<String>(\"cmd2\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"after\"]\n    );\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"before\", \"--\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"cmd1\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"before\"]\n    );\n    assert!(!m.contains_id(\"cmd2\"));\n\n    let res = cmd.try_get_matches_from_mut(vec![\"do\", \"before\", \"--\", \"after\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"cmd1\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"before\"]\n    );\n    assert_eq!(\n        m.get_many::<String>(\"cmd2\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"after\"]\n    );\n}\n\n#[test]\nfn issue_1480_max_values_consumes_extra_arg_1() {\n    let res = Command::new(\"prog\")\n        .arg(Arg::new(\"field\").num_args(..=1).long(\"field\"))\n        .arg(Arg::new(\"positional\").required(true).index(1))\n        .try_get_matches_from(vec![\"prog\", \"--field\", \"1\", \"file\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn issue_1480_max_values_consumes_extra_arg_2() {\n    let m = Command::new(\"prog\")\n        .arg(Arg::new(\"field\").num_args(..=1).long(\"field\"))\n        .try_get_matches_from(vec![\"prog\", \"--field\", \"1\", \"2\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::UnknownArgument,\n        str![[r#\"\nerror: unexpected argument '2' found\n\nUsage: prog [OPTIONS]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn issue_1480_max_values_consumes_extra_arg_3() {\n    let m = Command::new(\"prog\")\n        .arg(Arg::new(\"field\").num_args(..=1).long(\"field\"))\n        .try_get_matches_from(vec![\"prog\", \"--field\", \"1\", \"2\", \"3\"]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::UnknownArgument,\n        str![[r#\"\nerror: unexpected argument '2' found\n\nUsage: prog [OPTIONS]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn value_names_building_num_vals() {\n    let m = Command::new(\"test\")\n        .arg(\n            Arg::new(\"pos\")\n                .long(\"pos\")\n                .value_names([\"who\", \"what\", \"why\"]),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--pos\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn value_names_building_num_vals_for_positional() {\n    let m = Command::new(\"test\")\n        .arg(Arg::new(\"pos\").value_names([\"who\", \"what\", \"why\"]))\n        .try_get_matches_from(vec![\"myprog\", \"val1\", \"val2\", \"val3\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\"]\n    );\n}\n\n#[test]\nfn num_args_preferred_over_value_names() {\n    let m = Command::new(\"test\")\n        .arg(\n            Arg::new(\"pos\")\n                .long(\"pos\")\n                .num_args(4)\n                .value_names([\"who\", \"what\", \"why\"]),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--pos\", \"val1\", \"val2\", \"val3\", \"val4\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\", \"val4\"]\n    );\n}\n\n#[test]\nfn values_per_occurrence_named() {\n    let mut a = Command::new(\"test\").arg(\n        Arg::new(\"pos\")\n            .long(\"pos\")\n            .num_args(2)\n            .action(ArgAction::Append),\n    );\n\n    let m = a.try_get_matches_from_mut(vec![\"myprog\", \"--pos\", \"val1\", \"val2\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\"]\n    );\n\n    let m = a.try_get_matches_from_mut(vec![\n        \"myprog\", \"--pos\", \"val1\", \"val2\", \"--pos\", \"val3\", \"val4\",\n    ]);\n    let m = match m {\n        Ok(m) => m,\n        Err(err) => panic!(\"{err}\"),\n    };\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\", \"val3\", \"val4\"]\n    );\n}\n\n#[test]\nfn values_per_occurrence_positional() {\n    let mut a = Command::new(\"test\").arg(Arg::new(\"pos\").num_args(2).action(ArgAction::Append));\n\n    let m = a.try_get_matches_from_mut(vec![\"myprog\", \"val1\", \"val2\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"pos\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"val1\", \"val2\"]\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn issue_2229() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos\").help(\"multiple positionals\").num_args(3))\n        .try_get_matches_from(vec![\n            \"myprog\", \"val1\", \"val2\", \"val3\", \"val4\", \"val5\", \"val6\",\n        ]);\n\n    assert!(m.is_err());\n    let err = m.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::WrongNumberOfValues,\n        str![[r#\"\nerror: 3 values required for '[pos] [pos] [pos]' but 6 were provided\n\nUsage: myprog [pos] [pos] [pos]\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\n#[should_panic = \"Argument 'pos' is positional and it must take a value but action is SetTrue\"]\nfn disallow_positionals_without_values() {\n    let cmd = Command::new(\"test\").arg(Arg::new(\"pos\").num_args(0));\n    cmd.debug_assert();\n}\n"
  },
  {
    "path": "tests/builder/occurrences.rs",
    "content": "use clap::{Arg, ArgAction, ArgMatches, Command};\n\nfn occurrences_as_vec_vec<'a>(m: &'a ArgMatches, name: &str) -> Vec<Vec<&'a String>> {\n    m.get_occurrences(name)\n        .unwrap()\n        .map(Iterator::collect)\n        .collect()\n}\n\n#[test]\nfn grouped_value_works() {\n    let m = Command::new(\"cli\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from([\n            \"cli\",\n            \"--option\",\n            \"fr_FR:mon option 1\",\n            \"en_US:my option 1\",\n            \"--option\",\n            \"fr_FR:mon option 2\",\n            \"en_US:my option 2\",\n        ])\n        .unwrap();\n    let grouped_vals = occurrences_as_vec_vec(&m, \"option\");\n    assert_eq!(\n        grouped_vals,\n        vec![\n            vec![\"fr_FR:mon option 1\", \"en_US:my option 1\",],\n            vec![\"fr_FR:mon option 2\", \"en_US:my option 2\",],\n        ]\n    );\n}\n\n#[test]\nfn issue_1026() {\n    let m = Command::new(\"cli\")\n        .arg(Arg::new(\"server\").short('s').action(ArgAction::Set))\n        .arg(Arg::new(\"user\").short('u').action(ArgAction::Set))\n        .arg(\n            Arg::new(\"target\")\n                .long(\"target\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from([\n            \"backup\", \"-s\", \"server\", \"-u\", \"user\", \"--target\", \"target1\", \"file1\", \"file2\",\n            \"file3\", \"--target\", \"target2\", \"file4\", \"file5\", \"file6\", \"file7\", \"--target\",\n            \"target3\", \"file8\",\n        ])\n        .unwrap();\n    let grouped_vals = occurrences_as_vec_vec(&m, \"target\");\n    assert_eq!(\n        grouped_vals,\n        vec![\n            vec![\"target1\", \"file1\", \"file2\", \"file3\"],\n            vec![\"target2\", \"file4\", \"file5\", \"file6\", \"file7\",],\n            vec![\"target3\", \"file8\"]\n        ]\n    );\n}\n\n#[test]\nfn grouped_value_long_flag_delimiter() {\n    let m = Command::new(\"myapp\")\n        .arg(\n            Arg::new(\"option\")\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_delimiter(',')\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\n            \"myapp\",\n            \"--option=hmm\",\n            \"--option=val1,val2,val3\",\n            \"--option\",\n            \"alice,bob\",\n        ])\n        .unwrap();\n    let grouped_vals = occurrences_as_vec_vec(&m, \"option\");\n    assert_eq!(\n        grouped_vals,\n        vec![\n            vec![\"hmm\"],\n            vec![\"val1\", \"val2\", \"val3\"],\n            vec![\"alice\", \"bob\"]\n        ]\n    );\n}\n\n#[test]\nfn grouped_value_short_flag_delimiter() {\n    let m = Command::new(\"myapp\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .action(ArgAction::Set)\n                .value_delimiter(',')\n                .num_args(1..)\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\"myapp\", \"-o=foo\", \"-o=val1,val2,val3\", \"-o=bar\"])\n        .unwrap();\n    let grouped_vals = occurrences_as_vec_vec(&m, \"option\");\n    assert_eq!(\n        grouped_vals,\n        vec![vec![\"foo\"], vec![\"val1\", \"val2\", \"val3\"], vec![\"bar\"]]\n    );\n}\n\n#[test]\nfn grouped_value_positional_arg() {\n    let m = Command::new(\"multiple_values\")\n        .arg(\n            Arg::new(\"pos\")\n                .help(\"multiple positionals\")\n                .action(ArgAction::Set)\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\n            \"myprog\", \"val1\", \"val2\", \"val3\", \"val4\", \"val5\", \"val6\",\n        ])\n        .unwrap();\n    let grouped_vals = occurrences_as_vec_vec(&m, \"pos\");\n    assert_eq!(\n        grouped_vals,\n        vec![vec![\"val1\", \"val2\", \"val3\", \"val4\", \"val5\", \"val6\"]]\n    );\n}\n\n#[test]\nfn grouped_value_multiple_positional_arg() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos1\").help(\"multiple positionals\"))\n        .arg(\n            Arg::new(\"pos2\")\n                .help(\"multiple positionals\")\n                .action(ArgAction::Set)\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\n            \"myprog\", \"val1\", \"val2\", \"val3\", \"val4\", \"val5\", \"val6\",\n        ])\n        .unwrap();\n    let grouped_vals = occurrences_as_vec_vec(&m, \"pos2\");\n    assert_eq!(\n        grouped_vals,\n        vec![vec![\"val2\", \"val3\", \"val4\", \"val5\", \"val6\"]]\n    );\n}\n\n#[test]\nfn grouped_value_multiple_positional_arg_last_multiple() {\n    let m = Command::new(\"multiple_values\")\n        .arg(Arg::new(\"pos1\").help(\"multiple positionals\"))\n        .arg(\n            Arg::new(\"pos2\")\n                .help(\"multiple positionals\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .last(true),\n        )\n        .try_get_matches_from(vec![\n            \"myprog\", \"val1\", \"--\", \"val2\", \"val3\", \"val4\", \"val5\", \"val6\",\n        ])\n        .unwrap();\n    let grouped_vals = occurrences_as_vec_vec(&m, \"pos2\");\n    assert_eq!(\n        grouped_vals,\n        vec![vec![\"val2\", \"val3\", \"val4\", \"val5\", \"val6\"]]\n    );\n}\n\n#[test]\nfn grouped_interleaved_positional_values() {\n    let cmd = Command::new(\"foo\")\n        .arg(Arg::new(\"pos\").num_args(1..))\n        .arg(\n            Arg::new(\"flag\")\n                .short('f')\n                .long(\"flag\")\n                .action(ArgAction::Set)\n                .action(ArgAction::Append),\n        );\n\n    let m = cmd\n        .try_get_matches_from([\"foo\", \"1\", \"2\", \"-f\", \"a\", \"3\", \"-f\", \"b\", \"4\"])\n        .unwrap();\n\n    let pos = occurrences_as_vec_vec(&m, \"pos\");\n    assert_eq!(pos, vec![vec![\"1\", \"2\"], vec![\"3\"], vec![\"4\"]]);\n\n    let flag = occurrences_as_vec_vec(&m, \"flag\");\n    assert_eq!(flag, vec![vec![\"a\"], vec![\"b\"]]);\n}\n\n#[test]\nfn grouped_interleaved_positional_occurrences() {\n    let cmd = Command::new(\"foo\")\n        .arg(Arg::new(\"pos\").num_args(1..))\n        .arg(\n            Arg::new(\"flag\")\n                .short('f')\n                .long(\"flag\")\n                .action(ArgAction::Set)\n                .action(ArgAction::Append),\n        );\n\n    let m = cmd\n        .try_get_matches_from([\"foo\", \"1\", \"2\", \"-f\", \"a\", \"3\", \"-f\", \"b\", \"4\"])\n        .unwrap();\n\n    let pos = occurrences_as_vec_vec(&m, \"pos\");\n    assert_eq!(pos, vec![vec![\"1\", \"2\"], vec![\"3\"], vec![\"4\"]]);\n\n    let flag = occurrences_as_vec_vec(&m, \"flag\");\n    assert_eq!(flag, vec![vec![\"a\"], vec![\"b\"]]);\n}\n\n#[test]\nfn issue_2171() {\n    let schema = Command::new(\"ripgrep#1701 reproducer\")\n        .args_override_self(true)\n        .arg(\n            Arg::new(\"pretty\")\n                .short('p')\n                .long(\"pretty\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"search_zip\")\n                .short('z')\n                .long(\"search-zip\")\n                .action(ArgAction::SetTrue),\n        );\n\n    let test_args = [\n        vec![\"reproducer\", \"-pz\", \"-p\"],\n        vec![\"reproducer\", \"-pzp\"],\n        vec![\"reproducer\", \"-zpp\"],\n        vec![\"reproducer\", \"-pp\", \"-z\"],\n        vec![\"reproducer\", \"-p\", \"-p\", \"-z\"],\n        vec![\"reproducer\", \"-p\", \"-pz\"],\n        vec![\"reproducer\", \"-ppz\"],\n    ];\n\n    for argv in test_args {\n        let _ = schema.clone().try_get_matches_from(argv).unwrap();\n    }\n}\n"
  },
  {
    "path": "tests/builder/opts.rs",
    "content": "use clap::{arg, error::ErrorKind, Arg, ArgAction, ArgMatches, Command};\n\n#[cfg(feature = \"error-context\")]\nuse super::utils;\n\n#[test]\nfn require_equals_fail() {\n    let res = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"cfg\")\n                .require_equals(true)\n                .value_parser(clap::builder::NonEmptyStringValueParser::new())\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .try_get_matches_from(vec![\"prog\", \"--config\", \"file.conf\"]);\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::NoEquals);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn require_equals_fail_message() {\n    static NO_EQUALS: &str = \"error: equal sign is needed when assigning values to '--config=<cfg>'\n\nUsage: prog [OPTIONS]\n\nFor more information, try '--help'.\n\";\n    let cmd = Command::new(\"prog\").arg(\n        Arg::new(\"cfg\")\n            .require_equals(true)\n            .action(ArgAction::Set)\n            .long(\"config\"),\n    );\n    utils::assert_output(cmd, \"prog --config file.conf\", NO_EQUALS, true);\n}\n\n#[test]\nfn require_equals_min_values_zero() {\n    let res = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"cfg\")\n                .action(ArgAction::Set)\n                .require_equals(true)\n                .num_args(0..)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"cmd\"))\n        .try_get_matches_from(vec![\"prog\", \"--config\", \"cmd\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"cfg\"));\n    assert_eq!(m.get_one::<String>(\"cmd\").map(|v| v.as_str()), Some(\"cmd\"));\n}\n\n#[test]\nfn double_hyphen_as_value() {\n    let res = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"cfg\")\n                .action(ArgAction::Set)\n                .allow_hyphen_values(true)\n                .long(\"config\"),\n        )\n        .try_get_matches_from(vec![\"prog\", \"--config\", \"--\"]);\n    assert!(res.is_ok(), \"{res:?}\");\n    assert_eq!(\n        res.unwrap().get_one::<String>(\"cfg\").map(|v| v.as_str()),\n        Some(\"--\")\n    );\n}\n\n#[test]\nfn require_equals_no_empty_values_fail() {\n    let res = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"cfg\")\n                .action(ArgAction::Set)\n                .require_equals(true)\n                .value_parser(clap::builder::NonEmptyStringValueParser::new())\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"some\"))\n        .try_get_matches_from(vec![\"prog\", \"--config=\", \"file.conf\"]);\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\nfn require_equals_empty_vals_pass() {\n    let res = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"cfg\")\n                .action(ArgAction::Set)\n                .require_equals(true)\n                .long(\"config\"),\n        )\n        .try_get_matches_from(vec![\"prog\", \"--config=\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn require_equals_pass() {\n    let res = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"cfg\")\n                .action(ArgAction::Set)\n                .require_equals(true)\n                .long(\"config\"),\n        )\n        .try_get_matches_from(vec![\"prog\", \"--config=file.conf\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn stdin_char() {\n    let r = Command::new(\"opts\")\n        .arg(arg!(f: -f [flag] \"some flag\"))\n        .try_get_matches_from(vec![\"\", \"-f\", \"-\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"f\"));\n    assert_eq!(m.get_one::<String>(\"f\").map(|v| v.as_str()).unwrap(), \"-\");\n}\n\n#[test]\nfn opts_using_short() {\n    let r = Command::new(\"opts\")\n        .args([\n            arg!(f: -f [flag] \"some flag\"),\n            arg!(c: -c [color] \"some other flag\"),\n        ])\n        .try_get_matches_from(vec![\"\", \"-f\", \"some\", \"-c\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"f\"));\n    assert_eq!(\n        m.get_one::<String>(\"f\").map(|v| v.as_str()).unwrap(),\n        \"some\"\n    );\n    assert!(m.contains_id(\"c\"));\n    assert_eq!(\n        m.get_one::<String>(\"c\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn lots_o_vals() {\n    let r = Command::new(\"opts\")\n        .arg(arg!(o: -o <opt> \"some opt\").num_args(1..).required(true))\n        .try_get_matches_from(vec![\n            \"\", \"-o\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\",\n        ]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(m.get_many::<String>(\"o\").unwrap().count(), 297); // i.e. more than u8\n}\n\n#[test]\nfn opts_using_long_space() {\n    let r = Command::new(\"opts\")\n        .args([\n            arg!(--flag [flag] \"some flag\"),\n            arg!(--color [color] \"some other flag\"),\n        ])\n        .try_get_matches_from(vec![\"\", \"--flag\", \"some\", \"--color\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()).unwrap(),\n        \"some\"\n    );\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn opts_using_long_equals() {\n    let r = Command::new(\"opts\")\n        .args([\n            arg!(--flag [flag] \"some flag\"),\n            arg!(--color [color] \"some other flag\"),\n        ])\n        .try_get_matches_from(vec![\"\", \"--flag=some\", \"--color=other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()).unwrap(),\n        \"some\"\n    );\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn opts_using_mixed() {\n    let r = Command::new(\"opts\")\n        .args([\n            arg!(-f --flag [flag] \"some flag\"),\n            arg!(-c --color [color] \"some other flag\"),\n        ])\n        .try_get_matches_from(vec![\"\", \"-f\", \"some\", \"--color\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()).unwrap(),\n        \"some\"\n    );\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn opts_using_mixed2() {\n    let r = Command::new(\"opts\")\n        .args([\n            arg!(-f --flag [flag] \"some flag\"),\n            arg!(-c --color [color] \"some other flag\"),\n        ])\n        .try_get_matches_from(vec![\"\", \"--flag=some\", \"-c\", \"other\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()).unwrap(),\n        \"some\"\n    );\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn default_values_user_value() {\n    let r = Command::new(\"df\")\n        .arg(arg!(o: -o [opt] \"some opt\").default_value(\"default\"))\n        .try_get_matches_from(vec![\"\", \"-o\", \"value\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.get_one::<String>(\"o\").map(|v| v.as_str()).unwrap(),\n        \"value\"\n    );\n}\n\n#[test]\nfn multiple_vals_pos_arg_equals() {\n    let r = Command::new(\"mvae\")\n        .arg(arg!(o: -o [opt] ... \"some opt\"))\n        .arg(arg!([file] \"some file\"))\n        .try_get_matches_from(vec![\"\", \"-o=1\", \"some\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(m.get_one::<String>(\"o\").map(|v| v.as_str()).unwrap(), \"1\");\n    assert!(m.contains_id(\"file\"));\n    assert_eq!(\n        m.get_one::<String>(\"file\").map(|v| v.as_str()).unwrap(),\n        \"some\"\n    );\n}\n\n#[test]\nfn require_delims_no_delim() {\n    let r = Command::new(\"mvae\")\n        .arg(arg!(o: -o [opt] ... \"some opt\").value_delimiter(','))\n        .arg(arg!([file] \"some file\"))\n        .try_get_matches_from(vec![\"mvae\", \"-o\", \"1\", \"2\", \"some\"]);\n    assert!(r.is_err());\n    let err = r.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn require_delims() {\n    let r = Command::new(\"mvae\")\n        .arg(\n            arg!(o: -o <opt> \"some opt\")\n                .value_delimiter(',')\n                .required(true),\n        )\n        .arg(arg!([file] \"some file\"))\n        .try_get_matches_from(vec![\"\", \"-o\", \"1,2\", \"some\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.get_many::<String>(\"o\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"1\", \"2\"]\n    );\n    assert!(m.contains_id(\"file\"));\n    assert_eq!(\n        m.get_one::<String>(\"file\").map(|v| v.as_str()).unwrap(),\n        \"some\"\n    );\n}\n\n#[test]\nfn leading_hyphen_pass() {\n    let r = Command::new(\"mvae\")\n        .arg(\n            arg!(o: -o <opt> \"some opt\")\n                .required(true)\n                .num_args(1..)\n                .allow_hyphen_values(true),\n        )\n        .try_get_matches_from(vec![\"\", \"-o\", \"-2\", \"3\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.get_many::<String>(\"o\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"-2\", \"3\"]\n    );\n}\n\n#[test]\nfn leading_hyphen_fail() {\n    let r = Command::new(\"mvae\")\n        .arg(arg!(o: -o <opt> \"some opt\").required(true))\n        .try_get_matches_from(vec![\"\", \"-o\", \"-2\"]);\n    assert!(r.is_err());\n    let m = r.unwrap_err();\n    assert_eq!(m.kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn leading_hyphen_with_flag_after() {\n    let r = Command::new(\"mvae\")\n        .arg(\n            arg!(o: -o <opt> \"some opt\")\n                .required(true)\n                .num_args(1..)\n                .allow_hyphen_values(true),\n        )\n        .arg(arg!(f: -f \"some flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-o\", \"-2\", \"-f\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.get_many::<String>(\"o\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"-2\", \"-f\"]\n    );\n    assert!(!*m.get_one::<bool>(\"f\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn leading_hyphen_with_flag_before() {\n    let r = Command::new(\"mvae\")\n        .arg(arg!(o: -o [opt] ... \"some opt\").allow_hyphen_values(true))\n        .arg(arg!(f: -f \"some flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-f\", \"-o\", \"-2\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.get_many::<String>(\"o\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"-2\"]\n    );\n    assert!(*m.get_one::<bool>(\"f\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn leading_hyphen_with_only_pos_follows() {\n    let r = Command::new(\"mvae\")\n        .arg(\n            arg!(o: -o [opt] ... \"some opt\")\n                .action(ArgAction::Set)\n                .allow_hyphen_values(true),\n        )\n        .arg(arg!([arg] \"some arg\"))\n        .try_get_matches_from(vec![\"\", \"-o\", \"-2\", \"--\", \"val\"]);\n    assert!(r.is_ok(), \"{r:?}\");\n    let m = r.unwrap();\n    assert!(m.contains_id(\"o\"));\n    assert_eq!(\n        m.get_many::<String>(\"o\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"-2\"]\n    );\n    assert_eq!(m.get_one::<String>(\"arg\").map(|v| v.as_str()), Some(\"val\"));\n}\n\n#[test]\n#[cfg(feature = \"suggestions\")]\n#[cfg(feature = \"error-context\")]\nfn did_you_mean() {\n    static DYM: &str = \"\\\nerror: unexpected argument '--optio' found\n\n  tip: a similar argument exists: '--option'\n\nUsage: clap-test --option <opt>... [positional] [positional2] [positional3]...\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(utils::complex_app(), \"clap-test --optio=foo\", DYM, true);\n}\n\n#[test]\nfn issue_1047_min_zero_vals_default_val() {\n    let m = Command::new(\"foo\")\n        .arg(\n            Arg::new(\"del\")\n                .short('d')\n                .long(\"del\")\n                .action(ArgAction::Set)\n                .require_equals(true)\n                .num_args(0..)\n                .default_missing_value(\"default\"),\n        )\n        .try_get_matches_from(vec![\"foo\", \"-d\"])\n        .unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"del\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n}\n\nfn issue_1105_setup(argv: Vec<&'static str>) -> Result<ArgMatches, clap::Error> {\n    Command::new(\"opts\")\n        .arg(arg!(-o --option <opt> \"some option\").required(true))\n        .arg(arg!(--flag \"some flag\"))\n        .try_get_matches_from(argv)\n}\n\n#[test]\nfn issue_1105_empty_value_long_fail() {\n    let r = issue_1105_setup(vec![\"cmd\", \"--option\", \"--flag\"]);\n    assert!(r.is_err());\n    assert_eq!(r.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\nfn issue_1105_empty_value_long_explicit() {\n    let r = issue_1105_setup(vec![\"cmd\", \"--option\", \"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert_eq!(m.get_one::<String>(\"option\").map(|v| v.as_str()), Some(\"\"));\n}\n\n#[test]\nfn issue_1105_empty_value_long_equals() {\n    let r = issue_1105_setup(vec![\"cmd\", \"--option=\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert_eq!(m.get_one::<String>(\"option\").map(|v| v.as_str()), Some(\"\"));\n}\n\n#[test]\nfn issue_1105_empty_value_short_fail() {\n    let r = issue_1105_setup(vec![\"cmd\", \"-o\", \"--flag\"]);\n    assert!(r.is_err());\n    assert_eq!(r.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\nfn issue_1105_empty_value_short_explicit() {\n    let r = issue_1105_setup(vec![\"cmd\", \"-o\", \"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert_eq!(m.get_one::<String>(\"option\").map(|v| v.as_str()), Some(\"\"));\n}\n\n#[test]\nfn issue_1105_empty_value_short_equals() {\n    let r = issue_1105_setup(vec![\"cmd\", \"-o=\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert_eq!(m.get_one::<String>(\"option\").map(|v| v.as_str()), Some(\"\"));\n}\n\n#[test]\nfn issue_1105_empty_value_short_explicit_no_space() {\n    let r = issue_1105_setup(vec![\"cmd\", \"-o\", \"\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert_eq!(m.get_one::<String>(\"option\").map(|v| v.as_str()), Some(\"\"));\n}\n\n#[test]\n#[cfg(feature = \"suggestions\")]\n#[cfg(feature = \"error-context\")]\nfn issue_1073_suboptimal_flag_suggestion() {\n    static DYM_ISSUE_1073: &str = \"\\\nerror: unexpected argument '--files-without-matches' found\n\n  tip: a similar argument exists: '--files-without-match'\n\nUsage: ripgrep-616 --files-without-match\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"ripgrep-616\")\n        .arg(\n            Arg::new(\"files-with-matches\")\n                .long(\"files-with-matches\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"files-without-match\")\n                .long(\"files-without-match\")\n                .action(ArgAction::SetTrue),\n        );\n    utils::assert_output(\n        cmd,\n        \"ripgrep-616 --files-without-matches\",\n        DYM_ISSUE_1073,\n        true,\n    );\n}\n\n#[test]\nfn short_non_ascii_no_space() {\n    let matches = Command::new(\"cmd\")\n        .arg(arg!(opt: -'磨' <opt>).required(true))\n        .try_get_matches_from([\"test\", \"-磨VALUE\"])\n        .unwrap();\n\n    assert_eq!(\n        \"VALUE\",\n        matches\n            .get_one::<String>(\"opt\")\n            .map(|v| v.as_str())\n            .unwrap()\n    );\n}\n\n#[test]\nfn short_eq_val_starts_with_eq() {\n    let matches = Command::new(\"cmd\")\n        .arg(arg!(opt: -f <opt>).required(true))\n        .try_get_matches_from([\"test\", \"-f==value\"])\n        .unwrap();\n\n    assert_eq!(\n        \"=value\",\n        matches\n            .get_one::<String>(\"opt\")\n            .map(|v| v.as_str())\n            .unwrap()\n    );\n}\n\n#[test]\nfn long_eq_val_starts_with_eq() {\n    let matches = Command::new(\"cmd\")\n        .arg(arg!(opt: --foo <opt>).required(true))\n        .try_get_matches_from([\"test\", \"--foo==value\"])\n        .unwrap();\n\n    assert_eq!(\n        \"=value\",\n        matches\n            .get_one::<String>(\"opt\")\n            .map(|v| v.as_str())\n            .unwrap()\n    );\n}\n\n#[test]\nfn issue_2022_get_flags_misuse() {\n    let cmd = Command::new(\"test\")\n        .next_help_heading(Some(\"test\"))\n        .arg(Arg::new(\"a\").long(\"a\").default_value(\"32\"));\n    let matches = cmd.try_get_matches_from([\"\"]).unwrap();\n    assert!(matches.get_one::<String>(\"a\").map(|v| v.as_str()).is_some());\n}\n\n#[test]\nfn issue_2279() {\n    let before_help_heading = Command::new(\"cmd\")\n        .arg(Arg::new(\"foo\").short('f').default_value(\"bar\"))\n        .next_help_heading(Some(\"This causes default_value to be ignored\"))\n        .try_get_matches_from([\"\"])\n        .unwrap();\n\n    assert_eq!(\n        before_help_heading\n            .get_one::<String>(\"foo\")\n            .map(|v| v.as_str()),\n        Some(\"bar\")\n    );\n\n    let after_help_heading = Command::new(\"cmd\")\n        .next_help_heading(Some(\"This causes default_value to be ignored\"))\n        .arg(Arg::new(\"foo\").short('f').default_value(\"bar\"))\n        .try_get_matches_from([\"\"])\n        .unwrap();\n\n    assert_eq!(\n        after_help_heading\n            .get_one::<String>(\"foo\")\n            .map(|v| v.as_str()),\n        Some(\"bar\")\n    );\n}\n\n#[test]\nfn infer_long_arg_pass() {\n    let cmd = Command::new(\"test\")\n        .infer_long_args(true)\n        .arg(\n            Arg::new(\"racetrack\")\n                .long(\"racetrack\")\n                .alias(\"autobahn\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(Arg::new(\"racecar\").long(\"racecar\").action(ArgAction::Set));\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--racec=hello\"])\n        .unwrap();\n    assert!(!*matches\n        .get_one::<bool>(\"racetrack\")\n        .expect(\"defaulted by clap\"));\n    assert_eq!(\n        matches.get_one::<String>(\"racecar\").map(|v| v.as_str()),\n        Some(\"hello\")\n    );\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--racet\"])\n        .unwrap();\n    assert!(*matches\n        .get_one::<bool>(\"racetrack\")\n        .expect(\"defaulted by clap\"));\n    assert_eq!(\n        matches.get_one::<String>(\"racecar\").map(|v| v.as_str()),\n        None\n    );\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--auto\"])\n        .unwrap();\n    assert!(*matches\n        .get_one::<bool>(\"racetrack\")\n        .expect(\"defaulted by clap\"));\n    assert_eq!(\n        matches.get_one::<String>(\"racecar\").map(|v| v.as_str()),\n        None\n    );\n\n    let cmd = Command::new(\"test\")\n        .infer_long_args(true)\n        .arg(Arg::new(\"arg\").long(\"arg\").action(ArgAction::SetTrue));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--\"]).unwrap();\n    assert!(!*matches.get_one::<bool>(\"arg\").expect(\"defaulted by clap\"));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--a\"]).unwrap();\n    assert!(*matches.get_one::<bool>(\"arg\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn infer_long_arg_pass_conflicts_exact_match() {\n    let cmd = Command::new(\"test\")\n        .infer_long_args(true)\n        .arg(Arg::new(\"arg\").long(\"arg\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"arg2\").long(\"arg2\").action(ArgAction::SetTrue));\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--arg\"]).unwrap();\n    assert!(*matches.get_one::<bool>(\"arg\").expect(\"defaulted by clap\"));\n\n    let matches = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--arg2\"])\n        .unwrap();\n    assert!(*matches.get_one::<bool>(\"arg2\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn infer_long_arg_pass_conflicting_aliases() {\n    let cmd = Command::new(\"test\").infer_long_args(true).arg(\n        Arg::new(\"abc-123\")\n            .long(\"abc-123\")\n            .aliases([\"a\", \"abc-xyz\"])\n            .action(ArgAction::SetTrue),\n    );\n\n    let matches = cmd.clone().try_get_matches_from([\"test\", \"--ab\"]).unwrap();\n    assert!(*matches\n        .get_one::<bool>(\"abc-123\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn infer_long_arg_fail_conflicts() {\n    let cmd = Command::new(\"test\")\n        .infer_long_args(true)\n        .arg(\n            Arg::new(\"abc-123\")\n                .long(\"abc-123\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(\n            Arg::new(\"abc-xyz\")\n                .long(\"abc-xyz\")\n                .action(ArgAction::SetTrue),\n        );\n\n    let error = cmd\n        .clone()\n        .try_get_matches_from([\"test\", \"--abc\"])\n        .unwrap_err();\n    assert_eq!(error.kind(), ErrorKind::UnknownArgument);\n}\n"
  },
  {
    "path": "tests/builder/positionals.rs",
    "content": "use clap::{arg, error::ErrorKind, Arg, ArgAction, Command};\nuse snapbox::assert_data_eq;\nuse snapbox::str;\n\n#[test]\nfn only_pos_follow() {\n    let r = Command::new(\"onlypos\")\n        .args([arg!(f: -f [flag] \"some opt\"), arg!([arg] \"some arg\")])\n        .try_get_matches_from(vec![\"\", \"--\", \"-f\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert!(!m.contains_id(\"f\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg\").map(|v| v.as_str()).unwrap(),\n        \"-f\"\n    );\n}\n\n#[test]\nfn issue_946() {\n    let r = Command::new(\"compiletest\")\n        .arg(arg!(--exact    \"filters match exactly\").action(ArgAction::SetTrue))\n        .arg(\n            Arg::new(\"filter\")\n                .index(1)\n                .action(ArgAction::Set)\n                .allow_hyphen_values(true)\n                .help(\"filters to apply to output\"),\n        )\n        .try_get_matches_from(vec![\"compiletest\", \"--exact\"]);\n    assert!(r.is_ok(), \"{r:#?}\");\n    let matches = r.unwrap();\n\n    assert!(*matches.get_one::<bool>(\"exact\").expect(\"defaulted by clap\"));\n    assert!(matches\n        .get_one::<String>(\"filter\")\n        .map(|v| v.as_str())\n        .is_none());\n}\n\n#[test]\nfn positional() {\n    let r = Command::new(\"positional\")\n        .args([\n            arg!(-f --flag \"some flag\").action(ArgAction::SetTrue),\n            Arg::new(\"positional\").index(1),\n        ])\n        .try_get_matches_from(vec![\"\", \"-f\", \"test\"]);\n    assert!(r.is_ok(), \"{r:#?}\");\n    let m = r.unwrap();\n    assert!(m.contains_id(\"positional\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert_eq!(\n        m.get_one::<String>(\"positional\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"test\"\n    );\n\n    let m = Command::new(\"positional\")\n        .args([\n            arg!(-f --flag \"some flag\").action(ArgAction::SetTrue),\n            Arg::new(\"positional\").index(1),\n        ])\n        .try_get_matches_from(vec![\"\", \"test\", \"--flag\"])\n        .unwrap();\n    assert!(m.contains_id(\"positional\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert_eq!(\n        m.get_one::<String>(\"positional\")\n            .map(|v| v.as_str())\n            .unwrap(),\n        \"test\"\n    );\n}\n\n#[test]\nfn lots_o_vals() {\n    let r = Command::new(\"opts\")\n        .arg(arg!(<opt>... \"some pos\"))\n        .try_get_matches_from(vec![\n            \"\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\", \"some\",\n            \"some\",\n        ]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(m.get_many::<String>(\"opt\").unwrap().count(), 297); // i.e. more than u8\n}\n\n#[test]\nfn positional_multiple() {\n    let r = Command::new(\"positional_multiple\")\n        .args([\n            arg!(-f --flag \"some flag\").action(ArgAction::SetTrue),\n            Arg::new(\"positional\")\n                .index(1)\n                .action(ArgAction::Set)\n                .num_args(1..),\n        ])\n        .try_get_matches_from(vec![\"\", \"-f\", \"test1\", \"test2\", \"test3\"]);\n    assert!(r.is_ok(), \"{r:#?}\");\n    let m = r.unwrap();\n    assert!(m.contains_id(\"positional\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert_eq!(\n        &*m.get_many::<String>(\"positional\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"test1\", \"test2\", \"test3\"]\n    );\n}\n\n#[test]\nfn positional_multiple_3() {\n    let r = Command::new(\"positional_multiple\")\n        .args([\n            arg!(-f  --flag \"some flag\").action(ArgAction::SetTrue),\n            Arg::new(\"positional\")\n                .index(1)\n                .action(ArgAction::Set)\n                .num_args(1..),\n        ])\n        .try_get_matches_from(vec![\"\", \"test1\", \"test2\", \"test3\", \"--flag\"]);\n    assert!(r.is_ok(), \"{r:#?}\");\n    let m = r.unwrap();\n    assert!(m.contains_id(\"positional\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert_eq!(\n        &*m.get_many::<String>(\"positional\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"test1\", \"test2\", \"test3\"]\n    );\n}\n\n#[test]\nfn positional_multiple_2() {\n    let result = Command::new(\"positional_multiple\")\n        .args([arg!(-f --flag \"some flag\"), Arg::new(\"positional\").index(1)])\n        .try_get_matches_from(vec![\"\", \"-f\", \"test1\", \"test2\", \"test3\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn positional_possible_values() {\n    let r = Command::new(\"positional_possible_values\")\n        .args([\n            arg!(-f --flag \"some flag\").action(ArgAction::SetTrue),\n            Arg::new(\"positional\").index(1).value_parser([\"test123\"]),\n        ])\n        .try_get_matches_from(vec![\"\", \"-f\", \"test123\"]);\n    assert!(r.is_ok(), \"{r:#?}\");\n    let m = r.unwrap();\n    assert!(m.contains_id(\"positional\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert_eq!(\n        &*m.get_many::<String>(\"positional\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"test123\"]\n    );\n}\n\n#[test]\nfn create_positional() {\n    let _ = Command::new(\"test\")\n        .arg(Arg::new(\"test\").index(1).help(\"testing testing\"))\n        .try_get_matches_from(vec![\"\"])\n        .unwrap();\n}\n\n#[test]\nfn positional_hyphen_does_not_panic() {\n    let _ = Command::new(\"test\")\n        .arg(Arg::new(\"dummy\"))\n        .try_get_matches_from(vec![\"test\", \"-\"])\n        .unwrap();\n}\n\n#[test]\nfn single_positional_usage_string() {\n    let mut cmd = Command::new(\"test\").arg(arg!([FILE] \"some file\"));\n    assert_data_eq!(cmd.render_usage().to_string(), str![\"Usage: test [FILE]\"]);\n}\n\n#[test]\nfn single_positional_multiple_usage_string() {\n    let mut cmd = Command::new(\"test\").arg(arg!([FILE]... \"some file\"));\n    assert_data_eq!(cmd.render_usage().to_string(), str![\"Usage: test [FILE]...\"]);\n}\n\n#[test]\nfn multiple_positional_usage_string() {\n    let mut cmd = Command::new(\"test\")\n        .arg(arg!([FILE] \"some file\"))\n        .arg(arg!([FILES]... \"some file\"));\n    assert_data_eq!(cmd.render_usage().to_string(), str![\"Usage: test [FILE] [FILES]...\"],);\n}\n\n#[test]\nfn multiple_positional_one_required_usage_string() {\n    let mut cmd = Command::new(\"test\")\n        .arg(arg!(<FILE> \"some file\"))\n        .arg(arg!([FILES]... \"some file\"));\n    assert_data_eq!(cmd.render_usage().to_string(), str![\"Usage: test <FILE> [FILES]...\"]);\n}\n\n#[test]\nfn single_positional_required_usage_string() {\n    let mut cmd = Command::new(\"test\").arg(arg!(<FILE> \"some file\"));\n    assert_data_eq!(cmd.render_usage().to_string(), str![\"Usage: test <FILE>\"]);\n}\n\n// This tests a programmer error and will only succeed with debug_assertions\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Found non-required positional argument \\\nwith a lower index than a required positional argument\"]\nfn missing_required() {\n    let _ = Command::new(\"test\")\n        .arg(arg!([FILE1] \"some file\"))\n        .arg(arg!(<FILE2> \"some file\"))\n        .try_get_matches_from(vec![\"\"]);\n}\n\n#[test]\nfn missing_required_2() {\n    let r = Command::new(\"test\")\n        .arg(arg!(<FILE1> \"some file\"))\n        .arg(arg!(<FILE2> \"some file\"))\n        .try_get_matches_from(vec![\"test\", \"file\"]);\n    assert!(r.is_err());\n    assert_eq!(r.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn last_positional() {\n    let r = Command::new(\"test\")\n        .arg(arg!(<TARGET> \"some target\"))\n        .arg(arg!([CORPUS] \"some corpus\"))\n        .arg(arg!([ARGS]... \"some file\").last(true))\n        .try_get_matches_from(vec![\"test\", \"tgt\", \"--\", \"arg\"]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"ARGS\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"arg\"]\n    );\n}\n\n#[test]\nfn last_positional_no_double_dash() {\n    let r = Command::new(\"test\")\n        .arg(arg!(<TARGET> \"some target\"))\n        .arg(arg!([CORPUS] \"some corpus\"))\n        .arg(arg!([ARGS]... \"some file\").last(true))\n        .try_get_matches_from(vec![\"test\", \"tgt\", \"crp\", \"arg\"]);\n    assert!(r.is_err());\n    assert_eq!(r.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn last_positional_second_to_last_mult() {\n    let r = Command::new(\"test\")\n        .arg(arg!(<TARGET> \"some target\"))\n        .arg(arg!([CORPUS]... \"some corpus\"))\n        .arg(arg!([ARGS]... \"some file\").last(true))\n        .try_get_matches_from(vec![\"test\", \"tgt\", \"crp1\", \"crp2\", \"--\", \"arg\"]);\n    assert!(r.is_ok(), \"{:?}\", r.unwrap_err().kind());\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Argument 'arg' is a positional argument and can't have short or long name versions\"]\nfn positional_arg_with_long() {\n    use clap::{Arg, Command};\n\n    let _ = Command::new(\"test\")\n        .arg(Arg::new(\"arg\").index(1).long(\"arg\"))\n        .try_get_matches();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Argument 'arg' is a positional argument and can't have short or long name versions\"]\nfn positional_arg_with_short() {\n    use clap::{Arg, Command};\n\n    let _ = Command::new(\"test\")\n        .arg(Arg::new(\"arg\").index(1).short('a'))\n        .try_get_matches();\n}\n\n#[test]\nfn ignore_hyphen_values_on_last() {\n    let cmd = Command::new(\"foo\")\n        .arg(\n            Arg::new(\"cmd\")\n                .num_args(1..)\n                .last(true)\n                .allow_hyphen_values(true),\n        )\n        .arg(\n            Arg::new(\"name\")\n                .long(\"name\")\n                .short('n')\n                .action(ArgAction::Set)\n                .required(false),\n        );\n\n    let matches = cmd.try_get_matches_from([\"test\", \"-n\", \"foo\"]).unwrap();\n    assert_eq!(\n        matches.get_one::<String>(\"name\").map(|v| v.as_str()),\n        Some(\"foo\")\n    );\n}\n"
  },
  {
    "path": "tests/builder/posix_compatible.rs",
    "content": "use clap::{arg, error::ErrorKind, Arg, ArgAction, Command};\n\n#[test]\nfn flag_overrides_itself() {\n    let res = Command::new(\"posix\")\n        .arg(\n            arg!(--flag  \"some flag\"\n            )\n            .action(ArgAction::SetTrue)\n            .overrides_with(\"flag\"),\n        )\n        .try_get_matches_from(vec![\"\", \"--flag\", \"--flag\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn option_overrides_itself() {\n    let res = Command::new(\"posix\")\n        .arg(\n            arg!(--opt <val> \"some option\")\n                .required(false)\n                .overrides_with(\"opt\"),\n        )\n        .try_get_matches_from(vec![\"\", \"--opt=some\", \"--opt=other\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"opt\"));\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"other\")\n    );\n}\n\n#[test]\nfn posix_compatible_flags_long() {\n    let m = Command::new(\"posix\")\n        .arg(\n            arg!(--flag  \"some flag\")\n                .overrides_with(\"color\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(arg!(--color \"some other flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"--flag\", \"--color\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn posix_compatible_flags_long_rev() {\n    let m = Command::new(\"posix\")\n        .arg(\n            arg!(--flag  \"some flag\")\n                .overrides_with(\"color\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(arg!(--color \"some other flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"--color\", \"--flag\"])\n        .unwrap();\n    assert!(!*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn posix_compatible_flags_short() {\n    let m = Command::new(\"posix\")\n        .arg(\n            arg!(-f --flag  \"some flag\")\n                .overrides_with(\"color\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(arg!(-c --color \"some other flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-f\", \"-c\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn posix_compatible_flags_short_rev() {\n    let m = Command::new(\"posix\")\n        .arg(\n            arg!(-f --flag  \"some flag\")\n                .overrides_with(\"color\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(arg!(-c --color \"some other flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-c\", \"-f\"])\n        .unwrap();\n    assert!(!*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn posix_compatible_opts_long() {\n    let m = Command::new(\"posix\")\n        .arg(arg!(--flag <flag> \"some flag\").overrides_with(\"color\"))\n        .arg(arg!(--color <color> \"some other flag\"))\n        .try_get_matches_from(vec![\"\", \"--flag\", \"some\", \"--color\", \"other\"])\n        .unwrap();\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n    assert!(!m.contains_id(\"flag\"));\n}\n\n#[test]\nfn posix_compatible_opts_long_rev() {\n    let m = Command::new(\"posix\")\n        .arg(arg!(--flag <flag> \"some flag\").overrides_with(\"color\"))\n        .arg(arg!(--color <color> \"some other flag\"))\n        .try_get_matches_from(vec![\"\", \"--color\", \"some\", \"--flag\", \"other\"])\n        .unwrap();\n    assert!(!m.contains_id(\"color\"));\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn posix_compatible_opts_long_equals() {\n    let m = Command::new(\"posix\")\n        .arg(arg!(--flag <flag> \"some flag\").overrides_with(\"color\"))\n        .arg(arg!(--color <color> \"some other flag\"))\n        .try_get_matches_from(vec![\"\", \"--flag=some\", \"--color=other\"])\n        .unwrap();\n    assert!(m.contains_id(\"color\"));\n    assert_eq!(\n        m.get_one::<String>(\"color\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n    assert!(!m.contains_id(\"flag\"));\n}\n\n#[test]\nfn posix_compatible_opts_long_equals_rev() {\n    let m = Command::new(\"posix\")\n        .arg(arg!(--flag <flag> \"some flag\").overrides_with(\"color\"))\n        .arg(arg!(--color <color> \"some other flag\"))\n        .try_get_matches_from(vec![\"\", \"--color=some\", \"--flag=other\"])\n        .unwrap();\n    assert!(!m.contains_id(\"color\"));\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn posix_compatible_opts_short() {\n    let m = Command::new(\"posix\")\n        .arg(arg!(f: -f <flag>  \"some flag\").overrides_with(\"c\"))\n        .arg(arg!(c: -c <color> \"some other flag\"))\n        .try_get_matches_from(vec![\"\", \"-f\", \"some\", \"-c\", \"other\"])\n        .unwrap();\n    assert!(m.contains_id(\"c\"));\n    assert_eq!(\n        m.get_one::<String>(\"c\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n    assert!(!m.contains_id(\"f\"));\n}\n\n#[test]\nfn posix_compatible_opts_short_rev() {\n    let m = Command::new(\"posix\")\n        .arg(arg!(f: -f <flag>  \"some flag\").overrides_with(\"c\"))\n        .arg(arg!(c: -c <color> \"some other flag\"))\n        .try_get_matches_from(vec![\"\", \"-c\", \"some\", \"-f\", \"other\"])\n        .unwrap();\n    assert!(!m.contains_id(\"c\"));\n    assert!(m.contains_id(\"f\"));\n    assert_eq!(\n        m.get_one::<String>(\"f\").map(|v| v.as_str()).unwrap(),\n        \"other\"\n    );\n}\n\n#[test]\nfn conflict_overridden() {\n    let m = Command::new(\"conflict_overridden\")\n        .arg(\n            arg!(-f --flag \"some flag\")\n                .conflicts_with(\"debug\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(arg!(-d --debug \"other flag\").action(ArgAction::SetTrue))\n        .arg(\n            arg!(-c --color \"third flag\")\n                .overrides_with(\"flag\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"\", \"-f\", \"-c\", \"-d\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"debug\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn conflict_overridden_2() {\n    let result = Command::new(\"conflict_overridden\")\n        .arg(\n            arg!(-f --flag \"some flag\")\n                .conflicts_with(\"debug\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(arg!(-d --debug \"other flag\").action(ArgAction::SetTrue))\n        .arg(\n            arg!(-c --color \"third flag\")\n                .overrides_with(\"flag\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"\", \"-f\", \"-d\", \"-c\"]);\n    assert!(result.is_ok(), \"{}\", result.unwrap_err());\n    let m = result.unwrap();\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"debug\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn conflict_overridden_3() {\n    let result = Command::new(\"conflict_overridden\")\n        .arg(arg!(-f --flag \"some flag\").conflicts_with(\"debug\"))\n        .arg(arg!(-d --debug \"other flag\"))\n        .arg(arg!(-c --color \"third flag\").overrides_with(\"flag\"))\n        .try_get_matches_from(vec![\"\", \"-d\", \"-c\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::ArgumentConflict);\n}\n\n#[test]\nfn conflict_overridden_4() {\n    let m = Command::new(\"conflict_overridden\")\n        .arg(\n            arg!(-f --flag \"some flag\")\n                .conflicts_with(\"debug\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(arg!(-d --debug \"other flag\").action(ArgAction::SetTrue))\n        .arg(\n            arg!(-c --color \"third flag\")\n                .overrides_with(\"flag\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"\", \"-d\", \"-f\", \"-c\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"debug\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn pos_required_overridden_by_flag() {\n    let result = Command::new(\"require_overridden\")\n        .arg(Arg::new(\"pos\").index(1).required(true))\n        .arg(arg!(-c --color \"some flag\").overrides_with(\"pos\"))\n        .try_get_matches_from(vec![\"\", \"test\", \"-c\"]);\n    assert!(result.is_ok(), \"{:?}\", result.unwrap_err());\n}\n\n#[test]\nfn require_overridden_2() {\n    let m = Command::new(\"require_overridden\")\n        .arg(Arg::new(\"req_pos\").required(true))\n        .arg(\n            arg!(-c --color \"other flag\")\n                .overrides_with(\"req_pos\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"\", \"-c\", \"req_pos\"])\n        .unwrap();\n    assert!(!*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(m.contains_id(\"req_pos\"));\n}\n\n#[test]\nfn require_overridden_3() {\n    let m = Command::new(\"require_overridden\")\n        .arg(\n            arg!(-f --flag \"some flag\")\n                .requires(\"debug\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(arg!(-d --debug \"other flag\").action(ArgAction::SetTrue))\n        .arg(\n            arg!(-c --color \"third flag\")\n                .overrides_with(\"flag\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from(vec![\"\", \"-f\", \"-c\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"debug\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn require_overridden_4() {\n    let result = Command::new(\"require_overridden\")\n        .arg(arg!(-f --flag \"some flag\").requires(\"debug\"))\n        .arg(arg!(-d --debug \"other flag\"))\n        .arg(arg!(-c --color \"third flag\").overrides_with(\"flag\"))\n        .try_get_matches_from(vec![\"\", \"-c\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn incremental_override() {\n    let mut cmd = Command::new(\"test\")\n        .arg(arg!(--name <NAME> ...).required(true))\n        .arg(\n            arg!(--\"no-name\")\n                .overrides_with(\"name\")\n                .action(ArgAction::SetTrue),\n        );\n    let m = cmd\n        .try_get_matches_from_mut([\"test\", \"--name=ahmed\", \"--no-name\", \"--name=ali\"])\n        .unwrap();\n    assert_eq!(\n        m.get_many::<String>(\"name\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"ali\"]\n    );\n    assert!(!*m.get_one::<bool>(\"no-name\").expect(\"defaulted by clap\"));\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Argument or group 'extra' specified in 'overrides_with*' for 'config' does not exist\"]\nfn overrides_with_invalid_arg() {\n    let _ = Command::new(\"prog\")\n        .arg(Arg::new(\"config\").long(\"config\").overrides_with(\"extra\"))\n        .try_get_matches_from(vec![\"\", \"--config\"]);\n}\n"
  },
  {
    "path": "tests/builder/possible_values.rs",
    "content": "use clap::{builder::PossibleValue, error::ErrorKind, Arg, ArgAction, Command};\n\n#[cfg(feature = \"error-context\")]\nuse super::utils;\n\n#[test]\nfn possible_values_of_positional() {\n    let m = Command::new(\"possible_values\")\n        .arg(Arg::new(\"positional\").index(1).value_parser([\"test123\"]))\n        .try_get_matches_from(vec![\"myprog\", \"test123\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"positional\"));\n    assert_eq!(\n        m.get_one::<String>(\"positional\").map(|v| v.as_str()),\n        Some(\"test123\")\n    );\n}\n\n#[test]\nfn possible_value_arg_value() {\n    let m = Command::new(\"possible_values\")\n        .arg(\n            Arg::new(\"arg_value\")\n                .index(1)\n                .value_parser([PossibleValue::new(\"test123\")\n                    .hide(false)\n                    .help(\"It's just a test\")]),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"test123\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"arg_value\"));\n    assert_eq!(\n        m.get_one::<String>(\"arg_value\").map(|v| v.as_str()),\n        Some(\"test123\")\n    );\n}\n\n#[test]\nfn possible_values_of_positional_fail() {\n    let m = Command::new(\"possible_values\")\n        .arg(Arg::new(\"positional\").index(1).value_parser([\"test123\"]))\n        .try_get_matches_from(vec![\"myprog\", \"notest\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\nfn possible_values_of_positional_multiple() {\n    let m = Command::new(\"possible_values\")\n        .arg(\n            Arg::new(\"positional\")\n                .index(1)\n                .action(ArgAction::Set)\n                .value_parser([\"test123\", \"test321\"])\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"test123\", \"test321\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"positional\"));\n    assert_eq!(\n        m.get_many::<String>(\"positional\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        vec![\"test123\", \"test321\"]\n    );\n}\n\n#[test]\nfn possible_values_of_positional_multiple_fail() {\n    let m = Command::new(\"possible_values\")\n        .arg(\n            Arg::new(\"positional\")\n                .index(1)\n                .action(ArgAction::Set)\n                .value_parser([\"test123\", \"test321\"])\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"test123\", \"notest\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\nfn possible_values_of_option() {\n    let m = Command::new(\"possible_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([\"test123\"]),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--option\", \"test123\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_one::<String>(\"option\").map(|v| v.as_str()),\n        Some(\"test123\")\n    );\n}\n\n#[test]\nfn possible_values_of_option_fail() {\n    let m = Command::new(\"possible_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([\"test123\"]),\n        )\n        .try_get_matches_from(vec![\"myprog\", \"--option\", \"notest\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\nfn possible_values_of_option_multiple() {\n    let m = Command::new(\"possible_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([\"test123\", \"test321\"])\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\"\", \"--option\", \"test123\", \"--option\", \"test321\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n\n    assert!(m.contains_id(\"option\"));\n    assert_eq!(\n        m.get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        vec![\"test123\", \"test321\"]\n    );\n}\n\n#[test]\nfn possible_values_of_option_multiple_fail() {\n    let m = Command::new(\"possible_values\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([\"test123\", \"test321\"])\n                .action(ArgAction::Append),\n        )\n        .try_get_matches_from(vec![\"\", \"--option\", \"test123\", \"--option\", \"notest\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn possible_values_output() {\n    #[cfg(feature = \"suggestions\")]\n    static PV_ERROR: &str = \"\\\nerror: invalid value 'slo' for '-O <option>'\n  [possible values: slow, fast, \\\"ludicrous speed\\\"]\n\n  tip: a similar value exists: 'slow'\n\nFor more information, try '--help'.\n\";\n\n    #[cfg(not(feature = \"suggestions\"))]\n    static PV_ERROR: &str = \"\\\nerror: invalid value 'slo' for '-O <option>'\n  [possible values: slow, fast, \\\"ludicrous speed\\\"]\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(\n        Command::new(\"test\").arg(\n            Arg::new(\"option\")\n                .short('O')\n                .action(ArgAction::Set)\n                .value_parser([\"slow\", \"fast\", \"ludicrous speed\"]),\n        ),\n        \"clap-test -O slo\",\n        PV_ERROR,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn possible_values_alias_output() {\n    #[cfg(feature = \"suggestions\")]\n    static PV_ERROR: &str = \"\\\nerror: invalid value 'slo' for '-O <option>'\n  [possible values: slow, fast, \\\"ludicrous speed\\\"]\n\n  tip: a similar value exists: 'slow'\n\nFor more information, try '--help'.\n\";\n\n    #[cfg(not(feature = \"suggestions\"))]\n    static PV_ERROR: &str = \"\\\nerror: invalid value 'slo' for '-O <option>'\n  [possible values: slow, fast, \\\"ludicrous speed\\\"]\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(\n        Command::new(\"test\").arg(\n            Arg::new(\"option\")\n                .short('O')\n                .action(ArgAction::Set)\n                .value_parser([\n                    \"slow\".into(),\n                    PossibleValue::new(\"fast\").alias(\"fost\"),\n                    PossibleValue::new(\"ludicrous speed\").aliases([\"ls\", \"lcs\"]),\n                ]),\n        ),\n        \"clap-test -O slo\",\n        PV_ERROR,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn possible_values_hidden_output() {\n    #[cfg(feature = \"suggestions\")]\n    static PV_ERROR: &str = \"\\\nerror: invalid value 'slo' for '-O <option>'\n  [possible values: slow, fast, \\\"ludicrous speed\\\"]\n\n  tip: a similar value exists: 'slow'\n\nFor more information, try '--help'.\n\";\n\n    #[cfg(not(feature = \"suggestions\"))]\n    static PV_ERROR: &str = \"\\\nerror: invalid value 'slo' for '-O <option>'\n  [possible values: slow, fast, \\\"ludicrous speed\\\"]\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(\n        Command::new(\"test\").arg(\n            Arg::new(\"option\")\n                .short('O')\n                .action(ArgAction::Set)\n                .value_parser([\n                    \"slow\".into(),\n                    \"fast\".into(),\n                    PossibleValue::new(\"ludicrous speed\"),\n                    PossibleValue::new(\"forbidden speed\").hide(true),\n                ]),\n        ),\n        \"clap-test -O slo\",\n        PV_ERROR,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn escaped_possible_values_output() {\n    #[cfg(feature = \"suggestions\")]\n    static PV_ERROR_ESCAPED: &str = \"\\\nerror: invalid value 'ludicrous' for '-O <option>'\n  [possible values: slow, fast, \\\"ludicrous speed\\\"]\n\n  tip: a similar value exists: 'ludicrous speed'\n\nFor more information, try '--help'.\n\";\n\n    #[cfg(not(feature = \"suggestions\"))]\n    static PV_ERROR_ESCAPED: &str = \"\\\nerror: invalid value 'ludicrous' for '-O <option>'\n  [possible values: slow, fast, \\\"ludicrous speed\\\"]\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(\n        Command::new(\"test\").arg(\n            Arg::new(\"option\")\n                .short('O')\n                .action(ArgAction::Set)\n                .value_parser([\"slow\", \"fast\", \"ludicrous speed\"]),\n        ),\n        \"clap-test -O ludicrous\",\n        PV_ERROR_ESCAPED,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn missing_possible_value_error() {\n    static MISSING_PV_ERROR: &str = \"\\\nerror: a value is required for '-O <option>' but none was supplied\n  [possible values: slow, fast, \\\"ludicrous speed\\\"]\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(\n        Command::new(\"test\").arg(\n            Arg::new(\"option\")\n                .short('O')\n                .action(ArgAction::Set)\n                .value_parser([\n                    \"slow\".into(),\n                    PossibleValue::new(\"fast\").alias(\"fost\"),\n                    PossibleValue::new(\"ludicrous speed\"),\n                    PossibleValue::new(\"forbidden speed\").hide(true),\n                ]),\n        ),\n        \"clap-test -O\",\n        MISSING_PV_ERROR,\n        true,\n    );\n}\n\n#[test]\nfn alias() {\n    let m = Command::new(\"pv\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([PossibleValue::new(\"test123\").alias(\"123\"), \"test321\".into()])\n                .ignore_case(true),\n        )\n        .try_get_matches_from(vec![\"pv\", \"--option\", \"123\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    assert!(m\n        .unwrap()\n        .get_one::<String>(\"option\")\n        .map(|v| v.as_str())\n        .unwrap()\n        .eq(\"123\"));\n}\n\n#[test]\nfn aliases() {\n    let m = Command::new(\"pv\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([\n                    PossibleValue::new(\"test123\").aliases([\"1\", \"2\", \"3\"]),\n                    \"test321\".into(),\n                ])\n                .ignore_case(true),\n        )\n        .try_get_matches_from(vec![\"pv\", \"--option\", \"2\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    assert!(m\n        .unwrap()\n        .get_one::<String>(\"option\")\n        .map(|v| v.as_str())\n        .unwrap()\n        .eq(\"2\"));\n}\n\n#[test]\nfn ignore_case() {\n    let m = Command::new(\"pv\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([\"test123\", \"test321\"])\n                .ignore_case(true),\n        )\n        .try_get_matches_from(vec![\"pv\", \"--option\", \"TeSt123\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    assert!(m\n        .unwrap()\n        .get_one::<String>(\"option\")\n        .map(|v| v.as_str())\n        .unwrap()\n        .eq_ignore_ascii_case(\"test123\"));\n}\n\n#[test]\nfn ignore_case_fail() {\n    let m = Command::new(\"pv\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([\"test123\", \"test321\"]),\n        )\n        .try_get_matches_from(vec![\"pv\", \"--option\", \"TeSt123\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[test]\nfn ignore_case_multiple() {\n    let m = Command::new(\"pv\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([\"test123\", \"test321\"])\n                .num_args(1..)\n                .ignore_case(true),\n        )\n        .try_get_matches_from(vec![\"pv\", \"--option\", \"TeSt123\", \"teST123\", \"tESt321\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    assert_eq!(\n        m.unwrap()\n            .get_many::<String>(\"option\")\n            .unwrap()\n            .map(|v| v.as_str())\n            .collect::<Vec<_>>(),\n        [\"TeSt123\", \"teST123\", \"tESt321\"]\n    );\n}\n\n#[test]\nfn ignore_case_multiple_fail() {\n    let m = Command::new(\"pv\")\n        .arg(\n            Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(ArgAction::Set)\n                .value_parser([\"test123\", \"test321\"])\n                .num_args(1..),\n        )\n        .try_get_matches_from(vec![\"pv\", \"--option\", \"test123\", \"teST123\", \"test321\"]);\n\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);\n}\n\n#[cfg(feature = \"string\")]\nmod expensive {\n    use std::sync::{Arc, Mutex};\n\n    use clap::{Arg, Command};\n    use clap_builder::builder::{PossibleValue, PossibleValuesParser, TypedValueParser};\n\n    #[cfg(feature = \"error-context\")]\n    use super::utils;\n\n    #[derive(Clone)]\n    struct ExpensiveValues {\n        iterated: Arc<Mutex<bool>>,\n    }\n\n    impl ExpensiveValues {\n        pub(crate) fn new() -> Self {\n            ExpensiveValues {\n                iterated: Arc::new(Mutex::new(false)),\n            }\n        }\n    }\n\n    impl IntoIterator for ExpensiveValues {\n        type Item = String;\n\n        type IntoIter = ExpensiveValuesIntoIterator;\n\n        fn into_iter(self) -> Self::IntoIter {\n            ExpensiveValuesIntoIterator { me: self, index: 0 }\n        }\n    }\n\n    struct ExpensiveValuesIntoIterator {\n        me: ExpensiveValues,\n        index: usize,\n    }\n\n    impl Iterator for ExpensiveValuesIntoIterator {\n        type Item = String;\n        fn next(&mut self) -> Option<String> {\n            let mut guard = self\n                .me\n                .iterated\n                .lock()\n                .expect(\"not working across multiple threads\");\n\n            *guard = true;\n            self.index += 1;\n\n            if self.index < 3 {\n                Some(format!(\"expensive-value-{}\", self.index))\n            } else {\n                None\n            }\n        }\n    }\n\n    impl TypedValueParser for ExpensiveValues {\n        type Value = String;\n\n        fn parse_ref(\n            &self,\n            _cmd: &Command,\n            _arg: Option<&Arg>,\n            _value: &std::ffi::OsStr,\n        ) -> Result<Self::Value, clap_builder::Error> {\n            unimplemented!()\n        }\n\n        fn possible_values(&self) -> Option<Box<dyn Iterator<Item = PossibleValue> + '_>> {\n            Some(Box::new(self.clone().into_iter().map(PossibleValue::from)))\n        }\n    }\n\n    #[test]\n    fn no_iterate_when_hidden() {\n        static PV_EXPECTED: &str = \"\\\nUsage: clap-test [some-cheap-option] [some-expensive-option]\n\nArguments:\n  [some-cheap-option]      cheap [possible values: some, cheap, values]\n  [some-expensive-option]  expensive\n\nOptions:\n  -h, --help  Print help\n\";\n        let expensive = ExpensiveValues::new();\n        utils::assert_output(\n            Command::new(\"test\")\n                .arg(\n                    Arg::new(\"some-cheap-option\")\n                        .help(\"cheap\")\n                        .value_parser(PossibleValuesParser::new([\"some\", \"cheap\", \"values\"])),\n                )\n                .arg(\n                    Arg::new(\"some-expensive-option\")\n                        .help(\"expensive\")\n                        .hide_possible_values(true)\n                        .value_parser(expensive.clone()),\n                ),\n            \"clap-test -h\",\n            PV_EXPECTED,\n            false,\n        );\n        assert_eq!(*expensive.iterated.lock().unwrap(), false);\n    }\n\n    #[test]\n    fn iterate_when_displayed() {\n        static PV_EXPECTED: &str = \"\\\nUsage: clap-test [some-cheap-option] [some-expensive-option]\n\nArguments:\n  [some-cheap-option]      cheap [possible values: some, cheap, values]\n  [some-expensive-option]  expensive [possible values: expensive-value-1, expensive-value-2]\n\nOptions:\n  -h, --help  Print help\n\";\n        let expensive = ExpensiveValues::new();\n        utils::assert_output(\n            Command::new(\"test\")\n                .arg(\n                    Arg::new(\"some-cheap-option\")\n                        .help(\"cheap\")\n                        .value_parser(PossibleValuesParser::new([\"some\", \"cheap\", \"values\"])),\n                )\n                .arg(\n                    Arg::new(\"some-expensive-option\")\n                        .help(\"expensive\")\n                        .hide_possible_values(false)\n                        .value_parser(expensive.clone()),\n                ),\n            \"clap-test -h\",\n            PV_EXPECTED,\n            false,\n        );\n        assert_eq!(*expensive.iterated.lock().unwrap(), true);\n    }\n}\n"
  },
  {
    "path": "tests/builder/propagate_globals.rs",
    "content": "use clap::{Arg, ArgAction, ArgMatches, Command};\n\nfn get_app() -> Command {\n    Command::new(\"myprog\")\n        .arg(\n            Arg::new(\"GLOBAL_ARG\")\n                .long(\"global-arg\")\n                .help(\"Specifies something needed by the subcommands\")\n                .global(true)\n                .action(ArgAction::Set)\n                .default_value(\"default_value\"),\n        )\n        .arg(\n            Arg::new(\"GLOBAL_FLAG\")\n                .long(\"global-flag\")\n                .help(\"Specifies something needed by the subcommands\")\n                .global(true)\n                .action(ArgAction::Count),\n        )\n        .subcommand(Command::new(\"outer\").defer(|cmd| cmd.subcommand(Command::new(\"inner\"))))\n}\n\nfn get_matches(cmd: Command, argv: &'static str) -> ArgMatches {\n    cmd.try_get_matches_from(argv.split(' ').collect::<Vec<_>>())\n        .unwrap()\n}\n\nfn get_outer_matches(m: &ArgMatches) -> &ArgMatches {\n    m.subcommand_matches(\"outer\")\n        .expect(\"could not access outer subcommand\")\n}\n\nfn get_inner_matches(m: &ArgMatches) -> &ArgMatches {\n    get_outer_matches(m)\n        .subcommand_matches(\"inner\")\n        .expect(\"could not access inner subcommand\")\n}\n\nfn top_can_access_arg<T: Into<Option<&'static str>>>(m: &ArgMatches, val: T) -> bool {\n    m.get_one::<String>(\"GLOBAL_ARG\").map(|v| v.as_str()) == val.into()\n}\n\nfn inner_can_access_arg<T: Into<Option<&'static str>>>(m: &ArgMatches, val: T) -> bool {\n    get_inner_matches(m)\n        .get_one::<String>(\"GLOBAL_ARG\")\n        .map(|v| v.as_str())\n        == val.into()\n}\n\nfn outer_can_access_arg<T: Into<Option<&'static str>>>(m: &ArgMatches, val: T) -> bool {\n    get_outer_matches(m)\n        .get_one::<String>(\"GLOBAL_ARG\")\n        .map(|v| v.as_str())\n        == val.into()\n}\n\nfn top_can_access_flag(m: &ArgMatches, present: bool, occurrences: u8) -> bool {\n    (m.contains_id(\"GLOBAL_FLAG\") == present)\n        && (m.get_one::<u8>(\"GLOBAL_FLAG\").copied() == Some(occurrences))\n}\n\nfn inner_can_access_flag(m: &ArgMatches, present: bool, occurrences: u8) -> bool {\n    let m = get_inner_matches(m);\n    (m.contains_id(\"GLOBAL_FLAG\") == present)\n        && (m.get_one::<u8>(\"GLOBAL_FLAG\").copied() == Some(occurrences))\n}\n\nfn outer_can_access_flag(m: &ArgMatches, present: bool, occurrences: u8) -> bool {\n    let m = get_outer_matches(m);\n    (m.contains_id(\"GLOBAL_FLAG\") == present)\n        && (m.get_one::<u8>(\"GLOBAL_FLAG\").copied() == Some(occurrences))\n}\n\n#[test]\nfn global_arg_used_top_level() {\n    let m = get_matches(get_app(), \"myprog --global-arg=some_value outer inner\");\n\n    assert!(top_can_access_arg(&m, \"some_value\"));\n    assert!(inner_can_access_arg(&m, \"some_value\"));\n    assert!(outer_can_access_arg(&m, \"some_value\"));\n}\n\n#[test]\nfn global_arg_used_outer() {\n    let m = get_matches(get_app(), \"myprog outer --global-arg=some_value inner\");\n\n    assert!(top_can_access_arg(&m, \"some_value\"));\n    assert!(inner_can_access_arg(&m, \"some_value\"));\n    assert!(outer_can_access_arg(&m, \"some_value\"));\n}\n\n#[test]\nfn global_arg_used_inner() {\n    let m = get_matches(get_app(), \"myprog outer inner --global-arg=some_value\");\n\n    assert!(top_can_access_arg(&m, \"some_value\"));\n    assert!(inner_can_access_arg(&m, \"some_value\"));\n    assert!(outer_can_access_arg(&m, \"some_value\"));\n}\n\n#[test]\nfn global_arg_default_value() {\n    let m = get_matches(get_app(), \"myprog outer inner\");\n\n    assert!(top_can_access_arg(&m, \"default_value\"));\n    assert!(inner_can_access_arg(&m, \"default_value\"));\n    assert!(outer_can_access_arg(&m, \"default_value\"));\n}\n\n#[test]\nfn global_flag_used_top_level() {\n    let m = get_matches(get_app(), \"myprog --global-flag outer inner\");\n\n    assert!(top_can_access_flag(&m, true, 1));\n    assert!(inner_can_access_flag(&m, true, 1));\n    assert!(outer_can_access_flag(&m, true, 1));\n}\n\n#[test]\nfn global_flag_used_outer() {\n    let m = get_matches(get_app(), \"myprog outer --global-flag inner\");\n\n    assert!(top_can_access_flag(&m, true, 1));\n    assert!(inner_can_access_flag(&m, true, 1));\n    assert!(outer_can_access_flag(&m, true, 1));\n}\n\n#[test]\nfn global_flag_used_inner() {\n    let m = get_matches(get_app(), \"myprog outer inner --global-flag\");\n\n    assert!(top_can_access_flag(&m, true, 1));\n    assert!(inner_can_access_flag(&m, true, 1));\n    assert!(outer_can_access_flag(&m, true, 1));\n}\n\n#[test]\nfn global_flag_2x_used_top_level() {\n    let m = get_matches(get_app(), \"myprog --global-flag --global-flag outer inner\");\n\n    assert!(top_can_access_flag(&m, true, 2));\n    assert!(inner_can_access_flag(&m, true, 2));\n    assert!(outer_can_access_flag(&m, true, 2));\n}\n\n#[test]\nfn global_flag_2x_used_inner() {\n    let m = get_matches(get_app(), \"myprog outer inner --global-flag --global-flag\");\n\n    assert!(top_can_access_flag(&m, true, 2));\n    assert!(inner_can_access_flag(&m, true, 2));\n    assert!(outer_can_access_flag(&m, true, 2));\n}\n"
  },
  {
    "path": "tests/builder/require.rs",
    "content": "use clap::builder::ArgPredicate;\nuse clap::{arg, error::ErrorKind, Arg, ArgAction, ArgGroup, Command};\n\n#[cfg(feature = \"error-context\")]\nuse super::utils;\n\n#[test]\nfn flag_required() {\n    let result = Command::new(\"flag_required\")\n        .arg(arg!(-f --flag \"some flag\").requires(\"color\"))\n        .arg(arg!(-c --color \"third flag\"))\n        .try_get_matches_from(vec![\"\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn flag_required_2() {\n    let m = Command::new(\"flag_required\")\n        .arg(\n            arg!(-f --flag \"some flag\")\n                .requires(\"color\")\n                .action(ArgAction::SetTrue),\n        )\n        .arg(arg!(-c --color \"third flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-f\", \"-c\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"color\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn option_required() {\n    let result = Command::new(\"option_required\")\n        .arg(arg!(f: -f <flag> \"some flag\").requires(\"c\"))\n        .arg(arg!(c: -c <color> \"third flag\"))\n        .try_get_matches_from(vec![\"\", \"-f\", \"val\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn option_required_2() {\n    let m = Command::new(\"option_required\")\n        .arg(arg!(f: -f <flag> \"some flag\").requires(\"c\"))\n        .arg(arg!(c: -c <color> \"third flag\"))\n        .try_get_matches_from(vec![\"\", \"-f\", \"val\", \"-c\", \"other_val\"])\n        .unwrap();\n    assert!(m.contains_id(\"c\"));\n    assert_eq!(\n        m.get_one::<String>(\"c\").map(|v| v.as_str()).unwrap(),\n        \"other_val\"\n    );\n    assert!(m.contains_id(\"f\"));\n    assert_eq!(m.get_one::<String>(\"f\").map(|v| v.as_str()).unwrap(), \"val\");\n}\n\n#[test]\nfn positional_required() {\n    let result = Command::new(\"positional_required\")\n        .arg(Arg::new(\"flag\").index(1).required(true))\n        .try_get_matches_from(vec![\"\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn positional_required_2() {\n    let m = Command::new(\"positional_required\")\n        .arg(Arg::new(\"flag\").index(1).required(true))\n        .try_get_matches_from(vec![\"\", \"someval\"])\n        .unwrap();\n    assert!(m.contains_id(\"flag\"));\n    assert_eq!(\n        m.get_one::<String>(\"flag\").map(|v| v.as_str()).unwrap(),\n        \"someval\"\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn positional_required_with_requires() {\n    static POSITIONAL_REQ: &str = \"\\\nerror: the following required arguments were not provided:\n  <flag>\n  <opt>\n\nUsage: clap-test <flag> <opt> [bar]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"positional_required\")\n        .arg(Arg::new(\"flag\").required(true).requires(\"opt\"))\n        .arg(Arg::new(\"opt\"))\n        .arg(Arg::new(\"bar\"));\n\n    utils::assert_output(cmd, \"clap-test\", POSITIONAL_REQ, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn positional_required_with_requires_if_no_value() {\n    static POSITIONAL_REQ_IF_NO_VAL: &str = \"\\\nerror: the following required arguments were not provided:\n  <flag>\n\nUsage: clap-test <flag> [opt] [bar]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"positional_required\")\n        .arg(Arg::new(\"flag\").required(true).requires_if(\"val\", \"opt\"))\n        .arg(Arg::new(\"opt\"))\n        .arg(Arg::new(\"bar\"));\n\n    utils::assert_output(cmd, \"clap-test\", POSITIONAL_REQ_IF_NO_VAL, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn positional_required_with_requires_if_value() {\n    static POSITIONAL_REQ_IF_VAL: &str = \"\\\nerror: the following required arguments were not provided:\n  <foo>\n  <opt>\n\nUsage: clap-test <flag> <foo> <opt> [bar]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"positional_required\")\n        .arg(Arg::new(\"flag\").required(true).requires_if(\"val\", \"opt\"))\n        .arg(Arg::new(\"foo\").required(true))\n        .arg(Arg::new(\"opt\"))\n        .arg(Arg::new(\"bar\"));\n\n    utils::assert_output(cmd, \"clap-test val\", POSITIONAL_REQ_IF_VAL, true);\n}\n\n#[test]\nfn group_required() {\n    let result = Command::new(\"group_required\")\n        .arg(arg!(-f --flag \"some flag\"))\n        .group(ArgGroup::new(\"gr\").required(true).arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some \"some arg\"))\n        .arg(arg!(--other \"other arg\"))\n        .try_get_matches_from(vec![\"\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn group_required_2() {\n    let m = Command::new(\"group_required\")\n        .arg(arg!(-f --flag \"some flag\").action(ArgAction::SetTrue))\n        .group(ArgGroup::new(\"gr\").required(true).arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some \"some arg\").action(ArgAction::SetTrue))\n        .arg(arg!(--other \"other arg\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-f\", \"--some\"])\n        .unwrap();\n    assert!(*m.get_one::<bool>(\"some\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"other\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn group_required_3() {\n    let m = Command::new(\"group_required\")\n        .arg(arg!(-f --flag \"some flag\").action(ArgAction::SetTrue))\n        .group(ArgGroup::new(\"gr\").required(true).arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some \"some arg\").action(ArgAction::SetTrue))\n        .arg(arg!(--other \"other arg\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-f\", \"--other\"])\n        .unwrap();\n    assert!(!*m.get_one::<bool>(\"some\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"other\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn arg_require_group() {\n    let result = Command::new(\"arg_require_group\")\n        .arg(arg!(-f --flag \"some flag\").requires(\"gr\"))\n        .group(ArgGroup::new(\"gr\").arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some \"some arg\"))\n        .arg(arg!(--other \"other arg\"))\n        .try_get_matches_from(vec![\"\", \"-f\"]);\n    assert!(result.is_err());\n    let err = result.err().unwrap();\n    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn arg_require_group_2() {\n    let res = Command::new(\"arg_require_group\")\n        .arg(\n            arg!(-f --flag \"some flag\")\n                .requires(\"gr\")\n                .action(ArgAction::SetTrue),\n        )\n        .group(ArgGroup::new(\"gr\").arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some \"some arg\").action(ArgAction::SetTrue))\n        .arg(arg!(--other \"other arg\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-f\", \"--some\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(*m.get_one::<bool>(\"some\").expect(\"defaulted by clap\"));\n    assert!(!*m.get_one::<bool>(\"other\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn arg_require_group_3() {\n    let res = Command::new(\"arg_require_group\")\n        .arg(\n            arg!(-f --flag \"some flag\")\n                .requires(\"gr\")\n                .action(ArgAction::SetTrue),\n        )\n        .group(ArgGroup::new(\"gr\").arg(\"some\").arg(\"other\"))\n        .arg(arg!(--some \"some arg\").action(ArgAction::SetTrue))\n        .arg(arg!(--other \"other arg\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"\", \"-f\", \"--other\"]);\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!*m.get_one::<bool>(\"some\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"other\").expect(\"defaulted by clap\"));\n    assert!(*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n// REQUIRED_UNLESS\n\n#[test]\nfn issue_753() {\n    let m = Command::new(\"test\")\n        .arg(arg!(\n            -l --list \"List available interfaces (and stop there)\"\n        ))\n        .arg(\n            arg!(\n                -i --iface <INTERFACE> \"Ethernet interface for fetching NTP packets\"\n            )\n            .required(false)\n            .required_unless_present(\"list\"),\n        )\n        .arg(\n            arg!(-f --file <TESTFILE> \"Fetch NTP packets from pcap file\")\n                .conflicts_with(\"iface\")\n                .required_unless_present(\"list\"),\n        )\n        .arg(arg!(-s --server <SERVER_IP> \"NTP server IP address\").required_unless_present(\"list\"))\n        .try_get_matches_from(vec![\"test\", \"--list\"]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n}\n\n#[test]\nfn required_unless_present() {\n    let res = Command::new(\"unlesstest\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_unless_present(\"dbg\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"dbg\").long(\"debug\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"unlesstest\", \"--debug\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(*m.get_one::<bool>(\"dbg\").expect(\"defaulted by clap\"));\n    assert!(!m.contains_id(\"cfg\"));\n}\n\n#[test]\nfn required_unless_present_err() {\n    let res = Command::new(\"unlesstest\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_unless_present(\"dbg\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"dbg\").long(\"debug\"))\n        .try_get_matches_from(vec![\"unlesstest\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn required_unless_present_with_optional_value() {\n    let res = Command::new(\"unlesstest\")\n        .arg(Arg::new(\"opt\").long(\"opt\").num_args(0..=1))\n        .arg(\n            Arg::new(\"cfg\")\n                .required_unless_present(\"dbg\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"dbg\").long(\"debug\"))\n        .try_get_matches_from(vec![\"unlesstest\", \"--opt\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n// REQUIRED_UNLESS_ALL\n\n#[test]\nfn required_unless_present_all() {\n    let res = Command::new(\"unlessall\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_unless_present_all([\"dbg\", \"infile\"])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"dbg\").long(\"debug\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"infile\").short('i').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"unlessall\", \"--debug\", \"-i\", \"file\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(*m.get_one::<bool>(\"dbg\").expect(\"defaulted by clap\"));\n    assert!(m.contains_id(\"infile\"));\n    assert!(!m.contains_id(\"cfg\"));\n}\n\n#[test]\nfn required_unless_all_err() {\n    let res = Command::new(\"unlessall\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_unless_present_all([\"dbg\", \"infile\"])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"dbg\").long(\"debug\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"infile\").short('i').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"unlessall\", \"--debug\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n// REQUIRED_UNLESS_ONE\n\n#[test]\nfn required_unless_present_any() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_unless_present_any([\"dbg\", \"infile\"])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"dbg\").long(\"debug\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"infile\").short('i').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"unlessone\", \"--debug\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(*m.get_one::<bool>(\"dbg\").expect(\"defaulted by clap\"));\n    assert!(!m.contains_id(\"cfg\"));\n}\n\n#[test]\nfn required_unless_any_2() {\n    // This tests that the required_unless_present_any works when the second arg in the array is used\n    // instead of the first.\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_unless_present_any([\"dbg\", \"infile\"])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"dbg\").long(\"debug\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"infile\").short('i').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"unlessone\", \"-i\", \"file\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(m.contains_id(\"infile\"));\n    assert!(!m.contains_id(\"cfg\"));\n}\n\n#[test]\nfn required_unless_any_works_with_short() {\n    // GitHub issue: https://github.com/clap-rs/clap/issues/1135\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"a\")\n                .conflicts_with(\"b\")\n                .short('a')\n                .action(ArgAction::SetTrue),\n        )\n        .arg(Arg::new(\"b\").short('b').action(ArgAction::SetTrue))\n        .arg(\n            Arg::new(\"x\")\n                .short('x')\n                .action(ArgAction::SetTrue)\n                .required_unless_present_any([\"a\", \"b\"]),\n        )\n        .try_get_matches_from(vec![\"unlessone\", \"-a\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_unless_any_works_with_short_err() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"a\")\n                .conflicts_with(\"b\")\n                .short('a')\n                .action(ArgAction::SetTrue),\n        )\n        .arg(Arg::new(\"b\").short('b').action(ArgAction::SetTrue))\n        .arg(\n            Arg::new(\"x\")\n                .short('x')\n                .action(ArgAction::SetTrue)\n                .required_unless_present_any([\"a\", \"b\"]),\n        )\n        .try_get_matches_from(vec![\"unlessone\"]);\n\n    assert!(res.is_err());\n}\n\n#[test]\nfn required_unless_any_works_without() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"a\")\n                .conflicts_with(\"b\")\n                .short('a')\n                .action(ArgAction::SetTrue),\n        )\n        .arg(Arg::new(\"b\").short('b').action(ArgAction::SetTrue))\n        .arg(Arg::new(\"x\").required_unless_present_any([\"a\", \"b\"]))\n        .try_get_matches_from(vec![\"unlessone\", \"-a\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_unless_any_works_with_long() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"a\")\n                .conflicts_with(\"b\")\n                .short('a')\n                .action(ArgAction::SetTrue),\n        )\n        .arg(Arg::new(\"b\").short('b').action(ArgAction::SetTrue))\n        .arg(\n            Arg::new(\"x\")\n                .long(\"x_is_the_option\")\n                .action(ArgAction::SetTrue)\n                .required_unless_present_any([\"a\", \"b\"]),\n        )\n        .try_get_matches_from(vec![\"unlessone\", \"-a\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_unless_any_1() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_unless_present_any([\"dbg\", \"infile\"])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"dbg\").long(\"debug\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"infile\").short('i').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"unlessone\", \"--debug\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n    let m = res.unwrap();\n    assert!(!m.contains_id(\"infile\"));\n    assert!(!m.contains_id(\"cfg\"));\n    assert!(*m.get_one::<bool>(\"dbg\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn required_unless_any_err() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_unless_present_any([\"dbg\", \"infile\"])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"dbg\").long(\"debug\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"infile\").short('i').action(ArgAction::Set))\n        .try_get_matches_from(vec![\"unlessone\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn missing_required_output() {\n    static MISSING_REQ: &str = \"\\\nerror: the following required arguments were not provided:\n  --long-option-2 <option2>\n  <positional>\n  <positional2>\n\nUsage: clap-test --long-option-2 <option2> -F <positional> <positional2> [positional3]...\n\nFor more information, try '--help'.\n\";\n\n    utils::assert_output(utils::complex_app(), \"clap-test -F\", MISSING_REQ, true);\n}\n\n// Conditional external requirements\n\n#[test]\nfn requires_if_present_val() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"cfg\")\n                .requires_if(\"my.cfg\", \"extra\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").long(\"extra\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"unlessone\", \"--config=my.cfg\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn requires_if_present_mult() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"cfg\")\n                .requires_ifs([(\"my.cfg\", \"extra\"), (\"other.cfg\", \"other\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").long(\"extra\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"other\").long(\"other\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"unlessone\", \"--config=other.cfg\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn requires_if_present_mult_pass() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"cfg\")\n                .requires_ifs([(\"my.cfg\", \"extra\"), (\"other.cfg\", \"other\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").long(\"extra\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"other\").long(\"other\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"unlessone\", \"--config=some.cfg\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn requires_if_present_val_no_present_pass() {\n    let res = Command::new(\"unlessone\")\n        .arg(\n            Arg::new(\"cfg\")\n                .requires_if(\"my.cfg\", \"extra\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").long(\"extra\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"unlessone\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n// Conditionally required\n\n#[test]\nfn required_if_val_present_pass() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq(\"extra\", \"val\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .try_get_matches_from(vec![\"ri\", \"--extra\", \"val\", \"--config\", \"my.cfg\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_if_val_present_fail() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq(\"extra\", \"val\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .try_get_matches_from(vec![\"ri\", \"--extra\", \"val\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn required_if_val_present_ignore_case_pass() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq(\"extra\", \"Val\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(\n            Arg::new(\"extra\")\n                .action(ArgAction::Set)\n                .long(\"extra\")\n                .ignore_case(true),\n        )\n        .try_get_matches_from(vec![\"ri\", \"--extra\", \"vaL\", \"--config\", \"my.cfg\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_if_val_present_ignore_case_fail() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq(\"extra\", \"Val\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(\n            Arg::new(\"extra\")\n                .action(ArgAction::Set)\n                .long(\"extra\")\n                .ignore_case(true),\n        )\n        .try_get_matches_from(vec![\"ri\", \"--extra\", \"vaL\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn required_if_all_values_present_pass() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq_all([(\"extra\", \"val\"), (\"option\", \"spec\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .arg(Arg::new(\"option\").action(ArgAction::Set).long(\"option\"))\n        .try_get_matches_from(vec![\n            \"ri\", \"--extra\", \"val\", \"--option\", \"spec\", \"--config\", \"my.cfg\",\n        ]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_if_some_values_present_pass() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq_all([(\"extra\", \"val\"), (\"option\", \"spec\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .arg(Arg::new(\"option\").action(ArgAction::Set).long(\"option\"))\n        .try_get_matches_from(vec![\"ri\", \"--extra\", \"val\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_if_all_values_present_fail() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq_all([(\"extra\", \"val\"), (\"option\", \"spec\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .arg(Arg::new(\"option\").action(ArgAction::Set).long(\"option\"))\n        .try_get_matches_from(vec![\"ri\", \"--extra\", \"val\", \"--option\", \"spec\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn required_if_any_all_values_present_pass() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq_all([(\"extra\", \"val\"), (\"option\", \"spec\")])\n                .required_if_eq_any([(\"extra\", \"val2\"), (\"option\", \"spec2\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .arg(Arg::new(\"option\").action(ArgAction::Set).long(\"option\"))\n        .try_get_matches_from(vec![\n            \"ri\", \"--extra\", \"val\", \"--option\", \"spec\", \"--config\", \"my.cfg\",\n        ]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_if_any_all_values_present_fail() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq_all([(\"extra\", \"val\"), (\"option\", \"spec\")])\n                .required_if_eq_any([(\"extra\", \"val2\"), (\"option\", \"spec2\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .arg(Arg::new(\"option\").action(ArgAction::Set).long(\"option\"))\n        .try_get_matches_from(vec![\"ri\", \"--extra\", \"val\", \"--option\", \"spec\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn list_correct_required_args() {\n    static COND_REQ_IN_USAGE: &str = \"\\\nerror: the following required arguments were not provided:\n  --output <output>\n\nUsage: test --target <target> --input <input> --output <output>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"Test cmd\")\n        .version(\"1.0\")\n        .author(\"F0x06\")\n        .about(\"Arg test\")\n        .arg(\n            Arg::new(\"target\")\n                .action(ArgAction::Set)\n                .required(true)\n                .value_parser([\"file\", \"stdout\"])\n                .long(\"target\"),\n        )\n        .arg(\n            Arg::new(\"input\")\n                .action(ArgAction::Set)\n                .required(true)\n                .long(\"input\"),\n        )\n        .arg(\n            Arg::new(\"output\")\n                .action(ArgAction::Set)\n                .required(true)\n                .long(\"output\"),\n        );\n\n    utils::assert_output(\n        cmd,\n        \"test --input somepath --target file\",\n        COND_REQ_IN_USAGE,\n        true,\n    );\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn required_if_val_present_fail_error_output() {\n    static COND_REQ_IN_USAGE: &str = \"\\\nerror: the following required arguments were not provided:\n  --output <output>\n\nUsage: test --target <target> --input <input> --output <output>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"Test cmd\")\n        .version(\"1.0\")\n        .author(\"F0x06\")\n        .about(\"Arg test\")\n        .arg(\n            Arg::new(\"target\")\n                .action(ArgAction::Set)\n                .required(true)\n                .value_parser([\"file\", \"stdout\"])\n                .long(\"target\"),\n        )\n        .arg(\n            Arg::new(\"input\")\n                .action(ArgAction::Set)\n                .required(true)\n                .long(\"input\"),\n        )\n        .arg(\n            Arg::new(\"output\")\n                .action(ArgAction::Set)\n                .required_if_eq(\"target\", \"file\")\n                .long(\"output\"),\n        );\n\n    utils::assert_output(\n        cmd,\n        \"test --input somepath --target file\",\n        COND_REQ_IN_USAGE,\n        true,\n    );\n}\n\n#[test]\nfn required_if_wrong_val() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq(\"extra\", \"val\")\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .try_get_matches_from(vec![\"ri\", \"--extra\", \"other\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_ifs_val_present_pass() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq_any([(\"extra\", \"val\"), (\"option\", \"spec\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"option\").action(ArgAction::Set).long(\"option\"))\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .try_get_matches_from(vec![\"ri\", \"--option\", \"spec\", \"--config\", \"my.cfg\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_ifs_val_present_fail() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq_any([(\"extra\", \"val\"), (\"option\", \"spec\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .arg(Arg::new(\"option\").action(ArgAction::Set).long(\"option\"))\n        .try_get_matches_from(vec![\"ri\", \"--option\", \"spec\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\nfn required_ifs_wrong_val() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq_any([(\"extra\", \"val\"), (\"option\", \"spec\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .arg(Arg::new(\"option\").action(ArgAction::Set).long(\"option\"))\n        .try_get_matches_from(vec![\"ri\", \"--option\", \"other\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn required_ifs_wrong_val_mult_fail() {\n    let res = Command::new(\"ri\")\n        .arg(\n            Arg::new(\"cfg\")\n                .required_if_eq_any([(\"extra\", \"val\"), (\"option\", \"spec\")])\n                .action(ArgAction::Set)\n                .long(\"config\"),\n        )\n        .arg(Arg::new(\"extra\").action(ArgAction::Set).long(\"extra\"))\n        .arg(Arg::new(\"option\").action(ArgAction::Set).long(\"option\"))\n        .try_get_matches_from(vec![\"ri\", \"--extra\", \"other\", \"--option\", \"spec\"]);\n\n    assert!(res.is_err());\n    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn require_eq() {\n    static REQUIRE_EQUALS: &str = \"\\\nerror: the following required arguments were not provided:\n  --opt=<FILE>\n\nUsage: clap-test --opt=<FILE>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"clap-test\").version(\"v1.4.8\").arg(\n        Arg::new(\"opt\")\n            .long(\"opt\")\n            .short('o')\n            .required(true)\n            .require_equals(true)\n            .value_name(\"FILE\")\n            .help(\"some\"),\n    );\n    utils::assert_output(cmd, \"clap-test\", REQUIRE_EQUALS, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn require_eq_filtered() {\n    static REQUIRE_EQUALS_FILTERED: &str = \"\\\nerror: the following required arguments were not provided:\n  --opt=<FILE>\n\nUsage: clap-test --opt=<FILE> --foo=<FILE>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"clap-test\")\n        .version(\"v1.4.8\")\n        .arg(\n            Arg::new(\"opt\")\n                .long(\"opt\")\n                .short('o')\n                .required(true)\n                .require_equals(true)\n                .value_name(\"FILE\")\n                .help(\"some\"),\n        )\n        .arg(\n            Arg::new(\"foo\")\n                .long(\"foo\")\n                .short('f')\n                .required(true)\n                .require_equals(true)\n                .value_name(\"FILE\")\n                .help(\"some other arg\"),\n        );\n    utils::assert_output(cmd, \"clap-test -f=blah\", REQUIRE_EQUALS_FILTERED, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn require_eq_filtered_group() {\n    static REQUIRE_EQUALS_FILTERED_GROUP: &str = \"\\\nerror: the following required arguments were not provided:\n  --opt=<FILE>\n\nUsage: clap-test --opt=<FILE> --foo=<FILE> <--g1=<FILE>|--g2=<FILE>>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"clap-test\")\n        .version(\"v1.4.8\")\n        .arg(\n            Arg::new(\"opt\")\n                .long(\"opt\")\n                .short('o')\n                .required(true)\n                .require_equals(true)\n                .value_name(\"FILE\")\n                .help(\"some\"),\n        )\n        .arg(\n            Arg::new(\"foo\")\n                .long(\"foo\")\n                .short('f')\n                .required(true)\n                .require_equals(true)\n                .value_name(\"FILE\")\n                .help(\"some other arg\"),\n        )\n        .arg(\n            Arg::new(\"g1\")\n                .long(\"g1\")\n                .require_equals(true)\n                .value_name(\"FILE\"),\n        )\n        .arg(\n            Arg::new(\"g2\")\n                .long(\"g2\")\n                .require_equals(true)\n                .value_name(\"FILE\"),\n        )\n        .group(\n            ArgGroup::new(\"test_group\")\n                .args([\"g1\", \"g2\"])\n                .required(true),\n        );\n    utils::assert_output(\n        cmd,\n        \"clap-test -f=blah --g1=blah\",\n        REQUIRE_EQUALS_FILTERED_GROUP,\n        true,\n    );\n}\n\nfn issue_1158_app() -> Command {\n    Command::new(\"example\")\n        .arg(\n            arg!(-c --config <FILE> \"Custom config file.\")\n                .required_unless_present(\"ID\")\n                .conflicts_with(\"ID\"),\n        )\n        .arg(\n            arg!([ID] \"ID\")\n                .required_unless_present(\"config\")\n                .conflicts_with(\"config\")\n                .requires_ifs([\n                    (ArgPredicate::IsPresent, \"x\"),\n                    (ArgPredicate::IsPresent, \"y\"),\n                    (ArgPredicate::IsPresent, \"z\"),\n                ]),\n        )\n        .arg(arg!(x: -x <X> \"X\"))\n        .arg(arg!(y: -y <Y> \"Y\"))\n        .arg(arg!(z: -z <Z> \"Z\"))\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn multiple_required_unless_usage_printing() {\n    static MULTIPLE_REQUIRED_UNLESS_USAGE: &str = \"\\\nerror: the following required arguments were not provided:\n  --a <a>\n  --b <b>\n\nUsage: test --c <c> --a <a> --b <b>\n\nFor more information, try '--help'.\n\";\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"a\")\n                .long(\"a\")\n                .action(ArgAction::Set)\n                .required_unless_present(\"b\")\n                .conflicts_with(\"b\"),\n        )\n        .arg(\n            Arg::new(\"b\")\n                .long(\"b\")\n                .action(ArgAction::Set)\n                .required_unless_present(\"a\")\n                .conflicts_with(\"a\"),\n        )\n        .arg(\n            Arg::new(\"c\")\n                .long(\"c\")\n                .action(ArgAction::Set)\n                .required_unless_present(\"d\")\n                .conflicts_with(\"d\"),\n        )\n        .arg(\n            Arg::new(\"d\")\n                .long(\"d\")\n                .action(ArgAction::Set)\n                .required_unless_present(\"c\")\n                .conflicts_with(\"c\"),\n        );\n    utils::assert_output(cmd, \"test --c asd\", MULTIPLE_REQUIRED_UNLESS_USAGE, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn issue_1158_conflicting_requirements() {\n    static ISSUE_1158: &str = \"\\\nerror: the following required arguments were not provided:\n  -x <X>\n  -y <Y>\n  -z <Z>\n\nUsage: example -x <X> -y <Y> -z <Z> <ID>\n\nFor more information, try '--help'.\n\";\n\n    let cmd = issue_1158_app();\n\n    utils::assert_output(cmd, \"example id\", ISSUE_1158, true);\n}\n\n#[test]\nfn issue_1158_conflicting_requirements_rev() {\n    let res = issue_1158_app().try_get_matches_from([\"\", \"--config\", \"some.conf\"]);\n\n    assert!(res.is_ok(), \"{}\", res.unwrap_err());\n}\n\n#[test]\nfn issue_1643_args_mutually_require_each_other() {\n    use clap::*;\n\n    let cmd = Command::new(\"test\")\n        .arg(\n            Arg::new(\"relation_id\")\n                .help(\"The relation id to get the data from\")\n                .long(\"relation-id\")\n                .short('r')\n                .action(ArgAction::Set)\n                .requires(\"remote_unit_name\"),\n        )\n        .arg(\n            Arg::new(\"remote_unit_name\")\n                .help(\"The name of the remote unit to get data from\")\n                .long(\"remote-unit\")\n                .short('u')\n                .action(ArgAction::Set)\n                .requires(\"relation_id\"),\n        );\n\n    cmd.try_get_matches_from([\"test\", \"-u\", \"hello\", \"-r\", \"farewell\"])\n        .unwrap();\n}\n\n#[test]\nfn short_flag_require_equals_with_minvals_zero() {\n    let m = Command::new(\"foo\")\n        .arg(\n            Arg::new(\"check\")\n                .short('c')\n                .num_args(0..)\n                .require_equals(true),\n        )\n        .arg(Arg::new(\"unique\").short('u').action(ArgAction::SetTrue))\n        .try_get_matches_from([\"foo\", \"-cu\"])\n        .unwrap();\n    assert!(m.contains_id(\"check\"));\n    assert!(*m.get_one::<bool>(\"unique\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn issue_2624() {\n    let matches = Command::new(\"foo\")\n        .arg(\n            Arg::new(\"check\")\n                .short('c')\n                .long(\"check\")\n                .require_equals(true)\n                .num_args(0..)\n                .value_parser([\"silent\", \"quiet\", \"diagnose-first\"]),\n        )\n        .arg(\n            Arg::new(\"unique\")\n                .short('u')\n                .long(\"unique\")\n                .action(ArgAction::SetTrue),\n        )\n        .try_get_matches_from([\"foo\", \"-cu\"])\n        .unwrap();\n    assert!(matches.contains_id(\"check\"));\n    assert!(*matches\n        .get_one::<bool>(\"unique\")\n        .expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn required_unless_all_with_any() {\n    let cmd = Command::new(\"prog\")\n        .arg(Arg::new(\"foo\").long(\"foo\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"bar\").long(\"bar\").action(ArgAction::SetTrue))\n        .arg(Arg::new(\"baz\").long(\"baz\").action(ArgAction::SetTrue))\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .action(ArgAction::SetTrue)\n                .required_unless_present_any([\"foo\"])\n                .required_unless_present_all([\"bar\", \"baz\"]),\n        );\n\n    let result = cmd.clone().try_get_matches_from(vec![\"myprog\"]);\n    assert!(result.is_err(), \"{:?}\", result.unwrap());\n\n    let result = cmd.clone().try_get_matches_from(vec![\"myprog\", \"--foo\"]);\n    assert!(result.is_ok(), \"{:?}\", result.unwrap_err());\n    let matches = result.unwrap();\n    assert!(!*matches.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n\n    let result = cmd\n        .clone()\n        .try_get_matches_from(vec![\"myprog\", \"--bar\", \"--baz\"]);\n    assert!(result.is_ok(), \"{:?}\", result.unwrap_err());\n    let matches = result.unwrap();\n    assert!(!*matches.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n\n    let result = cmd.try_get_matches_from(vec![\"myprog\", \"--bar\"]);\n    assert!(result.is_err(), \"{:?}\", result.unwrap());\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command prog: Argument or group 'extra' specified in 'requires*' for 'config' does not exist\"]\nfn requires_invalid_arg() {\n    let _ = Command::new(\"prog\")\n        .arg(Arg::new(\"config\").requires(\"extra\").long(\"config\"))\n        .try_get_matches_from(vec![\"\", \"--config\"]);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command prog: Argument or group 'extra' specified in 'requires*' for 'config' does not exist\"]\nfn requires_if_invalid_arg() {\n    let _ = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"config\")\n                .requires_if(\"val\", \"extra\")\n                .long(\"config\"),\n        )\n        .try_get_matches_from(vec![\"\", \"--config\"]);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command prog: Argument or group 'extra' specified in 'required_if_eq*' for 'config' does not exist\"]\nfn required_if_invalid_arg() {\n    let _ = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"config\")\n                .required_if_eq(\"extra\", \"val\")\n                .long(\"config\"),\n        )\n        .try_get_matches_from(vec![\"\", \"--config\"]);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Command prog: Argument or group 'extra' specified in 'required_unless*' for 'config' does not exist\"]\nfn required_unless_invalid_arg() {\n    let _ = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"config\")\n                .required_unless_present(\"extra\")\n                .long(\"config\"),\n        )\n        .try_get_matches_from(vec![\"\"]);\n}\n\n#[test]\nfn requires_with_default_value() {\n    let result = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"opt\")\n                .long(\"opt\")\n                .default_value(\"default\")\n                .requires(\"flag\"),\n        )\n        .arg(Arg::new(\"flag\").long(\"flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"myprog\"]);\n\n    assert!(\n        result.is_ok(),\n        \"requires should ignore default_value: {:?}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn requires_if_with_default_value() {\n    let result = Command::new(\"prog\")\n        .arg(\n            Arg::new(\"opt\")\n                .long(\"opt\")\n                .default_value(\"default\")\n                .requires_if(\"default\", \"flag\"),\n        )\n        .arg(Arg::new(\"flag\").long(\"flag\").action(ArgAction::SetTrue))\n        .try_get_matches_from(vec![\"myprog\"]);\n\n    assert!(\n        result.is_ok(),\n        \"requires_if should ignore default_value: {:?}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn group_requires_with_default_value() {\n    let result = Command::new(\"prog\")\n        .arg(Arg::new(\"opt\").long(\"opt\").default_value(\"default\"))\n        .arg(Arg::new(\"flag\").long(\"flag\").action(ArgAction::SetTrue))\n        .group(ArgGroup::new(\"one\").arg(\"opt\").requires(\"flag\"))\n        .try_get_matches_from(vec![\"myprog\"]);\n\n    assert!(\n        result.is_ok(),\n        \"arg group requires should ignore default_value: {:?}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn required_if_eq_on_default_value() {\n    let result = Command::new(\"prog\")\n        .arg(Arg::new(\"opt\").long(\"opt\").default_value(\"default\"))\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .action(ArgAction::SetTrue)\n                .required_if_eq(\"opt\", \"default\"),\n        )\n        .try_get_matches_from(vec![\"myprog\"]);\n\n    assert!(\n        result.is_ok(),\n        \"required_if_eq should ignore default_value: {:?}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn required_if_eq_all_on_default_value() {\n    let result = Command::new(\"prog\")\n        .arg(Arg::new(\"opt\").long(\"opt\").default_value(\"default\"))\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .action(ArgAction::SetTrue)\n                .required_if_eq_all([(\"opt\", \"default\")]),\n        )\n        .try_get_matches_from(vec![\"myprog\"]);\n\n    assert!(\n        result.is_ok(),\n        \"required_if_eq_all should ignore default_value: {:?}\",\n        result.unwrap_err()\n    );\n    let m = result.unwrap();\n\n    assert_eq!(\n        m.get_one::<String>(\"opt\").map(|v| v.as_str()),\n        Some(\"default\")\n    );\n    assert!(!*m.get_one::<bool>(\"flag\").expect(\"defaulted by clap\"));\n}\n\n#[test]\nfn required_unless_on_default_value() {\n    let result = Command::new(\"prog\")\n        .arg(Arg::new(\"opt\").long(\"opt\").default_value(\"default\"))\n        .arg(Arg::new(\"flag\").long(\"flag\").required_unless_present(\"opt\"))\n        .try_get_matches_from(vec![\"myprog\"]);\n\n    assert!(result.is_err(), \"{:?}\", result.unwrap());\n}\n\n#[test]\nfn required_unless_all_on_default_value() {\n    let result = Command::new(\"prog\")\n        .arg(Arg::new(\"opt\").long(\"opt\").default_value(\"default\"))\n        .arg(\n            Arg::new(\"flag\")\n                .long(\"flag\")\n                .required_unless_present_all([\"opt\"]),\n        )\n        .try_get_matches_from(vec![\"myprog\"]);\n\n    assert!(result.is_err(), \"{:?}\", result.unwrap());\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn required_error_doesnt_duplicate() {\n    let cmd = Command::new(\"Clap-created-USAGE-string-bug\")\n        .arg(Arg::new(\"a\").required(true))\n        .arg(\n            Arg::new(\"b\")\n                .short('b')\n                .action(ArgAction::Set)\n                .conflicts_with(\"c\"),\n        )\n        .arg(\n            Arg::new(\"c\")\n                .short('c')\n                .action(ArgAction::Set)\n                .conflicts_with(\"b\"),\n        );\n    const EXPECTED: &str = \"\\\nerror: the argument '-b <b>' cannot be used with '-c <c>'\n\nUsage: clap-test -b <b> <a>\n\nFor more information, try '--help'.\n\";\n    utils::assert_output(cmd, \"clap-test aaa -b bbb -c ccc\", EXPECTED, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn required_require_with_group_shows_flag() {\n    let cmd = Command::new(\"test\")\n        .arg(arg!(--\"require-first\").requires(\"first\"))\n        .arg(arg!(--first).group(\"either_or_both\"))\n        .arg(arg!(--second).group(\"either_or_both\"))\n        .group(\n            ArgGroup::new(\"either_or_both\")\n                .multiple(true)\n                .required(true),\n        );\n    const EXPECTED: &str = \"\\\nerror: the following required arguments were not provided:\n  --first\n\nUsage: test --require-first <--first|--second>\n\nFor more information, try '--help'.\n\";\n    utils::assert_output(cmd, \"test --require-first --second\", EXPECTED, true);\n}\n\n#[test]\n#[should_panic = \"Argument flag cannot require itself\"]\nfn requires_self() {\n    let _result = Command::new(\"flag_required\")\n        .arg(arg!(-f --flag \"some flag\").requires(\"flag\"))\n        .try_get_matches_from(vec![\"\"]);\n}\n"
  },
  {
    "path": "tests/builder/subcommands.rs",
    "content": "use clap::{arg, error::ErrorKind, Arg, ArgAction, Command};\n\nuse super::utils;\nuse snapbox::assert_data_eq;\nuse snapbox::str;\n\n#[test]\nfn subcommand() {\n    let m = Command::new(\"test\")\n        .subcommand(Command::new(\"some\").defer(|cmd| {\n            cmd.arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .action(ArgAction::Set)\n                    .help(\"testing testing\"),\n            )\n        }))\n        .arg(Arg::new(\"other\").long(\"other\"))\n        .try_get_matches_from(vec![\"myprog\", \"some\", \"--test\", \"testing\"])\n        .unwrap();\n\n    assert_eq!(m.subcommand_name().unwrap(), \"some\");\n    let sub_m = m.subcommand_matches(\"some\").unwrap();\n    assert!(sub_m.contains_id(\"test\"));\n    assert_eq!(\n        sub_m.get_one::<String>(\"test\").map(|v| v.as_str()).unwrap(),\n        \"testing\"\n    );\n}\n\n#[test]\nfn subcommand_none_given() {\n    let m = Command::new(\"test\")\n        .subcommand(Command::new(\"some\").defer(|cmd| {\n            cmd.arg(\n                Arg::new(\"test\")\n                    .short('t')\n                    .long(\"test\")\n                    .action(ArgAction::Set)\n                    .help(\"testing testing\"),\n            )\n        }))\n        .arg(Arg::new(\"other\").long(\"other\"))\n        .try_get_matches_from(vec![\"\"])\n        .unwrap();\n\n    assert!(m.subcommand_name().is_none());\n}\n\n#[test]\nfn subcommand_multiple() {\n    let m = Command::new(\"test\")\n        .subcommands(vec![\n            Command::new(\"some\").defer(|cmd| {\n                cmd.arg(\n                    Arg::new(\"test\")\n                        .short('t')\n                        .long(\"test\")\n                        .action(ArgAction::Set)\n                        .help(\"testing testing\"),\n                )\n            }),\n            Command::new(\"add\").defer(|cmd| cmd.arg(Arg::new(\"roster\").short('r'))),\n        ])\n        .arg(Arg::new(\"other\").long(\"other\"))\n        .try_get_matches_from(vec![\"myprog\", \"some\", \"--test\", \"testing\"])\n        .unwrap();\n\n    assert!(m.subcommand_matches(\"some\").is_some());\n    assert!(m.subcommand_matches(\"add\").is_none());\n    assert_eq!(m.subcommand_name().unwrap(), \"some\");\n    let sub_m = m.subcommand_matches(\"some\").unwrap();\n    assert!(sub_m.contains_id(\"test\"));\n    assert_eq!(\n        sub_m.get_one::<String>(\"test\").map(|v| v.as_str()).unwrap(),\n        \"testing\"\n    );\n}\n\n#[test]\nfn single_alias() {\n    let m = Command::new(\"myprog\")\n        .subcommand(Command::new(\"test\").alias(\"do-stuff\"))\n        .try_get_matches_from(vec![\"myprog\", \"do-stuff\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\n#[test]\nfn multiple_aliases() {\n    let m = Command::new(\"myprog\")\n        .subcommand(Command::new(\"test\").aliases([\"do-stuff\", \"test-stuff\"]))\n        .try_get_matches_from(vec![\"myprog\", \"test-stuff\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"test\"));\n}\n\n#[test]\n#[cfg(feature = \"suggestions\")]\n#[cfg(feature = \"error-context\")]\nfn subcmd_did_you_mean_output() {\n    #[cfg(feature = \"suggestions\")]\n    static DYM_SUBCMD: &str = \"\\\nerror: unrecognized subcommand 'subcm'\n\n  tip: a similar subcommand exists: 'subcmd'\n\nUsage: dym [COMMAND]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"dym\").subcommand(Command::new(\"subcmd\"));\n    utils::assert_output(cmd, \"dym subcm\", DYM_SUBCMD, true);\n}\n\n#[test]\n#[cfg(feature = \"suggestions\")]\n#[cfg(feature = \"error-context\")]\nfn subcmd_did_you_mean_output_ambiguous() {\n    #[cfg(feature = \"suggestions\")]\n    static DYM_SUBCMD_AMBIGUOUS: &str = \"\\\nerror: unrecognized subcommand 'te'\n\n  tip: some similar subcommands exist: 'test', 'temp'\n\nUsage: dym [COMMAND]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"dym\")\n        .subcommand(Command::new(\"test\"))\n        .subcommand(Command::new(\"temp\"));\n    utils::assert_output(cmd, \"dym te\", DYM_SUBCMD_AMBIGUOUS, true);\n}\n\n#[test]\n#[cfg(feature = \"suggestions\")]\n#[cfg(feature = \"error-context\")]\nfn subcmd_did_you_mean_output_arg() {\n    static EXPECTED: &str = \"\\\nerror: unexpected argument '--subcmarg' found\n\n  tip: 'subcmd --subcmdarg' exists\n\nUsage: dym [COMMAND]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"dym\").subcommand(\n        Command::new(\"subcmd\").defer(|cmd| cmd.arg(arg!(-s --subcmdarg <subcmdarg> \"tests\"))),\n    );\n\n    utils::assert_output(cmd, \"dym --subcmarg subcmd\", EXPECTED, true);\n}\n\n#[test]\n#[cfg(feature = \"suggestions\")]\n#[cfg(feature = \"error-context\")]\nfn subcmd_did_you_mean_output_arg_false_positives() {\n    static EXPECTED: &str = \"\\\nerror: unexpected argument '--subcmarg' found\n\nUsage: dym [COMMAND]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"dym\").subcommand(\n        Command::new(\"subcmd\").defer(|cmd| cmd.arg(arg!(-s --subcmdarg <subcmdarg> \"tests\"))),\n    );\n\n    utils::assert_output(cmd, \"dym --subcmarg foo\", EXPECTED, true);\n}\n\n#[test]\nfn alias_help() {\n    let m = Command::new(\"myprog\")\n        .subcommand(Command::new(\"test\").alias(\"do-stuff\"))\n        .try_get_matches_from(vec![\"myprog\", \"help\", \"do-stuff\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::DisplayHelp);\n}\n\n#[test]\nfn visible_aliases_help_output() {\n    static VISIBLE_ALIAS_HELP: &str = \"\\\nUsage: clap-test [COMMAND]\n\nCommands:\n  test  Some help [aliases: dongle, done]\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n    let cmd = Command::new(\"clap-test\").version(\"2.6\").subcommand(\n        Command::new(\"test\")\n            .about(\"Some help\")\n            .alias(\"invisible\")\n            .visible_alias(\"dongle\")\n            .visible_alias(\"done\"),\n    );\n    utils::assert_output(cmd, \"clap-test --help\", VISIBLE_ALIAS_HELP, false);\n}\n\n#[test]\nfn invisible_aliases_help_output() {\n    static INVISIBLE_ALIAS_HELP: &str = \"\\\nUsage: clap-test [COMMAND]\n\nCommands:\n  test  Some help\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n\n    let cmd = Command::new(\"clap-test\")\n        .version(\"2.6\")\n        .subcommand(Command::new(\"test\").about(\"Some help\").alias(\"invisible\"));\n    utils::assert_output(cmd, \"clap-test --help\", INVISIBLE_ALIAS_HELP, false);\n}\n\n#[test]\nfn issue_1031_args_with_same_name() {\n    let res = Command::new(\"prog\")\n        .arg(arg!(--\"ui-path\" <PATH>).required(true))\n        .subcommand(Command::new(\"signer\"))\n        .try_get_matches_from(vec![\"prog\", \"--ui-path\", \"signer\"]);\n\n    assert!(res.is_ok(), \"{:?}\", res.unwrap_err().kind());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"ui-path\").map(|v| v.as_str()),\n        Some(\"signer\")\n    );\n}\n\n#[test]\nfn issue_1031_args_with_same_name_no_more_vals() {\n    let res = Command::new(\"prog\")\n        .arg(arg!(--\"ui-path\" <PATH>).required(true))\n        .subcommand(Command::new(\"signer\"))\n        .try_get_matches_from(vec![\"prog\", \"--ui-path\", \"value\", \"signer\"]);\n\n    assert!(res.is_ok(), \"{:?}\", res.unwrap_err().kind());\n    let m = res.unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"ui-path\").map(|v| v.as_str()),\n        Some(\"value\")\n    );\n    assert_eq!(m.subcommand_name(), Some(\"signer\"));\n}\n\n#[test]\nfn issue_1161_multiple_hyphen_hyphen() {\n    // from example 22\n    let res = Command::new(\"myprog\")\n        .arg(Arg::new(\"eff\").short('f'))\n        .arg(Arg::new(\"pea\").short('p').action(ArgAction::Set))\n        .arg(\n            Arg::new(\"slop\")\n                .action(ArgAction::Set)\n                .num_args(1..)\n                .last(true),\n        )\n        .try_get_matches_from(vec![\n            \"-f\",\n            \"-p=bob\",\n            \"--\",\n            \"sloppy\",\n            \"slop\",\n            \"-a\",\n            \"--\",\n            \"subprogram\",\n            \"position\",\n            \"args\",\n        ]);\n\n    assert!(res.is_ok(), \"{:?}\", res.unwrap_err().kind());\n    let m = res.unwrap();\n\n    let expected = Some(vec![\n        \"sloppy\",\n        \"slop\",\n        \"-a\",\n        \"--\",\n        \"subprogram\",\n        \"position\",\n        \"args\",\n    ]);\n    let actual = m\n        .get_many::<String>(\"slop\")\n        .map(|vals| vals.map(|s| s.as_str()).collect::<Vec<_>>());\n\n    assert_eq!(expected, actual);\n}\n\n#[test]\nfn issue_1722_not_emit_error_when_arg_follows_similar_to_a_subcommand() {\n    let m = Command::new(\"myprog\")\n        .subcommand(Command::new(\"subcommand\"))\n        .arg(Arg::new(\"argument\"))\n        .try_get_matches_from(vec![\"myprog\", \"--\", \"subcommand\"]);\n    assert_eq!(\n        m.unwrap().get_one::<String>(\"argument\").map(|v| v.as_str()),\n        Some(\"subcommand\")\n    );\n}\n\n#[test]\nfn subcommand_placeholder_test() {\n    let mut cmd = Command::new(\"myprog\")\n        .subcommand(Command::new(\"subcommand\"))\n        .subcommand_value_name(\"TEST_PLACEHOLDER\")\n        .subcommand_help_heading(\"TEST_HEADER\");\n\n    assert_eq!(\n        &cmd.render_usage().to_string(),\n        \"Usage: myprog [TEST_PLACEHOLDER]\"\n    );\n\n    let help_text = cmd.render_help().to_string();\n\n    assert!(help_text.contains(\"TEST_HEADER:\"));\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn subcommand_used_after_double_dash() {\n    static SUBCMD_AFTER_DOUBLE_DASH: &str = \"\\\nerror: unexpected argument 'subcmd' found\n\n  tip: subcommand 'subcmd' exists; to use it, remove the '--' before it\n\nUsage: cmd [COMMAND]\n\nFor more information, try '--help'.\n\";\n\n    let cmd = Command::new(\"cmd\").subcommand(Command::new(\"subcmd\"));\n\n    utils::assert_output(cmd, \"cmd -- subcmd\", SUBCMD_AFTER_DOUBLE_DASH, true);\n}\n\n#[test]\nfn subcommand_after_argument() {\n    let m = Command::new(\"myprog\")\n        .arg(Arg::new(\"some_text\"))\n        .subcommand(Command::new(\"test\"))\n        .try_get_matches_from(vec![\"myprog\", \"teat\", \"test\"])\n        .unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"some_text\").map(|v| v.as_str()),\n        Some(\"teat\")\n    );\n    assert_eq!(m.subcommand().unwrap().0, \"test\");\n}\n\n#[test]\nfn subcommand_after_argument_looks_like_help() {\n    let m = Command::new(\"myprog\")\n        .arg(Arg::new(\"some_text\"))\n        .subcommand(Command::new(\"test\"))\n        .try_get_matches_from(vec![\"myprog\", \"helt\", \"test\"])\n        .unwrap();\n    assert_eq!(\n        m.get_one::<String>(\"some_text\").map(|v| v.as_str()),\n        Some(\"helt\")\n    );\n    assert_eq!(m.subcommand().unwrap().0, \"test\");\n}\n\n#[test]\nfn issue_2494_subcommand_is_present() {\n    let cmd = Command::new(\"opt\")\n        .arg(Arg::new(\"global\").long(\"global\").action(ArgAction::SetTrue))\n        .subcommand(Command::new(\"global\"));\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"opt\", \"--global\", \"global\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name().unwrap(), \"global\");\n    assert!(*m.get_one::<bool>(\"global\").expect(\"defaulted by clap\"));\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"opt\", \"--global\"])\n        .unwrap();\n    assert!(m.subcommand_name().is_none());\n    assert!(*m.get_one::<bool>(\"global\").expect(\"defaulted by clap\"));\n\n    let m = cmd.try_get_matches_from([\"opt\", \"global\"]).unwrap();\n    assert_eq!(m.subcommand_name().unwrap(), \"global\");\n    assert!(!*m.get_one::<bool>(\"global\").expect(\"defaulted by clap\"));\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn subcommand_not_recognized() {\n    let cmd = Command::new(\"fake\")\n        .subcommand(Command::new(\"sub\"))\n        .disable_help_subcommand(true)\n        .infer_subcommands(true);\n    utils::assert_output(\n        cmd,\n        \"fake help\",\n        \"error: unrecognized subcommand 'help'\n\nUsage: fake [COMMAND]\n\nFor more information, try '--help'.\n\",\n        true,\n    );\n}\n\n#[test]\nfn busybox_like_multicall() {\n    fn applet_commands() -> [Command; 2] {\n        [Command::new(\"true\"), Command::new(\"false\")]\n    }\n    let cmd = Command::new(\"busybox\")\n        .multicall(true)\n        .subcommand(Command::new(\"busybox\").defer(|cmd| cmd.subcommands(applet_commands())))\n        .subcommands(applet_commands());\n\n    let m = cmd\n        .clone()\n        .try_get_matches_from([\"busybox\", \"true\"])\n        .unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"busybox\"));\n    assert_eq!(m.subcommand().unwrap().1.subcommand_name(), Some(\"true\"));\n\n    let m = cmd.clone().try_get_matches_from([\"true\"]).unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"true\"));\n\n    let m = cmd.clone().try_get_matches_from([\"a.out\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);\n}\n\n#[test]\nfn hostname_like_multicall() {\n    let mut cmd = Command::new(\"hostname\")\n        .multicall(true)\n        .subcommand(Command::new(\"hostname\"))\n        .subcommand(Command::new(\"dnsdomainname\"));\n\n    let m = cmd.clone().try_get_matches_from([\"hostname\"]).unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"hostname\"));\n\n    let m = cmd.clone().try_get_matches_from([\"dnsdomainname\"]).unwrap();\n    assert_eq!(m.subcommand_name(), Some(\"dnsdomainname\"));\n\n    let m = cmd.clone().try_get_matches_from([\"a.out\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);\n\n    let m = cmd.try_get_matches_from_mut([\"hostname\", \"hostname\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);\n\n    let m = cmd.try_get_matches_from([\"hostname\", \"dnsdomainname\"]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn bad_multicall_command_error() {\n    let cmd = Command::new(\"repl\")\n        .version(\"1.0.0\")\n        .propagate_version(true)\n        .multicall(true)\n        .subcommand(Command::new(\"foo\"))\n        .subcommand(Command::new(\"bar\"));\n\n    let err = cmd.clone().try_get_matches_from([\"world\"]).unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::InvalidSubcommand);\n    assert_data_eq!(\n        err.to_string(),\n        str![[r#\"\nerror: unrecognized subcommand 'world'\n\nUsage: <COMMAND>\n\nFor more information, try 'help'.\n\n\"#]]\n    );\n\n    #[cfg(feature = \"suggestions\")]\n    {\n        let err = cmd.clone().try_get_matches_from([\"baz\"]).unwrap_err();\n        utils::assert_error(err, ErrorKind::InvalidSubcommand, str![[r#\"\nerror: unrecognized subcommand 'baz'\n\n  tip: a similar subcommand exists: 'bar'\n\nUsage: <COMMAND>\n\nFor more information, try 'help'.\n\n\"#]], true);\n    }\n\n    // Verify whatever we did to get the above to work didn't disable `--help` and `--version`.\n\n    let err = cmd\n        .clone()\n        .try_get_matches_from([\"foo\", \"--help\"])\n        .unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::DisplayHelp);\n\n    let err = cmd\n        .clone()\n        .try_get_matches_from([\"foo\", \"--version\"])\n        .unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::DisplayVersion);\n}\n\n#[test]\n#[should_panic = \"Command repl: Arguments like oh-no cannot be set on a multicall command\"]\nfn cant_have_args_with_multicall() {\n    let mut cmd = Command::new(\"repl\")\n        .version(\"1.0.0\")\n        .propagate_version(true)\n        .multicall(true)\n        .subcommand(Command::new(\"foo\"))\n        .subcommand(Command::new(\"bar\"))\n        .arg(Arg::new(\"oh-no\"));\n    cmd.build();\n}\n\n#[test]\nfn multicall_help_flag() {\n    static EXPECTED: &str = \"\\\nUsage: foo bar [value]\n\nArguments:\n  [value]  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n    let cmd = Command::new(\"repl\")\n        .version(\"1.0.0\")\n        .propagate_version(true)\n        .multicall(true)\n        .subcommand(Command::new(\"foo\").defer(|cmd| {\n            cmd.subcommand(Command::new(\"bar\").defer(|cmd| cmd.arg(Arg::new(\"value\"))))\n        }));\n    utils::assert_output(cmd, \"foo bar --help\", EXPECTED, false);\n}\n\n#[test]\nfn multicall_help_subcommand() {\n    static EXPECTED: &str = \"\\\nUsage: foo bar [value]\n\nArguments:\n  [value]  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n    let cmd = Command::new(\"repl\")\n        .version(\"1.0.0\")\n        .propagate_version(true)\n        .multicall(true)\n        .subcommand(\n            Command::new(\"foo\")\n                .defer(|cmd| cmd.subcommand(Command::new(\"bar\").arg(Arg::new(\"value\")))),\n        );\n    utils::assert_output(cmd, \"help foo bar\", EXPECTED, false);\n}\n\n#[test]\nfn multicall_render_help() {\n    let mut cmd = Command::new(\"repl\")\n        .version(\"1.0.0\")\n        .propagate_version(true)\n        .multicall(true)\n        .subcommand(\n            Command::new(\"foo\")\n                .defer(|cmd| cmd.subcommand(Command::new(\"bar\").arg(Arg::new(\"value\")))),\n        );\n    cmd.build();\n    let subcmd = cmd.find_subcommand_mut(\"foo\").unwrap();\n    let subcmd = subcmd.find_subcommand_mut(\"bar\").unwrap();\n\n    let help = subcmd.render_help().to_string();\n    assert_data_eq!(\n        help,\n        str![[r#\"\nUsage: foo bar [value]\n\nArguments:\n  [value]  \n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\n\"#]]\n    );\n}\n\n#[test]\n#[should_panic = \"Command test: command name `repeat` is duplicated\"]\nfn duplicate_subcommand() {\n    Command::new(\"test\")\n        .subcommand(Command::new(\"repeat\"))\n        .subcommand(Command::new(\"repeat\"))\n        .build();\n}\n\n#[test]\n#[should_panic = \"Command test: command `unique` alias `repeat` is duplicated\"]\nfn duplicate_subcommand_alias() {\n    Command::new(\"test\")\n        .subcommand(Command::new(\"repeat\"))\n        .subcommand(Command::new(\"unique\").alias(\"repeat\"))\n        .build();\n}\n"
  },
  {
    "path": "tests/builder/template_help.rs",
    "content": "use super::utils;\n\nuse clap::{arg, Command};\n\n#[cfg(not(feature = \"unstable-v5\"))]\nstatic EXAMPLE1_TMPL_S: &str = \"{bin} {version}\n{author}\n{about}\n\nUsage: {usage}\n\n{all-args}\";\n\n#[cfg(feature = \"unstable-v5\")]\nstatic EXAMPLE1_TMPL_S: &str = \"{name} {version}\n{author}\n{about}\n\nUsage: {usage}\n\n{all-args}\";\n\n#[cfg(not(feature = \"unstable-v5\"))]\nstatic EXAMPLE1_TMPS_F: &str = \"{bin} {version}\n{author}\n{about}\n\nUsage: {usage}\n\nOptions:\n{options}\nArguments:\n{positionals}\nCommands:\n{subcommands}\";\n\n#[cfg(feature = \"unstable-v5\")]\nstatic EXAMPLE1_TMPS_F: &str = \"{name} {version}\n{author}\n{about}\n\nUsage: {usage}\n\nOptions:\n{options}\nArguments:\n{positionals}\nCommands:\n{subcommands}\";\n\nstatic CUSTOM_TEMPL_HELP: &str = \"MyApp 1.0\nKevin K. <kbknapp@gmail.com>\nDoes awesome things\n\nUsage: MyApp [OPTIONS] <output> [COMMAND]\n\nOptions:\n  -c, --config <FILE>  Sets a custom config file\n  -d...                Turn debugging information on\n  -h, --help           Print help\n  -V, --version        Print version\nArguments:\n  <output>  Sets an optional output file\nCommands:\n  test  does testing things\n  help  Print this message or the help of the given subcommand(s)\n\";\n\nstatic SIMPLE_TEMPLATE: &str = \"MyApp 1.0\nKevin K. <kbknapp@gmail.com>\nDoes awesome things\n\nUsage: MyApp [OPTIONS] <output> [COMMAND]\n\nCommands:\n  test  does testing things\n  help  Print this message or the help of the given subcommand(s)\n\nArguments:\n  <output>  Sets an optional output file\n\nOptions:\n  -c, --config <FILE>  Sets a custom config file\n  -d...                Turn debugging information on\n  -h, --help           Print help\n  -V, --version        Print version\n\";\n\n#[test]\nfn with_template() {\n    let cmd = get_app().help_template(EXAMPLE1_TMPL_S);\n    utils::assert_output(cmd, \"MyApp --help\", SIMPLE_TEMPLATE, false);\n}\n\n#[test]\nfn custom_template() {\n    let cmd = get_app().help_template(EXAMPLE1_TMPS_F);\n    utils::assert_output(cmd, \"MyApp --help\", CUSTOM_TEMPL_HELP, false);\n}\n\n#[test]\nfn template_empty() {\n    let cmd = Command::new(\"MyApp\")\n        .version(\"1.0\")\n        .author(\"Kevin K. <kbknapp@gmail.com>\")\n        .about(\"Does awesome things\")\n        .help_template(\"\");\n    utils::assert_output(cmd, \"MyApp --help\", \"\\n\", false);\n}\n\n#[test]\nfn template_notag() {\n    let cmd = Command::new(\"MyApp\")\n        .version(\"1.0\")\n        .author(\"Kevin K. <kbknapp@gmail.com>\")\n        .about(\"Does awesome things\")\n        .help_template(\"test no tag test\");\n    utils::assert_output(cmd, \"MyApp --help\", \"test no tag test\\n\", false);\n}\n\n#[test]\nfn template_unknowntag() {\n    let cmd = Command::new(\"MyApp\")\n        .version(\"1.0\")\n        .author(\"Kevin K. <kbknapp@gmail.com>\")\n        .about(\"Does awesome things\")\n        .help_template(\"test {unknown_tag} test\");\n    utils::assert_output(cmd, \"MyApp --help\", \"test {unknown_tag} test\\n\", false);\n}\n\n#[test]\nfn template_author_version() {\n    #[cfg(not(feature = \"unstable-v5\"))]\n    let cmd = Command::new(\"MyApp\")\n        .version(\"1.0\")\n        .author(\"Kevin K. <kbknapp@gmail.com>\")\n        .about(\"Does awesome things\")\n        .help_template(\"{author}\\n{version}\\n{about}\\n{bin}\");\n\n    #[cfg(feature = \"unstable-v5\")]\n    let cmd = Command::new(\"MyApp\")\n        .version(\"1.0\")\n        .author(\"Kevin K. <kbknapp@gmail.com>\")\n        .about(\"Does awesome things\")\n        .help_template(\"{author}\\n{version}\\n{about}\\n{name}\");\n\n    utils::assert_output(\n        cmd,\n        \"MyApp --help\",\n        \"Kevin K. <kbknapp@gmail.com>\\n1.0\\nDoes awesome things\\nMyApp\\n\",\n        false,\n    );\n}\n\n// ----------\n\nfn get_app() -> Command {\n    Command::new(\"MyApp\")\n        .version(\"1.0\")\n        .author(\"Kevin K. <kbknapp@gmail.com>\")\n        .about(\"Does awesome things\")\n        .arg(\n            arg!(\n                -c --config <FILE> \"Sets a custom config file\"\n            )\n            .required(false),\n        )\n        .arg(arg!(\n            <output>            \"Sets an optional output file\"\n        ))\n        .arg(arg!(\n            d: -d ...           \"Turn debugging information on\"\n        ))\n        .subcommand(\n            Command::new(\"test\")\n                .about(\"does testing things\")\n                .arg(arg!(-l --list \"lists test values\")),\n        )\n}\n"
  },
  {
    "path": "tests/builder/tests.rs",
    "content": "use super::utils;\n\nuse std::io::Write;\nuse std::str;\n\nuse clap::{Arg, Command};\nuse snapbox::assert_data_eq;\n\nstatic SCF2OP: &str = \"flag present 2 times\noption NOT present\npositional NOT present\nflag2 NOT present\noption2 maybe present with value of: Nothing\npositional2 maybe present with value of: Nothing\noption3 NOT present\npositional3 NOT present\noption NOT present\npositional NOT present\nsubcmd present\nflag present 2 times\nscoption present with value: some\nAn scoption: some\nscpositional present with value: value\n\";\n\nstatic SCFOP: &str = \"flag present 1 times\noption NOT present\npositional NOT present\nflag2 NOT present\noption2 maybe present with value of: Nothing\npositional2 maybe present with value of: Nothing\noption3 NOT present\npositional3 NOT present\noption NOT present\npositional NOT present\nsubcmd present\nflag present 1 times\nscoption present with value: some\nAn scoption: some\nscpositional present with value: value\n\";\n\nstatic O2P: &str = \"flag NOT present\noption present with value: some\nAn option: some\nAn option: other\npositional present with value: value\nflag2 NOT present\noption2 maybe present with value of: Nothing\npositional2 maybe present with value of: Nothing\noption3 NOT present\npositional3 NOT present\noption present with value: some\nAn option: some\nAn option: other\npositional present with value: value\nsubcmd NOT present\n\";\n\nstatic F2OP: &str = \"flag present 2 times\noption present with value: some\nAn option: some\npositional present with value: value\nflag2 NOT present\noption2 maybe present with value of: Nothing\npositional2 maybe present with value of: Nothing\noption3 NOT present\npositional3 NOT present\noption present with value: some\nAn option: some\npositional present with value: value\nsubcmd NOT present\n\";\n\nstatic FOP: &str = \"flag present 1 times\noption present with value: some\nAn option: some\npositional present with value: value\nflag2 NOT present\noption2 maybe present with value of: Nothing\npositional2 maybe present with value of: Nothing\noption3 NOT present\npositional3 NOT present\noption present with value: some\nAn option: some\npositional present with value: value\nsubcmd NOT present\n\";\n\npub(crate) fn check_complex_output(args: &str, out: impl snapbox::data::IntoData) {\n    let mut w = vec![];\n    let matches = utils::complex_app()\n        .try_get_matches_from(args.split(' ').collect::<Vec<_>>())\n        .unwrap();\n    match matches.get_one::<u8>(\"flag\").unwrap() {\n        0 => {\n            writeln!(w, \"flag NOT present\").unwrap();\n        }\n        n => {\n            writeln!(w, \"flag present {n} times\").unwrap();\n        }\n    }\n\n    if matches.contains_id(\"option\") {\n        if let Some(v) = matches.get_one::<String>(\"option\").map(|v| v.as_str()) {\n            writeln!(w, \"option present with value: {v}\").unwrap();\n        }\n        if let Some(ov) = matches.get_many::<String>(\"option\") {\n            for o in ov {\n                writeln!(w, \"An option: {o}\").unwrap();\n            }\n        }\n    } else {\n        writeln!(w, \"option NOT present\").unwrap();\n    }\n\n    if let Some(p) = matches.get_one::<String>(\"positional\").map(|v| v.as_str()) {\n        writeln!(w, \"positional present with value: {p}\").unwrap();\n    } else {\n        writeln!(w, \"positional NOT present\").unwrap();\n    }\n\n    if *matches.get_one::<bool>(\"flag2\").expect(\"defaulted by clap\") {\n        writeln!(w, \"flag2 present\").unwrap();\n        writeln!(\n            w,\n            \"option2 present with value of: {}\",\n            matches\n                .get_one::<String>(\"long-option-2\")\n                .map(|v| v.as_str())\n                .unwrap()\n        )\n        .unwrap();\n        writeln!(\n            w,\n            \"positional2 present with value of: {}\",\n            matches\n                .get_one::<String>(\"positional2\")\n                .map(|v| v.as_str())\n                .unwrap()\n        )\n        .unwrap();\n    } else {\n        writeln!(w, \"flag2 NOT present\").unwrap();\n        writeln!(\n            w,\n            \"option2 maybe present with value of: {}\",\n            matches\n                .get_one::<String>(\"long-option-2\")\n                .map(|v| v.as_str())\n                .unwrap_or(\"Nothing\")\n        )\n        .unwrap();\n        writeln!(\n            w,\n            \"positional2 maybe present with value of: {}\",\n            matches\n                .get_one::<String>(\"positional2\")\n                .map(|v| v.as_str())\n                .unwrap_or(\"Nothing\")\n        )\n        .unwrap();\n    }\n\n    let _ = match matches\n        .get_one::<String>(\"option3\")\n        .map(|v| v.as_str())\n        .unwrap_or(\"\")\n    {\n        \"fast\" => writeln!(w, \"option3 present quickly\"),\n        \"slow\" => writeln!(w, \"option3 present slowly\"),\n        _ => writeln!(w, \"option3 NOT present\"),\n    };\n\n    let _ = match matches\n        .get_one::<String>(\"positional3\")\n        .map(|v| v.as_str())\n        .unwrap_or(\"\")\n    {\n        \"vi\" => writeln!(w, \"positional3 present in vi mode\"),\n        \"emacs\" => writeln!(w, \"positional3 present in emacs mode\"),\n        _ => writeln!(w, \"positional3 NOT present\"),\n    };\n\n    if matches.contains_id(\"option\") {\n        if let Some(v) = matches.get_one::<String>(\"option\").map(|v| v.as_str()) {\n            writeln!(w, \"option present with value: {v}\").unwrap();\n        }\n        if let Some(ov) = matches.get_many::<String>(\"option\") {\n            for o in ov {\n                writeln!(w, \"An option: {o}\").unwrap();\n            }\n        }\n    } else {\n        writeln!(w, \"option NOT present\").unwrap();\n    }\n\n    if let Some(p) = matches.get_one::<String>(\"positional\").map(|v| v.as_str()) {\n        writeln!(w, \"positional present with value: {p}\").unwrap();\n    } else {\n        writeln!(w, \"positional NOT present\").unwrap();\n    }\n    if let Some(\"subcmd\") = matches.subcommand_name() {\n        writeln!(w, \"subcmd present\").unwrap();\n        if let Some(matches) = matches.subcommand_matches(\"subcmd\") {\n            match matches.get_one::<u8>(\"flag\").unwrap() {\n                0 => {\n                    writeln!(w, \"flag NOT present\").unwrap();\n                }\n                n => {\n                    writeln!(w, \"flag present {n} times\").unwrap();\n                }\n            }\n\n            if matches.contains_id(\"option\") {\n                if let Some(v) = matches.get_one::<String>(\"option\").map(|v| v.as_str()) {\n                    writeln!(w, \"scoption present with value: {v}\").unwrap();\n                }\n                if let Some(ov) = matches.get_many::<String>(\"option\") {\n                    for o in ov {\n                        writeln!(w, \"An scoption: {o}\").unwrap();\n                    }\n                }\n            } else {\n                writeln!(w, \"scoption NOT present\").unwrap();\n            }\n\n            if let Some(p) = matches\n                .get_one::<String>(\"scpositional\")\n                .map(|v| v.as_str())\n            {\n                writeln!(w, \"scpositional present with value: {p}\").unwrap();\n            }\n        }\n    } else {\n        writeln!(w, \"subcmd NOT present\").unwrap();\n    }\n\n    let res = str::from_utf8(&w).unwrap();\n    assert_data_eq!(res, out);\n}\n\n#[test]\nfn create_app() {\n    let _ = Command::new(\"test\")\n        .version(\"1.0\")\n        .author(\"kevin\")\n        .about(\"does awesome things\")\n        .try_get_matches_from(vec![\"\"])\n        .unwrap();\n}\n\n#[test]\nfn add_multiple_arg() {\n    let _ = Command::new(\"test\")\n        .args([Arg::new(\"test\").short('s'), Arg::new(\"test2\").short('l')])\n        .try_get_matches_from(vec![\"\"])\n        .unwrap();\n}\n#[test]\nfn flag_x2_opt() {\n    check_complex_output(\n        \"clap-test value -f -f -o some\",\n        \"flag present 2 times\noption present with value: some\nAn option: some\npositional present with value: value\nflag2 NOT present\noption2 maybe present with value of: Nothing\npositional2 maybe present with value of: Nothing\noption3 NOT present\npositional3 NOT present\noption present with value: some\nAn option: some\npositional present with value: value\nsubcmd NOT present\n\",\n    );\n}\n\n#[test]\nfn long_opt_x2_pos() {\n    check_complex_output(\"clap-test value --option some --option other\", O2P);\n}\n\n#[test]\nfn long_opt_eq_x2_pos() {\n    check_complex_output(\"clap-test value --option=some --option=other\", O2P);\n}\n\n#[test]\nfn short_opt_x2_pos() {\n    check_complex_output(\"clap-test value -o some -o other\", O2P);\n}\n\n#[test]\nfn short_opt_eq_x2_pos() {\n    check_complex_output(\"clap-test value -o=some -o=other\", O2P);\n}\n\n#[test]\nfn short_flag_x2_comb_short_opt_pos() {\n    check_complex_output(\"clap-test value -ff -o some\", F2OP);\n}\n\n#[test]\nfn short_flag_short_opt_pos() {\n    check_complex_output(\"clap-test value -f -o some\", FOP);\n}\n\n#[test]\nfn long_flag_long_opt_pos() {\n    check_complex_output(\"clap-test value --flag --option some\", FOP);\n}\n\n#[test]\nfn long_flag_long_opt_eq_pos() {\n    check_complex_output(\"clap-test value --flag --option=some\", FOP);\n}\n\n#[test]\nfn sc_long_flag_long_opt() {\n    check_complex_output(\"clap-test subcmd value --flag --option some\", SCFOP);\n}\n\n#[test]\nfn sc_long_flag_short_opt_pos() {\n    check_complex_output(\"clap-test subcmd value --flag -o some\", SCFOP);\n}\n\n#[test]\nfn sc_long_flag_long_opt_eq_pos() {\n    check_complex_output(\"clap-test subcmd value --flag --option=some\", SCFOP);\n}\n\n#[test]\nfn sc_short_flag_long_opt_pos() {\n    check_complex_output(\"clap-test subcmd value -f --option some\", SCFOP);\n}\n\n#[test]\nfn sc_short_flag_short_opt_pos() {\n    check_complex_output(\"clap-test subcmd value -f -o some\", SCFOP);\n}\n\n#[test]\nfn sc_short_flag_short_opt_eq_pos() {\n    check_complex_output(\"clap-test subcmd value -f -o=some\", SCFOP);\n}\n\n#[test]\nfn sc_short_flag_long_opt_eq_pos() {\n    check_complex_output(\"clap-test subcmd value -f --option=some\", SCFOP);\n}\n\n#[test]\nfn sc_short_flag_x2_comb_long_opt_pos() {\n    check_complex_output(\"clap-test subcmd value -ff --option some\", SCF2OP);\n}\n\n#[test]\nfn sc_short_flag_x2_comb_short_opt_pos() {\n    check_complex_output(\"clap-test subcmd value -ff -o some\", SCF2OP);\n}\n\n#[test]\nfn sc_short_flag_x2_comb_long_opt_eq_pos() {\n    check_complex_output(\"clap-test subcmd value -ff --option=some\", SCF2OP);\n}\n\n#[test]\nfn sc_short_flag_x2_comb_short_opt_eq_pos() {\n    check_complex_output(\"clap-test subcmd value -ff -o=some\", SCF2OP);\n}\n\n#[test]\nfn sc_long_flag_x2_long_opt_pos() {\n    check_complex_output(\"clap-test subcmd value --flag --flag --option some\", SCF2OP);\n}\n\n#[test]\nfn sc_long_flag_x2_short_opt_pos() {\n    check_complex_output(\"clap-test subcmd value --flag --flag -o some\", SCF2OP);\n}\n\n#[test]\nfn sc_long_flag_x2_short_opt_eq_pos() {\n    check_complex_output(\"clap-test subcmd value --flag --flag -o=some\", SCF2OP);\n}\n\n#[test]\nfn sc_long_flag_x2_long_opt_eq_pos() {\n    check_complex_output(\"clap-test subcmd value --flag --flag --option=some\", SCF2OP);\n}\n\n#[test]\nfn sc_short_flag_x2_long_opt_pos() {\n    check_complex_output(\"clap-test subcmd value -f -f --option some\", SCF2OP);\n}\n\n#[test]\nfn sc_short_flag_x2_short_opt_pos() {\n    check_complex_output(\"clap-test subcmd value -f -f -o some\", SCF2OP);\n}\n\n#[test]\nfn sc_short_flag_x2_short_opt_eq_pos() {\n    check_complex_output(\"clap-test subcmd value -f -f -o=some\", SCF2OP);\n}\n\n#[test]\nfn sc_short_flag_x2_long_opt_eq_pos() {\n    check_complex_output(\"clap-test subcmd value -f -f --option=some\", SCF2OP);\n}\n\n#[test]\nfn mut_arg_all() {\n    let mut cmd = utils::complex_app();\n    let arg_names = cmd\n        .get_arguments()\n        .map(|a| a.get_id().clone())\n        .filter(|a| a != \"version\" && a != \"help\")\n        .collect::<Vec<_>>();\n\n    for arg_name in arg_names {\n        cmd = cmd.mut_arg(arg_name, |arg| arg.hide_possible_values(true));\n    }\n}\n\n#[test]\nfn mut_subcommand_all() {\n    let cmd = utils::complex_app();\n\n    assert_eq!(\n        cmd.find_subcommand(\"subcmd\")\n            .unwrap()\n            .is_disable_version_flag_set(),\n        false\n    );\n    let cmd = cmd.mut_subcommand(\"subcmd\", |subcmd| subcmd.disable_version_flag(true));\n    assert_eq!(\n        cmd.find_subcommand(\"subcmd\")\n            .unwrap()\n            .is_disable_version_flag_set(),\n        true\n    );\n}\n\n#[test]\nfn mut_subcommand_with_alias_resolve() {\n    let mut cmd =\n        Command::new(\"foo\").subcommand(Command::new(\"bar\").alias(\"baz\").about(\"test subcmd\"));\n    assert_eq!(\n        cmd.find_subcommand(\"baz\")\n            .unwrap()\n            .get_about()\n            .unwrap()\n            .to_string(),\n        \"test subcmd\"\n    );\n\n    let true_name = cmd.find_subcommand(\"baz\").unwrap().get_name().to_string();\n    assert_eq!(true_name, \"bar\");\n\n    cmd = cmd.mut_subcommand(&*true_name, |subcmd| subcmd.about(\"modified about\"));\n    assert_eq!(\n        cmd.find_subcommand(\"baz\")\n            .unwrap()\n            .get_about()\n            .unwrap()\n            .to_string(),\n        \"modified about\"\n    );\n}\n\n#[test]\nfn issue_3669_command_build_recurses() {\n    let mut cmd = Command::new(\"ctest\").subcommand(\n        Command::new(\"subcmd\").subcommand(\n            Command::new(\"multi\")\n                .about(\"tests subcommands\")\n                .author(\"Kevin K. <kbknapp@gmail.com>\")\n                .version(\"0.1\")\n                .arg(clap::arg!(\n                    <FLAG>                    \"tests flags\"\n                )),\n        ),\n    );\n    cmd.build();\n}\n"
  },
  {
    "path": "tests/builder/unicode.rs",
    "content": "#![cfg(feature = \"unicode\")]\n\n#[test]\nfn possible_values_ignore_case() {\n    let m = clap::Command::new(\"pv\")\n        .arg(\n            clap::Arg::new(\"option\")\n                .short('o')\n                .long(\"option\")\n                .action(clap::ArgAction::Set)\n                .value_parser([\"ä\"])\n                .ignore_case(true),\n        )\n        .try_get_matches_from(vec![\"pv\", \"--option\", \"Ä\"]);\n\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    assert!(m\n        .unwrap()\n        .get_one::<String>(\"option\")\n        .map(|v| v.as_str())\n        .is_some());\n}\n"
  },
  {
    "path": "tests/builder/unique_args.rs",
    "content": "#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Argument names must be unique, but 'arg1' is in use by more than one argument or group\"]\nfn unique_arg_names() {\n    use clap::{Arg, Command};\n\n    let _ = Command::new(\"some\")\n        .args([Arg::new(\"arg1\").short('a'), Arg::new(\"arg1\").short('b')])\n        .try_get_matches();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Short option names must be unique for each argument, but '-a' is in use by both 'arg1' and 'arg2'\"]\nfn unique_arg_shorts() {\n    use clap::{Arg, Command};\n\n    let _ = Command::new(\"some\")\n        .args([Arg::new(\"arg1\").short('a'), Arg::new(\"arg2\").short('a')])\n        .try_get_matches();\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"Long option names must be unique for each argument, but '--long' is in use by both 'arg1' and 'arg2'\"]\nfn unique_arg_longs() {\n    use clap::{Arg, Command};\n\n    let _ = Command::new(\"some\")\n        .args([Arg::new(\"arg1\").long(\"long\"), Arg::new(\"arg2\").long(\"long\")])\n        .try_get_matches();\n}\n"
  },
  {
    "path": "tests/builder/utf16.rs",
    "content": "//! These Windows-only tests are ported from the Unix-only tests in\n//! tests/utf16.rs. The tests that use StrictUtf8 mode are omitted here,\n//! because that's a Unix-only feature.\n\n#![cfg(windows)]\n\nuse clap::{arg, value_parser, Command};\nuse std::ffi::OsString;\nuse std::os::windows::ffi::OsStringExt;\n\n// Take a slice of ASCII bytes, convert them to UTF-16, and then append a\n// dangling surrogate character to make the result invalid UTF-16.\nfn bad_osstring(ascii: &[u8]) -> OsString {\n    let mut wide_chars: Vec<u16> = ascii.iter().map(|&c| c as u16).collect();\n    // UTF-16 surrogate characters are only valid in pairs.\n    let surrogate_char: u16 = 0xDC00;\n    wide_chars.push(surrogate_char);\n    let os = OsString::from_wide(&wide_chars);\n    assert!(os.to_str().is_none(), \"invalid Unicode\");\n    os\n}\n\n#[test]\nfn invalid_utf16_positional() {\n    let r = Command::new(\"bad_utf16\")\n        .arg(arg!(<arg> \"some arg\").value_parser(value_parser!(OsString)))\n        .try_get_matches_from(vec![OsString::from(\"\"), bad_osstring(b\"\")]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(&*m.get_one::<OsString>(\"arg\").unwrap(), &*bad_osstring(b\"\"));\n}\n\n#[test]\nfn invalid_utf16_option_short_space() {\n    let r = Command::new(\"bad_utf16\")\n        .arg(arg!(-a --arg <arg> \"some arg\").value_parser(value_parser!(OsString)))\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from(\"-a\"),\n            bad_osstring(b\"\"),\n        ]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(&*m.get_one::<OsString>(\"arg\").unwrap(), &*bad_osstring(b\"\"));\n}\n\n#[test]\nfn invalid_utf16_option_short_equals() {\n    let r = Command::new(\"bad_utf16\")\n        .arg(arg!(-a --arg <arg> \"some arg\").value_parser(value_parser!(OsString)))\n        .try_get_matches_from(vec![OsString::from(\"\"), bad_osstring(b\"-a=\")]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(&*m.get_one::<OsString>(\"arg\").unwrap(), &*bad_osstring(b\"\"));\n}\n\n#[test]\nfn invalid_utf16_option_short_no_space() {\n    let r = Command::new(\"bad_utf16\")\n        .arg(arg!(-a --arg <arg> \"some arg\").value_parser(value_parser!(OsString)))\n        .try_get_matches_from(vec![OsString::from(\"\"), bad_osstring(b\"-a\")]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(&*m.get_one::<OsString>(\"arg\").unwrap(), &*bad_osstring(b\"\"));\n}\n\n#[test]\nfn invalid_utf16_option_long_space() {\n    let r = Command::new(\"bad_utf16\")\n        .arg(arg!(-a --arg <arg> \"some arg\").value_parser(value_parser!(OsString)))\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from(\"--arg\"),\n            bad_osstring(b\"\"),\n        ]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(&*m.get_one::<OsString>(\"arg\").unwrap(), &*bad_osstring(b\"\"));\n}\n\n#[test]\nfn invalid_utf16_option_long_equals() {\n    let r = Command::new(\"bad_utf16\")\n        .arg(arg!(-a --arg <arg> \"some arg\").value_parser(value_parser!(OsString)))\n        .try_get_matches_from(vec![OsString::from(\"\"), bad_osstring(b\"--arg=\")]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(&*m.get_one::<OsString>(\"arg\").unwrap(), &*bad_osstring(b\"\"));\n}\n"
  },
  {
    "path": "tests/builder/utf8.rs",
    "content": "#![cfg(not(windows))]\n\nuse clap::{arg, error::ErrorKind, value_parser, Arg, ArgAction, Command};\nuse std::ffi::OsString;\nuse std::os::unix::ffi::OsStringExt;\n\n#[test]\nfn invalid_utf8_strict_positional() {\n    let m = Command::new(\"bad_utf8\")\n        .arg(Arg::new(\"arg\"))\n        .try_get_matches_from(vec![OsString::from(\"\"), OsString::from_vec(vec![0xe9])]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_short_space() {\n    let m = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from(\"-a\"),\n            OsString::from_vec(vec![0xe9]),\n        ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_short_equals() {\n    let m = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from_vec(vec![0x2d, 0x61, 0x3d, 0xe9]),\n        ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_short_no_space() {\n    let m = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from_vec(vec![0x2d, 0x61, 0xe9]),\n        ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_long_space() {\n    let m = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from(\"--arg\"),\n            OsString::from_vec(vec![0xe9]),\n        ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_long_equals() {\n    let m = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from_vec(vec![0x2d, 0x2d, 0x61, 0x72, 0x67, 0x3d, 0xe9]),\n        ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_invalid_short() {\n    let m = Command::new(\"bad_utf8\").try_get_matches_from(vec![\n        OsString::from(\"\"),\n        OsString::from(\"-a\"),\n        OsString::from_vec(vec![0xe9]),\n    ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn invalid_utf8_strict_invalid_long() {\n    let m = Command::new(\"bad_utf8\").try_get_matches_from(vec![\n        OsString::from(\"\"),\n        OsString::from(\"--arg\"),\n        OsString::from_vec(vec![0xe9]),\n    ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn invalid_utf8_positional() {\n    let r = Command::new(\"bad_utf8\")\n        .arg(Arg::new(\"arg\").value_parser(value_parser!(OsString)))\n        .try_get_matches_from(vec![OsString::from(\"\"), OsString::from_vec(vec![0xe9])]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<OsString>(\"arg\").unwrap(),\n        &*OsString::from_vec(vec![0xe9])\n    );\n}\n\n#[test]\nfn invalid_utf8_option_short_space() {\n    let r = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set)\n                .value_parser(value_parser!(OsString)),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from(\"-a\"),\n            OsString::from_vec(vec![0xe9]),\n        ]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<OsString>(\"arg\").unwrap(),\n        &*OsString::from_vec(vec![0xe9])\n    );\n}\n\n#[test]\nfn invalid_utf8_option_short_equals() {\n    let r = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set)\n                .value_parser(value_parser!(OsString)),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from_vec(vec![0x2d, 0x61, 0x3d, 0xe9]),\n        ]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<OsString>(\"arg\").unwrap(),\n        &*OsString::from_vec(vec![0xe9])\n    );\n}\n\n#[test]\nfn invalid_utf8_option_short_no_space() {\n    let r = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set)\n                .value_parser(value_parser!(OsString)),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from_vec(vec![0x2d, 0x61, 0xe9]),\n        ]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<OsString>(\"arg\").unwrap(),\n        &*OsString::from_vec(vec![0xe9])\n    );\n}\n\n#[test]\nfn invalid_utf8_option_long_space() {\n    let r = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set)\n                .value_parser(value_parser!(OsString)),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from(\"--arg\"),\n            OsString::from_vec(vec![0xe9]),\n        ]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<OsString>(\"arg\").unwrap(),\n        &*OsString::from_vec(vec![0xe9])\n    );\n}\n\n#[test]\nfn invalid_utf8_option_long_equals() {\n    let r = Command::new(\"bad_utf8\")\n        .arg(\n            Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .action(ArgAction::Set)\n                .value_parser(value_parser!(OsString)),\n        )\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from_vec(vec![0x2d, 0x2d, 0x61, 0x72, 0x67, 0x3d, 0xe9]),\n        ]);\n    assert!(r.is_ok(), \"{}\", r.unwrap_err());\n    let m = r.unwrap();\n    assert!(m.contains_id(\"arg\"));\n    assert_eq!(\n        m.get_one::<OsString>(\"arg\").unwrap(),\n        &*OsString::from_vec(vec![0xe9])\n    );\n}\n\n#[test]\nfn refuse_invalid_utf8_subcommand_with_allow_external_subcommands() {\n    let m = Command::new(\"bad_utf8\")\n        .allow_external_subcommands(true)\n        .external_subcommand_value_parser(value_parser!(String))\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from_vec(vec![0xe9]),\n            OsString::from(\"normal\"),\n        ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn refuse_invalid_utf8_subcommand_when_args_are_allowed_with_allow_external_subcommands() {\n    let m = Command::new(\"bad_utf8\")\n        .allow_external_subcommands(true)\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from_vec(vec![0xe9]),\n            OsString::from(\"normal\"),\n        ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn refuse_invalid_utf8_subcommand_args_with_allow_external_subcommands() {\n    let m = Command::new(\"bad_utf8\")\n        .allow_external_subcommands(true)\n        .external_subcommand_value_parser(value_parser!(String))\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from(\"subcommand\"),\n            OsString::from(\"normal\"),\n            OsString::from_vec(vec![0xe9]),\n            OsString::from(\"--another_normal\"),\n        ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn allow_invalid_utf8_subcommand_args_with_allow_external_subcommands() {\n    let m = Command::new(\"bad_utf8\")\n        .allow_external_subcommands(true)\n        .try_get_matches_from(vec![\n            OsString::from(\"\"),\n            OsString::from(\"subcommand\"),\n            OsString::from(\"normal\"),\n            OsString::from_vec(vec![0xe9]),\n            OsString::from(\"--another_normal\"),\n        ]);\n    assert!(m.is_ok(), \"{}\", m.unwrap_err());\n    let m = m.unwrap();\n    let (subcommand, args) = m.subcommand().unwrap();\n    let args = args\n        .get_many::<OsString>(\"\")\n        .unwrap()\n        .cloned()\n        .collect::<Vec<_>>();\n    assert_eq!(subcommand, OsString::from(\"subcommand\"));\n    assert_eq!(\n        args,\n        vec![\n            OsString::from(\"normal\"),\n            OsString::from_vec(vec![0xe9]),\n            OsString::from(\"--another_normal\"),\n        ]\n    );\n}\n\n#[test]\nfn allow_validated_utf8_value_of() {\n    let a = Command::new(\"test\").arg(arg!(--name <NAME>));\n    let m = a.try_get_matches_from([\"test\", \"--name\", \"me\"]).unwrap();\n    let _ = m.get_one::<String>(\"name\").map(|v| v.as_str());\n}\n\n#[test]\nfn allow_validated_utf8_external_subcommand_values_of() {\n    let a = Command::new(\"test\")\n        .allow_external_subcommands(true)\n        .external_subcommand_value_parser(value_parser!(String));\n    let m = a.try_get_matches_from(vec![\"test\", \"cmd\", \"arg\"]).unwrap();\n    let (_ext, args) = m.subcommand().unwrap();\n    args.get_many::<String>(\"\").unwrap_or_default().count();\n}\n\n#[test]\n#[should_panic = \"Mismatch between definition and access of ``. Could not downcast to std::ffi::os_str::OsString, need to downcast to alloc::string::String\"]\nfn panic_validated_utf8_external_subcommand_values_of_os() {\n    let a = Command::new(\"test\")\n        .allow_external_subcommands(true)\n        .external_subcommand_value_parser(value_parser!(String));\n    let m = a.try_get_matches_from(vec![\"test\", \"cmd\", \"arg\"]).unwrap();\n    let (_ext, args) = m.subcommand().unwrap();\n    args.get_many::<OsString>(\"\").unwrap_or_default().count();\n}\n\n#[test]\nfn allow_invalid_utf8_external_subcommand_values_of_os() {\n    let a = Command::new(\"test\").allow_external_subcommands(true);\n    let m = a.try_get_matches_from(vec![\"test\", \"cmd\", \"arg\"]).unwrap();\n    let (_ext, args) = m.subcommand().unwrap();\n    args.get_many::<OsString>(\"\").unwrap_or_default().count();\n}\n\n#[test]\n#[should_panic = \"Mismatch between definition and access of ``. Could not downcast to alloc::string::String, need to downcast to std::ffi::os_str::OsString\"]\nfn panic_invalid_utf8_external_subcommand_values_of() {\n    let a = Command::new(\"test\").allow_external_subcommands(true);\n    let m = a.try_get_matches_from(vec![\"test\", \"cmd\", \"arg\"]).unwrap();\n    let (_ext, args) = m.subcommand().unwrap();\n    args.get_many::<String>(\"\").unwrap_or_default().count();\n}\n"
  },
  {
    "path": "tests/builder/utils.rs",
    "content": "#![allow(unused_imports, dead_code)]\n\nuse std::io::{BufRead, Cursor, Write};\nuse std::str;\n\nuse clap::{arg, error::Error, error::ErrorKind, Arg, ArgAction, ArgGroup, Command};\nuse snapbox::assert_data_eq;\n\npub(crate) const FULL_TEMPLATE: &str = \"\\\n{before-help}{name} {version}\n{author-with-newline}{about-with-newline}\n{usage-heading} {usage}\n\n{all-args}{after-help}\";\n\n#[track_caller]\npub(crate) fn assert_output(\n    l: Command,\n    args: &str,\n    expected: impl snapbox::data::IntoData,\n    stderr: bool,\n) {\n    let mut buf = Cursor::new(Vec::with_capacity(50));\n    let res = l.try_get_matches_from(args.split(' ').collect::<Vec<_>>());\n    let err = res.unwrap_err();\n    write!(&mut buf, \"{err}\").unwrap();\n    let actual = buf.into_inner();\n    let actual = String::from_utf8(actual).unwrap();\n    assert_eq!(\n        stderr,\n        err.use_stderr(),\n        \"Should Use STDERR failed. Should be {} but is {}\",\n        stderr,\n        err.use_stderr()\n    );\n    assert_data_eq!(actual, expected.raw());\n}\n\n#[track_caller]\npub(crate) fn assert_error<F: clap::error::ErrorFormatter>(\n    err: Error<F>,\n    expected_kind: ErrorKind,\n    expected_output: impl snapbox::data::IntoData,\n    stderr: bool,\n) {\n    let actual_output = err.to_string();\n    assert_eq!(\n        stderr,\n        err.use_stderr(),\n        \"Should Use STDERR failed. Should be {} but is {}\",\n        stderr,\n        err.use_stderr()\n    );\n    assert_eq!(expected_kind, err.kind());\n    #[cfg(feature = \"error-context\")]\n    assert_data_eq!(actual_output, expected_output);\n}\n\n// Legacy tests from the python script days\n\npub(crate) fn complex_app() -> Command {\n    let opt3_vals = [\"fast\", \"slow\"];\n    let pos3_vals = [\"vi\", \"emacs\"];\n\n    Command::new(\"clap-test\")\n        .version(\"v1.4.8\")\n        .about(\"tests clap library\")\n        .author(\"Kevin K. <kbknapp@gmail.com>\")\n        .help_template(FULL_TEMPLATE)\n        .arg(\n            arg!(\n                -o --option <opt> \"tests options\"\n            )\n            .required(false)\n            .num_args(1..)\n            .action(ArgAction::Append),\n        )\n        .arg(arg!([positional] \"tests positionals\"))\n        .arg(\n            arg!(-f --flag  \"tests flags\")\n                .action(ArgAction::Count)\n                .global(true),\n        )\n        .args([\n            arg!(flag2: -F \"tests flags with exclusions\")\n                .conflicts_with(\"flag\")\n                .requires(\"long-option-2\")\n                .action(ArgAction::SetTrue),\n            arg!(--\"long-option-2\" <option2> \"tests long options with exclusions\")\n                .conflicts_with(\"option\")\n                .requires(\"positional2\"),\n            arg!([positional2] \"tests positionals with exclusions\"),\n            arg!(-O --option3 <option3> \"specific vals\").value_parser(opt3_vals),\n            arg!([positional3] ... \"tests specific values\").value_parser(pos3_vals),\n            arg!(--multvals <val> \"Tests multiple values, not mult occs\")\n                .value_names([\"one\", \"two\"]),\n            arg!(--multvalsmo <val> ... \"Tests multiple values, and mult occs\")\n                .value_names([\"one\", \"two\"]),\n            arg!(--minvals2 <minvals> \"Tests 2 min vals\").num_args(2..),\n            arg!(--maxvals3 <maxvals> \"Tests 3 max vals\").num_args(1..=3),\n            arg!(--optvaleq <optval> \"Tests optional value, require = sign\")\n                .num_args(0..=1)\n                .require_equals(true),\n            arg!(--optvalnoeq <optval> \"Tests optional value\").num_args(0..=1),\n        ])\n        .subcommand(\n            Command::new(\"subcmd\")\n                .about(\"tests subcommands\")\n                .version(\"0.1\")\n                .author(\"Kevin K. <kbknapp@gmail.com>\")\n                .help_template(FULL_TEMPLATE)\n                .arg(arg!(-o --option <scoption> \"tests options\").num_args(1..))\n                .arg(arg!(-s --subcmdarg <subcmdarg> \"tests other args\"))\n                .arg(arg!([scpositional] \"tests positionals\")),\n        )\n}\n"
  },
  {
    "path": "tests/builder/version.rs",
    "content": "use clap::{error::ErrorKind, ArgAction, Command};\nuse snapbox::str;\n\nuse crate::utils;\n\nfn common() -> Command {\n    Command::new(\"foo\").help_template(utils::FULL_TEMPLATE)\n}\n\nfn with_version() -> Command {\n    common().version(\"3.0\")\n}\n\nfn with_long_version() -> Command {\n    common().long_version(\"3.0 (abcdefg)\")\n}\n\nfn with_both() -> Command {\n    common().version(\"3.0\").long_version(\"3.0 (abcdefg)\")\n}\n\nfn with_subcommand() -> Command {\n    with_version().subcommand(Command::new(\"bar\").defer(|cmd| cmd.subcommand(Command::new(\"baz\"))))\n}\n\n#[test]\nfn version_short_flag_no_version() {\n    let res = common().try_get_matches_from(\"foo -V\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::UnknownArgument,\n        str![[r#\"\nerror: unexpected argument '-V' found\n\nUsage: foo\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn version_long_flag_no_version() {\n    let res = common().try_get_matches_from(\"foo --version\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::UnknownArgument,\n        str![[r#\"\nerror: unexpected argument '--version' found\n\nUsage: foo\n\nFor more information, try '--help'.\n\n\"#]],\n        true,\n    );\n}\n\n#[test]\nfn version_short_flag_with_version() {\n    let res = with_version().try_get_matches_from(\"foo -V\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::DisplayVersion,\n        str![[r#\"\nfoo 3.0\n\n\"#]],\n        false,\n    );\n}\n\n#[test]\nfn version_long_flag_with_version() {\n    let res = with_version().try_get_matches_from(\"foo --version\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::DisplayVersion,\n        str![[r#\"\nfoo 3.0\n\n\"#]],\n        false,\n    );\n}\n\n#[test]\nfn version_short_flag_with_long_version() {\n    let res = with_long_version().try_get_matches_from(\"foo -V\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::DisplayVersion,\n        str![[r#\"\nfoo 3.0 (abcdefg)\n\n\"#]],\n        false,\n    );\n}\n\n#[test]\nfn version_long_flag_with_long_version() {\n    let res = with_long_version().try_get_matches_from(\"foo --version\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::DisplayVersion,\n        str![[r#\"\nfoo 3.0 (abcdefg)\n\n\"#]],\n        false,\n    );\n}\n\n#[test]\nfn version_short_flag_with_both() {\n    let res = with_both().try_get_matches_from(\"foo -V\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(\n        err,\n        ErrorKind::DisplayVersion,\n        str![[r#\"\nfoo 3.0\n\n\"#]],\n        false,\n    );\n}\n\n#[test]\nfn version_long_flag_with_both() {\n    let res = with_both().try_get_matches_from(\"foo --version\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    utils::assert_error(err, ErrorKind::DisplayVersion, str![[r#\"\nfoo 3.0 (abcdefg)\n\n\"#]], false);\n}\n\n#[test]\nfn help_short_flag_no_version() {\n    static EXPECTED: &str = \"\\\nfoo \n\nUsage: foo\n\nOptions:\n  -h, --help  Print help\n\";\n    let cmd = common();\n    utils::assert_output(cmd, \"foo -h\", EXPECTED, false);\n}\n\n#[test]\nfn help_long_flag_no_version() {\n    static EXPECTED: &str = \"\\\nfoo \n\nUsage: foo\n\nOptions:\n  -h, --help  Print help\n\";\n    let cmd = common();\n    utils::assert_output(cmd, \"foo --help\", EXPECTED, false);\n}\n\n#[test]\nfn help_short_flag_with_version() {\n    static EXPECTED: &str = \"\\\nfoo 3.0\n\nUsage: foo\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n    let cmd = with_version();\n    utils::assert_output(cmd, \"foo -h\", EXPECTED, false);\n}\n\n#[test]\nfn help_long_flag_with_version() {\n    static EXPECTED: &str = \"\\\nfoo 3.0\n\nUsage: foo\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n    let cmd = with_version();\n    utils::assert_output(cmd, \"foo --help\", EXPECTED, false);\n}\n\n#[test]\nfn help_short_flag_with_long_version() {\n    static EXPECTED: &str = \"\\\nfoo 3.0 (abcdefg)\n\nUsage: foo\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n    let cmd = with_long_version();\n    utils::assert_output(cmd, \"foo -h\", EXPECTED, false);\n}\n\n#[test]\nfn help_long_flag_with_long_version() {\n    static EXPECTED: &str = \"\\\nfoo 3.0 (abcdefg)\n\nUsage: foo\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n    let cmd = with_long_version();\n    utils::assert_output(cmd, \"foo --help\", EXPECTED, false);\n}\n\n#[test]\nfn help_short_flag_with_both() {\n    static EXPECTED: &str = \"\\\nfoo 3.0\n\nUsage: foo\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n    let cmd = with_both();\n    utils::assert_output(cmd, \"foo -h\", EXPECTED, false);\n}\n\n#[test]\nfn help_long_flag_with_both() {\n    static EXPECTED: &str = \"\\\nfoo 3.0\n\nUsage: foo\n\nOptions:\n  -h, --help     Print help\n  -V, --version  Print version\n\";\n    let cmd = with_both();\n    utils::assert_output(cmd, \"foo --help\", EXPECTED, false);\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"Command foo: Long option names must be unique for each argument, but '--version' is in use by both 'ver' and 'version' (call `cmd.disable_version_flag(true)` to remove the auto-generated `--version`)\"]\nfn override_version_long_with_user_flag() {\n    with_version()\n        .arg(\n            clap::Arg::new(\"ver\")\n                .long(\"version\")\n                .action(ArgAction::SetTrue),\n        )\n        .debug_assert();\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic = \"Command foo: Short option names must be unique for each argument, but '-V' is in use by both 'ver' and 'version' (call `cmd.disable_version_flag(true)` to remove the auto-generated `--version`)\"]\nfn override_version_short_with_user_flag() {\n    with_version()\n        .arg(clap::Arg::new(\"ver\").short('V').action(ArgAction::SetTrue))\n        .debug_assert();\n}\n\n#[test]\nfn no_propagation_by_default_long() {\n    // Version Flag should not be propagated to subcommands\n    let res = with_subcommand().try_get_matches_from(\"foo bar --version\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn no_propagation_by_default_short() {\n    let res = with_subcommand().try_get_matches_from(\"foo bar -V\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::UnknownArgument);\n}\n\n#[test]\nfn propagate_version_long() {\n    let res = with_subcommand()\n        .propagate_version(true)\n        .try_get_matches_from(\"foo bar --version\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::DisplayVersion);\n}\n\n#[test]\nfn propagate_version_short() {\n    let res = with_subcommand()\n        .propagate_version(true)\n        .try_get_matches_from(\"foo bar -V\".split(' '));\n\n    assert!(res.is_err());\n    let err = res.unwrap_err();\n    assert_eq!(err.kind(), ErrorKind::DisplayVersion);\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"`ArgAction::Version` used without providing Command::version or Command::long_version\"]\nfn version_required() {\n    let _res = common()\n        .arg(clap::arg!(--version).action(ArgAction::Version))\n        .try_get_matches_from(\"foo -z\".split(' '));\n}\n\n#[test]\n#[should_panic = \"Argument `version` is undefined\"]\nfn mut_arg_version_no_auto_version() {\n    let _ = common().mut_arg(\"version\", |v| v.short('z').action(ArgAction::SetTrue));\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic = \"No version information via Command::version or Command::long_version to propagate\"]\nfn propagate_version_no_version_info() {\n    let _res = common()\n        .propagate_version(true)\n        .subcommand(Command::new(\"bar\"))\n        .try_get_matches_from(\"foo\".split(' '));\n}\n"
  },
  {
    "path": "tests/derive/app_name.rs",
    "content": "use clap::CommandFactory;\nuse clap::Parser;\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\nuse crate::utils::get_help;\nuse crate::utils::get_long_help;\n\n#[test]\nfn app_name_in_short_help_from_struct() {\n    #[derive(Parser)]\n    #[command(name = \"my-cmd\")]\n    struct MyApp {}\n\n    let help = get_help::<MyApp>();\n\n    assert_data_eq!(help, str![[r#\"\nUsage: my-cmd\n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn app_name_in_long_help_from_struct() {\n    #[derive(Parser)]\n    #[command(name = \"my-cmd\")]\n    struct MyApp {}\n\n    let help = get_help::<MyApp>();\n\n    assert_data_eq!(help, str![[r#\"\nUsage: my-cmd\n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn app_name_in_short_help_from_enum() {\n    #[derive(Parser)]\n    #[command(name = \"my-cmd\")]\n    enum MyApp {}\n\n    let help = get_help::<MyApp>();\n\n    assert_data_eq!(help, str![[r#\"\nUsage: my-cmd\n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn app_name_in_long_help_from_enum() {\n    #[derive(Parser)]\n    #[command(name = \"my-cmd\")]\n    enum MyApp {}\n\n    let help = get_long_help::<MyApp>();\n\n    assert_data_eq!(help, str![[r#\"\nUsage: my-cmd\n\nOptions:\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn app_name_in_short_version_from_struct() {\n    #[derive(Parser)]\n    #[command(name = \"my-cmd\")]\n    struct MyApp {}\n\n    let version = MyApp::command().render_version();\n\n    assert_data_eq!(version, str![[r#\"\nmy-cmd \n\n\"#]].raw());\n}\n\n#[test]\nfn app_name_in_long_version_from_struct() {\n    #[derive(Parser)]\n    #[command(name = \"my-cmd\")]\n    struct MyApp {}\n\n    let version = MyApp::command().render_long_version();\n\n    assert_data_eq!(version, str![[r#\"\nmy-cmd \n\n\"#]].raw());\n}\n\n#[test]\nfn app_name_in_short_version_from_enum() {\n    #[derive(Parser)]\n    #[command(name = \"my-cmd\")]\n    enum MyApp {}\n\n    let version = MyApp::command().render_version();\n\n    assert_data_eq!(version, str![[r#\"\nmy-cmd \n\n\"#]].raw());\n}\n\n#[test]\nfn app_name_in_long_version_from_enum() {\n    #[derive(Parser)]\n    #[command(name = \"my-cmd\")]\n    enum MyApp {}\n\n    let version = MyApp::command().render_long_version();\n\n    assert_data_eq!(version, str![[r#\"\nmy-cmd \n\n\"#]].raw());\n}\n"
  },
  {
    "path": "tests/derive/arguments.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse crate::utils::get_help;\n\nuse clap::Parser;\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\n#[test]\nfn required_argument() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        arg: i32,\n    }\n    assert_eq!(\n        Opt { arg: 42 },\n        Opt::try_parse_from([\"test\", \"42\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"test\"]).is_err());\n    assert!(Opt::try_parse_from([\"test\", \"42\", \"24\"]).is_err());\n}\n\n#[test]\nfn argument_with_default() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(default_value = \"42\")]\n        arg: i32,\n    }\n    assert_eq!(\n        Opt { arg: 24 },\n        Opt::try_parse_from([\"test\", \"24\"]).unwrap()\n    );\n    assert_eq!(Opt { arg: 42 }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert!(Opt::try_parse_from([\"test\", \"42\", \"24\"]).is_err());\n}\n\n#[test]\nfn auto_value_name() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        my_special_arg: i32,\n    }\n\n    let help = get_help::<Opt>();\n\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <MY_SPECIAL_ARG>\n\nArguments:\n  <MY_SPECIAL_ARG>  \n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n\n    // Ensure the implicit `num_vals` is just 1\n    assert_eq!(\n        Opt { my_special_arg: 10 },\n        Opt::try_parse_from([\"test\", \"10\"]).unwrap()\n    );\n}\n\n#[test]\nfn explicit_value_name() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_name = \"BROWNIE_POINTS\")]\n        my_special_arg: i32,\n    }\n\n    let help = get_help::<Opt>();\n\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <BROWNIE_POINTS>\n\nArguments:\n  <BROWNIE_POINTS>  \n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n\n    // Ensure the implicit `num_vals` is just 1\n    assert_eq!(\n        Opt { my_special_arg: 10 },\n        Opt::try_parse_from([\"test\", \"10\"]).unwrap()\n    );\n}\n\n#[test]\nfn option_type_is_optional() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        arg: Option<i32>,\n    }\n    assert_eq!(\n        Opt { arg: Some(42) },\n        Opt::try_parse_from([\"test\", \"42\"]).unwrap()\n    );\n    assert_eq!(Opt { arg: None }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert!(Opt::try_parse_from([\"test\", \"42\", \"24\"]).is_err());\n}\n\n#[test]\nfn vec_type_is_multiple_values() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        arg: Vec<i32>,\n    }\n    assert_eq!(\n        Opt { arg: vec![24] },\n        Opt::try_parse_from([\"test\", \"24\"]).unwrap()\n    );\n    assert_eq!(Opt { arg: vec![] }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(\n        Opt { arg: vec![24, 42] },\n        Opt::try_parse_from([\"test\", \"24\", \"42\"]).unwrap()\n    );\n    assert_eq!(\n        clap::error::ErrorKind::ValueValidation,\n        Opt::try_parse_from([\"test\", \"NOPE\"]).err().unwrap().kind()\n    );\n}\n"
  },
  {
    "path": "tests/derive/author_version_about.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse clap::Parser;\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\nuse crate::utils;\n\n#[test]\nfn no_author_version_about() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(name = \"foo\")]\n    #[command(help_template = utils::FULL_TEMPLATE)]\n    struct Opt {}\n\n    let output = utils::get_long_help::<Opt>();\n    assert!(output.starts_with(\"foo \\n\\nUsage:\"));\n}\n\n#[test]\nfn use_env() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(author, about, version)]\n    #[command(help_template = utils::FULL_TEMPLATE)]\n    struct Opt {}\n\n    let output = utils::get_long_help::<Opt>();\n    assert_data_eq!(\n        output,\n        str![[r#\"\nclap [..]\nA simple to use, efficient, and full-featured Command Line Argument Parser\n\nUsage: clap\n\nOptions:\n  -h, --help\n          Print help\n\n  -V, --version\n          Print version\n\n\"#]]\n    );\n}\n\n#[test]\nfn explicit_version_not_str_lit() {\n    const VERSION: &str = \"custom version\";\n\n    #[derive(Parser)]\n    #[command(version = VERSION)]\n    #[command(help_template = utils::FULL_TEMPLATE)]\n    pub(crate) struct Opt {}\n\n    let output = utils::get_long_help::<Opt>();\n    assert_data_eq!(\n        output,\n        str![[r#\"\nclap custom version\n\nUsage: clap\n\nOptions:\n  -h, --help\n          Print help\n\n  -V, --version\n          Print version\n\n\"#]]\n        .raw()\n    );\n}\n"
  },
  {
    "path": "tests/derive/basic.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse clap::Parser;\n\n#[test]\nfn basic() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(short = 'a', long = \"arg\")]\n        arg: i32,\n    }\n    assert_eq!(\n        Opt { arg: 24 },\n        Opt::try_parse_from([\"test\", \"-a24\"]).unwrap()\n    );\n}\n\n#[test]\nfn update_basic() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(short, long)]\n        first: i32,\n        #[arg(short, long)]\n        second: i32,\n    }\n\n    let mut opt = Opt::try_parse_from([\"test\", \"-f0\", \"-s1\"]).unwrap();\n\n    opt.try_update_from([\"test\", \"-f42\"]).unwrap();\n\n    assert_eq!(\n        Opt {\n            first: 42,\n            second: 1\n        },\n        opt\n    );\n}\n\n#[test]\nfn update_explicit_required() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(short, long, required = true)]\n        first: i32,\n        #[arg(short, long, required = true)]\n        second: i32,\n    }\n\n    let mut opt = Opt::try_parse_from([\"test\", \"-f0\", \"-s1\"]).unwrap();\n\n    opt.try_update_from([\"test\", \"-f42\"]).unwrap();\n\n    assert_eq!(\n        Opt {\n            first: 42,\n            second: 1\n        },\n        opt\n    );\n}\n\n#[test]\nfn unit_struct() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt;\n\n    assert_eq!(Opt {}, Opt::try_parse_from([\"test\"]).unwrap());\n}\n"
  },
  {
    "path": "tests/derive/boxed.rs",
    "content": "use clap::{Args, Parser, Subcommand};\n\n#[derive(Parser, PartialEq, Debug)]\nstruct Opt {\n    #[command(subcommand)]\n    sub: Box<Sub>,\n}\n\n#[derive(Subcommand, PartialEq, Debug)]\nenum Sub {\n    Flame {\n        #[command(flatten)]\n        arg: Box<Ext>,\n    },\n}\n\n#[derive(Args, PartialEq, Debug)]\nstruct Ext {\n    arg: u32,\n}\n\n#[test]\nfn boxed_flatten_subcommand() {\n    assert_eq!(\n        Opt {\n            sub: Box::new(Sub::Flame {\n                arg: Box::new(Ext { arg: 1 })\n            })\n        },\n        Opt::try_parse_from([\"test\", \"flame\", \"1\"]).unwrap()\n    );\n}\n\n#[test]\nfn update_boxed_flatten_subcommand() {\n    let mut opt = Opt::try_parse_from([\"test\", \"flame\", \"1\"]).unwrap();\n\n    opt.try_update_from([\"test\", \"flame\", \"42\"]).unwrap();\n\n    assert_eq!(\n        Opt {\n            sub: Box::new(Sub::Flame {\n                arg: Box::new(Ext { arg: 42 })\n            })\n        },\n        opt\n    );\n}\n"
  },
  {
    "path": "tests/derive/custom_string_parsers.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse std::num::ParseIntError;\nuse std::path::PathBuf;\n\nuse clap::Parser;\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\n#[derive(Parser, PartialEq, Debug)]\nstruct PathOpt {\n    #[arg(short, long)]\n    path: PathBuf,\n\n    #[arg(short, default_value = \"../\")]\n    default_path: PathBuf,\n\n    #[arg(short)]\n    vector_path: Vec<PathBuf>,\n\n    #[arg(short)]\n    option_path_1: Option<PathBuf>,\n\n    #[arg(short = 'q')]\n    option_path_2: Option<PathBuf>,\n}\n\n#[test]\nfn test_path_opt_simple() {\n    assert_eq!(\n        PathOpt {\n            path: PathBuf::from(\"/usr/bin\"),\n            default_path: PathBuf::from(\"../\"),\n            vector_path: vec![\n                PathBuf::from(\"/a/b/c\"),\n                PathBuf::from(\"/d/e/f\"),\n                PathBuf::from(\"/g/h/i\"),\n            ],\n            option_path_1: None,\n            option_path_2: Some(PathBuf::from(\"j.zip\")),\n        },\n        PathOpt::try_parse_from([\n            \"test\", \"-p\", \"/usr/bin\", \"-v\", \"/a/b/c\", \"-v\", \"/d/e/f\", \"-v\", \"/g/h/i\", \"-q\",\n            \"j.zip\",\n        ])\n        .unwrap()\n    );\n}\n\nfn parse_hex(input: &str) -> Result<u64, ParseIntError> {\n    u64::from_str_radix(input, 16)\n}\n\n#[derive(Parser, PartialEq, Debug)]\nstruct HexOpt {\n    #[arg(short, value_parser = parse_hex)]\n    number: u64,\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn test_parse_hex() {\n    assert_eq!(\n        HexOpt { number: 5 },\n        HexOpt::try_parse_from([\"test\", \"-n\", \"5\"]).unwrap()\n    );\n    assert_eq!(\n        HexOpt {\n            number: 0x00ab_cdef\n        },\n        HexOpt::try_parse_from([\"test\", \"-n\", \"abcdef\"]).unwrap()\n    );\n\n    let err = HexOpt::try_parse_from([\"test\", \"-n\", \"gg\"]).unwrap_err();\n    assert_data_eq!(err.to_string(), str![[r#\"\nerror: invalid value 'gg' for '-n <NUMBER>': invalid digit found in string\n\nFor more information, try '--help'.\n\n\"#]].raw());\n}\n\n#[derive(Debug)]\nstruct ErrCode(u32);\nimpl std::error::Error for ErrCode {}\nimpl std::fmt::Display for ErrCode {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        std::fmt::Display::fmt(&self.0, f)\n    }\n}\nfn custom_parser_2(_: &str) -> Result<&'static str, ErrCode> {\n    Ok(\"B\")\n}\n\n#[derive(Parser, PartialEq, Debug)]\nstruct NoOpOpt {\n    #[arg(short, value_parser = custom_parser_2)]\n    b: &'static str,\n}\n\n#[test]\nfn test_every_custom_parser() {\n    assert_eq!(\n        NoOpOpt { b: \"B\" },\n        NoOpOpt::try_parse_from([\"test\", \"-b=?\"]).unwrap()\n    );\n}\n\n#[test]\nfn update_every_custom_parser() {\n    let mut opt = NoOpOpt { b: \"0\" };\n\n    opt.try_update_from([\"test\", \"-b=?\"]).unwrap();\n\n    assert_eq!(NoOpOpt { b: \"B\" }, opt);\n}\n\n#[derive(Parser, PartialEq, Debug)]\nstruct DefaultedOpt {\n    #[arg(short)]\n    integer: u64,\n\n    #[arg(short)]\n    path: PathBuf,\n}\n\n#[test]\nfn test_parser_with_default_value() {\n    assert_eq!(\n        DefaultedOpt {\n            integer: 9000,\n            path: PathBuf::from(\"src/lib.rs\"),\n        },\n        DefaultedOpt::try_parse_from([\"test\", \"-i\", \"9000\", \"-p\", \"src/lib.rs\",]).unwrap()\n    );\n}\n"
  },
  {
    "path": "tests/derive/default_value.rs",
    "content": "use std::path::PathBuf;\n\nuse clap::{CommandFactory, Parser};\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\nuse crate::utils;\n\n#[test]\nfn default_value() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(default_value = \"3\")]\n        arg: i32,\n    }\n    assert_eq!(Opt { arg: 3 }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(Opt { arg: 1 }, Opt::try_parse_from([\"test\", \"1\"]).unwrap());\n\n    let help = utils::get_long_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [ARG]\n\nArguments:\n  [ARG]\n          [default: 3]\n\nOptions:\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn default_value_t() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(default_value_t = 3)]\n        arg: i32,\n    }\n    assert_eq!(Opt { arg: 3 }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(Opt { arg: 1 }, Opt::try_parse_from([\"test\", \"1\"]).unwrap());\n\n    let help = utils::get_long_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [ARG]\n\nArguments:\n  [ARG]\n          [default: 3]\n\nOptions:\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn auto_default_value_t() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(default_value_t)]\n        arg: i32,\n    }\n    assert_eq!(Opt { arg: 0 }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(Opt { arg: 1 }, Opt::try_parse_from([\"test\", \"1\"]).unwrap());\n\n    let help = utils::get_long_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [ARG]\n\nArguments:\n  [ARG]\n          [default: 0]\n\nOptions:\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn default_values_t() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(default_values_t = vec![1, 2, 3])]\n        arg1: Vec<i32>,\n\n        #[arg(long, default_values_t = [4, 5, 6])]\n        arg2: Vec<i32>,\n\n        #[arg(long, default_values_t = [7, 8, 9])]\n        arg3: Vec<i32>,\n\n        #[arg(long, default_values_t = 10..=12)]\n        arg4: Vec<i32>,\n\n        #[arg(long, default_values_t = vec![\"hello\".to_string(), \"world\".to_string()])]\n        arg5: Vec<String>,\n\n        #[arg(long, default_values_t = &vec![\"foo\".to_string(), \"bar\".to_string()])]\n        arg6: Vec<String>,\n    }\n    assert_eq!(\n        Opt {\n            arg1: vec![1, 2, 3],\n            arg2: vec![4, 5, 6],\n            arg3: vec![7, 8, 9],\n            arg4: vec![10, 11, 12],\n            arg5: vec![\"hello\".to_string(), \"world\".to_string()],\n            arg6: vec![\"foo\".to_string(), \"bar\".to_string()],\n        },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg1: vec![1],\n            arg2: vec![4, 5, 6],\n            arg3: vec![7, 8, 9],\n            arg4: vec![10, 11, 12],\n            arg5: vec![\"hello\".to_string(), \"world\".to_string()],\n            arg6: vec![\"foo\".to_string(), \"bar\".to_string()],\n        },\n        Opt::try_parse_from([\"test\", \"1\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg1: vec![1, 2, 3],\n            arg2: vec![4, 5, 6],\n            arg3: vec![7, 8, 9],\n            arg4: vec![42, 15],\n            arg5: vec![\"baz\".to_string()],\n            arg6: vec![\"foo\".to_string(), \"bar\".to_string()],\n        },\n        Opt::try_parse_from([\"test\", \"--arg4\", \"42\", \"--arg4\", \"15\", \"--arg5\", \"baz\"]).unwrap()\n    );\n\n    let help = utils::get_long_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [OPTIONS] [ARG1]...\n\nArguments:\n  [ARG1]...\n          [default: 1 2 3]\n\nOptions:\n      --arg2 <ARG2>\n          [default: 4 5 6]\n\n      --arg3 <ARG3>\n          [default: 7 8 9]\n\n      --arg4 <ARG4>\n          [default: 10 11 12]\n\n      --arg5 <ARG5>\n          [default: hello world]\n\n      --arg6 <ARG6>\n          [default: foo bar]\n\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn default_value_os_t() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(default_value_os_t = PathBuf::from(\"abc.def\"))]\n        arg: PathBuf,\n    }\n    assert_eq!(\n        Opt {\n            arg: PathBuf::from(\"abc.def\")\n        },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: PathBuf::from(\"ghi\")\n        },\n        Opt::try_parse_from([\"test\", \"ghi\"]).unwrap()\n    );\n\n    let help = utils::get_long_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [ARG]\n\nArguments:\n  [ARG]\n          [default: abc.def]\n\nOptions:\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn default_values_os_t() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(\n            default_values_os_t = vec![PathBuf::from(\"abc.def\"), PathBuf::from(\"123.foo\")]\n        )]\n        arg1: Vec<PathBuf>,\n\n        #[arg(\n            long,\n            default_values_os_t = [PathBuf::from(\"bar.baz\")]\n        )]\n        arg2: Vec<PathBuf>,\n    }\n    assert_eq!(\n        Opt {\n            arg1: vec![PathBuf::from(\"abc.def\"), PathBuf::from(\"123.foo\")],\n            arg2: vec![PathBuf::from(\"bar.baz\")]\n        },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg1: vec![PathBuf::from(\"ghi\")],\n            arg2: vec![PathBuf::from(\"baz.bar\"), PathBuf::from(\"foo.bar\")]\n        },\n        Opt::try_parse_from([\"test\", \"ghi\", \"--arg2\", \"baz.bar\", \"--arg2\", \"foo.bar\"]).unwrap()\n    );\n\n    let help = utils::get_long_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [OPTIONS] [ARG1]...\n\nArguments:\n  [ARG1]...\n          [default: abc.def 123.foo]\n\nOptions:\n      --arg2 <ARG2>\n          [default: bar.baz]\n\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn detect_os_variant() {\n    #![allow(deprecated)]\n\n    #[derive(clap::Parser)]\n    pub(crate) struct Options {\n        #[arg(default_value_os = \"123\")]\n        x: String,\n    }\n    Options::command().debug_assert();\n}\n"
  },
  {
    "path": "tests/derive/deny_warnings.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\n#![deny(unused_qualifications)]\n#![deny(warnings)]\n\nuse clap::Parser;\n\nfn try_str(s: &str) -> Result<String, std::convert::Infallible> {\n    Ok(s.into())\n}\n\n#[test]\nfn warning_never_struct() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(value_parser = try_str, default_value_t)]\n        s: String,\n    }\n    assert_eq!(\n        Opt {\n            s: \"foo\".to_string()\n        },\n        Opt::try_parse_from([\"test\", \"foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn warning_never_enum() {\n    #[derive(Parser, Debug, PartialEq)]\n    enum Opt {\n        Foo {\n            #[arg(value_parser = try_str, default_value_t)]\n            s: String,\n        },\n    }\n    assert_eq!(\n        Opt::Foo {\n            s: \"foo\".to_string()\n        },\n        Opt::try_parse_from([\"test\", \"foo\", \"foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn warning_unused_qualifications() {\n    // This causes `clap::Args` within the derive to be unused qualifications\n    use clap::Args;\n\n    #[derive(Args, Clone, Copy, Debug, Default)]\n    #[group(skip)]\n    pub(crate) struct Compose<L: Args> {\n        #[command(flatten)]\n        pub(crate) left: L,\n    }\n}\n"
  },
  {
    "path": "tests/derive/doc_comments_help.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse crate::utils;\n\nuse clap::{CommandFactory, Parser, Subcommand, ValueEnum};\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\n#[test]\nfn doc_comments() {\n    /// Lorem ipsum\n    #[derive(Parser, PartialEq, Debug)]\n    struct LoremIpsum {\n        /// Fooify a bar\n        /// and a baz\n        #[arg(short, long)]\n        foo: bool,\n    }\n\n    let help = utils::get_long_help::<LoremIpsum>();\n    assert_data_eq!(help, str![[r#\"\nLorem ipsum\n\nUsage: clap [OPTIONS]\n\nOptions:\n  -f, --foo\n          Fooify a bar and a baz\n\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn help_is_better_than_comments() {\n    /// Lorem ipsum\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(name = \"lorem-ipsum\", about = \"Dolor sit amet\")]\n    struct LoremIpsum {\n        /// Fooify a bar\n        #[arg(short, long, help = \"DO NOT PASS A BAR UNDER ANY CIRCUMSTANCES\")]\n        foo: bool,\n    }\n\n    let help = utils::get_long_help::<LoremIpsum>();\n    assert_data_eq!(help, str![[r#\"\nDolor sit amet\n\nUsage: lorem-ipsum [OPTIONS]\n\nOptions:\n  -f, --foo\n          DO NOT PASS A BAR UNDER ANY CIRCUMSTANCES\n\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn empty_line_in_doc_comment_is_double_linefeed() {\n    /// Foo.\n    ///\n    /// Bar\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(name = \"lorem-ipsum\")]\n    struct LoremIpsum {}\n\n    let help = utils::get_long_help::<LoremIpsum>();\n    assert!(help.starts_with(\n        \"\\\nFoo.\n\nBar\n\nUsage:\"\n    ));\n}\n\n#[test]\nfn field_long_doc_comment_both_help_long_help() {\n    /// Lorem ipsumclap\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(name = \"lorem-ipsum\", about = \"Dolor sit amet\")]\n    struct LoremIpsum {\n        /// Dot is removed from multiline comments.\n        ///\n        /// Long help\n        #[arg(long)]\n        foo: bool,\n\n        /// Dot is removed from one short comment.\n        #[arg(long)]\n        bar: bool,\n    }\n\n    let short_help = utils::get_help::<LoremIpsum>();\n    let long_help = utils::get_long_help::<LoremIpsum>();\n\n    assert_data_eq!(short_help, str![[r#\"\nDolor sit amet\n\nUsage: lorem-ipsum [OPTIONS]\n\nOptions:\n      --foo   Dot is removed from multiline comments\n      --bar   Dot is removed from one short comment\n  -h, --help  Print help (see more with '--help')\n\n\"#]].raw());\n    assert_data_eq!(long_help, str![[r#\"\nDolor sit amet\n\nUsage: lorem-ipsum [OPTIONS]\n\nOptions:\n      --foo\n          Dot is removed from multiline comments.\n          \n          Long help\n\n      --bar\n          Dot is removed from one short comment\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]].raw());\n}\n\n#[test]\nfn top_long_doc_comment_both_help_long_help() {\n    /// Lorem ipsumclap\n    #[derive(Parser, Debug)]\n    #[command(name = \"lorem-ipsum\", about = \"Dolor sit amet\")]\n    struct LoremIpsum {\n        #[command(subcommand)]\n        foo: SubCommand,\n    }\n\n    #[derive(Parser, Debug)]\n    pub(crate) enum SubCommand {\n        /// DO NOT PASS A BAR UNDER ANY CIRCUMSTANCES\n        ///\n        /// Or something else\n        Foo {\n            #[arg(help = \"foo\")]\n            bars: String,\n        },\n    }\n\n    let short_help = utils::get_help::<LoremIpsum>();\n    let long_help = utils::get_subcommand_long_help::<LoremIpsum>(\"foo\");\n\n    assert_data_eq!(short_help, str![[r#\"\nDolor sit amet\n\nUsage: lorem-ipsum <COMMAND>\n\nCommands:\n  foo   DO NOT PASS A BAR UNDER ANY CIRCUMSTANCES\n  help  Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n    assert_data_eq!(long_help, str![[r#\"\nDO NOT PASS A BAR UNDER ANY CIRCUMSTANCES\n\nOr something else\n\nUsage: foo <BARS>\n\nArguments:\n  <BARS>\n          foo\n\nOptions:\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]].raw());\n}\n\n#[test]\nfn verbatim_doc_comment() {\n    /// DANCE!\n    ///\n    ///                    ()\n    ///                    |\n    ///               (   ()   )\n    ///     ) ________    //  )\n    ///  ()  |\\       \\  //\n    /// ( \\\\__ \\ ______\\//\n    ///    \\__) |       |\n    ///      |  |       |\n    ///       \\ |       |\n    ///        \\|_______|\n    ///        //    \\\\\n    ///       ((     ||\n    ///        \\\\    ||\n    ///      ( ()    ||\n    ///       (      () ) )\n    #[derive(Parser, Debug)]\n    #[command(verbatim_doc_comment)]\n    struct SeeFigure1 {\n        #[arg(long)]\n        foo: bool,\n    }\n\n    let help = utils::get_long_help::<SeeFigure1>();\n    assert_data_eq!(help, str![[r#\"\nDANCE!\n\n                   ()\n                   |\n              (   ()   )\n    ) ________    //  )\n ()  |\\       \\  //\n( \\\\__ \\ ______\\//\n   \\__) |       |\n     |  |       |\n      \\ |       |\n       \\|_______|\n       //    \\\\\n      ((     ||\n       \\\\    ||\n     ( ()    ||\n      (      () ) )\n\nUsage: clap [OPTIONS]\n\nOptions:\n      --foo\n          \n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]].raw());\n}\n\n#[test]\nfn verbatim_doc_comment_field() {\n    #[derive(Parser, Debug)]\n    struct Command {\n        /// This help ends in a period.\n        #[arg(long, verbatim_doc_comment)]\n        foo: bool,\n        /// This help does not end in a period.\n        #[arg(long)]\n        bar: bool,\n    }\n\n    let help = utils::get_long_help::<Command>();\n\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [OPTIONS]\n\nOptions:\n      --foo\n          This help ends in a period.\n\n      --bar\n          This help does not end in a period\n\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn multiline_separates_default() {\n    #[derive(Parser, Debug)]\n    struct Command {\n        /// Multiline\n        ///\n        /// Doc comment\n        #[arg(long, default_value = \"x\")]\n        x: String,\n    }\n\n    let help = utils::get_long_help::<Command>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [OPTIONS]\n\nOptions:\n      --x <X>\n          Multiline\n          \n          Doc comment\n          \n          [default: x]\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]].raw());\n\n    // The short help should still have the default on the same line\n    let help = utils::get_help::<Command>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [OPTIONS]\n\nOptions:\n      --x <X>  Multiline [default: x]\n  -h, --help   Print help (see more with '--help')\n\n\"#]].raw());\n}\n\n#[cfg(feature = \"unstable-v5\")]\n#[test]\nfn value_enum_multiline_doc_comment() {\n    #[derive(Parser, Debug)]\n    struct Command {\n        x: LoremIpsum,\n    }\n\n    #[derive(ValueEnum, Clone, PartialEq, Debug)]\n    enum LoremIpsum {\n        /// Doc comment summary\n        ///\n        /// The doc comment body is not ignored\n        Bar,\n    }\n\n    let help = utils::get_long_help::<Command>();\n\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <X>\n\nArguments:\n  <X>\n          Possible values:\n          - bar: Doc comment summary\n            \n            The doc comment body is not ignored\n\nOptions:\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]].raw());\n}\n\n#[cfg(not(feature = \"unstable-v5\"))]\n#[test]\nfn value_enum_multiline_doc_comment() {\n    #[derive(Parser, Debug)]\n    struct Command {\n        x: LoremIpsum,\n    }\n\n    #[derive(ValueEnum, Clone, PartialEq, Debug)]\n    enum LoremIpsum {\n        /// Doc comment summary\n        ///\n        /// The doc comment body is ignored\n        Bar,\n    }\n\n    let help = utils::get_long_help::<Command>();\n\n    // There is no long help text for possible values. The long help only contains the summary.\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <X>\n\nArguments:\n  <X>\n          Possible values:\n          - bar: Doc comment summary\n\nOptions:\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]].raw());\n}\n\n#[test]\nfn doc_comment_about_handles_both_abouts() {\n    /// Opts doc comment summary\n    #[derive(Parser, Debug)]\n    pub(crate) struct Opts {\n        #[command(subcommand)]\n        pub(crate) cmd: Sub,\n    }\n\n    /// Sub doc comment summary\n    ///\n    /// Sub doc comment body\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    pub(crate) enum Sub {\n        Compress { output: String },\n    }\n\n    let cmd = Opts::command();\n    assert_eq!(\n        cmd.get_about().map(|s| s.to_string()),\n        Some(\"Opts doc comment summary\".to_owned())\n    );\n    // clap will fallback to `about` on `None`.  The main care about is not providing a `Sub` doc\n    // comment.\n    assert_eq!(cmd.get_long_about(), None);\n}\n\n#[test]\nfn respect_subcommand_doc_comment() {\n    #[derive(Parser, Debug)]\n    pub(crate) enum Cmd {\n        /// For child\n        #[command(subcommand)]\n        Child(Child),\n    }\n\n    #[derive(Subcommand, Debug)]\n    pub(crate) enum Child {\n        One,\n        Twp,\n    }\n\n    let output = str![[r#\"\nUsage: cmd <COMMAND>\n\nCommands:\n  child  For child\n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help  Print help\n\n\"#]];\n    utils::assert_output::<Cmd>(\"cmd --help\", output, false);\n}\n\n#[test]\nfn force_long_help() {\n    /// Lorem ipsum\n    #[derive(Parser, PartialEq, Debug)]\n    struct LoremIpsum {\n        /// Fooify a bar\n        /// and a baz.\n        #[arg(short, long, long_help)]\n        foo: bool,\n    }\n\n    let help = utils::get_long_help::<LoremIpsum>();\n    assert_data_eq!(help, str![[r#\"\nLorem ipsum\n\nUsage: clap [OPTIONS]\n\nOptions:\n  -f, --foo\n          Fooify a bar and a baz.\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]].raw());\n}\n"
  },
  {
    "path": "tests/derive/explicit_name_no_renaming.rs",
    "content": "use clap::Parser;\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\nuse crate::utils;\n\n#[test]\nfn explicit_short_long_no_rename() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(short = '.', long = \".foo\")]\n        foo: String,\n    }\n\n    assert_eq!(\n        Opt { foo: \"long\".into() },\n        Opt::try_parse_from([\"test\", \"--.foo\", \"long\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            foo: \"short\".into(),\n        },\n        Opt::try_parse_from([\"test\", \"-.\", \"short\"]).unwrap()\n    );\n}\n\n#[test]\nfn explicit_name_no_rename() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(id = \".options\")]\n        foo: String,\n    }\n\n    let help = utils::get_long_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <.options>\n\nArguments:\n  <.options>\n          \n\nOptions:\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n"
  },
  {
    "path": "tests/derive/flags.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse clap::builder::BoolishValueParser;\nuse clap::builder::TypedValueParser as _;\nuse clap::ArgAction;\nuse clap::CommandFactory;\nuse clap::Parser;\n\n#[test]\nfn bool_type_is_flag() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short, long)]\n        alice: bool,\n    }\n\n    assert_eq!(Opt { alice: false }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(\n        Opt { alice: true },\n        Opt::try_parse_from([\"test\", \"-a\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { alice: true },\n        Opt::try_parse_from([\"test\", \"-a\", \"-a\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { alice: true },\n        Opt::try_parse_from([\"test\", \"--alice\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"test\", \"-i\"]).is_err());\n    assert!(Opt::try_parse_from([\"test\", \"-a\", \"foo\"]).is_err());\n}\n\n#[test]\nfn non_bool_type_flag() {\n    fn parse_from_flag(b: bool) -> usize {\n        if b {\n            10\n        } else {\n            5\n        }\n    }\n\n    #[derive(Parser, Debug)]\n    struct Opt {\n        #[arg(short, long, action = ArgAction::SetTrue, value_parser = BoolishValueParser::new().map(parse_from_flag))]\n        alice: usize,\n        #[arg(short, long, action = ArgAction::SetTrue, value_parser = BoolishValueParser::new().map(parse_from_flag))]\n        bob: usize,\n    }\n\n    let opt = Opt::try_parse_from([\"test\"]).unwrap();\n    assert_eq!(opt.alice, 5);\n    assert_eq!(opt.bob, 5);\n\n    let opt = Opt::try_parse_from([\"test\", \"-a\"]).unwrap();\n    assert_eq!(opt.alice, 10);\n    assert_eq!(opt.bob, 5);\n\n    let opt = Opt::try_parse_from([\"test\", \"-b\"]).unwrap();\n    assert_eq!(opt.alice, 5);\n    assert_eq!(opt.bob, 10);\n\n    let opt = Opt::try_parse_from([\"test\", \"-b\", \"-a\"]).unwrap();\n    assert_eq!(opt.alice, 10);\n    assert_eq!(opt.bob, 10);\n}\n\n#[test]\n#[ignore] // Not a good path for supporting this atm\nfn inferred_help() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        /// Foo\n        #[arg(short, long)]\n        help: bool,\n    }\n\n    let mut cmd = Opt::command();\n    cmd.build();\n    let arg = cmd.get_arguments().find(|a| a.get_id() == \"help\").unwrap();\n    assert_eq!(\n        arg.get_help().map(|s| s.to_string()),\n        Some(\"Foo\".to_owned()),\n        \"Incorrect help\"\n    );\n    assert!(matches!(arg.get_action(), ArgAction::Help));\n}\n\n#[test]\n#[ignore] // Not a good path for supporting this atm\nfn inferred_version() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        /// Foo\n        #[arg(short, long)]\n        version: bool,\n    }\n\n    let mut cmd = Opt::command();\n    cmd.build();\n    let arg = cmd\n        .get_arguments()\n        .find(|a| a.get_id() == \"version\")\n        .unwrap();\n    assert_eq!(\n        arg.get_help().map(|s| s.to_string()),\n        Some(\"Foo\".to_owned()),\n        \"Incorrect help\"\n    );\n    assert!(matches!(arg.get_action(), ArgAction::Version));\n}\n\n#[test]\nfn count() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        #[arg(short, long, action = clap::ArgAction::Count)]\n        alice: u8,\n        #[arg(short, long, action = clap::ArgAction::Count)]\n        bob: u8,\n    }\n\n    assert_eq!(\n        Opt { alice: 0, bob: 0 },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { alice: 1, bob: 0 },\n        Opt::try_parse_from([\"test\", \"-a\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { alice: 2, bob: 0 },\n        Opt::try_parse_from([\"test\", \"-a\", \"-a\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { alice: 2, bob: 2 },\n        Opt::try_parse_from([\"test\", \"-a\", \"--alice\", \"-bb\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { alice: 3, bob: 1 },\n        Opt::try_parse_from([\"test\", \"-aaa\", \"--bob\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"test\", \"-i\"]).is_err());\n    assert!(Opt::try_parse_from([\"test\", \"-a\", \"foo\"]).is_err());\n}\n\n#[test]\nfn mixed_type_flags() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        #[arg(short, long)]\n        alice: bool,\n        #[arg(short, long, action = clap::ArgAction::Count)]\n        bob: u8,\n    }\n\n    assert_eq!(\n        Opt {\n            alice: false,\n            bob: 0\n        },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            alice: true,\n            bob: 0\n        },\n        Opt::try_parse_from([\"test\", \"-a\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            alice: true,\n            bob: 0\n        },\n        Opt::try_parse_from([\"test\", \"-a\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            alice: false,\n            bob: 1\n        },\n        Opt::try_parse_from([\"test\", \"-b\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            alice: true,\n            bob: 1\n        },\n        Opt::try_parse_from([\"test\", \"--alice\", \"--bob\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            alice: true,\n            bob: 4\n        },\n        Opt::try_parse_from([\"test\", \"-bb\", \"-a\", \"-bb\"]).unwrap()\n    );\n}\n\n#[test]\nfn ignore_qualified_bool_type() {\n    mod inner {\n        #[allow(non_camel_case_types)]\n        #[derive(PartialEq, Eq, Debug, Clone)]\n        pub(crate) struct bool(pub(crate) String);\n\n        impl std::str::FromStr for bool {\n            type Err = String;\n\n            fn from_str(s: &str) -> Result<Self, Self::Err> {\n                Ok(bool(s.into()))\n            }\n        }\n    }\n\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        arg: inner::bool,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: inner::bool(\"success\".into())\n        },\n        Opt::try_parse_from([\"test\", \"success\"]).unwrap()\n    );\n}\n\n#[test]\nfn override_implicit_action() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        #[arg(long, action = clap::ArgAction::Set)]\n        arg: bool,\n    }\n\n    assert_eq!(\n        Opt { arg: false },\n        Opt::try_parse_from([\"test\", \"--arg\", \"false\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt { arg: true },\n        Opt::try_parse_from([\"test\", \"--arg\", \"true\"]).unwrap()\n    );\n}\n\n#[test]\nfn override_implicit_from_flag_positional() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        #[arg(action = clap::ArgAction::Set)]\n        arg: bool,\n    }\n\n    assert_eq!(\n        Opt { arg: false },\n        Opt::try_parse_from([\"test\", \"false\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt { arg: true },\n        Opt::try_parse_from([\"test\", \"true\"]).unwrap()\n    );\n}\n\n#[test]\nfn unit_for_negation() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        #[arg(long)]\n        arg: bool,\n        #[arg(long, action = ArgAction::SetTrue, overrides_with = \"arg\")]\n        no_arg: (),\n    }\n\n    assert_eq!(\n        Opt {\n            arg: false,\n            no_arg: ()\n        },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            arg: true,\n            no_arg: ()\n        },\n        Opt::try_parse_from([\"test\", \"--arg\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            arg: false,\n            no_arg: ()\n        },\n        Opt::try_parse_from([\"test\", \"--no-arg\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            arg: true,\n            no_arg: ()\n        },\n        Opt::try_parse_from([\"test\", \"--no-arg\", \"--arg\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            arg: false,\n            no_arg: ()\n        },\n        Opt::try_parse_from([\"test\", \"--arg\", \"--no-arg\"]).unwrap()\n    );\n}\n\n#[test]\nfn optional_value_flag() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        #[arg(short, long, num_args=0..=1)]\n        alice: bool,\n    }\n\n    assert_eq!(Opt { alice: false }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(\n        Opt { alice: true },\n        Opt::try_parse_from([\"test\", \"-a\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { alice: true },\n        Opt::try_parse_from([\"test\", \"-a\", \"true\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { alice: false },\n        Opt::try_parse_from([\"test\", \"-a\", \"false\"]).unwrap()\n    );\n}\n"
  },
  {
    "path": "tests/derive/flatten.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse clap::{Args, Parser, Subcommand};\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\nuse crate::utils;\n\n#[test]\nfn flatten() {\n    #[derive(Args, PartialEq, Debug)]\n    struct Common {\n        arg: i32,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[command(flatten)]\n        common: Common,\n    }\n    assert_eq!(\n        Opt {\n            common: Common { arg: 42 }\n        },\n        Opt::try_parse_from([\"test\", \"42\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"test\"]).is_err());\n    assert!(Opt::try_parse_from([\"test\", \"42\", \"24\"]).is_err());\n}\n\n#[cfg(debug_assertions)]\n#[test]\n#[should_panic]\nfn flatten_twice() {\n    #[derive(Args, PartialEq, Debug)]\n    struct Common {\n        arg: i32,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[command(flatten)]\n        c1: Common,\n        // Defines \"arg\" twice, so this should not work.\n        #[command(flatten)]\n        c2: Common,\n    }\n    Opt::try_parse_from([\"test\", \"42\", \"43\"]).unwrap();\n}\n\n#[test]\nfn flatten_in_subcommand() {\n    #[derive(Args, PartialEq, Debug)]\n    struct Common {\n        arg: i32,\n    }\n\n    #[derive(Args, PartialEq, Debug)]\n    struct Add {\n        #[arg(short)]\n        interactive: bool,\n        #[command(flatten)]\n        common: Common,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    enum Opt {\n        Fetch {\n            #[arg(short)]\n            all: bool,\n            #[command(flatten)]\n            common: Common,\n        },\n\n        Add(Add),\n    }\n\n    assert_eq!(\n        Opt::Fetch {\n            all: false,\n            common: Common { arg: 42 }\n        },\n        Opt::try_parse_from([\"test\", \"fetch\", \"42\"]).unwrap()\n    );\n    assert_eq!(\n        Opt::Add(Add {\n            interactive: true,\n            common: Common { arg: 43 }\n        }),\n        Opt::try_parse_from([\"test\", \"add\", \"-i\", \"43\"]).unwrap()\n    );\n}\n\n#[test]\nfn update_args_with_flatten() {\n    #[derive(Args, PartialEq, Debug)]\n    struct Common {\n        arg: i32,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[command(flatten)]\n        common: Common,\n    }\n\n    let mut opt = Opt {\n        common: Common { arg: 42 },\n    };\n    opt.try_update_from([\"test\"]).unwrap();\n    assert_eq!(Opt::try_parse_from([\"test\", \"42\"]).unwrap(), opt);\n\n    let mut opt = Opt {\n        common: Common { arg: 42 },\n    };\n    opt.try_update_from([\"test\", \"52\"]).unwrap();\n    assert_eq!(Opt::try_parse_from([\"test\", \"52\"]).unwrap(), opt);\n}\n\n#[derive(Subcommand, PartialEq, Debug)]\nenum BaseCli {\n    Command1(Command1),\n}\n\n#[derive(Args, PartialEq, Debug)]\nstruct Command1 {\n    arg1: i32,\n\n    arg2: i32,\n}\n\n#[derive(Args, PartialEq, Debug)]\nstruct Command2 {\n    arg2: i32,\n}\n\n#[derive(Parser, PartialEq, Debug)]\nenum Opt {\n    #[command(flatten)]\n    BaseCli(BaseCli),\n    Command2(Command2),\n}\n\n#[test]\nfn merge_subcommands_with_flatten() {\n    assert_eq!(\n        Opt::BaseCli(BaseCli::Command1(Command1 { arg1: 42, arg2: 44 })),\n        Opt::try_parse_from([\"test\", \"command1\", \"42\", \"44\"]).unwrap()\n    );\n    assert_eq!(\n        Opt::Command2(Command2 { arg2: 43 }),\n        Opt::try_parse_from([\"test\", \"command2\", \"43\"]).unwrap()\n    );\n}\n\n#[test]\nfn update_subcommands_with_flatten() {\n    let mut opt = Opt::BaseCli(BaseCli::Command1(Command1 { arg1: 12, arg2: 14 }));\n    opt.try_update_from([\"test\", \"command1\", \"42\", \"44\"])\n        .unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"command1\", \"42\", \"44\"]).unwrap(),\n        opt\n    );\n\n    let mut opt = Opt::BaseCli(BaseCli::Command1(Command1 { arg1: 12, arg2: 14 }));\n    opt.try_update_from([\"test\", \"command1\", \"42\"]).unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"command1\", \"42\", \"14\"]).unwrap(),\n        opt\n    );\n\n    let mut opt = Opt::BaseCli(BaseCli::Command1(Command1 { arg1: 12, arg2: 14 }));\n    opt.try_update_from([\"test\", \"command2\", \"43\"]).unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"command2\", \"43\"]).unwrap(),\n        opt\n    );\n}\n\n#[test]\nfn flatten_with_doc_comment() {\n    #[derive(Args, PartialEq, Debug)]\n    struct Common {\n        /// This is an arg. Arg means \"argument\". Command line argument.\n        arg: i32,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        /// The very important comment that clippy had me put here.\n        /// It knows better.\n        #[command(flatten)]\n        common: Common,\n    }\n    assert_eq!(\n        Opt {\n            common: Common { arg: 42 }\n        },\n        Opt::try_parse_from([\"test\", \"42\"]).unwrap()\n    );\n\n    let help = utils::get_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <ARG>\n\nArguments:\n  <ARG>  This is an arg. Arg means \"argument\". Command line argument\n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn docstrings_ordering_with_multiple_command() {\n    /// This is the docstring for Flattened\n    #[derive(Args)]\n    struct Flattened {\n        #[arg(long)]\n        foo: bool,\n    }\n\n    /// This is the docstring for Command\n    #[derive(Parser)]\n    struct Command {\n        #[command(flatten)]\n        flattened: Flattened,\n    }\n\n    let short_help = utils::get_help::<Command>();\n\n    assert_data_eq!(short_help, str![[r#\"\nThis is the docstring for Command\n\nUsage: clap [OPTIONS]\n\nOptions:\n      --foo   \n  -h, --help  Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn docstrings_ordering_with_multiple_clap_partial() {\n    /// This is the docstring for Flattened\n    #[derive(Args)]\n    struct Flattened {\n        #[arg(long)]\n        foo: bool,\n    }\n\n    #[derive(Parser)]\n    struct Command {\n        #[command(flatten)]\n        flattened: Flattened,\n    }\n\n    let short_help = utils::get_help::<Command>();\n\n    assert_data_eq!(short_help, str![[r#\"\nThis is the docstring for Flattened\n\nUsage: clap [OPTIONS]\n\nOptions:\n      --foo   \n  -h, --help  Print help\n\n\"#]].raw());\n}\n\n#[test]\n#[should_panic = \"cannot `#[flatten]` an `Option<Args>` with `#[group(skip)]`\"]\nfn flatten_skipped_group() {\n    #[derive(clap::Parser, Debug)]\n    struct Cli {\n        #[clap(flatten)]\n        args: Option<Args>,\n    }\n\n    #[derive(clap::Args, Debug)]\n    #[group(skip)]\n    struct Args {\n        #[clap(short)]\n        param: bool,\n    }\n\n    Cli::try_parse_from([\"test\"]).unwrap();\n}\n"
  },
  {
    "path": "tests/derive/generic.rs",
    "content": "use clap::{Args, Parser};\n\n#[test]\nfn generic_struct_flatten() {\n    #[derive(Args, PartialEq, Debug)]\n    struct Inner {\n        pub(crate) answer: isize,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Outer<T: Args> {\n        #[command(flatten)]\n        pub(crate) inner: T,\n    }\n\n    assert_eq!(\n        Outer {\n            inner: Inner { answer: 42 }\n        },\n        Outer::parse_from([\"--answer\", \"42\"])\n    );\n}\n\n#[test]\nfn generic_struct_flatten_w_where_clause() {\n    #[derive(Args, PartialEq, Debug)]\n    struct Inner {\n        pub(crate) answer: isize,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Outer<T>\n    where\n        T: Args,\n    {\n        #[command(flatten)]\n        pub(crate) inner: T,\n    }\n\n    assert_eq!(\n        Outer {\n            inner: Inner { answer: 42 }\n        },\n        Outer::parse_from([\"--answer\", \"42\"])\n    );\n}\n\n#[test]\nfn generic_enum() {\n    #[derive(Args, PartialEq, Debug)]\n    struct Inner {\n        pub(crate) answer: isize,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    enum GenericEnum<T: Args> {\n        Start(T),\n        Stop,\n    }\n\n    assert_eq!(\n        GenericEnum::Start(Inner { answer: 42 }),\n        GenericEnum::parse_from([\"test\", \"start\", \"42\"])\n    );\n}\n\n#[test]\nfn generic_enum_w_where_clause() {\n    #[derive(Args, PartialEq, Debug)]\n    struct Inner {\n        pub(crate) answer: isize,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    enum GenericEnum<T>\n    where\n        T: Args,\n    {\n        Start(T),\n        Stop,\n    }\n\n    assert_eq!(\n        GenericEnum::Start(Inner { answer: 42 }),\n        GenericEnum::parse_from([\"test\", \"start\", \"42\"])\n    );\n}\n\n#[test]\nfn generic_w_fromstr_trait_bound() {\n    use std::str::FromStr;\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt<T>\n    where\n        T: FromStr + Send + Sync + Clone + 'static,\n        <T as FromStr>::Err: std::error::Error + Sync + Send + 'static,\n    {\n        answer: T,\n    }\n\n    assert_eq!(\n        Opt::<isize> { answer: 42 },\n        Opt::<isize>::parse_from([\"--answer\", \"42\"])\n    );\n}\n\n#[test]\nfn generic_wo_trait_bound() {\n    use std::time::Duration;\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt<T> {\n        answer: isize,\n        #[arg(skip)]\n        took: Option<T>,\n    }\n\n    assert_eq!(\n        Opt::<Duration> {\n            answer: 42,\n            took: None\n        },\n        Opt::<Duration>::parse_from([\"--answer\", \"42\"])\n    );\n}\n\n#[test]\nfn generic_where_clause_w_trailing_comma() {\n    use std::str::FromStr;\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt<T>\n    where\n        T: FromStr + Send + Sync + Clone + 'static,\n        <T as FromStr>::Err: std::error::Error + Sync + Send + 'static,\n    {\n        pub(crate) answer: T,\n    }\n\n    assert_eq!(\n        Opt::<isize> { answer: 42 },\n        Opt::<isize>::parse_from([\"--answer\", \"42\"])\n    );\n}\n"
  },
  {
    "path": "tests/derive/groups.rs",
    "content": "use clap::Parser;\nuse snapbox::str;\n\nuse crate::utils::assert_output;\n\n#[test]\nfn test_safely_nest_parser() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[command(flatten)]\n        foo: Foo,\n    }\n\n    #[derive(Parser, Debug, PartialEq)]\n    struct Foo {\n        #[arg(long)]\n        foo: bool,\n    }\n\n    assert_eq!(\n        Opt {\n            foo: Foo { foo: true }\n        },\n        Opt::try_parse_from([\"test\", \"--foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn implicit_struct_group() {\n    #[derive(Parser, Debug)]\n    struct Opt {\n        #[arg(short, long, requires = \"Source\")]\n        add: bool,\n\n        #[command(flatten)]\n        source: Source,\n    }\n\n    #[derive(clap::Args, Debug)]\n    struct Source {\n        crates: Vec<String>,\n        #[arg(long)]\n        path: Option<std::path::PathBuf>,\n        #[arg(long)]\n        git: Option<String>,\n    }\n\n    let output = str![[r#\"\nerror: the following required arguments were not provided:\n  <CRATES|--path <PATH>|--git <GIT>>\n\nUsage: prog --add <CRATES|--path <PATH>|--git <GIT>>\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_output::<Opt>(\"prog --add\", output, true);\n\n    use clap::Args;\n    assert_eq!(Source::group_id(), Some(clap::Id::from(\"Source\")));\n    assert_eq!(Opt::group_id(), Some(clap::Id::from(\"Opt\")));\n}\n\n#[test]\nfn skip_group_avoids_duplicate_ids() {\n    #[derive(Parser, Debug)]\n    #[group(skip)]\n    struct Opt {\n        #[command(flatten)]\n        first: Compose<Empty, Empty>,\n        #[command(flatten)]\n        second: Compose<Empty, Empty>,\n    }\n\n    #[derive(clap::Args, Debug)]\n    #[group(skip)]\n    pub(crate) struct Compose<L: Args, R: Args> {\n        #[command(flatten)]\n        pub(crate) left: L,\n        #[command(flatten)]\n        pub(crate) right: R,\n    }\n\n    #[derive(clap::Args, Clone, Copy, Debug)]\n    #[group(skip)]\n    pub(crate) struct Empty;\n\n    use clap::CommandFactory;\n    Opt::command().debug_assert();\n\n    use clap::Args;\n    assert_eq!(Empty::group_id(), None);\n    assert_eq!(Compose::<Empty, Empty>::group_id(), None);\n    assert_eq!(Opt::group_id(), None);\n}\n\n#[test]\nfn optional_flatten() {\n    #[derive(Parser, Debug, PartialEq, Eq)]\n    struct Opt {\n        #[command(flatten)]\n        source: Option<Source>,\n    }\n\n    #[derive(clap::Args, Debug, PartialEq, Eq)]\n    struct Source {\n        crates: Vec<String>,\n        #[arg(long)]\n        path: Option<std::path::PathBuf>,\n        #[arg(long)]\n        git: Option<String>,\n    }\n\n    assert_eq!(Opt { source: None }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(\n        Opt {\n            source: Some(Source {\n                crates: vec![\"serde\".to_owned()],\n                path: None,\n                git: None,\n            }),\n        },\n        Opt::try_parse_from([\"test\", \"serde\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            source: Some(Source {\n                crates: Vec::new(),\n                path: Some(\"./\".into()),\n                git: None,\n            }),\n        },\n        Opt::try_parse_from([\"test\", \"--path=./\"]).unwrap()\n    );\n}\n\n#[test]\n#[should_panic = \"\\\nCommand clap: Argument group name must be unique\n\n\\t'Compose' is already in use\"]\nfn helpful_panic_on_duplicate_groups() {\n    #[derive(Parser, Debug)]\n    struct Opt {\n        #[command(flatten)]\n        first: Compose<Empty, Empty>,\n        #[command(flatten)]\n        second: Compose<Empty, Empty>,\n    }\n\n    #[derive(clap::Args, Debug)]\n    pub(crate) struct Compose<L: clap::Args, R: clap::Args> {\n        #[command(flatten)]\n        pub(crate) left: L,\n        #[command(flatten)]\n        pub(crate) right: R,\n    }\n\n    #[derive(clap::Args, Clone, Copy, Debug)]\n    pub(crate) struct Empty;\n\n    use clap::CommandFactory;\n    Opt::command().debug_assert();\n}\n\n#[test]\nfn custom_group_id() {\n    #[derive(Parser, Debug, PartialEq, Eq)]\n    struct Opt {\n        #[command(flatten)]\n        source: Option<Source>,\n    }\n\n    #[derive(clap::Args, Debug, PartialEq, Eq)]\n    #[group(id = \"source\")]\n    struct Source {\n        crates: Vec<String>,\n        #[arg(long)]\n        path: Option<std::path::PathBuf>,\n        #[arg(long)]\n        git: Option<String>,\n    }\n\n    assert_eq!(Opt { source: None }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(\n        Opt {\n            source: Some(Source {\n                crates: vec![\"serde\".to_owned()],\n                path: None,\n                git: None,\n            }),\n        },\n        Opt::try_parse_from([\"test\", \"serde\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            source: Some(Source {\n                crates: Vec::new(),\n                path: Some(\"./\".into()),\n                git: None,\n            }),\n        },\n        Opt::try_parse_from([\"test\", \"--path=./\"]).unwrap()\n    );\n}\n\n#[test]\nfn required_group() {\n    #[derive(Parser, Debug, PartialEq, Eq)]\n    struct Opt {\n        #[command(flatten)]\n        source: Source,\n    }\n\n    #[derive(clap::Args, Debug, PartialEq, Eq)]\n    #[group(required = true, multiple = false)]\n    struct Source {\n        #[arg(long)]\n        path: Option<std::path::PathBuf>,\n        #[arg(long)]\n        git: Option<String>,\n    }\n\n    assert_eq!(\n        Opt {\n            source: Source {\n                path: Some(\"./\".into()),\n                git: None,\n            },\n        },\n        Opt::try_parse_from([\"test\", \"--path=./\"]).unwrap()\n    );\n\n    let output = str![[r#\"\nerror: the following required arguments were not provided:\n  <--path <PATH>|--git <GIT>>\n\nUsage: test <--path <PATH>|--git <GIT>>\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_output::<Opt>(\"test\", output, true);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\n#[cfg(feature = \"suggestions\")]\nfn suggestion() {\n    #[derive(Parser, Debug)]\n    struct Args {\n        name: String,\n\n        #[arg(long)]\n        hello: Option<u8>,\n\n        #[arg(long)]\n        count01: Vec<u8>,\n        #[arg(long)]\n        count02: Vec<u8>,\n        #[arg(long)]\n        count03: Vec<u8>,\n        #[arg(long)]\n        count04: Vec<u8>,\n        #[arg(long)]\n        count05: Vec<u8>,\n        #[arg(long)]\n        count06: Vec<u8>,\n        #[arg(long)]\n        count07: Vec<u8>,\n        #[arg(long)]\n        count08: Vec<u8>,\n        #[arg(long)]\n        count09: Vec<u8>,\n        #[arg(long)]\n        count10: Vec<u8>,\n        #[arg(long)]\n        count11: Vec<u8>,\n        #[arg(long)]\n        count12: Vec<u8>,\n        #[arg(long)]\n        count13: Vec<u8>,\n        #[arg(long)]\n        count14: Vec<u8>,\n        #[arg(long)]\n        count15: Vec<u8>,\n        #[arg(long)]\n        count16: Vec<u8>,\n        #[arg(long)]\n        count17: Vec<u8>,\n        #[arg(long)]\n        count18: Vec<u8>,\n    }\n\n    let output = str![[r#\"\nerror: unexpected argument '--hell' found\n\n  tip: a similar argument exists: '--hello'\n\nUsage: test --hello <HELLO> <NAME>\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_output::<Args>(\"test --hell\", output, true);\n}\n"
  },
  {
    "path": "tests/derive/help.rs",
    "content": "use clap::{ArgAction, Args, CommandFactory, Parser, Subcommand};\nuse snapbox::assert_data_eq;\nuse snapbox::str;\n\n#[test]\nfn arg_help_heading_applied() {\n    #[derive(Debug, Clone, Parser)]\n    struct CliOptions {\n        #[arg(long)]\n        #[arg(help_heading = Some(\"HEADING A\"))]\n        should_be_in_section_a: u32,\n\n        #[arg(long)]\n        no_section: u32,\n    }\n\n    let cmd = CliOptions::command();\n\n    let should_be_in_section_a = cmd\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_section_a\")\n        .unwrap();\n    assert_eq!(should_be_in_section_a.get_help_heading(), Some(\"HEADING A\"));\n\n    let should_be_in_section_b = cmd\n        .get_arguments()\n        .find(|a| a.get_id() == \"no_section\")\n        .unwrap();\n    assert_eq!(should_be_in_section_b.get_help_heading(), None);\n}\n\n#[test]\nfn app_help_heading_applied() {\n    #[derive(Debug, Clone, Parser)]\n    #[command(next_help_heading = \"DEFAULT\")]\n    struct CliOptions {\n        #[arg(long)]\n        #[arg(help_heading = Some(\"HEADING A\"))]\n        should_be_in_section_a: u32,\n\n        #[arg(long)]\n        should_be_in_default_section: u32,\n    }\n\n    let cmd = CliOptions::command();\n\n    let should_be_in_section_a = cmd\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_section_a\")\n        .unwrap();\n    assert_eq!(should_be_in_section_a.get_help_heading(), Some(\"HEADING A\"));\n\n    let should_be_in_default_section = cmd\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_default_section\")\n        .unwrap();\n    assert_eq!(\n        should_be_in_default_section.get_help_heading(),\n        Some(\"DEFAULT\")\n    );\n}\n\n#[test]\nfn app_help_heading_flattened() {\n    // Used to help track the cause in tests\n    #![allow(clippy::enum_variant_names)]\n\n    #[derive(Debug, Clone, Parser)]\n    struct CliOptions {\n        #[command(flatten)]\n        options_a: OptionsA,\n\n        #[command(flatten)]\n        options_b: OptionsB,\n\n        #[command(subcommand)]\n        sub_a: SubA,\n\n        #[arg(long)]\n        should_be_in_default_section: u32,\n    }\n\n    #[derive(Debug, Clone, Args)]\n    #[command(next_help_heading = \"HEADING A\")]\n    struct OptionsA {\n        #[arg(long)]\n        should_be_in_section_a: u32,\n    }\n\n    #[derive(Debug, Clone, Args)]\n    #[command(next_help_heading = \"HEADING B\")]\n    struct OptionsB {\n        #[arg(long)]\n        should_be_in_section_b: u32,\n    }\n\n    #[derive(Debug, Clone, Subcommand)]\n    enum SubA {\n        #[command(flatten)]\n        SubB(SubB),\n        #[command(subcommand)]\n        SubC(SubC),\n        SubAOne,\n        #[command(next_help_heading = \"SUB A\")]\n        SubATwo {\n            should_be_in_sub_a: u32,\n        },\n    }\n\n    #[derive(Debug, Clone, Subcommand)]\n    enum SubB {\n        #[command(next_help_heading = \"SUB B\")]\n        SubBOne { should_be_in_sub_b: u32 },\n    }\n\n    #[derive(Debug, Clone, Subcommand)]\n    enum SubC {\n        #[command(next_help_heading = \"SUB C\")]\n        SubCOne { should_be_in_sub_c: u32 },\n    }\n\n    let cmd = CliOptions::command();\n\n    let should_be_in_section_a = cmd\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_section_a\")\n        .unwrap();\n    assert_eq!(should_be_in_section_a.get_help_heading(), Some(\"HEADING A\"));\n\n    let should_be_in_section_b = cmd\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_section_b\")\n        .unwrap();\n    assert_eq!(should_be_in_section_b.get_help_heading(), Some(\"HEADING B\"));\n\n    let should_be_in_section_b = cmd\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_default_section\")\n        .unwrap();\n    assert_eq!(should_be_in_section_b.get_help_heading(), Some(\"HEADING B\"));\n\n    let sub_a_two = cmd.find_subcommand(\"sub-a-two\").unwrap();\n\n    let should_be_in_sub_a = sub_a_two\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_sub_a\")\n        .unwrap();\n    assert_eq!(should_be_in_sub_a.get_help_heading(), Some(\"SUB A\"));\n\n    let sub_b_one = cmd.find_subcommand(\"sub-b-one\").unwrap();\n\n    let should_be_in_sub_b = sub_b_one\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_sub_b\")\n        .unwrap();\n    assert_eq!(should_be_in_sub_b.get_help_heading(), Some(\"SUB B\"));\n\n    let sub_c = cmd.find_subcommand(\"sub-c\").unwrap();\n    let sub_c_one = sub_c.find_subcommand(\"sub-c-one\").unwrap();\n\n    let should_be_in_sub_c = sub_c_one\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_sub_c\")\n        .unwrap();\n    assert_eq!(should_be_in_sub_c.get_help_heading(), Some(\"SUB C\"));\n}\n\n#[test]\nfn flatten_field_with_help_heading() {\n    #[derive(Debug, Clone, Parser)]\n    struct CliOptions {\n        #[command(flatten)]\n        #[command(next_help_heading = \"HEADING A\")]\n        options_a: OptionsA,\n    }\n\n    #[derive(Debug, Clone, Args)]\n    struct OptionsA {\n        #[arg(long)]\n        should_be_in_section_a: u32,\n    }\n\n    let cmd = CliOptions::command();\n\n    let should_be_in_section_a = cmd\n        .get_arguments()\n        .find(|a| a.get_id() == \"should_be_in_section_a\")\n        .unwrap();\n    assert_eq!(should_be_in_section_a.get_help_heading(), Some(\"HEADING A\"));\n}\n\n// The challenge with this test is creating an error situation not caught by `clap`'s error checking\n// but by the code that `clap_derive` generates.\n//\n// Ultimately, the easiest way to confirm is to put a debug statement in the desired error path.\n#[test]\nfn derive_generated_error_has_full_context() {\n    #[derive(Debug, Parser)]\n    #[command(subcommand_negates_reqs = true)]\n    struct Opts {\n        #[arg(long)]\n        req_str: String,\n\n        #[command(subcommand)]\n        cmd: Option<SubCommands>,\n    }\n\n    #[derive(Debug, Parser)]\n    enum SubCommands {\n        Sub {\n            #[arg(short, long, action = clap::ArgAction::Count)]\n            verbose: u8,\n        },\n    }\n\n    let result = Opts::try_parse_from([\"test\", \"sub\"]);\n    assert!(\n        result.is_err(),\n        \"`SubcommandsNegateReqs` with non-optional `req_str` should fail: {:?}\",\n        result.unwrap()\n    );\n\n    let expected = str![[r#\"\nerror: the following required argument was not provided: req_str\n\nUsage: clap --req-str <REQ_STR>\n       clap <COMMAND>\n\nFor more information, try '--help'.\n\n\"#]];\n    assert_data_eq!(result.unwrap_err().to_string(), expected);\n}\n\n#[test]\nfn derive_order_next_order() {\n    #[derive(Parser, Debug)]\n    #[command(name = \"test\", version = \"1.2\")]\n    struct Args {\n        #[command(flatten)]\n        a: A,\n        #[command(flatten)]\n        b: B,\n    }\n\n    #[derive(Args, Debug)]\n    #[command(next_display_order = 10000)]\n    struct A {\n        /// second flag\n        #[arg(long)]\n        flag_a: bool,\n        /// second option\n        #[arg(long)]\n        option_a: Option<String>,\n    }\n\n    #[derive(Args, Debug)]\n    #[command(next_display_order = 10)]\n    struct B {\n        /// first flag\n        #[arg(long)]\n        flag_b: bool,\n        /// first option\n        #[arg(long)]\n        option_b: Option<String>,\n    }\n\n    use clap::CommandFactory;\n    let mut cmd = Args::command();\n\n    let help = cmd.render_help().to_string();\n    assert_data_eq!(\n        help,\n        snapbox::str![[r#\"\nUsage: test [OPTIONS]\n\nOptions:\n      --flag-b               first flag\n      --option-b <OPTION_B>  first option\n  -h, --help                 Print help\n  -V, --version              Print version\n      --flag-a               second flag\n      --option-a <OPTION_A>  second option\n\n\"#]],\n    );\n}\n\n#[test]\nfn derive_order_next_order_flatten() {\n    #[derive(Parser, Debug)]\n    #[command(name = \"test\", version = \"1.2\")]\n    struct Args {\n        #[command(flatten)]\n        #[command(next_display_order = 10000)]\n        a: A,\n        #[command(flatten)]\n        #[command(next_display_order = 10)]\n        b: B,\n    }\n\n    #[derive(Args, Debug)]\n    struct A {\n        /// second flag\n        #[arg(long)]\n        flag_a: bool,\n        /// second option\n        #[arg(long)]\n        option_a: Option<String>,\n    }\n\n    #[derive(Args, Debug)]\n    struct B {\n        /// first flag\n        #[arg(long)]\n        flag_b: bool,\n        /// first option\n        #[arg(long)]\n        option_b: Option<String>,\n    }\n\n    use clap::CommandFactory;\n    let mut cmd = Args::command();\n\n    let help = cmd.render_help().to_string();\n    assert_data_eq!(\n        help,\n        snapbox::str![[r#\"\nUsage: test [OPTIONS]\n\nOptions:\n      --flag-b               first flag\n      --option-b <OPTION_B>  first option\n  -h, --help                 Print help\n  -V, --version              Print version\n      --flag-a               second flag\n      --option-a <OPTION_A>  second option\n\n\"#]],\n    );\n}\n\n#[test]\nfn derive_order_no_next_order() {\n    #[derive(Parser, Debug)]\n    #[command(name = \"test\", version = \"1.2\")]\n    #[command(next_display_order = None)]\n    struct Args {\n        #[command(flatten)]\n        a: A,\n        #[command(flatten)]\n        b: B,\n    }\n\n    #[derive(Args, Debug)]\n    struct A {\n        /// first flag\n        #[arg(long)]\n        flag_a: bool,\n        /// first option\n        #[arg(long)]\n        option_a: Option<String>,\n    }\n\n    #[derive(Args, Debug)]\n    struct B {\n        /// second flag\n        #[arg(long)]\n        flag_b: bool,\n        /// second option\n        #[arg(long)]\n        option_b: Option<String>,\n    }\n\n    use clap::CommandFactory;\n    let mut cmd = Args::command();\n\n    let help = cmd.render_help().to_string();\n    assert_data_eq!(help, str![[r#\"\nUsage: test [OPTIONS]\n\nOptions:\n      --flag-a               first flag\n      --flag-b               second flag\n  -h, --help                 Print help\n      --option-a <OPTION_A>  first option\n      --option-b <OPTION_B>  second option\n  -V, --version              Print version\n\n\"#]]);\n}\n\n#[test]\nfn derive_possible_value_help() {\n    /// Application help\n    #[derive(Parser, PartialEq, Debug)]\n    struct Args {\n        /// Argument help\n        #[arg(value_enum)]\n        arg: ArgChoice,\n    }\n\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        /// Foo help\n        Foo,\n        /// Bar help\n        Bar,\n    }\n\n    use clap::CommandFactory;\n    let mut cmd = Args::command();\n\n    let help = cmd.render_long_help().to_string();\n    assert_data_eq!(\n        help,\n        str![[r#\"\nApplication help\n\nUsage: clap <ARG>\n\nArguments:\n  <ARG>\n          Argument help\n\n          Possible values:\n          - foo: Foo help\n          - bar: Bar help\n\nOptions:\n  -h, --help\n          Print help (see a summary with '-h')\n\n\"#]]\n    );\n}\n\n#[test]\nfn custom_help_flag() {\n    #[derive(Debug, Clone, Parser)]\n    #[command(disable_help_flag = true)]\n    struct CliOptions {\n        #[arg(short = 'h', long = \"verbose-help\", action = ArgAction::Help, value_parser = clap::value_parser!(bool))]\n        help: (),\n    }\n\n    let result = CliOptions::try_parse_from([\"cmd\", \"--verbose-help\"]);\n    let err = result.unwrap_err();\n    assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp);\n\n    CliOptions::try_parse_from([\"cmd\"]).unwrap();\n}\n\n#[test]\nfn custom_version_flag() {\n    #[derive(Debug, Clone, Parser)]\n    #[command(disable_version_flag = true, version = \"2.0.0\")]\n    struct CliOptions {\n        #[arg(short = 'V', long = \"verbose-version\", action = ArgAction::Version, value_parser = clap::value_parser!(bool))]\n        version: (),\n    }\n\n    let result = CliOptions::try_parse_from([\"cmd\", \"--verbose-version\"]);\n    let err = result.unwrap_err();\n    assert_eq!(err.kind(), clap::error::ErrorKind::DisplayVersion);\n\n    CliOptions::try_parse_from([\"cmd\"]).unwrap();\n}\n"
  },
  {
    "path": "tests/derive/issues.rs",
    "content": "// https://github.com/TeXitoi/structopt/issues/{NUMBER}\n\nuse clap::{ArgGroup, Args, Parser, Subcommand};\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\nuse crate::utils;\n\n#[test]\nfn issue_151_groups_within_subcommands() {\n    #[derive(Args, Debug)]\n    #[command(group = ArgGroup::new(\"verb\").required(true).multiple(true))]\n    struct Opt {\n        #[arg(long, group = \"verb\")]\n        foo: Option<String>,\n        #[arg(long, group = \"verb\")]\n        bar: Option<String>,\n    }\n\n    #[derive(Debug, Parser)]\n    struct Cli {\n        #[command(flatten)]\n        a: Opt,\n    }\n\n    assert!(Cli::try_parse_from([\"test\"]).is_err());\n    assert!(Cli::try_parse_from([\"test\", \"--foo=v1\"]).is_ok());\n    assert!(Cli::try_parse_from([\"test\", \"--bar=v2\"]).is_ok());\n    assert!(Cli::try_parse_from([\"test\", \"--zebra=v3\"]).is_err());\n    assert!(Cli::try_parse_from([\"test\", \"--foo=v1\", \"--bar=v2\"]).is_ok());\n}\n\n#[test]\nfn issue_289() {\n    #[derive(Parser)]\n    #[command(infer_subcommands = true)]\n    enum Args {\n        SomeCommand {\n            #[command(subcommand)]\n            sub: SubSubCommand,\n        },\n        AnotherCommand,\n    }\n\n    #[derive(Subcommand)]\n    #[command(infer_subcommands = true)]\n    enum SubSubCommand {\n        TestCommand,\n    }\n\n    assert!(Args::try_parse_from([\"test\", \"some-command\", \"test-command\"]).is_ok());\n    assert!(Args::try_parse_from([\"test\", \"some\", \"test-command\"]).is_ok());\n    assert!(Args::try_parse_from([\"test\", \"some-command\", \"test\"]).is_ok());\n    assert!(Args::try_parse_from([\"test\", \"some\", \"test\"]).is_ok());\n}\n\n#[test]\nfn issue_324() {\n    fn my_version() -> &'static str {\n        \"MY_VERSION\"\n    }\n\n    #[derive(Parser)]\n    #[command(version = my_version())]\n    #[command(help_template = utils::FULL_TEMPLATE)]\n    struct Opt {\n        #[command(subcommand)]\n        _cmd: SubCommand,\n    }\n\n    #[derive(Subcommand)]\n    enum SubCommand {\n        Start,\n    }\n\n    let help = utils::get_long_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nclap MY_VERSION\n\nUsage: clap <COMMAND>\n\nCommands:\n  start  \n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help\n          Print help\n\n  -V, --version\n          Print version\n\n\"#]].raw());\n}\n\n#[test]\nfn issue_418() {\n    #[derive(Debug, Parser)]\n    struct Opts {\n        #[command(subcommand)]\n        /// The command to run\n        command: Command,\n    }\n\n    #[derive(Debug, Subcommand)]\n    enum Command {\n        /// Reticulate the splines\n        #[command(visible_alias = \"ret\")]\n        Reticulate {\n            /// How many splines\n            num_splines: u8,\n        },\n        /// Frobnicate the rest\n        #[command(visible_alias = \"frob\")]\n        Frobnicate,\n    }\n\n    let help = utils::get_long_help::<Opts>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <COMMAND>\n\nCommands:\n  reticulate  Reticulate the splines [aliases: ret]\n  frobnicate  Frobnicate the rest [aliases: frob]\n  help        Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn issue_490() {\n    use clap::Parser;\n    use std::iter::FromIterator;\n    use std::str::FromStr;\n\n    struct U16ish;\n    impl FromStr for U16ish {\n        type Err = ();\n        fn from_str(_: &str) -> Result<Self, Self::Err> {\n            unimplemented!()\n        }\n    }\n    impl<'a> FromIterator<&'a U16ish> for Vec<u16> {\n        fn from_iter<T: IntoIterator<Item = &'a U16ish>>(_: T) -> Self {\n            unimplemented!()\n        }\n    }\n\n    #[derive(Parser, Debug)]\n    struct Opt {\n        opt_vec: Vec<u16>,\n        #[arg(long)]\n        opt_opt_vec: Option<Vec<u16>>,\n    }\n\n    // Assert that it compiles\n}\n"
  },
  {
    "path": "tests/derive/macros.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse clap::Parser;\n\n// Tests that clap_derive properly detects an `Option` field\n// that results from a macro expansion\n#[test]\nfn use_option() {\n    macro_rules! expand_ty {\n        ($name:ident: $ty:ty) => {\n            #[derive(Parser)]\n            struct Outer {\n                #[arg(short, long)]\n                #[allow(dead_code)]\n                $name: $ty,\n            }\n        };\n    }\n\n    expand_ty!(my_field: Option<String>);\n}\n\n#[test]\nfn issue_447() {\n    macro_rules! Command {\n        ( $name:ident, [\n        #[$meta:meta] $var:ident($inner:ty)\n      ] ) => {\n            #[derive(Debug, PartialEq, clap::Parser)]\n            enum $name {\n                #[$meta]\n                $var($inner),\n            }\n        };\n    }\n\n    Command! {GitCmd, [\n      #[command(external_subcommand)]\n      Ext(Vec<String>)\n    ]}\n}\n"
  },
  {
    "path": "tests/derive/main.rs",
    "content": "#![cfg(feature = \"derive\")]\n#![cfg(feature = \"help\")]\n#![cfg(feature = \"usage\")]\n\nautomod::dir!(\"tests/derive\");\n"
  },
  {
    "path": "tests/derive/markdown.rs",
    "content": "#![cfg(feature = \"unstable-markdown\")]\n\nuse clap::CommandFactory;\nuse clap_derive::Parser;\nuse snapbox::file;\n\nmacro_rules! assert_help {\n    ($Command:ty, $filename:literal) => {{\n        let help = <$Command>::command().render_long_help().ansi().to_string();\n        snapbox::assert_data_eq!(help, file![$filename]);\n    }};\n}\n\n#[test]\nfn headers() {\n    /// # This is a header\n    /// ## second level\n    /// ### `additional` *styling **on ~top~ of** it*\n    /// regular paragraph\n    #[derive(Parser)]\n    struct Command;\n\n    assert_help!(Command, \"snapshots/headers.term.svg\");\n}\n\n#[test]\nfn inline_styles() {\n    /// *emphasis* **bold** ~strike through~ `code`\n    ///\n    /// *all **of ~them `combined` in~ one** line*\n    #[derive(Parser)]\n    struct Command;\n\n    assert_help!(Command, \"snapshots/inline_styles.term.svg\");\n}\n\n#[test]\nfn links() {\n    /// <https://example.com/literal>\n    ///\n    /// [with name](https://example.com/with%20name)\n    ///\n    /// ![image](https://example.com/image)\n    ///\n    /// [referencing][reference]\n    ///\n    /// [reference]: https://example.com/reference\n    #[derive(Parser)]\n    struct Command;\n\n    assert_help!(Command, \"snapshots/links.term.svg\");\n}\n\n#[test]\nfn html() {\n    /// <html>\n    ///     <is>\n    ///         <used>\n    ///     </verbatim>\n    /// </html>\n    ///\n    /// <inline>html</as-well>\n    #[derive(Parser)]\n    struct Command;\n\n    assert_help!(Command, \"snapshots/html.term.svg\");\n}\n\n#[test]\nfn blocks() {\n    /// ```rust\n    /// This is a *fenced* code block.\n    ///\n    /// There is not much going on in terms of **styling**.\n    /// ```\n    ///\n    /// ---\n    ///\n    ///     Code blocks can also be initiated through\n    ///     Indentation.\n    ///\n    /// > This is a block quote.\n    /// > **Regular ~styling *should* work~ here.**\n    /// >\n    /// > # even headings\n    /// > and regular paragraphs.\n    /// >\n    /// > - lists\n    /// >   - are\n    /// >\n    /// > 1. also\n    /// >    1. supported\n    /// >\n    /// > > nesting them\n    /// > > > also works (not)\n    ///\n    #[derive(Parser)]\n    struct Command;\n\n    assert_help!(Command, \"snapshots/blocks.term.svg\");\n}\n\n#[test]\nfn lists() {\n    /// Lists:\n    ///\n    /// - unordered\n    ///   - bullet\n    ///     - lists\n    /// - with multiple\n    ///   - levels\n    ///\n    /// 0. numeric lists\n    /// 1. only care\n    ///    1. about the initial number\n    /// 2. 5. and count from there\n    ///    7. anything goes\n    /// 3. though they need an empty line\n    #[derive(Parser)]\n    struct Command;\n\n    assert_help!(Command, \"snapshots/lists.term.svg\");\n}\n\n#[test]\nfn paragraphs() {\n    /// Paragraphs are separated by empty lines.\n    /// All lines will be joined onto one.\n    ///\n    /// The first paragraph is used as short help by clap.\\\n    /// backslashes can be used to insert hard line breaks.\n    ///\n    /// | these | can   |\\\n    /// | ----- | ----- |\\\n    /// | be    | used  |\\\n    /// | for   | tables|\n    ///\n    /// Because tables are not yet supported.\n    ///\n    #[doc = \"You can also use trailing spaces for hard breaks,  \\nbut this is not really recommended.\"]\n    #[derive(Parser)]\n    struct Command;\n\n    assert_help!(Command, \"snapshots/paragraphs.term.svg\");\n}\n"
  },
  {
    "path": "tests/derive/naming.rs",
    "content": "use clap::Args;\nuse clap::Parser;\n\n#[test]\nfn test_standalone_long_generates_kebab_case() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[allow(non_snake_case)]\n    struct Opt {\n        #[arg(long)]\n        FOO_OPTION: bool,\n    }\n\n    assert_eq!(\n        Opt { FOO_OPTION: true },\n        Opt::try_parse_from([\"test\", \"--foo-option\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_custom_long_overwrites_default_name() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(long = \"foo\")]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"--foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_long_uses_previous_defined_custom_name() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(id = \"foo\", long)]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"--foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_long_ignores_afterwards_defined_custom_name() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(long, id = \"foo\")]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"--foo-option\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_long_uses_previous_defined_custom_id() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(id = \"foo\", long)]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"--foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_long_ignores_afterwards_defined_custom_id() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(long, id = \"foo\")]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"--foo-option\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_short_generates_kebab_case() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[allow(non_snake_case)]\n    struct Opt {\n        #[arg(short)]\n        FOO_OPTION: bool,\n    }\n\n    assert_eq!(\n        Opt { FOO_OPTION: true },\n        Opt::try_parse_from([\"test\", \"-f\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_custom_short_overwrites_default_name() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short = 'o')]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"-o\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_short_uses_previous_defined_custom_name() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(id = \"option\", short)]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"-o\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_short_ignores_afterwards_defined_custom_name() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short, id = \"option\")]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"-f\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_short_uses_previous_defined_custom_id() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(id = \"option\", short)]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"-o\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_short_ignores_afterwards_defined_custom_id() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short, id = \"option\")]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"-f\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_long_uses_previous_defined_casing() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(rename_all = \"screaming_snake\", long)]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"--FOO_OPTION\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_short_uses_previous_defined_casing() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(rename_all = \"screaming_snake\", short)]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"-F\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_long_works_with_verbatim_casing() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[allow(non_snake_case)]\n    struct Opt {\n        #[arg(rename_all = \"verbatim\", long)]\n        _fOO_oPtiON: bool,\n    }\n\n    assert_eq!(\n        Opt { _fOO_oPtiON: true },\n        Opt::try_parse_from([\"test\", \"--_fOO_oPtiON\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_standalone_short_works_with_verbatim_casing() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(rename_all = \"verbatim\", short)]\n        _foo: bool,\n    }\n\n    assert_eq!(\n        Opt { _foo: true },\n        Opt::try_parse_from([\"test\", \"-_\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_rename_all_is_propagated_from_struct_to_fields() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[command(rename_all = \"screaming_snake\")]\n    struct Opt {\n        #[arg(long)]\n        foo: bool,\n    }\n\n    assert_eq!(\n        Opt { foo: true },\n        Opt::try_parse_from([\"test\", \"--FOO\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_rename_all_is_not_propagated_from_struct_into_flattened() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[command(rename_all = \"screaming_snake\")]\n    struct Opt {\n        #[command(flatten)]\n        foo: Foo,\n    }\n\n    #[derive(Args, Debug, PartialEq)]\n    struct Foo {\n        #[arg(long)]\n        foo: bool,\n    }\n\n    assert_eq!(\n        Opt {\n            foo: Foo { foo: true }\n        },\n        Opt::try_parse_from([\"test\", \"--foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_lower_is_renamed() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(rename_all = \"lower\", long)]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"--foooption\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_upper_is_renamed() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(rename_all = \"upper\", long)]\n        foo_option: bool,\n    }\n\n    assert_eq!(\n        Opt { foo_option: true },\n        Opt::try_parse_from([\"test\", \"--FOOOPTION\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_single_word_enum_variant_is_default_renamed_into_kebab_case() {\n    #[derive(Parser, Debug, PartialEq)]\n    enum Opt {\n        Command { foo: u32 },\n    }\n\n    assert_eq!(\n        Opt::Command { foo: 0 },\n        Opt::try_parse_from([\"test\", \"command\", \"0\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_multi_word_enum_variant_is_renamed() {\n    #[derive(Parser, Debug, PartialEq)]\n    enum Opt {\n        FirstCommand { foo: u32 },\n    }\n\n    assert_eq!(\n        Opt::FirstCommand { foo: 0 },\n        Opt::try_parse_from([\"test\", \"first-command\", \"0\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_rename_all_is_not_propagated_from_struct_into_subcommand() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[command(rename_all = \"screaming_snake\")]\n    struct Opt {\n        #[command(subcommand)]\n        foo: Foo,\n    }\n\n    #[derive(Parser, Debug, PartialEq)]\n    enum Foo {\n        Command {\n            #[arg(long)]\n            foo: bool,\n        },\n    }\n\n    assert_eq!(\n        Opt {\n            foo: Foo::Command { foo: true }\n        },\n        Opt::try_parse_from([\"test\", \"command\", \"--foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_rename_all_is_propagated_from_enum_to_variants() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[command(rename_all = \"screaming_snake\")]\n    enum Opt {\n        FirstVariant,\n        SecondVariant {\n            #[arg(long)]\n            foo: String,\n        },\n    }\n\n    assert_eq!(\n        Opt::FirstVariant,\n        Opt::try_parse_from([\"test\", \"FIRST_VARIANT\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_rename_all_is_propagated_from_enum_to_variant_fields() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[command(rename_all = \"screaming_snake\")]\n    enum Opt {\n        FirstVariant,\n        SecondVariant {\n            #[arg(long)]\n            foo: String,\n        },\n    }\n\n    assert_eq!(\n        Opt::SecondVariant {\n            foo: \"value\".into()\n        },\n        Opt::try_parse_from([\"test\", \"SECOND_VARIANT\", \"--FOO\", \"value\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_rename_all_is_propagation_can_be_overridden() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[command(rename_all = \"screaming_snake\")]\n    enum Opt {\n        #[command(rename_all = \"kebab_case\")]\n        FirstVariant {\n            #[arg(long)]\n            foo_option: bool,\n        },\n        SecondVariant {\n            #[arg(rename_all = \"kebab_case\", long)]\n            foo_option: bool,\n        },\n    }\n\n    assert_eq!(\n        Opt::FirstVariant { foo_option: true },\n        Opt::try_parse_from([\"test\", \"first-variant\", \"--foo-option\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt::SecondVariant { foo_option: true },\n        Opt::try_parse_from([\"test\", \"SECOND_VARIANT\", \"--foo-option\"]).unwrap()\n    );\n}\n"
  },
  {
    "path": "tests/derive/nested_subcommands.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse clap::{Parser, Subcommand};\n\n#[derive(Parser, PartialEq, Debug)]\nstruct Opt {\n    #[arg(short, long)]\n    force: bool,\n    #[arg(short, long, action = clap::ArgAction::Count)]\n    verbose: u8,\n    #[command(subcommand)]\n    cmd: Sub,\n}\n\n#[derive(Subcommand, PartialEq, Debug)]\nenum Sub {\n    Fetch {},\n    Add {},\n}\n\n#[derive(Parser, PartialEq, Debug)]\nstruct Opt2 {\n    #[arg(short, long)]\n    force: bool,\n    #[arg(short, long, action = clap::ArgAction::Count)]\n    verbose: u8,\n    #[command(subcommand)]\n    cmd: Option<Sub>,\n}\n\n#[test]\nfn test_no_cmd() {\n    let result = Opt::try_parse_from([\"test\"]);\n    assert!(result.is_err());\n\n    assert_eq!(\n        Opt2 {\n            force: false,\n            verbose: 0,\n            cmd: None\n        },\n        Opt2::try_parse_from([\"test\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_fetch() {\n    assert_eq!(\n        Opt {\n            force: false,\n            verbose: 3,\n            cmd: Sub::Fetch {}\n        },\n        Opt::try_parse_from([\"test\", \"-vvv\", \"fetch\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            force: true,\n            verbose: 0,\n            cmd: Sub::Fetch {}\n        },\n        Opt::try_parse_from([\"test\", \"--force\", \"fetch\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_add() {\n    assert_eq!(\n        Opt {\n            force: false,\n            verbose: 0,\n            cmd: Sub::Add {}\n        },\n        Opt::try_parse_from([\"test\", \"add\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            force: false,\n            verbose: 2,\n            cmd: Sub::Add {}\n        },\n        Opt::try_parse_from([\"test\", \"-vv\", \"add\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_badinput() {\n    let result = Opt::try_parse_from([\"test\", \"badcmd\"]);\n    assert!(result.is_err());\n    let result = Opt::try_parse_from([\"test\", \"add\", \"--verbose\"]);\n    assert!(result.is_err());\n    let result = Opt::try_parse_from([\"test\", \"--badopt\", \"add\"]);\n    assert!(result.is_err());\n    let result = Opt::try_parse_from([\"test\", \"add\", \"--badopt\"]);\n    assert!(result.is_err());\n}\n\n#[derive(Parser, PartialEq, Debug)]\nstruct Opt3 {\n    #[arg(short, long)]\n    all: bool,\n    #[command(subcommand)]\n    cmd: Sub2,\n}\n\n#[derive(Subcommand, PartialEq, Debug)]\nenum Sub2 {\n    Foo {\n        file: String,\n        #[command(subcommand)]\n        cmd: Sub3,\n    },\n    Bar {},\n}\n\n#[derive(Subcommand, PartialEq, Debug)]\nenum Sub3 {\n    Baz {},\n    Quux {},\n}\n\n#[test]\nfn test_subsubcommand() {\n    assert_eq!(\n        Opt3 {\n            all: true,\n            cmd: Sub2::Foo {\n                file: \"lib.rs\".to_string(),\n                cmd: Sub3::Quux {}\n            }\n        },\n        Opt3::try_parse_from([\"test\", \"--all\", \"foo\", \"lib.rs\", \"quux\"]).unwrap()\n    );\n}\n\n#[derive(Parser, PartialEq, Debug)]\nenum SubSubCmdWithOption {\n    Remote {\n        #[command(subcommand)]\n        cmd: Option<Remote>,\n    },\n    Stash {\n        #[command(subcommand)]\n        cmd: Stash,\n    },\n}\n#[derive(Subcommand, PartialEq, Debug)]\nenum Remote {\n    Add { name: String, url: String },\n    Remove { name: String },\n}\n\n#[derive(Subcommand, PartialEq, Debug)]\nenum Stash {\n    Save,\n    Pop,\n}\n\n#[test]\nfn sub_sub_cmd_with_option() {\n    fn make(args: &[&str]) -> Option<SubSubCmdWithOption> {\n        SubSubCmdWithOption::try_parse_from(args).ok()\n    }\n    assert_eq!(\n        Some(SubSubCmdWithOption::Remote { cmd: None }),\n        make(&[\"\", \"remote\"])\n    );\n    assert_eq!(\n        Some(SubSubCmdWithOption::Remote {\n            cmd: Some(Remote::Add {\n                name: \"origin\".into(),\n                url: \"http\".into()\n            })\n        }),\n        make(&[\"\", \"remote\", \"add\", \"origin\", \"http\"])\n    );\n    assert_eq!(\n        Some(SubSubCmdWithOption::Stash { cmd: Stash::Save }),\n        make(&[\"\", \"stash\", \"save\"])\n    );\n    assert_eq!(None, make(&[\"\", \"stash\"]));\n}\n"
  },
  {
    "path": "tests/derive/non_literal_attributes.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse std::num::ParseIntError;\n\nuse clap::error::ErrorKind;\nuse clap::Parser;\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\npub(crate) const DISPLAY_ORDER: usize = 2;\n\n// Check if the global settings compile\n#[derive(Parser, Debug, PartialEq, Eq)]\n#[command(group = clap::ArgGroup::new(\"foo\"))]\nstruct Opt {\n    #[arg(\n        long = \"x\",\n        display_order = DISPLAY_ORDER,\n        next_line_help = true,\n        default_value = \"0\",\n        require_equals = true,\n    )]\n    x: i32,\n\n    #[arg(short = 'l', long = \"level\", aliases = [\"set-level\", \"lvl\"])]\n    level: String,\n\n    #[arg(long(\"values\"))]\n    values: Vec<i32>,\n\n    #[arg(id = \"FILE\", requires_if(\"FILE\", \"values\"))]\n    files: Vec<String>,\n}\n\n#[test]\nfn test_slice() {\n    assert_eq!(\n        Opt {\n            x: 0,\n            level: \"1\".to_string(),\n            files: Vec::new(),\n            values: vec![],\n        },\n        Opt::try_parse_from([\"test\", \"-l\", \"1\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            x: 0,\n            level: \"1\".to_string(),\n            files: Vec::new(),\n            values: vec![],\n        },\n        Opt::try_parse_from([\"test\", \"--level\", \"1\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            x: 0,\n            level: \"1\".to_string(),\n            files: Vec::new(),\n            values: vec![],\n        },\n        Opt::try_parse_from([\"test\", \"--set-level\", \"1\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            x: 0,\n            level: \"1\".to_string(),\n            files: Vec::new(),\n            values: vec![],\n        },\n        Opt::try_parse_from([\"test\", \"--lvl\", \"1\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_multi_args() {\n    assert_eq!(\n        Opt {\n            x: 0,\n            level: \"1\".to_string(),\n            files: vec![\"file\".to_string()],\n            values: vec![],\n        },\n        Opt::try_parse_from([\"test\", \"-l\", \"1\", \"file\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            x: 0,\n            level: \"1\".to_string(),\n            files: vec![\"FILE\".to_string()],\n            values: vec![1],\n        },\n        Opt::try_parse_from([\"test\", \"-l\", \"1\", \"--values\", \"1\", \"--\", \"FILE\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_multi_args_fail() {\n    let result = Opt::try_parse_from([\"test\", \"-l\", \"1\", \"--\", \"FILE\"]);\n    assert!(result.is_err());\n}\n\n#[test]\nfn test_bool() {\n    assert_eq!(\n        Opt {\n            x: 1,\n            level: \"1\".to_string(),\n            files: vec![],\n            values: vec![],\n        },\n        Opt::try_parse_from([\"test\", \"-l\", \"1\", \"--x=1\"]).unwrap()\n    );\n    let result = Opt::try_parse_from([\"test\", \"-l\", \"1\", \"--x\", \"1\"]);\n    assert!(result.is_err());\n    assert_eq!(result.unwrap_err().kind(), ErrorKind::NoEquals);\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn test_parse_hex_function_path() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct HexOpt {\n        #[arg(short, value_parser = parse_hex)]\n        number: u64,\n    }\n\n    fn parse_hex(input: &str) -> Result<u64, ParseIntError> {\n        u64::from_str_radix(input, 16)\n    }\n\n    assert_eq!(\n        HexOpt { number: 5 },\n        HexOpt::try_parse_from([\"test\", \"-n\", \"5\"]).unwrap()\n    );\n    assert_eq!(\n        HexOpt {\n            number: 0x00ab_cdef\n        },\n        HexOpt::try_parse_from([\"test\", \"-n\", \"abcdef\"]).unwrap()\n    );\n\n    let err = HexOpt::try_parse_from([\"test\", \"-n\", \"gg\"]).unwrap_err();\n    assert_data_eq!(err.to_string(), str![[r#\"\nerror: invalid value 'gg' for '-n <NUMBER>': invalid digit found in string\n\nFor more information, try '--help'.\n\n\"#]].raw());\n}\n\n#[test]\n#[cfg(feature = \"error-context\")]\nfn test_const_name() {\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(id = NAME, short, long)]\n        number: u64,\n    }\n\n    const NAME: &str = \"fun\";\n\n    assert_eq!(\n        Opt { number: 5 },\n        Opt::try_parse_from([\"test\", \"-f\", \"5\"]).unwrap()\n    );\n}\n"
  },
  {
    "path": "tests/derive/occurrences.rs",
    "content": "#![cfg(feature = \"unstable-v5\")]\nuse clap::Parser;\n\n#[test]\nfn test_vec_of_vec() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short = 'p', num_args = 2)]\n        points: Vec<Vec<i32>>,\n    }\n\n    assert_eq!(\n        Opt {\n            points: vec![vec![1, 2], vec![0, 0]]\n        },\n        Opt::try_parse_from([\"test\", \"-p\", \"1\", \"2\", \"-p\", \"0\", \"0\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_vec_of_vec_opt_out() {\n    fn parser(s: &str) -> Result<Vec<String>, std::convert::Infallible> {\n        Ok(s.split(',').map(str::to_owned).collect())\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_parser = parser, short = 'p')]\n        arg: Vec<::std::vec::Vec<String>>,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: vec![vec![\"1\".into(), \"2\".into()], vec![\"a\".into(), \"b\".into()]],\n        },\n        Opt::try_parse_from([\"test\", \"-p\", \"1,2\", \"-p\", \"a,b\"]).unwrap(),\n    );\n}\n\n#[test]\nfn test_vec_vec_empty() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short = 'p', num_args = 2)]\n        points: Vec<Vec<i32>>,\n    }\n\n    assert_eq!(\n        Opt { points: vec![] },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_option_vec_vec() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short = 'p', num_args = 2)]\n        points: Option<Vec<Vec<i32>>>,\n    }\n\n    assert_eq!(\n        Opt {\n            points: Some(vec![vec![1, 2], vec![3, 4]])\n        },\n        Opt::try_parse_from([\"test\", \"-p\", \"1\", \"2\", \"-p\", \"3\", \"4\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_option_vec_vec_empty() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short = 'p', num_args = 2)]\n        points: Option<Vec<Vec<i32>>>,\n    }\n\n    assert_eq!(Opt { points: None }, Opt::try_parse_from([\"test\"]).unwrap());\n}\n"
  },
  {
    "path": "tests/derive/options.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\n#![allow(clippy::option_option)]\n\nuse clap::{Parser, Subcommand};\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\nuse crate::utils;\n\n#[test]\nfn required_option() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short, long)]\n        arg: i32,\n    }\n    assert_eq!(\n        Opt { arg: 42 },\n        Opt::try_parse_from([\"test\", \"-a42\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { arg: 42 },\n        Opt::try_parse_from([\"test\", \"-a\", \"42\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { arg: 42 },\n        Opt::try_parse_from([\"test\", \"--arg\", \"42\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { arg: 42 },\n        Opt::try_parse_from([\"test\", \"--arg\", \"24\", \"--arg\", \"42\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"test\"]).is_err());\n}\n\n#[test]\nfn option_with_default() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short, default_value = \"42\")]\n        arg: i32,\n    }\n    assert_eq!(\n        Opt { arg: 24 },\n        Opt::try_parse_from([\"test\", \"-a24\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { arg: 42 },\n        Opt::try_parse_from([\"test\", \"-a\", \"24\", \"-a\", \"42\"]).unwrap()\n    );\n    assert_eq!(Opt { arg: 42 }, Opt::try_parse_from([\"test\"]).unwrap());\n}\n\n#[test]\nfn option_with_raw_default() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short, default_value = \"42\")]\n        arg: i32,\n    }\n    assert_eq!(\n        Opt { arg: 24 },\n        Opt::try_parse_from([\"test\", \"-a24\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { arg: 42 },\n        Opt::try_parse_from([\"test\", \"-a\", \"24\", \"-a\", \"42\"]).unwrap()\n    );\n    assert_eq!(Opt { arg: 42 }, Opt::try_parse_from([\"test\"]).unwrap());\n}\n\n#[test]\nfn option_from_str() {\n    #[derive(Clone, Debug, PartialEq)]\n    struct A;\n\n    impl std::str::FromStr for A {\n        type Err = std::convert::Infallible;\n\n        fn from_str(_: &str) -> Result<A, Self::Err> {\n            Ok(A)\n        }\n    }\n\n    #[derive(Debug, Parser, PartialEq)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        a: Option<A>,\n    }\n\n    assert_eq!(Opt { a: None }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(\n        Opt { a: Some(A) },\n        Opt::try_parse_from([\"test\", \"foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn vec_from_str() {\n    #[derive(Clone, Debug, PartialEq)]\n    struct A;\n\n    impl std::str::FromStr for A {\n        type Err = std::convert::Infallible;\n\n        fn from_str(_: &str) -> Result<A, Self::Err> {\n            Ok(A)\n        }\n    }\n\n    #[derive(Debug, Parser, PartialEq)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        a: Vec<A>,\n    }\n\n    assert_eq!(\n        Opt { a: Vec::new() },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { a: vec![A] },\n        Opt::try_parse_from([\"test\", \"foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn option_vec_from_str() {\n    #[derive(Clone, Debug, PartialEq)]\n    struct A;\n\n    impl std::str::FromStr for A {\n        type Err = std::convert::Infallible;\n\n        fn from_str(_: &str) -> Result<A, Self::Err> {\n            Ok(A)\n        }\n    }\n\n    #[derive(Debug, Parser, PartialEq)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short)]\n        a: Option<Vec<A>>,\n    }\n\n    assert_eq!(Opt { a: None }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(\n        Opt { a: Some(vec![A]) },\n        Opt::try_parse_from([\"test\", \"-a\", \"foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn option_type_is_optional() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short)]\n        arg: Option<i32>,\n    }\n    assert_eq!(\n        Opt { arg: Some(42) },\n        Opt::try_parse_from([\"test\", \"-a42\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { arg: Some(42) },\n        Opt::try_parse_from([\"test\", \"-a\", \"24\", \"-a\", \"42\"]).unwrap()\n    );\n    assert_eq!(Opt { arg: None }, Opt::try_parse_from([\"test\"]).unwrap());\n}\n\n#[test]\nfn required_with_option_type() {\n    #[derive(Debug, PartialEq, Eq, Parser)]\n    #[command(subcommand_negates_reqs = true)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(required = true)]\n        req_str: Option<String>,\n\n        #[command(subcommand)]\n        cmd: Option<SubCommands>,\n    }\n\n    #[derive(Debug, PartialEq, Eq, Subcommand)]\n    enum SubCommands {\n        ExSub {\n            #[arg(short, long, action = clap::ArgAction::Count)]\n            verbose: u8,\n        },\n    }\n\n    assert_eq!(\n        Opt {\n            req_str: Some((\"arg\").into()),\n            cmd: None,\n        },\n        Opt::try_parse_from([\"test\", \"arg\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            req_str: None,\n            cmd: Some(SubCommands::ExSub { verbose: 1 }),\n        },\n        Opt::try_parse_from([\"test\", \"ex-sub\", \"-v\"]).unwrap()\n    );\n\n    assert!(Opt::try_parse_from([\"test\"]).is_err());\n}\n\n#[test]\nfn ignore_qualified_option_type() {\n    fn parser(s: &str) -> Result<Option<String>, std::convert::Infallible> {\n        Ok(Some(s.to_string()))\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(value_parser = parser)]\n        arg: ::std::option::Option<String>,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: Some(\"success\".into())\n        },\n        Opt::try_parse_from([\"test\", \"success\"]).unwrap()\n    );\n}\n\n#[test]\nfn option_option_type_is_optional_value() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short)]\n        #[allow(clippy::option_option)]\n        arg: Option<Option<i32>>,\n    }\n    assert_eq!(\n        Opt {\n            arg: Some(Some(42))\n        },\n        Opt::try_parse_from([\"test\", \"-a42\"]).unwrap()\n    );\n    assert_eq!(\n        Opt { arg: Some(None) },\n        Opt::try_parse_from([\"test\", \"-a\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: Some(Some(42))\n        },\n        Opt::try_parse_from([\"test\", \"-a\", \"24\", \"-a\", \"42\"]).unwrap()\n    );\n    assert_eq!(Opt { arg: None }, Opt::try_parse_from([\"test\"]).unwrap());\n}\n\n#[test]\nfn option_option_type_help() {\n    #[derive(Parser, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(long, value_name = \"val\")]\n        arg: Option<Option<i32>>,\n    }\n    let help = utils::get_help::<Opt>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap [OPTIONS]\n\nOptions:\n      --arg [<val>]  \n  -h, --help         Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn two_option_option_types() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short)]\n        arg: Option<Option<i32>>,\n\n        #[arg(long)]\n        field: Option<Option<String>>,\n    }\n    assert_eq!(\n        Opt {\n            arg: Some(Some(42)),\n            field: Some(Some(\"f\".into()))\n        },\n        Opt::try_parse_from([\"test\", \"-a42\", \"--field\", \"f\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: Some(Some(42)),\n            field: Some(None)\n        },\n        Opt::try_parse_from([\"test\", \"-a42\", \"--field\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: Some(None),\n            field: Some(None)\n        },\n        Opt::try_parse_from([\"test\", \"-a\", \"--field\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: Some(None),\n            field: Some(Some(\"f\".into()))\n        },\n        Opt::try_parse_from([\"test\", \"-a\", \"--field\", \"f\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: None,\n            field: Some(None)\n        },\n        Opt::try_parse_from([\"test\", \"--field\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: None,\n            field: None\n        },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n}\n\n#[test]\nfn vec_type_is_multiple_occurrences() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short, long)]\n        arg: Vec<i32>,\n    }\n    assert_eq!(\n        Opt { arg: vec![24] },\n        Opt::try_parse_from([\"test\", \"-a24\"]).unwrap()\n    );\n    assert_eq!(Opt { arg: vec![] }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(\n        Opt { arg: vec![24, 42] },\n        Opt::try_parse_from([\"test\", \"-a\", \"24\", \"-a\", \"42\"]).unwrap()\n    );\n}\n\n#[test]\nfn vec_type_with_required() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short, long, required = true)]\n        arg: Vec<i32>,\n    }\n    assert_eq!(\n        Opt { arg: vec![24] },\n        Opt::try_parse_from([\"test\", \"-a24\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"test\"]).is_err());\n    assert_eq!(\n        Opt { arg: vec![24, 42] },\n        Opt::try_parse_from([\"test\", \"-a\", \"24\", \"-a\", \"42\"]).unwrap()\n    );\n}\n\n#[test]\nfn vec_type_with_multiple_values_only() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short, long, num_args(1..))]\n        arg: Vec<i32>,\n    }\n    assert_eq!(\n        Opt { arg: vec![24] },\n        Opt::try_parse_from([\"test\", \"-a24\"]).unwrap()\n    );\n    assert_eq!(Opt { arg: vec![] }, Opt::try_parse_from([\"test\"]).unwrap());\n    assert_eq!(\n        Opt { arg: vec![24, 42] },\n        Opt::try_parse_from([\"test\", \"-a\", \"24\", \"42\"]).unwrap()\n    );\n}\n\n#[test]\nfn ignore_qualified_vec_type() {\n    fn parser(s: &str) -> Result<Vec<String>, std::convert::Infallible> {\n        Ok(vec![s.to_string()])\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(value_parser = parser)]\n        arg: ::std::vec::Vec<String>,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: vec![\"success\".into()]\n        },\n        Opt::try_parse_from([\"test\", \"success\"]).unwrap()\n    );\n}\n\n#[test]\nfn option_vec_type() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short)]\n        arg: Option<Vec<i32>>,\n    }\n    assert_eq!(\n        Opt { arg: Some(vec![1]) },\n        Opt::try_parse_from([\"test\", \"-a\", \"1\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            arg: Some(vec![1, 2])\n        },\n        Opt::try_parse_from([\"test\", \"-a\", \"1\", \"-a\", \"2\"]).unwrap()\n    );\n\n    assert_eq!(Opt { arg: None }, Opt::try_parse_from([\"test\"]).unwrap());\n}\n\n#[test]\nfn option_vec_type_structopt_behavior() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short, long, num_args(0..))]\n        arg: Option<Vec<i32>>,\n    }\n    assert_eq!(\n        Opt { arg: Some(vec![1]) },\n        Opt::try_parse_from([\"test\", \"-a\", \"1\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            arg: Some(vec![1, 2])\n        },\n        Opt::try_parse_from([\"test\", \"-a\", \"1\", \"2\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt { arg: Some(vec![]) },\n        Opt::try_parse_from([\"test\", \"-a\"]).unwrap()\n    );\n\n    assert_eq!(Opt { arg: None }, Opt::try_parse_from([\"test\"]).unwrap());\n}\n\n#[test]\nfn two_option_vec_types() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(short)]\n        arg: Option<Vec<i32>>,\n\n        #[arg(short)]\n        b: Option<Vec<i32>>,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: Some(vec![1]),\n            b: None,\n        },\n        Opt::try_parse_from([\"test\", \"-a\", \"1\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            arg: Some(vec![1]),\n            b: Some(vec![1])\n        },\n        Opt::try_parse_from([\"test\", \"-a\", \"1\", \"-b\", \"1\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            arg: Some(vec![1, 2]),\n            b: Some(vec![1, 2])\n        },\n        Opt::try_parse_from([\"test\", \"-a\", \"1\", \"-a\", \"2\", \"-b\", \"1\", \"-b\", \"2\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt { arg: None, b: None },\n        Opt::try_parse_from([\"test\"]).unwrap()\n    );\n}\n\n#[test]\nfn explicit_value_parser() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(long, value_parser = clap::value_parser!(i32))]\n        arg: i32,\n    }\n    assert_eq!(\n        Opt { arg: 42 },\n        Opt::try_parse_from([\"test\", \"--arg\", \"42\"]).unwrap()\n    );\n}\n\n#[test]\nfn implicit_value_parser() {\n    #[derive(Parser, PartialEq, Debug)]\n    #[command(args_override_self = true)]\n    struct Opt {\n        #[arg(long)]\n        arg: i32,\n    }\n    assert_eq!(\n        Opt { arg: 42 },\n        Opt::try_parse_from([\"test\", \"--arg\", \"42\"]).unwrap()\n    );\n}\n"
  },
  {
    "path": "tests/derive/privacy.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nmod options {\n    use clap::Parser;\n\n    #[derive(Debug, Parser)]\n    pub(crate) struct Options {\n        #[command(subcommand)]\n        pub(crate) subcommand: super::subcommands::SubCommand,\n    }\n}\n\nmod subcommands {\n    use clap::Subcommand;\n\n    #[derive(Debug, Subcommand)]\n    pub(crate) enum SubCommand {\n        /// foo\n        Foo {\n            /// foo\n            bars: String,\n        },\n    }\n}\n"
  },
  {
    "path": "tests/derive/raw_bool_literal.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[test]\nfn raw_bool_literal() {\n    #[derive(Parser, Debug, PartialEq)]\n    #[command(name = \"raw_bool\")]\n    struct Opt {\n        #[arg(raw(false))]\n        a: String,\n        #[arg(raw(true))]\n        b: String,\n    }\n\n    assert_eq!(\n        Opt {\n            a: \"one\".into(),\n            b: \"--help\".into()\n        },\n        Opt::try_parse_from([\"test\", \"one\", \"--\", \"--help\"]).unwrap()\n    );\n}\n"
  },
  {
    "path": "tests/derive/raw_idents.rs",
    "content": "use clap::Parser;\n\n#[test]\nfn raw_idents() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short, long)]\n        r#type: String,\n    }\n\n    assert_eq!(\n        Opt {\n            r#type: \"long\".into()\n        },\n        Opt::try_parse_from([\"test\", \"--type\", \"long\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            r#type: \"short\".into()\n        },\n        Opt::try_parse_from([\"test\", \"-t\", \"short\"]).unwrap()\n    );\n}\n"
  },
  {
    "path": "tests/derive/rename_all_env.rs",
    "content": "#![cfg(feature = \"env\")]\n\nuse clap::Parser;\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\nuse crate::utils;\n\n#[test]\nfn it_works() {\n    #[derive(Debug, PartialEq, Parser)]\n    #[command(rename_all_env = \"kebab\")]\n    struct BehaviorModel {\n        #[arg(env)]\n        be_nice: String,\n    }\n\n    let help = utils::get_help::<BehaviorModel>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <BE_NICE>\n\nArguments:\n  <BE_NICE>  [env: be-nice=]\n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn default_is_screaming() {\n    #[derive(Debug, PartialEq, Parser)]\n    struct BehaviorModel {\n        #[arg(env)]\n        be_nice: String,\n    }\n\n    let help = utils::get_help::<BehaviorModel>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <BE_NICE>\n\nArguments:\n  <BE_NICE>  [env: BE_NICE=]\n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn overridable() {\n    #[derive(Debug, PartialEq, Parser)]\n    #[command(rename_all_env = \"kebab\")]\n    struct BehaviorModel {\n        #[arg(env)]\n        be_nice: String,\n\n        #[arg(rename_all_env = \"pascal\", env)]\n        be_aggressive: String,\n    }\n\n    let help = utils::get_help::<BehaviorModel>();\n    assert_data_eq!(help, str![[r#\"\nUsage: clap <BE_NICE> <BE_AGGRESSIVE>\n\nArguments:\n  <BE_NICE>        [env: be-nice=]\n  <BE_AGGRESSIVE>  [env: BeAggressive=]\n\nOptions:\n  -h, --help  Print help\n\n\"#]].raw());\n}\n"
  },
  {
    "path": "tests/derive/skip.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[test]\nfn skip_1() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short)]\n        x: u32,\n        #[arg(skip)]\n        s: u32,\n    }\n\n    assert!(Opt::try_parse_from([\"test\", \"-x\", \"10\", \"20\"]).is_err());\n\n    let mut opt = Opt::try_parse_from([\"test\", \"-x\", \"10\"]).unwrap();\n    assert_eq!(\n        opt,\n        Opt {\n            x: 10,\n            s: 0, // default\n        }\n    );\n    opt.s = 42;\n\n    opt.try_update_from([\"test\", \"-x\", \"22\"]).unwrap();\n\n    assert_eq!(opt, Opt { x: 22, s: 42 });\n}\n\n#[test]\nfn skip_2() {\n    #[derive(Parser, Debug, PartialEq)]\n    struct Opt {\n        #[arg(short)]\n        x: u32,\n        #[arg(skip)]\n        ss: String,\n        #[arg(skip)]\n        sn: u8,\n\n        y: u32,\n        #[arg(skip)]\n        sz: u16,\n\n        t: u32,\n    }\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"-x\", \"10\", \"20\", \"30\"]).unwrap(),\n        Opt {\n            x: 10,\n            ss: String::from(\"\"),\n            sn: 0,\n            y: 20,\n            sz: 0,\n            t: 30,\n        }\n    );\n}\n\n#[test]\nfn skip_enum() {\n    #[derive(Debug, PartialEq)]\n    #[allow(unused)]\n    #[derive(Default)]\n    enum Kind {\n        A,\n        #[default]\n        B,\n    }\n\n    #[derive(Parser, Debug, PartialEq)]\n    pub(crate) struct Opt {\n        #[arg(long, short)]\n        number: u32,\n        #[arg(skip)]\n        k: Kind,\n        #[arg(skip)]\n        v: Vec<u32>,\n    }\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"-n\", \"10\"]).unwrap(),\n        Opt {\n            number: 10,\n            k: Kind::B,\n            v: vec![],\n        }\n    );\n}\n\n#[test]\nfn skip_help_doc_comments() {\n    #[derive(Parser, Debug, PartialEq, Eq)]\n    pub(crate) struct Opt {\n        #[arg(skip, help = \"internal_stuff\")]\n        a: u32,\n\n        #[arg(skip, long_help = \"internal_stuff\\ndo not touch\")]\n        b: u32,\n\n        /// Not meant to be used by clap.\n        ///\n        /// I want a default here.\n        #[arg(skip)]\n        c: u32,\n\n        #[arg(short)]\n        n: u32,\n    }\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"-n\", \"10\"]).unwrap(),\n        Opt {\n            n: 10,\n            a: 0,\n            b: 0,\n            c: 0,\n        }\n    );\n}\n\n#[test]\nfn skip_val() {\n    #[derive(Parser, Debug, PartialEq, Eq)]\n    pub(crate) struct Opt {\n        #[arg(long, short)]\n        number: u32,\n\n        #[arg(skip = \"key\")]\n        k: String,\n\n        #[arg(skip = vec![1, 2, 3])]\n        v: Vec<u32>,\n    }\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"-n\", \"10\"]).unwrap(),\n        Opt {\n            number: 10,\n            k: \"key\".to_string(),\n            v: vec![1, 2, 3]\n        }\n    );\n}\n"
  },
  {
    "path": "tests/derive/subcommands.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n//\n// This work was derived from Structopt (https://github.com/TeXitoi/structopt)\n// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the\n// MIT/Apache 2.0 license.\n\nuse clap::{Args, Parser, Subcommand};\nuse snapbox::assert_data_eq;\nuse snapbox::prelude::*;\nuse snapbox::str;\n\nuse crate::utils;\n\n#[derive(Parser, PartialEq, Eq, Debug)]\nenum Opt {\n    /// Fetch stuff from GitHub\n    Fetch {\n        #[arg(long)]\n        all: bool,\n        /// Overwrite local branches.\n        #[arg(short, long)]\n        force: bool,\n\n        repo: String,\n    },\n\n    Add {\n        #[arg(short, long)]\n        interactive: bool,\n        #[arg(short, long)]\n        verbose: bool,\n    },\n}\n\n#[test]\nfn test_fetch() {\n    assert_eq!(\n        Opt::Fetch {\n            all: true,\n            force: false,\n            repo: \"origin\".to_string()\n        },\n        Opt::try_parse_from([\"test\", \"fetch\", \"--all\", \"origin\"]).unwrap()\n    );\n    assert_eq!(\n        Opt::Fetch {\n            all: false,\n            force: true,\n            repo: \"origin\".to_string()\n        },\n        Opt::try_parse_from([\"test\", \"fetch\", \"-f\", \"origin\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_add() {\n    assert_eq!(\n        Opt::Add {\n            interactive: false,\n            verbose: false\n        },\n        Opt::try_parse_from([\"test\", \"add\"]).unwrap()\n    );\n    assert_eq!(\n        Opt::Add {\n            interactive: true,\n            verbose: true\n        },\n        Opt::try_parse_from([\"test\", \"add\", \"-i\", \"-v\"]).unwrap()\n    );\n}\n\n#[test]\nfn test_no_parse() {\n    let result = Opt::try_parse_from([\"test\", \"badcmd\", \"-i\", \"-v\"]);\n    assert!(result.is_err());\n\n    let result = Opt::try_parse_from([\"test\", \"add\", \"--badoption\"]);\n    assert!(result.is_err());\n\n    let result = Opt::try_parse_from([\"test\"]);\n    assert!(result.is_err());\n}\n\n#[derive(Parser, PartialEq, Eq, Debug)]\nenum Opt2 {\n    DoSomething { arg: String },\n}\n\n#[test]\n/// This test is specifically to make sure that hyphenated subcommands get\n/// processed correctly.\nfn test_hyphenated_subcommands() {\n    assert_eq!(\n        Opt2::DoSomething {\n            arg: \"blah\".to_string()\n        },\n        Opt2::try_parse_from([\"test\", \"do-something\", \"blah\"]).unwrap()\n    );\n}\n\n#[derive(Parser, PartialEq, Eq, Debug)]\nenum Opt3 {\n    Add,\n    Init,\n    Fetch,\n}\n\n#[test]\nfn test_null_commands() {\n    assert_eq!(Opt3::Add, Opt3::try_parse_from([\"test\", \"add\"]).unwrap());\n    assert_eq!(Opt3::Init, Opt3::try_parse_from([\"test\", \"init\"]).unwrap());\n    assert_eq!(\n        Opt3::Fetch,\n        Opt3::try_parse_from([\"test\", \"fetch\"]).unwrap()\n    );\n}\n\n#[derive(Parser, PartialEq, Eq, Debug)]\n#[command(about = \"Not shown\")]\nstruct Add {\n    file: String,\n}\n/// Not shown\n#[derive(Parser, PartialEq, Eq, Debug)]\nstruct Fetch {\n    remote: String,\n}\n#[derive(Parser, PartialEq, Eq, Debug)]\nenum Opt4 {\n    // Not shown\n    /// Add a file\n    Add(Add),\n    Init,\n    /// download history from remote\n    Fetch(Fetch),\n}\n\n#[test]\nfn test_tuple_commands() {\n    assert_eq!(\n        Opt4::Add(Add {\n            file: \"f\".to_string()\n        }),\n        Opt4::try_parse_from([\"test\", \"add\", \"f\"]).unwrap()\n    );\n    assert_eq!(Opt4::Init, Opt4::try_parse_from([\"test\", \"init\"]).unwrap());\n    assert_eq!(\n        Opt4::Fetch(Fetch {\n            remote: \"origin\".to_string()\n        }),\n        Opt4::try_parse_from([\"test\", \"fetch\", \"origin\"]).unwrap()\n    );\n\n    let output = utils::get_long_help::<Opt4>();\n\n    assert_data_eq!(output, str![[r#\"\nUsage: clap <COMMAND>\n\nCommands:\n  add    Add a file\n  init   \n  fetch  download history from remote\n  help   Print this message or the help of the given subcommand(s)\n\nOptions:\n  -h, --help\n          Print help\n\n\"#]].raw());\n}\n\n#[test]\nfn global_passed_down() {\n    #[derive(Debug, PartialEq, Eq, Parser)]\n    struct Opt {\n        #[arg(global = true, long)]\n        other: bool,\n        #[command(subcommand)]\n        sub: Subcommands,\n    }\n\n    #[derive(Debug, PartialEq, Eq, Subcommand)]\n    enum Subcommands {\n        Add,\n        Global(GlobalCmd),\n    }\n\n    #[derive(Debug, PartialEq, Eq, Args)]\n    struct GlobalCmd {\n        #[arg(from_global)]\n        other: bool,\n    }\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"global\"]).unwrap(),\n        Opt {\n            other: false,\n            sub: Subcommands::Global(GlobalCmd { other: false })\n        }\n    );\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"global\", \"--other\"]).unwrap(),\n        Opt {\n            other: true,\n            sub: Subcommands::Global(GlobalCmd { other: true })\n        }\n    );\n}\n\n#[test]\nfn external_subcommand() {\n    #[derive(Debug, PartialEq, Eq, Parser)]\n    struct Opt {\n        #[command(subcommand)]\n        sub: Subcommands,\n    }\n\n    #[derive(Debug, PartialEq, Eq, Subcommand)]\n    enum Subcommands {\n        Add,\n        Remove,\n        #[command(external_subcommand)]\n        Other(Vec<String>),\n    }\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"add\"]).unwrap(),\n        Opt {\n            sub: Subcommands::Add\n        }\n    );\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"remove\"]).unwrap(),\n        Opt {\n            sub: Subcommands::Remove\n        }\n    );\n\n    assert!(Opt::try_parse_from([\"test\"]).is_err());\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"git\", \"status\"]).unwrap(),\n        Opt {\n            sub: Subcommands::Other(vec![\"git\".into(), \"status\".into()])\n        }\n    );\n}\n\n#[test]\nfn external_subcommand_os_string() {\n    use std::ffi::OsString;\n\n    #[derive(Debug, PartialEq, Eq, Parser)]\n    struct Opt {\n        #[command(subcommand)]\n        sub: Subcommands,\n    }\n\n    #[derive(Debug, PartialEq, Eq, Subcommand)]\n    enum Subcommands {\n        #[command(external_subcommand)]\n        Other(Vec<OsString>),\n    }\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"git\", \"status\"]).unwrap(),\n        Opt {\n            sub: Subcommands::Other(vec![\"git\".into(), \"status\".into()])\n        }\n    );\n\n    assert!(Opt::try_parse_from([\"test\"]).is_err());\n}\n\n#[test]\nfn external_subcommand_optional() {\n    #[derive(Debug, PartialEq, Eq, Parser)]\n    struct Opt {\n        #[command(subcommand)]\n        sub: Option<Subcommands>,\n    }\n\n    #[derive(Debug, PartialEq, Eq, Subcommand)]\n    enum Subcommands {\n        #[command(external_subcommand)]\n        Other(Vec<String>),\n    }\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"git\", \"status\"]).unwrap(),\n        Opt {\n            sub: Some(Subcommands::Other(vec![\"git\".into(), \"status\".into()]))\n        }\n    );\n\n    assert_eq!(Opt::try_parse_from([\"test\"]).unwrap(), Opt { sub: None });\n}\n\n#[test]\nfn enum_in_enum_subsubcommand() {\n    #[derive(Parser, Debug, PartialEq, Eq)]\n    pub(crate) enum Opt {\n        #[command(alias = \"l\")]\n        List,\n        #[command(subcommand, alias = \"d\")]\n        Daemon(DaemonCommand),\n    }\n\n    #[derive(Subcommand, Debug, PartialEq, Eq)]\n    pub(crate) enum DaemonCommand {\n        Start,\n        Stop,\n    }\n\n    let result = Opt::try_parse_from([\"test\"]);\n    assert!(result.is_err());\n\n    let result = Opt::try_parse_from([\"test\", \"list\"]).unwrap();\n    assert_eq!(Opt::List, result);\n\n    let result = Opt::try_parse_from([\"test\", \"l\"]).unwrap();\n    assert_eq!(Opt::List, result);\n\n    let result = Opt::try_parse_from([\"test\", \"daemon\"]);\n    assert!(result.is_err());\n\n    let result = Opt::try_parse_from([\"test\", \"daemon\", \"start\"]).unwrap();\n    assert_eq!(Opt::Daemon(DaemonCommand::Start), result);\n\n    let result = Opt::try_parse_from([\"test\", \"d\", \"start\"]).unwrap();\n    assert_eq!(Opt::Daemon(DaemonCommand::Start), result);\n}\n\n#[test]\nfn update_subcommands() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    enum Opt {\n        Command1(Command1),\n        Command2(Command2),\n    }\n\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Command1 {\n        arg1: i32,\n\n        arg2: i32,\n    }\n\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Command2 {\n        arg2: i32,\n    }\n\n    // Full subcommand update\n    let mut opt = Opt::Command1(Command1 { arg1: 12, arg2: 14 });\n    opt.try_update_from([\"test\", \"command1\", \"42\", \"44\"])\n        .unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"command1\", \"42\", \"44\"]).unwrap(),\n        opt\n    );\n\n    // Partial subcommand update\n    let mut opt = Opt::Command1(Command1 { arg1: 12, arg2: 14 });\n    opt.try_update_from([\"test\", \"command1\", \"42\"]).unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"command1\", \"42\", \"14\"]).unwrap(),\n        opt\n    );\n\n    // Change subcommand\n    let mut opt = Opt::Command1(Command1 { arg1: 12, arg2: 14 });\n    opt.try_update_from([\"test\", \"command2\", \"43\"]).unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"command2\", \"43\"]).unwrap(),\n        opt\n    );\n}\n\n#[test]\nfn update_subcommands_explicit_required() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    #[command(subcommand_required = true)]\n    enum Opt {\n        Command1(Command1),\n        Command2(Command2),\n    }\n\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Command1 {\n        arg1: i32,\n\n        arg2: i32,\n    }\n\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Command2 {\n        arg2: i32,\n    }\n\n    // Full subcommand update\n    let mut opt = Opt::Command1(Command1 { arg1: 12, arg2: 14 });\n    opt.try_update_from([\"test\"]).unwrap();\n    assert_eq!(Opt::Command1(Command1 { arg1: 12, arg2: 14 }), opt);\n}\n\n#[test]\nfn update_sub_subcommands() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    enum Opt {\n        #[command(subcommand)]\n        Child1(Child1),\n        #[command(subcommand)]\n        Child2(Child2),\n    }\n\n    #[derive(Subcommand, PartialEq, Eq, Debug)]\n    enum Child1 {\n        Command1(Command1),\n        Command2(Command2),\n    }\n\n    #[derive(Subcommand, PartialEq, Eq, Debug)]\n    enum Child2 {\n        Command1(Command1),\n        Command2(Command2),\n    }\n\n    #[derive(Args, PartialEq, Eq, Debug)]\n    struct Command1 {\n        arg1: i32,\n\n        arg2: i32,\n    }\n\n    #[derive(Args, PartialEq, Eq, Debug)]\n    struct Command2 {\n        arg2: i32,\n    }\n\n    // Full subcommand update\n    let mut opt = Opt::Child1(Child1::Command1(Command1 { arg1: 12, arg2: 14 }));\n    opt.try_update_from([\"test\", \"child1\", \"command1\", \"42\", \"44\"])\n        .unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"child1\", \"command1\", \"42\", \"44\"]).unwrap(),\n        opt\n    );\n\n    // Partial subcommand update\n    let mut opt = Opt::Child1(Child1::Command1(Command1 { arg1: 12, arg2: 14 }));\n    opt.try_update_from([\"test\", \"child1\", \"command1\", \"42\"])\n        .unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"child1\", \"command1\", \"42\", \"14\"]).unwrap(),\n        opt\n    );\n\n    // Partial subcommand update\n    let mut opt = Opt::Child1(Child1::Command1(Command1 { arg1: 12, arg2: 14 }));\n    opt.try_update_from([\"test\", \"child1\", \"command2\", \"43\"])\n        .unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"child1\", \"command2\", \"43\"]).unwrap(),\n        opt\n    );\n\n    // Change subcommand\n    let mut opt = Opt::Child1(Child1::Command1(Command1 { arg1: 12, arg2: 14 }));\n    opt.try_update_from([\"test\", \"child2\", \"command2\", \"43\"])\n        .unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"child2\", \"command2\", \"43\"]).unwrap(),\n        opt\n    );\n}\n\n#[test]\nfn update_ext_subcommand() {\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    enum Opt {\n        Command1(Command1),\n        Command2(Command2),\n        #[command(external_subcommand)]\n        Ext(Vec<String>),\n    }\n\n    #[derive(Args, PartialEq, Eq, Debug)]\n    struct Command1 {\n        arg1: i32,\n\n        arg2: i32,\n    }\n\n    #[derive(Args, PartialEq, Eq, Debug)]\n    struct Command2 {\n        arg2: i32,\n    }\n\n    // Full subcommand update\n    let mut opt = Opt::Ext(vec![\"12\".into(), \"14\".into()]);\n    opt.try_update_from([\"test\", \"ext\", \"42\", \"44\"]).unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"ext\", \"42\", \"44\"]).unwrap(),\n        opt\n    );\n\n    // No partial subcommand update\n    let mut opt = Opt::Ext(vec![\"12\".into(), \"14\".into()]);\n    opt.try_update_from([\"test\", \"ext\", \"42\"]).unwrap();\n    assert_eq!(Opt::try_parse_from([\"test\", \"ext\", \"42\"]).unwrap(), opt);\n\n    // Change subcommand\n    let mut opt = Opt::Ext(vec![\"12\".into(), \"14\".into()]);\n    opt.try_update_from([\"test\", \"command2\", \"43\"]).unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"command2\", \"43\"]).unwrap(),\n        opt\n    );\n\n    let mut opt = Opt::Command1(Command1 { arg1: 12, arg2: 14 });\n    opt.try_update_from([\"test\", \"ext\", \"42\", \"44\"]).unwrap();\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"ext\", \"42\", \"44\"]).unwrap(),\n        opt\n    );\n}\n#[test]\nfn subcommand_name_not_literal() {\n    fn get_name() -> &'static str {\n        \"renamed\"\n    }\n\n    #[derive(Parser, PartialEq, Eq, Debug)]\n    struct Opt {\n        #[command(subcommand)]\n        subcmd: SubCmd,\n    }\n\n    #[derive(Subcommand, PartialEq, Eq, Debug)]\n    enum SubCmd {\n        #[command(name = get_name())]\n        SubCmd1,\n    }\n\n    assert!(Opt::try_parse_from([\"test\", \"renamed\"]).is_ok());\n}\n\n#[test]\nfn skip_subcommand() {\n    #[derive(Debug, PartialEq, Eq, Parser)]\n    struct Opt {\n        #[command(subcommand)]\n        sub: Subcommands,\n    }\n\n    #[derive(Debug, PartialEq, Eq, Subcommand)]\n    enum Subcommands {\n        Add,\n        Remove,\n\n        #[allow(dead_code)]\n        #[command(skip)]\n        Skip,\n\n        #[allow(dead_code)]\n        #[command(skip)]\n        Other(Other),\n    }\n\n    #[allow(dead_code)]\n    #[derive(Debug, PartialEq, Eq)]\n    enum Other {\n        One,\n        Twp,\n    }\n\n    assert!(Subcommands::has_subcommand(\"add\"));\n    assert!(Subcommands::has_subcommand(\"remove\"));\n    assert!(!Subcommands::has_subcommand(\"skip\"));\n    assert!(!Subcommands::has_subcommand(\"other\"));\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"add\"]).unwrap(),\n        Opt {\n            sub: Subcommands::Add\n        }\n    );\n\n    assert_eq!(\n        Opt::try_parse_from([\"test\", \"remove\"]).unwrap(),\n        Opt {\n            sub: Subcommands::Remove\n        }\n    );\n\n    let res = Opt::try_parse_from([\"test\", \"skip\"]);\n    assert_eq!(\n        res.unwrap_err().kind(),\n        clap::error::ErrorKind::InvalidSubcommand,\n    );\n\n    let res = Opt::try_parse_from([\"test\", \"other\"]);\n    assert_eq!(\n        res.unwrap_err().kind(),\n        clap::error::ErrorKind::InvalidSubcommand,\n    );\n}\n\n#[test]\nfn built_in_subcommand_escaped() {\n    #[derive(Debug, PartialEq, Eq, Parser)]\n    enum Command {\n        Install {\n            arg: Option<String>,\n        },\n        #[command(external_subcommand)]\n        Custom(Vec<String>),\n    }\n\n    assert_eq!(\n        Command::try_parse_from([\"test\", \"install\", \"arg\"]).unwrap(),\n        Command::Install {\n            arg: Some(String::from(\"arg\"))\n        }\n    );\n    assert_eq!(\n        Command::try_parse_from([\"test\", \"--\", \"install\"]).unwrap(),\n        Command::Custom(vec![String::from(\"install\")])\n    );\n    assert_eq!(\n        Command::try_parse_from([\"test\", \"--\", \"install\", \"arg\"]).unwrap(),\n        Command::Custom(vec![String::from(\"install\"), String::from(\"arg\")])\n    );\n}\n"
  },
  {
    "path": "tests/derive/type_alias_regressions.rs",
    "content": "//! Regression test to ensure that type aliases do not cause compilation failures.\n\nuse clap::{Parser, Subcommand, ValueEnum};\n\n// Result type alias\n#[allow(dead_code)]\ntype Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;\n\ntype Option<T> = std::option::Option<T>;\n\n#[derive(Parser)]\npub(crate) struct Opts {\n    another_string: String,\n    #[command(subcommand)]\n    command: Command,\n    #[arg(short, long, value_enum)]\n    choice: ArgChoice,\n}\n\n#[derive(Subcommand, PartialEq, Debug)]\nenum Command {\n    DoSomething { arg: Option<String> },\n}\n\n#[derive(ValueEnum, PartialEq, Debug, Clone)]\nenum ArgChoice {\n    Foo,\n    Bar,\n}\n\n#[test]\nfn type_alias_regressions() {\n    Opts::try_parse_from([\"test\", \"value\", \"--choice=foo\", \"do-something\"]).unwrap();\n}\n"
  },
  {
    "path": "tests/derive/utf8.rs",
    "content": "#![cfg(not(windows))]\n\nuse clap::error::ErrorKind;\nuse clap::Parser;\nuse std::ffi::OsString;\nuse std::os::unix::ffi::OsStringExt;\n\n#[derive(Parser, Debug, PartialEq, Eq)]\nstruct Positional {\n    arg: String,\n}\n\n#[derive(Parser, Debug, PartialEq, Eq)]\nstruct Named {\n    #[arg(short, long)]\n    arg: String,\n}\n\n#[test]\nfn invalid_utf8_strict_positional() {\n    let m = Positional::try_parse_from(vec![OsString::from(\"\"), OsString::from_vec(vec![0xe9])]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_short_space() {\n    let m = Named::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from(\"-a\"),\n        OsString::from_vec(vec![0xe9]),\n    ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_short_equals() {\n    let m = Named::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from_vec(vec![0x2d, 0x61, 0x3d, 0xe9]),\n    ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_short_no_space() {\n    let m = Named::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from_vec(vec![0x2d, 0x61, 0xe9]),\n    ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_long_space() {\n    let m = Named::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from(\"--arg\"),\n        OsString::from_vec(vec![0xe9]),\n    ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn invalid_utf8_strict_option_long_equals() {\n    let m = Named::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from_vec(vec![0x2d, 0x2d, 0x61, 0x72, 0x67, 0x3d, 0xe9]),\n    ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[derive(Parser, Debug, PartialEq, Eq)]\nstruct PositionalOs {\n    arg: OsString,\n}\n\n#[derive(Parser, Debug, PartialEq, Eq)]\nstruct NamedOs {\n    #[arg(short, long)]\n    arg: OsString,\n}\n\n#[test]\nfn invalid_utf8_positional() {\n    let r = PositionalOs::try_parse_from(vec![OsString::from(\"\"), OsString::from_vec(vec![0xe9])]);\n    assert_eq!(\n        r.unwrap(),\n        PositionalOs {\n            arg: OsString::from_vec(vec![0xe9])\n        }\n    );\n}\n\n#[test]\nfn invalid_utf8_option_short_space() {\n    let r = NamedOs::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from(\"-a\"),\n        OsString::from_vec(vec![0xe9]),\n    ]);\n    assert_eq!(\n        r.unwrap(),\n        NamedOs {\n            arg: OsString::from_vec(vec![0xe9])\n        }\n    );\n}\n\n#[test]\nfn invalid_utf8_option_short_equals() {\n    let r = NamedOs::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from_vec(vec![0x2d, 0x61, 0x3d, 0xe9]),\n    ]);\n    assert_eq!(\n        r.unwrap(),\n        NamedOs {\n            arg: OsString::from_vec(vec![0xe9])\n        }\n    );\n}\n\n#[test]\nfn invalid_utf8_option_short_no_space() {\n    let r = NamedOs::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from_vec(vec![0x2d, 0x61, 0xe9]),\n    ]);\n    assert_eq!(\n        r.unwrap(),\n        NamedOs {\n            arg: OsString::from_vec(vec![0xe9])\n        }\n    );\n}\n\n#[test]\nfn invalid_utf8_option_long_space() {\n    let r = NamedOs::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from(\"--arg\"),\n        OsString::from_vec(vec![0xe9]),\n    ]);\n    assert_eq!(\n        r.unwrap(),\n        NamedOs {\n            arg: OsString::from_vec(vec![0xe9])\n        }\n    );\n}\n\n#[test]\nfn invalid_utf8_option_long_equals() {\n    let r = NamedOs::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from_vec(vec![0x2d, 0x2d, 0x61, 0x72, 0x67, 0x3d, 0xe9]),\n    ]);\n    assert_eq!(\n        r.unwrap(),\n        NamedOs {\n            arg: OsString::from_vec(vec![0xe9])\n        }\n    );\n}\n\n#[derive(Debug, PartialEq, Parser)]\nenum External {\n    #[command(external_subcommand)]\n    Other(Vec<String>),\n}\n\n#[test]\nfn refuse_invalid_utf8_subcommand_with_allow_external_subcommands() {\n    let m = External::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from_vec(vec![0xe9]),\n        OsString::from(\"normal\"),\n    ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[test]\nfn refuse_invalid_utf8_subcommand_args_with_allow_external_subcommands() {\n    let m = External::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from(\"subcommand\"),\n        OsString::from(\"normal\"),\n        OsString::from_vec(vec![0xe9]),\n        OsString::from(\"--another_normal\"),\n    ]);\n    assert!(m.is_err());\n    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidUtf8);\n}\n\n#[derive(Debug, PartialEq, Parser)]\nenum ExternalOs {\n    #[command(external_subcommand)]\n    Other(Vec<OsString>),\n}\n\n#[test]\nfn allow_invalid_utf8_subcommand_args_with_allow_external_subcommands() {\n    let m = ExternalOs::try_parse_from(vec![\n        OsString::from(\"\"),\n        OsString::from(\"subcommand\"),\n        OsString::from(\"normal\"),\n        OsString::from_vec(vec![0xe9]),\n        OsString::from(\"--another_normal\"),\n    ]);\n    assert_eq!(\n        m.unwrap(),\n        ExternalOs::Other(vec![\n            OsString::from(\"subcommand\"),\n            OsString::from(\"normal\"),\n            OsString::from_vec(vec![0xe9]),\n            OsString::from(\"--another_normal\"),\n        ])\n    );\n}\n"
  },
  {
    "path": "tests/derive/utils.rs",
    "content": "// Hi, future me (or whoever you are)!\n//\n// Yes, we do need this attr.\n// No, the warnings cannot be fixed otherwise.\n// Accept and endure. Do not touch.\n#![allow(unused)]\n\nuse clap::CommandFactory;\nuse snapbox::assert_data_eq;\n\npub(crate) const FULL_TEMPLATE: &str = \"\\\n{before-help}{name} {version}\n{author-with-newline}{about-with-newline}\n{usage-heading} {usage}\n\n{all-args}{after-help}\";\n\npub(crate) fn get_help<T: CommandFactory>() -> String {\n    let output = <T as CommandFactory>::command().render_help().to_string();\n\n    eprintln!(\"\\n%%% HELP %%%:=====\\n{output}\\n=====\\n\");\n    eprintln!(\"\\n%%% HELP (DEBUG) %%%:=====\\n{output:?}\\n=====\\n\");\n\n    output\n}\n\npub(crate) fn get_long_help<T: CommandFactory>() -> String {\n    let output = <T as CommandFactory>::command()\n        .render_long_help()\n        .to_string();\n\n    eprintln!(\"\\n%%% LONG_HELP %%%:=====\\n{output}\\n=====\\n\");\n    eprintln!(\"\\n%%% LONG_HELP (DEBUG) %%%:=====\\n{output:?}\\n=====\\n\");\n\n    output\n}\n\npub(crate) fn get_subcommand_long_help<T: CommandFactory>(subcmd: &str) -> String {\n    let output = <T as CommandFactory>::command()\n        .get_subcommands_mut()\n        .find(|s| s.get_name() == subcmd)\n        .unwrap()\n        .render_long_help()\n        .to_string();\n\n    eprintln!(\"\\n%%% SUBCOMMAND `{subcmd}` HELP %%%:=====\\n{output}\\n=====\\n\",);\n    eprintln!(\"\\n%%% SUBCOMMAND `{subcmd}` HELP (DEBUG) %%%:=====\\n{output:?}\\n=====\\n\",);\n\n    output\n}\n\n#[track_caller]\npub(crate) fn assert_output<P: clap::Parser + std::fmt::Debug>(\n    args: &str,\n    expected: impl snapbox::IntoData,\n    stderr: bool,\n) {\n    let res = P::try_parse_from(args.split(' ').collect::<Vec<_>>());\n    let err = res.unwrap_err();\n    let actual = err.render().to_string();\n    assert_eq!(\n        stderr,\n        err.use_stderr(),\n        \"Should Use STDERR failed. Should be {} but is {}\",\n        stderr,\n        err.use_stderr()\n    );\n    assert_data_eq!(actual, expected.raw());\n}\n"
  },
  {
    "path": "tests/derive/value_enum.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,\n// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and\n// Ana Hobden (@hoverbear) <operator@hoverbear.org>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\nuse clap::Parser;\n\n#[test]\nfn basic() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n        Bar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum)]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Foo\n        },\n        Opt::try_parse_from([\"\", \"foo\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Bar\n        },\n        Opt::try_parse_from([\"\", \"bar\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"fOo\"]).is_err());\n}\n\n#[test]\nfn default_value() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    #[derive(Default)]\n    enum ArgChoice {\n        Foo,\n        #[default]\n        Bar,\n    }\n\n    \n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, default_value_t)]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Foo\n        },\n        Opt::try_parse_from([\"\", \"foo\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Bar\n        },\n        Opt::try_parse_from([\"\", \"bar\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Bar\n        },\n        Opt::try_parse_from([\"\"]).unwrap()\n    );\n}\n\n#[test]\nfn vec_for_default_values_t() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n        Bar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, default_values_t = vec![ArgChoice::Foo, ArgChoice::Bar])]\n        arg1: Vec<ArgChoice>,\n\n        #[arg(\n            long,\n            value_enum,\n            default_values_t = clap::ValueEnum::value_variants()\n        )]\n        arg2: Vec<ArgChoice>,\n    }\n\n    assert_eq!(\n        Opt {\n            arg1: vec![ArgChoice::Foo],\n            arg2: vec![ArgChoice::Foo, ArgChoice::Bar]\n        },\n        Opt::try_parse_from([\"\", \"foo\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg1: vec![ArgChoice::Bar],\n            arg2: vec![ArgChoice::Foo, ArgChoice::Bar]\n        },\n        Opt::try_parse_from([\"\", \"bar\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg1: vec![ArgChoice::Foo, ArgChoice::Bar],\n            arg2: vec![ArgChoice::Foo, ArgChoice::Bar]\n        },\n        Opt::try_parse_from([\"\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg1: vec![ArgChoice::Foo, ArgChoice::Bar],\n            arg2: vec![ArgChoice::Foo]\n        },\n        Opt::try_parse_from([\"\", \"--arg2\", \"foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn vec_for_default_values_os_t() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n        Bar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, default_values_os_t = vec![ArgChoice::Foo, ArgChoice::Bar])]\n        arg: Vec<ArgChoice>,\n\n        #[arg(\n            long,\n            value_enum,\n            default_values_os_t = clap::ValueEnum::value_variants()\n        )]\n        arg2: Vec<ArgChoice>,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: vec![ArgChoice::Foo],\n            arg2: vec![ArgChoice::Foo, ArgChoice::Bar]\n        },\n        Opt::try_parse_from([\"\", \"foo\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: vec![ArgChoice::Bar],\n            arg2: vec![ArgChoice::Foo, ArgChoice::Bar]\n        },\n        Opt::try_parse_from([\"\", \"bar\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: vec![ArgChoice::Foo, ArgChoice::Bar],\n            arg2: vec![ArgChoice::Foo, ArgChoice::Bar]\n        },\n        Opt::try_parse_from([\"\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: vec![ArgChoice::Foo, ArgChoice::Bar],\n            arg2: vec![ArgChoice::Foo]\n        },\n        Opt::try_parse_from([\"\", \"--arg2\", \"foo\"]).unwrap()\n    );\n}\n\n#[test]\nfn multi_word_is_renamed_kebab() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    #[allow(non_camel_case_types)]\n    enum ArgChoice {\n        FooBar,\n        BAR_BAZ,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum)]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::FooBar\n        },\n        Opt::try_parse_from([\"\", \"foo-bar\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::BAR_BAZ\n        },\n        Opt::try_parse_from([\"\", \"bar-baz\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"FooBar\"]).is_err());\n}\n\n#[test]\nfn variant_with_defined_casing() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        #[value(rename_all = \"screaming_snake\")]\n        FooBar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum)]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::FooBar\n        },\n        Opt::try_parse_from([\"\", \"FOO_BAR\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"FooBar\"]).is_err());\n}\n\n#[test]\nfn casing_is_propagated_from_parent() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    #[value(rename_all = \"screaming_snake\")]\n    enum ArgChoice {\n        FooBar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum)]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::FooBar\n        },\n        Opt::try_parse_from([\"\", \"FOO_BAR\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"FooBar\"]).is_err());\n}\n\n#[test]\nfn casing_propagation_is_overridden() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    #[value(rename_all = \"screaming_snake\")]\n    enum ArgChoice {\n        #[value(rename_all = \"camel\")]\n        FooBar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum)]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::FooBar\n        },\n        Opt::try_parse_from([\"\", \"fooBar\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"FooBar\"]).is_err());\n    assert!(Opt::try_parse_from([\"\", \"FOO_BAR\"]).is_err());\n}\n\n#[test]\nfn ignore_case() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, ignore_case(true))]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Foo\n        },\n        Opt::try_parse_from([\"\", \"foo\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Foo\n        },\n        Opt::try_parse_from([\"\", \"fOo\"]).unwrap()\n    );\n}\n\n#[test]\nfn ignore_case_set_to_false() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, ignore_case(false))]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Foo\n        },\n        Opt::try_parse_from([\"\", \"foo\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"fOo\"]).is_err());\n}\n\n#[test]\nfn alias() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        #[value(alias = \"TOTP\")]\n        Totp,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, ignore_case(false))]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Totp\n        },\n        Opt::try_parse_from([\"\", \"totp\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Totp\n        },\n        Opt::try_parse_from([\"\", \"TOTP\"]).unwrap()\n    );\n}\n\n#[test]\nfn multiple_alias() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        #[value(alias = \"TOTP\", alias = \"t\")]\n        Totp,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, ignore_case(false))]\n        arg: ArgChoice,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Totp\n        },\n        Opt::try_parse_from([\"\", \"totp\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Totp\n        },\n        Opt::try_parse_from([\"\", \"TOTP\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: ArgChoice::Totp\n        },\n        Opt::try_parse_from([\"\", \"t\"]).unwrap()\n    );\n}\n\n#[test]\nfn skip_variant() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    #[allow(dead_code)] // silence warning about `Baz` being unused\n    enum ArgChoice {\n        Foo,\n        Bar,\n        #[value(skip)]\n        Baz,\n    }\n\n    assert_eq!(\n        <ArgChoice as clap::ValueEnum>::value_variants()\n            .iter()\n            .map(clap::ValueEnum::to_possible_value)\n            .map(Option::unwrap)\n            .collect::<Vec<_>>(),\n        vec![\n            clap::builder::PossibleValue::new(\"foo\"),\n            clap::builder::PossibleValue::new(\"bar\")\n        ]\n    );\n\n    {\n        use clap::ValueEnum;\n        assert!(ArgChoice::from_str(\"foo\", true).is_ok());\n        assert!(ArgChoice::from_str(\"bar\", true).is_ok());\n        assert!(ArgChoice::from_str(\"baz\", true).is_err());\n    }\n}\n\n#[test]\nfn skip_non_unit_variant() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    #[allow(dead_code)] // silence warning about `Baz` being unused\n    enum ArgChoice {\n        Foo,\n        Bar,\n        #[value(skip)]\n        Baz(usize),\n    }\n\n    assert_eq!(\n        <ArgChoice as clap::ValueEnum>::value_variants()\n            .iter()\n            .map(clap::ValueEnum::to_possible_value)\n            .map(Option::unwrap)\n            .collect::<Vec<_>>(),\n        vec![\n            clap::builder::PossibleValue::new(\"foo\"),\n            clap::builder::PossibleValue::new(\"bar\")\n        ]\n    );\n\n    {\n        use clap::ValueEnum;\n        assert!(ArgChoice::from_str(\"foo\", true).is_ok());\n        assert!(ArgChoice::from_str(\"bar\", true).is_ok());\n        assert!(ArgChoice::from_str(\"baz\", true).is_err());\n    }\n}\n\n#[test]\nfn from_str_invalid() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n    }\n\n    {\n        use clap::ValueEnum;\n        assert!(ArgChoice::from_str(\"bar\", true).is_err());\n    }\n}\n\n#[test]\nfn option_type() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n        Bar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum)]\n        arg: Option<ArgChoice>,\n    }\n\n    assert_eq!(Opt { arg: None }, Opt::try_parse_from([\"\"]).unwrap());\n    assert_eq!(\n        Opt {\n            arg: Some(ArgChoice::Foo)\n        },\n        Opt::try_parse_from([\"\", \"foo\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: Some(ArgChoice::Bar)\n        },\n        Opt::try_parse_from([\"\", \"bar\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"fOo\"]).is_err());\n}\n\n#[test]\nfn option_option_type() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n        Bar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, long)]\n        arg: Option<Option<ArgChoice>>,\n    }\n\n    assert_eq!(Opt { arg: None }, Opt::try_parse_from([\"\"]).unwrap());\n    assert_eq!(\n        Opt { arg: Some(None) },\n        Opt::try_parse_from([\"\", \"--arg\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: Some(Some(ArgChoice::Foo))\n        },\n        Opt::try_parse_from([\"\", \"--arg\", \"foo\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: Some(Some(ArgChoice::Bar))\n        },\n        Opt::try_parse_from([\"\", \"--arg\", \"bar\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"--arg\", \"fOo\"]).is_err());\n}\n\n#[test]\nfn vec_type() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n        Bar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, short, long)]\n        arg: Vec<ArgChoice>,\n    }\n\n    assert_eq!(Opt { arg: vec![] }, Opt::try_parse_from([\"\"]).unwrap());\n    assert_eq!(\n        Opt {\n            arg: vec![ArgChoice::Foo]\n        },\n        Opt::try_parse_from([\"\", \"-a\", \"foo\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: vec![ArgChoice::Foo, ArgChoice::Bar]\n        },\n        Opt::try_parse_from([\"\", \"-a\", \"foo\", \"-a\", \"bar\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"-a\", \"fOo\"]).is_err());\n}\n\n#[test]\nfn option_vec_type() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n        Bar,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(value_enum, short, long)]\n        arg: Option<Vec<ArgChoice>>,\n    }\n\n    assert_eq!(Opt { arg: None }, Opt::try_parse_from([\"\"]).unwrap());\n    assert_eq!(\n        Opt {\n            arg: Some(vec![ArgChoice::Foo])\n        },\n        Opt::try_parse_from([\"\", \"-a\", \"foo\"]).unwrap()\n    );\n    assert_eq!(\n        Opt {\n            arg: Some(vec![ArgChoice::Foo, ArgChoice::Bar])\n        },\n        Opt::try_parse_from([\"\", \"-a\", \"foo\", \"-a\", \"bar\"]).unwrap()\n    );\n    assert!(Opt::try_parse_from([\"\", \"-a\", \"fOo\"]).is_err());\n}\n\n#[test]\nfn vec_type_default_value() {\n    #[derive(clap::ValueEnum, PartialEq, Debug, Clone)]\n    enum ArgChoice {\n        Foo,\n        Bar,\n        Baz,\n    }\n\n    #[derive(Parser, PartialEq, Debug)]\n    struct Opt {\n        #[arg(\n            value_enum,\n            short,\n            long,\n            default_value = \"foo,bar\",\n            value_delimiter = ','\n        )]\n        arg: Vec<ArgChoice>,\n    }\n\n    assert_eq!(\n        Opt {\n            arg: vec![ArgChoice::Foo, ArgChoice::Bar]\n        },\n        Opt::try_parse_from([\"\"]).unwrap()\n    );\n\n    assert_eq!(\n        Opt {\n            arg: vec![ArgChoice::Foo, ArgChoice::Baz]\n        },\n        Opt::try_parse_from([\"\", \"-a\", \"foo,baz\"]).unwrap()\n    );\n}\n"
  },
  {
    "path": "tests/derive_ui/bool_value_enum.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\")]\nstruct Opt {\n    #[arg(short, value_enum, default_value_t)]\n    opts: bool,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/bool_value_enum.stderr",
    "content": "error[E0277]: the trait bound `bool: ValueEnum` is not satisfied\n --> tests/derive_ui/bool_value_enum.rs:6:30\n  |\n6 |     #[arg(short, value_enum, default_value_t)]\n  |                              ^^^^^^^^^^^^^^^ the trait `ValueEnum` is not implemented for `bool`\n  |\nhelp: the trait `ValueEnum` is implemented for `ColorChoice`\n --> clap_builder/src/util/color.rs\n  |\n  | impl ValueEnum for ColorChoice {\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/clap_empty_attr.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command]\nstruct Opt {}\n\n#[derive(Parser, Debug)]\nstruct Opt1 {\n    #[arg = \"short\"]\n    foo: u32,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/clap_empty_attr.stderr",
    "content": "error: expected attribute arguments in parentheses: #[command(...)]\n --> tests/derive_ui/clap_empty_attr.rs:4:3\n  |\n4 | #[command]\n  |   ^^^^^^^\n\nerror: expected parentheses: #[arg(...)]\n --> tests/derive_ui/clap_empty_attr.rs:9:11\n  |\n9 |     #[arg = \"short\"]\n  |           ^\n"
  },
  {
    "path": "tests/derive_ui/default_value_t_invalid.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\")]\nstruct Opt {\n    #[arg(default_value_t = -10)]\n    value: u32,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/default_value_t_invalid.stderr",
    "content": "error[E0600]: cannot apply unary operator `-` to type `u32`\n  --> tests/derive_ui/default_value_t_invalid.rs:14:29\n   |\n14 |     #[arg(default_value_t = -10)]\n   |                             ^^^ cannot apply unary operator `-`\n   |\n   = note: unsigned values cannot be negated\n"
  },
  {
    "path": "tests/derive_ui/default_values_t_invalid.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\")]\nstruct Opt {\n    #[arg(default_values_t = [1, 2, 3])]\n    value: u32,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/default_values_t_invalid.stderr",
    "content": "error: #[arg(default_values_t)] can be used only on Vec types\n\n       = note: see https://docs.rs/clap/latest/clap/_derive/index.html#arg-attributes\n\n --> tests/derive_ui/default_values_t_invalid.rs:6:11\n  |\n6 |     #[arg(default_values_t = [1, 2, 3])]\n  |           ^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/enum_flatten.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\")]\nenum Opt {\n    #[command(flatten)]\n    Variant1,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/enum_flatten.stderr",
    "content": "error: invalid variant for `#[command(flatten)]`, expected newtype variant\n  --> tests/derive_ui/enum_flatten.rs:14:5\n   |\n14 | /     #[command(flatten)]\n15 | |     Variant1,\n   | |____________^\n"
  },
  {
    "path": "tests/derive_ui/enum_variant_not_args.rs",
    "content": "#[derive(clap::Parser)]\nenum Opt {\n    Sub(SubCmd),\n}\n\n#[derive(clap::Parser)]\nenum SubCmd {}\n\nfn main() {}\n"
  },
  {
    "path": "tests/derive_ui/enum_variant_not_args.stderr",
    "content": "error[E0277]: the trait bound `SubCmd: clap::Args` is not satisfied\n --> tests/derive_ui/enum_variant_not_args.rs:3:9\n  |\n3 |     Sub(SubCmd),\n  |         ^^^^^^ unsatisfied trait bound\n  |\nhelp: the trait `clap::Args` is not implemented for `SubCmd`\n --> tests/derive_ui/enum_variant_not_args.rs:7:1\n  |\n7 | enum SubCmd {}\n  | ^^^^^^^^^^^\nhelp: the following other types implement trait `clap::Args`\n --> clap_builder/src/derive.rs\n  |\n  | impl<T: Args> Args for Box<T> {\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Box<T>`\n...\n  | impl Args for () {\n  | ^^^^^^^^^^^^^^^^ `()`\n"
  },
  {
    "path": "tests/derive_ui/external_subcommand_misuse.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser, Debug)]\nstruct Opt {\n    #[command(external_subcommand)]\n    field: String,\n}\n\nfn main() {\n    let _ = Opt::parse();\n}\n"
  },
  {
    "path": "tests/derive_ui/external_subcommand_misuse.stderr",
    "content": "error: `external_subcommand` cannot be used with `arg`\n --> tests/derive_ui/external_subcommand_misuse.rs:5:15\n  |\n5 |     #[command(external_subcommand)]\n  |               ^^^^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/external_subcommand_wrong_type.rs",
    "content": "use clap::Parser;\nuse std::ffi::CString;\n\n#[derive(Parser, Debug)]\nenum Opt {\n    #[command(external_subcommand)]\n    Other(Vec<CString>),\n}\n\n#[derive(Parser, Debug)]\nenum Opt2 {\n    #[command(external_subcommand)]\n    Other(String),\n}\n\n#[derive(Parser, Debug)]\nenum Opt3 {\n    #[command(external_subcommand)]\n    Other { a: String },\n}\n\nfn main() {\n    let _ = Opt::parse();\n    let _ = Opt2::parse();\n    let _ = Opt3::parse();\n}\n"
  },
  {
    "path": "tests/derive_ui/external_subcommand_wrong_type.stderr",
    "content": "error: invalid type for `#[command(external_subcommand)]`, expected a `Vec<String>` or `Vec<OsString>`\n --> tests/derive_ui/external_subcommand_wrong_type.rs:7:11\n  |\n7 |     Other(Vec<CString>),\n  |           ^^^\n\nerror: invalid type for `#[command(external_subcommand)]`, expected a `Vec<String>` or `Vec<OsString>`\n  --> tests/derive_ui/external_subcommand_wrong_type.rs:13:11\n   |\n13 |     Other(String),\n   |           ^^^^^^\n\nerror: invalid type for `#[command(external_subcommand)]`, expected a newtype variant with either a `Vec<String>` or `Vec<OsString>`\n  --> tests/derive_ui/external_subcommand_wrong_type.rs:18:5\n   |\n18 | /     #[command(external_subcommand)]\n19 | |     Other { a: String },\n   | |_______________________^\n"
  },
  {
    "path": "tests/derive_ui/flatten_and_methods.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\nstruct DaemonOpts {\n    #[arg(short)]\n    user: String,\n    #[arg(short)]\n    group: String,\n}\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\")]\nstruct Opt {\n    #[command(flatten, version = \"foo\")]\n    opts: DaemonOpts,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/flatten_and_methods.stderr",
    "content": "error: methods are not allowed for flattened entry\n  --> tests/derive_ui/flatten_and_methods.rs:22:15\n   |\n22 |     #[command(flatten, version = \"foo\")]\n   |               ^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/flatten_enum_in_struct.rs",
    "content": "#[derive(clap::Parser)]\nstruct Opt {\n    #[command(flatten)]\n    sub: SubCmd,\n}\n\n#[derive(clap::Parser)]\nenum SubCmd {}\n\nfn main() {}\n"
  },
  {
    "path": "tests/derive_ui/flatten_enum_in_struct.stderr",
    "content": "error[E0277]: the trait bound `SubCmd: clap::Args` is not satisfied\n --> tests/derive_ui/flatten_enum_in_struct.rs:4:10\n  |\n4 |     sub: SubCmd,\n  |          ^^^^^^ unsatisfied trait bound\n  |\nhelp: the trait `clap::Args` is not implemented for `SubCmd`\n --> tests/derive_ui/flatten_enum_in_struct.rs:8:1\n  |\n8 | enum SubCmd {}\n  | ^^^^^^^^^^^\nhelp: the following other types implement trait `clap::Args`\n --> tests/derive_ui/flatten_enum_in_struct.rs:1:10\n  |\n1 | #[derive(clap::Parser)]\n  |          ^^^^^^^^^^^^ `Opt`\n  |\n ::: clap_builder/src/derive.rs\n  |\n  | impl<T: Args> Args for Box<T> {\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Box<T>`\n...\n  | impl Args for () {\n  | ^^^^^^^^^^^^^^^^ `()`\n  = note: this error originates in the derive macro `clap::Parser` (in Nightly builds, run with -Z macro-backtrace for more info)\n"
  },
  {
    "path": "tests/derive_ui/flatten_struct_in_enum.rs",
    "content": "#[derive(clap::Parser)]\nenum Opt {\n    #[command(flatten)]\n    Sub(SubCmd),\n}\n\n#[derive(clap::Parser)]\nstruct SubCmd {}\n\nfn main() {}\n"
  },
  {
    "path": "tests/derive_ui/flatten_struct_in_enum.stderr",
    "content": "error[E0277]: the trait bound `SubCmd: Subcommand` is not satisfied\n --> tests/derive_ui/flatten_struct_in_enum.rs:4:9\n  |\n4 |     Sub(SubCmd),\n  |         ^^^^^^ unsatisfied trait bound\n  |\nhelp: the trait `Subcommand` is not implemented for `SubCmd`\n --> tests/derive_ui/flatten_struct_in_enum.rs:8:1\n  |\n8 | struct SubCmd {}\n  | ^^^^^^^^^^^^^\nhelp: the following other types implement trait `Subcommand`\n --> tests/derive_ui/flatten_struct_in_enum.rs:1:10\n  |\n1 | #[derive(clap::Parser)]\n  |          ^^^^^^^^^^^^ `Opt`\n  |\n ::: clap_builder/src/derive.rs\n  |\n  | impl<T: Subcommand> Subcommand for Box<T> {\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Box<T>`\n...\n  | impl Subcommand for () {\n  | ^^^^^^^^^^^^^^^^^^^^^^ `()`\n...\n  | impl Subcommand for Infallible {\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Infallible`\n  = note: this error originates in the derive macro `clap::Parser` (in Nightly builds, run with -Z macro-backtrace for more info)\n"
  },
  {
    "path": "tests/derive_ui/group_name_attribute.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\")]\nstruct Opt {\n    #[command(flatten)]\n    source: Source,\n}\n\n#[derive(clap::Args, Debug)]\n#[group(required = true, name = \"src\")]\nstruct Source {\n    #[arg(short)]\n    git: String,\n\n    #[arg(short)]\n    path: String,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/group_name_attribute.stderr",
    "content": "error[E0599]: no method named `name` found for struct `ArgGroup` in the current scope\n  --> tests/derive_ui/group_name_attribute.rs:11:26\n   |\n11 | #[group(required = true, name = \"src\")]\n   |                          ^^^^\n   |\nhelp: there is a method `ne` with a similar name\n   |\n11 - #[group(required = true, name = \"src\")]\n11 + #[group(required = true, ne = \"src\")]\n   |\n"
  },
  {
    "path": "tests/derive_ui/multiple_external_subcommand.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser, Debug)]\nstruct Opt {\n    #[command(subcommand)]\n    cmd: Command,\n}\n\n#[derive(Parser, Debug)]\nenum Command {\n    #[command(external_subcommand)]\n    Run(Vec<String>),\n\n    #[command(external_subcommand)]\n    Other(Vec<String>),\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/multiple_external_subcommand.stderr",
    "content": "error: `#[command(external_subcommand)] can only be specified once and has already been specified\n  --> tests/derive_ui/multiple_external_subcommand.rs:14:15\n   |\n14 |     #[command(external_subcommand)]\n   |               ^^^^^^^^^^^^^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/non_existent_attr.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\")]\nstruct Opt {\n    #[arg(short, non_existing_attribute = 1)]\n    debug: bool,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/non_existent_attr.stderr",
    "content": "error[E0599]: no method named `non_existing_attribute` found for struct `Arg` in the current scope\n  --> tests/derive_ui/non_existent_attr.rs:14:18\n   |\n14 |     #[arg(short, non_existing_attribute = 1)]\n   |                  ^^^^^^^^^^^^^^^^^^^^^^ method not found in `Arg`\n"
  },
  {
    "path": "tests/derive_ui/rename_all_wrong_casing.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\", rename_all = \"fail\")]\nstruct Opt {\n    #[arg(short)]\n    s: String,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/rename_all_wrong_casing.stderr",
    "content": "error: unsupported casing: `fail`\n  --> tests/derive_ui/rename_all_wrong_casing.rs:12:40\n   |\n12 | #[command(name = \"basic\", rename_all = \"fail\")]\n   |                                        ^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/skip_flatten.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"make-cookie\")]\nstruct MakeCookie {\n    #[arg(short)]\n    s: String,\n\n    #[command(skip, flatten)]\n    cmd: Command,\n}\n\n#[derive(Parser, Debug)]\nenum Command {\n    #[command(name = \"pound\")]\n    /// Pound acorns into flour for cookie dough.\n    Pound { acorns: u32 },\n\n    Sparkle {\n        #[arg(short)]\n        color: String,\n    },\n}\n\nimpl Default for Command {\n    fn default() -> Self {\n        Command::Pound { acorns: 0 }\n    }\n}\n\nfn main() {\n    let opt = MakeCookie::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/skip_flatten.stderr",
    "content": "error: `flatten` cannot be used with `skip`\n  --> tests/derive_ui/skip_flatten.rs:17:21\n   |\n17 |     #[command(skip, flatten)]\n   |                     ^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/skip_subcommand.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"make-cookie\")]\nstruct MakeCookie {\n    #[arg(short)]\n    s: String,\n\n    #[command(subcommand, skip)]\n    cmd: Command,\n}\n\n#[derive(Parser, Debug)]\nenum Command {\n    #[command(name = \"pound\")]\n    /// Pound acorns into flour for cookie dough.\n    Pound { acorns: u32 },\n\n    Sparkle {\n        #[arg(short)]\n        color: String,\n    },\n}\n\nimpl Default for Command {\n    fn default() -> Self {\n        Command::Pound { acorns: 0 }\n    }\n}\n\nfn main() {\n    let opt = MakeCookie::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/skip_subcommand.stderr",
    "content": "error: `skip` cannot be used with `subcommand`\n  --> tests/derive_ui/skip_subcommand.rs:17:27\n   |\n17 |     #[command(subcommand, skip)]\n   |                           ^^^^\n"
  },
  {
    "path": "tests/derive_ui/skip_with_other_options.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"test\")]\npub struct Opt {\n    #[arg(long)]\n    a: u32,\n    #[arg(skip, long)]\n    b: u32,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/skip_with_other_options.stderr",
    "content": "error: `long` cannot be used with `#[arg(skip)]\n --> tests/derive_ui/skip_with_other_options.rs:8:17\n  |\n8 |     #[arg(skip, long)]\n  |                 ^^^^\n"
  },
  {
    "path": "tests/derive_ui/skip_without_default.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Debug)]\nenum Kind {\n    A,\n    B,\n}\n\n#[derive(Parser, Debug)]\n#[command(name = \"test\")]\npub struct Opt {\n    #[arg(short)]\n    number: u32,\n    #[arg(skip)]\n    k: Kind,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/skip_without_default.stderr",
    "content": "error[E0277]: the trait bound `Kind: Default` is not satisfied\n  --> tests/derive_ui/skip_without_default.rs:22:11\n   |\n22 |     #[arg(skip)]\n   |           ^^^^ unsatisfied trait bound\n   |\nhelp: the trait `Default` is not implemented for `Kind`\n  --> tests/derive_ui/skip_without_default.rs:12:1\n   |\n12 | enum Kind {\n   | ^^^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/struct_subcommand.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\", subcommand)]\nstruct Opt {\n    #[arg(short)]\n    s: String,\n}\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/struct_subcommand.stderr",
    "content": "error: `subcommand` cannot be used with `#[command]`\n  --> tests/derive_ui/struct_subcommand.rs:12:27\n   |\n12 | #[command(name = \"basic\", subcommand)]\n   |                           ^^^^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/subcommand_and_flatten.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\nstruct MakeCookie {\n    #[arg(short)]\n    s: String,\n\n    #[command(subcommand, flatten)]\n    cmd: Command,\n}\n\n#[derive(Parser, Debug)]\nenum Command {\n    /// Pound acorns into flour for cookie dough.\n    Pound { acorns: u32 },\n\n    Sparkle {\n        #[arg(short)]\n        color: String,\n    },\n}\n\nfn main() {\n    let opt = MakeCookie::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/subcommand_and_flatten.stderr",
    "content": "error: `flatten` cannot be used with `subcommand`\n  --> tests/derive_ui/subcommand_and_flatten.rs:16:27\n   |\n16 |     #[command(subcommand, flatten)]\n   |                           ^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/subcommand_and_methods.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\nstruct MakeCookie {\n    #[arg(short)]\n    s: String,\n\n    #[command(subcommand, version = \"foo\")]\n    cmd: Command,\n}\n\n#[derive(Parser, Debug)]\nenum Command {\n    /// Pound acorns into flour for cookie dough.\n    Pound { acorns: u32 },\n\n    Sparkle {\n        #[arg(short)]\n        color: String,\n    },\n}\n\nfn main() {\n    let opt = MakeCookie::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/subcommand_and_methods.stderr",
    "content": "error: methods in attributes are not allowed for subcommand\n  --> tests/derive_ui/subcommand_and_methods.rs:16:15\n   |\n16 |     #[command(subcommand, version = \"foo\")]\n   |               ^^^^^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/subcommand_on_struct.rs",
    "content": "use clap::Subcommand;\n\n#[derive(Subcommand, Debug)]\nstruct Opt {}\n\nfn main() {}\n"
  },
  {
    "path": "tests/derive_ui/subcommand_on_struct.stderr",
    "content": "error: `#[derive(Subcommand)]` only supports enums\n --> $DIR/subcommand_on_struct.rs:3:10\n  |\n3 | #[derive(Subcommand, Debug)]\n  |          ^^^^^^^^^^\n  |\n  = note: this error originates in the derive macro `Subcommand` (in Nightly builds, run with -Z macro-backtrace for more info)\n"
  },
  {
    "path": "tests/derive_ui/subcommand_opt_opt.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\nstruct MakeCookie {\n    #[arg(short)]\n    s: String,\n\n    #[command(subcommand)]\n    cmd: Option<Option<Command>>,\n}\n\n#[derive(Parser, Debug)]\nenum Command {\n    /// Pound acorns into flour for cookie dough.\n    Pound { acorns: u32 },\n\n    Sparkle {\n        #[arg(short)]\n        color: String,\n    },\n}\n\nfn main() {\n    let opt = MakeCookie::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/subcommand_opt_opt.stderr",
    "content": "error: `Option<Option<T>>` is an invalid `#[command(subcommand)]` type\n  --> tests/derive_ui/subcommand_opt_opt.rs:17:10\n   |\n17 |     cmd: Option<Option<Command>>,\n   |          ^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/subcommand_opt_vec.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\nstruct MakeCookie {\n    #[arg(short)]\n    s: String,\n\n    #[command(subcommand)]\n    cmd: Option<Vec<Command>>,\n}\n\n#[derive(Parser, Debug)]\nenum Command {\n    /// Pound acorns into flour for cookie dough.\n    Pound { acorns: u32 },\n\n    Sparkle {\n        #[arg(short)]\n        color: String,\n    },\n}\n\nfn main() {\n    let opt = MakeCookie::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/subcommand_opt_vec.stderr",
    "content": "error: `Option<Vec<T>>` is an invalid `#[command(subcommand)]` type\n  --> tests/derive_ui/subcommand_opt_vec.rs:17:10\n   |\n17 |     cmd: Option<Vec<Command>>,\n   |          ^^^^^^\n"
  },
  {
    "path": "tests/derive_ui/tuple_struct.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n// except according to those terms.\n\nuse clap::Parser;\n\n#[derive(Parser, Debug)]\n#[command(name = \"basic\")]\nstruct Opt(u32);\n\nfn main() {\n    let opt = Opt::parse();\n    println!(\"{opt:?}\");\n}\n"
  },
  {
    "path": "tests/derive_ui/tuple_struct.stderr",
    "content": "error: `#[derive(Parser)]` only supports non-tuple structs and enums\n  --> tests/derive_ui/tuple_struct.rs:11:10\n   |\n11 | #[derive(Parser, Debug)]\n   |          ^^^^^^\n   |\n   = note: this error originates in the derive macro `Parser` (in Nightly builds, run with -Z macro-backtrace for more info)\n\nerror[E0599]: no function or associated item named `parse` found for struct `Opt` in the current scope\n  --> tests/derive_ui/tuple_struct.rs:16:20\n   |\n13 | struct Opt(u32);\n   | ---------- function or associated item `parse` not found for this struct\n...\n16 |     let opt = Opt::parse();\n   |                    ^^^^^ function or associated item not found in `Opt`\n   |\n   = help: items from traits can only be used if the trait is implemented and in scope\n   = note: the following traits define an item `parse`, perhaps you need to implement one of them:\n           candidate #1: `Parser`\n           candidate #2: `TypedValueParser`\n"
  },
  {
    "path": "tests/derive_ui/value_enum_non_unit.rs",
    "content": "use clap::ValueEnum;\n\n#[derive(ValueEnum, Clone, Debug)]\nenum Opt {\n    Foo(usize),\n}\n\nfn main() {\n    println!(\"{:?}\", Opt::Foo(42));\n}\n"
  },
  {
    "path": "tests/derive_ui/value_enum_non_unit.stderr",
    "content": "error: `#[derive(ValueEnum)]` only supports unit variants. Non-unit variants must be skipped\n --> tests/derive_ui/value_enum_non_unit.rs:5:5\n  |\n5 |     Foo(usize),\n  |     ^^^\n"
  },
  {
    "path": "tests/derive_ui/value_enum_on_struct.rs",
    "content": "use clap::ValueEnum;\n\n#[derive(ValueEnum, Clone, Debug)]\nstruct Opt {}\n\nfn main() {\n    println!(\"{:?}\", Opt::value_variants());\n}\n"
  },
  {
    "path": "tests/derive_ui/value_enum_on_struct.stderr",
    "content": "error: `#[derive(ValueEnum)]` only supports enums\n --> tests/derive_ui/value_enum_on_struct.rs:3:10\n  |\n3 | #[derive(ValueEnum, Clone, Debug)]\n  |          ^^^^^^^^^\n  |\n  = note: this error originates in the derive macro `ValueEnum` (in Nightly builds, run with -Z macro-backtrace for more info)\n"
  },
  {
    "path": "tests/derive_ui/value_parser_unsupported.rs",
    "content": "use clap::Parser;\n\n#[derive(Parser, Debug)]\nstruct Cli {\n    foo: Custom,\n}\n\n#[derive(Clone, Debug)]\nstruct Custom;\n\nfn main() {\n    Cli::parse();\n}\n"
  },
  {
    "path": "tests/derive_ui/value_parser_unsupported.stderr",
    "content": "error[E0599]: the method `value_parser` exists for reference `&&&&&&_infer_ValueParser_for<Custom>`, but its trait bounds were not satisfied\n --> tests/derive_ui/value_parser_unsupported.rs:5:5\n  |\n5 |     foo: Custom,\n  |     ^^^ method cannot be called on `&&&&&&_infer_ValueParser_for<Custom>` due to unsatisfied trait bounds\n...\n9 | struct Custom;\n  | ------------- doesn't satisfy 7 bounds\n  |\n ::: clap_builder/src/builder/value_parser.rs\n  |\n  | pub struct _infer_ValueParser_for<T>(std::marker::PhantomData<T>);\n  | ------------------------------------ doesn't satisfy `_: _impls_FromStr`\n  |\n  = note: the following trait bounds were not satisfied:\n          `Custom: ValueEnum`\n          which is required by `&&&&&_infer_ValueParser_for<Custom>: clap::builder::impl_prelude::_impls_ValueEnum`\n          `Custom: ValueParserFactory`\n          which is required by `&&&&&&_infer_ValueParser_for<Custom>: clap::builder::impl_prelude::_impls_ValueParserFactory`\n          `Custom: From<OsString>`\n          which is required by `&&&&_infer_ValueParser_for<Custom>: clap::builder::impl_prelude::_impls_From_OsString`\n          `Custom: From<&'s std::ffi::OsStr>`\n          which is required by `&&&_infer_ValueParser_for<Custom>: clap::builder::impl_prelude::_impls_From_OsStr`\n          `Custom: From<std::string::String>`\n          which is required by `&&_infer_ValueParser_for<Custom>: clap::builder::impl_prelude::_impls_From_String`\n          `Custom: From<&'s str>`\n          which is required by `&_infer_ValueParser_for<Custom>: clap::builder::impl_prelude::_impls_From_str`\n          `Custom: FromStr`\n          which is required by `_infer_ValueParser_for<Custom>: clap::builder::impl_prelude::_impls_FromStr`\nnote: the traits `From`, `FromStr`, `ValueEnum`,  and `ValueParserFactory` must be implemented\n --> clap_builder/src/builder/value_parser.rs\n  |\n  | pub trait ValueParserFactory {\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  |\n ::: clap_builder/src/derive.rs\n  |\n  | pub trait ValueEnum: Sized + Clone {\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n --> $RUST/core/src/convert/mod.rs\n --> $RUST/core/src/str/traits.rs\n  = note: this error originates in the macro `clap::value_parser` (in Nightly builds, run with -Z macro-backtrace for more info)\n"
  },
  {
    "path": "tests/derive_ui.rs",
    "content": "// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>\n//\n// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n// option. This file may not be copied, modified, or distributed\n\n#![cfg(feature = \"unstable-derive-ui-tests\")]\n\n#[cfg(feature = \"derive\")]\n#[rustversion::attr(not(stable(1.94)), ignore)] // STABLE\n#[test]\nfn ui() {\n    let t = trybuild::TestCases::new();\n    t.compile_fail(\"tests/derive_ui/*.rs\");\n}\n"
  },
  {
    "path": "tests/examples.rs",
    "content": "#[test]\n#[cfg(feature = \"help\")]\n#[cfg(feature = \"error-context\")]\n#[cfg(feature = \"usage\")]\nfn example_tests() {\n    let t = trycmd::TestCases::new();\n    let features = [\n        // Default\n        #[cfg(feature = \"std\")]\n        \"std\",\n        #[cfg(feature = \"color\")]\n        \"color\",\n        #[cfg(feature = \"help\")]\n        \"help\",\n        #[cfg(feature = \"usage\")]\n        \"usage\",\n        #[cfg(feature = \"error-context\")]\n        \"error-context\",\n        #[cfg(feature = \"suggestions\")]\n        \"suggestions\",\n        // Optional\n        #[cfg(feature = \"derive\")]\n        \"derive\",\n        #[cfg(feature = \"cargo\")]\n        \"cargo\",\n        #[cfg(feature = \"wrap_help\")]\n        \"wrap_help\",\n        #[cfg(feature = \"env\")]\n        \"env\",\n        #[cfg(feature = \"unicode\")]\n        \"unicode\",\n        #[cfg(feature = \"string\")]\n        \"string\",\n        // In-work\n        //#[cfg(feature = \"unstable-v5\")]  // Currently has failures\n        //\"unstable-v5\",\n    ]\n    .join(\" \");\n    t.register_bins(trycmd::cargo::compile_examples([\"--features\", &features]).unwrap());\n    t.case(\"examples/**/*.md\");\n}\n"
  },
  {
    "path": "tests/macros.rs",
    "content": "mod arg {\n    #[test]\n    fn name_explicit() {\n        let arg = clap::arg!(foo: --bar <NUM>);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_long(), Some(\"bar\"));\n        assert_eq!(arg.get_value_names(), Some(vec![\"NUM\".into()].as_slice()));\n        assert!(!arg.is_required_set());\n    }\n\n    #[test]\n    fn name_from_long() {\n        let arg = clap::arg!(--bar <NUM>);\n        assert_eq!(arg.get_id(), \"bar\");\n        assert_eq!(arg.get_long(), Some(\"bar\"));\n        assert_eq!(arg.get_value_names(), Some(vec![\"NUM\".into()].as_slice()));\n        assert!(!arg.is_required_set());\n    }\n\n    #[test]\n    fn name_from_value() {\n        let arg = clap::arg!(<NUM>);\n        assert_eq!(arg.get_id(), \"NUM\");\n        assert_eq!(arg.get_long(), None);\n        assert_eq!(arg.get_value_names(), Some(vec![\"NUM\".into()].as_slice()));\n        assert!(arg.is_required_set());\n    }\n\n    #[test]\n    #[should_panic]\n    fn name_none_fails() {\n        clap::arg!(\"Help\");\n    }\n\n    #[test]\n    #[should_panic]\n    fn short_only_fails() {\n        clap::arg!(-b);\n    }\n\n    #[test]\n    fn short() {\n        let arg = clap::arg!(foo: -b);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: -'b');\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: -b ...);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Count));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: -b \"How to use it\");\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(\n            arg.get_help().map(|s| s.to_string()),\n            Some(\"How to use it\".to_owned())\n        );\n    }\n\n    #[test]\n    fn short_and_long() {\n        let arg = clap::arg!(foo: -b --hello);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_long(), Some(\"hello\"));\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: -'b' --hello);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_long(), Some(\"hello\"));\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: -b --hello ...);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_long(), Some(\"hello\"));\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Count));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: -b --hello \"How to use it\");\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_long(), Some(\"hello\"));\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(\n            arg.get_help().map(|s| s.to_string()),\n            Some(\"How to use it\".to_owned())\n        );\n    }\n\n    #[test]\n    fn short_help() {\n        let arg = clap::arg!(help: -b);\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n\n        let mut cmd = clap::Command::new(\"cmd\")\n            .disable_help_flag(true)\n            .arg(clap::arg!(help: -b).action(clap::ArgAction::Help));\n        cmd.build();\n        let arg = cmd\n            .get_arguments()\n            .find(|arg| arg.get_id() == \"help\")\n            .unwrap();\n        assert!(matches!(arg.get_action(), clap::ArgAction::Help));\n    }\n\n    #[test]\n    fn long_help() {\n        let arg = clap::arg!(-'?' - -help);\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n\n        let mut cmd = clap::Command::new(\"cmd\")\n            .disable_help_flag(true)\n            .arg(clap::arg!(-'?' - -help).action(clap::ArgAction::Help));\n        cmd.build();\n        let arg = cmd\n            .get_arguments()\n            .find(|arg| arg.get_id() == \"help\")\n            .unwrap();\n        assert!(matches!(arg.get_action(), clap::ArgAction::Help));\n    }\n\n    #[test]\n    fn short_version() {\n        let arg = clap::arg!(version: -b);\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n\n        let mut cmd = clap::Command::new(\"cmd\")\n            .disable_version_flag(true)\n            .version(\"1.0.0\")\n            .arg(clap::arg!(version: -b).action(clap::ArgAction::Version));\n        cmd.build();\n        let arg = cmd\n            .get_arguments()\n            .find(|arg| arg.get_id() == \"version\")\n            .unwrap();\n        assert!(matches!(arg.get_action(), clap::ArgAction::Version));\n    }\n\n    #[test]\n    fn long_version() {\n        let arg = clap::arg!(-'?' - -version);\n        assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue));\n\n        let mut cmd = clap::Command::new(\"cmd\")\n            .disable_version_flag(true)\n            .version(\"1.0.0\")\n            .arg(clap::arg!(-'?' - -version).action(clap::ArgAction::Version));\n        cmd.build();\n        let arg = cmd\n            .get_arguments()\n            .find(|arg| arg.get_id() == \"version\")\n            .unwrap();\n        assert!(matches!(arg.get_action(), clap::ArgAction::Version));\n    }\n\n    #[test]\n    fn short_with_value() {\n        let arg = clap::arg!(foo: -b <NUM>);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Set));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: -'b' <NUM>);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Set));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: -b  <NUM> ...);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Append));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: -b  <NUM> \"How to use it\");\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_short(), Some('b'));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Set));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(\n            arg.get_help().map(|s| s.to_string()),\n            Some(\"How to use it\".to_owned())\n        );\n    }\n\n    #[test]\n    fn positional() {\n        let arg = clap::arg!(<NUM>);\n        assert_eq!(arg.get_id(), \"NUM\");\n        assert_eq!(arg.get_value_names(), Some(vec![\"NUM\".into()].as_slice()));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Set));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!([NUM]);\n        assert_eq!(arg.get_id(), \"NUM\");\n        assert_eq!(arg.get_value_names(), Some(vec![\"NUM\".into()].as_slice()));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Set));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(!arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(<NUM>);\n        assert_eq!(arg.get_id(), \"NUM\");\n        assert_eq!(arg.get_value_names(), Some(vec![\"NUM\".into()].as_slice()));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Set));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(foo: <NUM>);\n        assert_eq!(arg.get_id(), \"foo\");\n        assert_eq!(arg.get_value_names(), Some(vec![\"NUM\".into()].as_slice()));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Set));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(<NUM> ...);\n        assert_eq!(arg.get_id(), \"NUM\");\n        assert_eq!(arg.get_value_names(), Some(vec![\"NUM\".into()].as_slice()));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Append));\n        assert_eq!(arg.get_num_args(), Some((1..).into()));\n        assert!(arg.is_required_set());\n        assert_eq!(arg.get_help().map(|s| s.to_string()), None);\n\n        let arg = clap::arg!(<NUM> \"How to use it\");\n        assert_eq!(arg.get_id(), \"NUM\");\n        assert_eq!(arg.get_value_names(), Some(vec![\"NUM\".into()].as_slice()));\n        assert!(matches!(arg.get_action(), clap::ArgAction::Set));\n        assert_eq!(arg.get_num_args(), None);\n        assert!(arg.is_required_set());\n        assert_eq!(\n            arg.get_help().map(|s| s.to_string()),\n            Some(\"How to use it\".to_owned())\n        );\n    }\n\n    #[test]\n    #[cfg(all(feature = \"help\", feature = \"usage\"))]\n    fn optional_value() {\n        let mut cmd = clap::Command::new(\"test\")\n            .args_override_self(true)\n            .arg(clap::arg!(port: -p [NUM]));\n\n        let r = cmd.try_get_matches_from_mut([\"test\", \"-p42\"]);\n        assert!(r.is_ok(), \"{}\", r.unwrap_err());\n        let m = r.unwrap();\n        assert!(m.contains_id(\"port\"));\n        assert_eq!(m.get_one::<String>(\"port\").unwrap(), \"42\");\n\n        let r = cmd.try_get_matches_from_mut([\"test\", \"-p\"]);\n        assert!(r.is_ok(), \"{}\", r.unwrap_err());\n        let m = r.unwrap();\n        assert!(m.contains_id(\"port\"));\n        assert!(m.get_one::<String>(\"port\").is_none());\n\n        let r = cmd.try_get_matches_from_mut([\"test\", \"-p\", \"24\", \"-p\", \"42\"]);\n        assert!(r.is_ok(), \"{}\", r.unwrap_err());\n        let m = r.unwrap();\n        assert!(m.contains_id(\"port\"));\n        assert_eq!(m.get_one::<String>(\"port\").unwrap(), \"42\");\n\n        let help = cmd.render_help().to_string();\n        snapbox::assert_data_eq!(\n            help,\n            snapbox::str![[r#\"\nUsage: test [OPTIONS]\n\nOptions:\n  -p [<NUM>]  \n  -h, --help  Print help\n\n\"#]]\n        );\n    }\n}\n\nmod arg_impl {\n    #[test]\n    fn string_ident() {\n        let expected = \"one\";\n        let actual = clap::arg_impl! { @string one };\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    fn string_literal() {\n        let expected = \"one\";\n        let actual = clap::arg_impl! { @string \"one\" };\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    fn char_ident() {\n        let expected = 'o';\n        let actual = clap::arg_impl! { @char o };\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    fn char_literal() {\n        let expected = 'o';\n        let actual = clap::arg_impl! { @char 'o' };\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    // allow double quoted dashed arg name in square brackets (e.g [\"some-arg\"])\n    fn arg_name_dashed() {\n        let arg = clap::arg!([\"some-arg\"] \"some arg\");\n        assert_eq!(arg, clap::Arg::new(\"some-arg\").help(\"some arg\"));\n\n        let m = clap::Command::new(\"flag\")\n            .arg(arg)\n            .try_get_matches_from(vec![\"\", \"some-val\"])\n            .unwrap();\n        assert_eq!(m.get_one::<String>(\"some-arg\").unwrap(), \"some-val\");\n    }\n\n    #[test]\n    // allow double quoted dashed arg value in triangle brackets (e.g <\"some-val\">)\n    // test in combination with short argument name (e.g. -v)\n    fn arg_value_dashed_with_short_arg() {\n        let arg = clap::arg!(-a <\"some-val\"> \"some arg\");\n        assert_eq!(\n            arg,\n            clap::Arg::new(\"some-val\")\n                .short('a')\n                .long(\"arg\")\n                .value_name(\"some-val\")\n        );\n\n        let m = clap::Command::new(\"cmd\")\n            .arg(arg)\n            .try_get_matches_from(vec![\"\", \"-a\", \"val\"])\n            .unwrap();\n        assert_eq!(m.get_one::<String>(\"some-val\").unwrap(), \"val\");\n    }\n\n    #[test]\n    // allow double quoted dashed arg value in triangle brackets (e.g <\"some-val\">)\n    // test in combination with long argument name (e.g. --value)\n    fn arg_value_dashed_with_long_arg() {\n        let arg = clap::arg!(-a --arg <\"some-val\"> \"some arg\");\n        assert_eq!(\n            arg,\n            clap::Arg::new(\"arg\")\n                .short('a')\n                .long(\"arg\")\n                .value_name(\"some-val\")\n        );\n\n        let m = clap::Command::new(\"cmd\")\n            .arg(arg)\n            .try_get_matches_from(vec![\"\", \"--arg\", \"some-val\"])\n            .unwrap();\n        assert_eq!(m.get_one::<String>(\"arg\").unwrap(), \"some-val\");\n    }\n}\n"
  },
  {
    "path": "tests/ui/V_flag_stdout.toml",
    "content": "bin.name = \"stdio-fixture\"\nargs = [\"-V\"]\nstatus.code = 0\nstdout = \"\"\"\nstdio-fixture 1.0\n\"\"\"\nstderr = \"\"\n"
  },
  {
    "path": "tests/ui/arg_required_else_help_stderr.toml",
    "content": "bin.name = \"stdio-fixture\"\nargs = []\nstatus.code = 2\nstdout = \"\"\nstderr = \"\"\"\nUsage: stdio-fixture[EXE] [OPTIONS] [NAME] [ENV] [COMMAND]\n\nCommands:\n  more                    \n  test                    Subcommand with one visible alias [aliases: do-stuff]\n  test_2                  several visible aliases [aliases: do-other-stuff, tests]\n  test_3, --test          several visible long flag aliases [aliases: --testing, --testall, --test_all]\n  test_4, -t              several visible short flag aliases [aliases: -q, -w]\n  test_5, -e, --test-hdr  all kinds of visible aliases [aliases: -r, -y, --thetests, --t4k, tests_4k]\n  help                    Print this message or the help of the given subcommand(s)\n\nArguments:\n  [NAME]  App name [default: clap] [aliases: --app-name]\n  [ENV]   Read from env var when arg is not present. [env: ENV_ARG=]\n\nOptions:\n      --verbose        log\n  -c, --config <MODE>  Speed configuration [default: fast] [possible values: fast, slow]\n  -f <FRUITS>          List of fruits [default: apple banane orange] [aliases: -b]\n  -h, --help           Print help (see more with '--help')\n  -V, --version        Print version\n\"\"\"\n"
  },
  {
    "path": "tests/ui/error_stderr.toml",
    "content": "bin.name = \"stdio-fixture\"\nargs = [\"--unknown-argument\"]\nstatus.code = 2\nstdout = \"\"\nstderr = \"\"\"\nerror: unexpected argument '--unknown-argument' found\n\n  tip: to pass '--unknown-argument' as a value, use '-- --unknown-argument'\n\nUsage: stdio-fixture[EXE] [OPTIONS] [NAME] [ENV] [COMMAND]\n\nFor more information, try '--help'.\n\"\"\"\n"
  },
  {
    "path": "tests/ui/h_flag_stdout.toml",
    "content": "bin.name = \"stdio-fixture\"\nargs = [\"-h\"]\nstatus.code = 0\nstdout = \"\"\"\nUsage: stdio-fixture[EXE] [OPTIONS] [NAME] [ENV] [COMMAND]\n\nCommands:\n  more                    \n  test                    Subcommand with one visible alias [aliases: do-stuff]\n  test_2                  several visible aliases [aliases: do-other-stuff, tests]\n  test_3, --test          several visible long flag aliases [aliases: --testing, --testall, --test_all]\n  test_4, -t              several visible short flag aliases [aliases: -q, -w]\n  test_5, -e, --test-hdr  all kinds of visible aliases [aliases: -r, -y, --thetests, --t4k, tests_4k]\n  help                    Print this message or the help of the given subcommand(s)\n\nArguments:\n  [NAME]  App name [default: clap] [aliases: --app-name]\n  [ENV]   Read from env var when arg is not present. [env: ENV_ARG=]\n\nOptions:\n      --verbose        log\n  -c, --config <MODE>  Speed configuration [default: fast] [possible values: fast, slow]\n  -f <FRUITS>          List of fruits [default: apple banane orange] [aliases: -b]\n  -h, --help           Print help (see more with '--help')\n  -V, --version        Print version\n\"\"\"\nstderr = \"\"\n"
  },
  {
    "path": "tests/ui/help_cmd_stdout.toml",
    "content": "bin.name = \"stdio-fixture\"\nargs = [\"help\"]\nstatus.code = 0\nstdout = \"\"\"\nUsage: stdio-fixture[EXE] [OPTIONS] [NAME] [ENV] [COMMAND]\n\nCommands:\n  more                    \n  test                    Subcommand with one visible alias [aliases: do-stuff]\n  test_2                  several visible aliases [aliases: do-other-stuff, tests]\n  test_3, --test          several visible long flag aliases [aliases: --testing, --testall, --test_all]\n  test_4, -t              several visible short flag aliases [aliases: -q, -w]\n  test_5, -e, --test-hdr  all kinds of visible aliases [aliases: -r, -y, --thetests, --t4k, tests_4k]\n  help                    Print this message or the help of the given subcommand(s)\n\nArguments:\n  [NAME]\n          Set the instance app name\n          \n          [default: clap]\n          [aliases: --app-name]\n\n  [ENV]\n          Read from env var when arg is not present.\n          \n          [env: ENV_ARG=]\n\nOptions:\n      --verbose\n          more log\n\n  -c, --config <MODE>\n          Speed configuration\n\n          Possible values:\n          - fast\n          - slow: slower than fast\n          \n          [default: fast]\n\n  -f <FRUITS>\n          List of fruits\n          \n          [default: apple banane orange]\n          [aliases: -b]\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\"\"\"\nstderr = \"\"\n"
  },
  {
    "path": "tests/ui/help_flag_stdout.toml",
    "content": "bin.name = \"stdio-fixture\"\nargs = [\"--help\"]\nstatus.code = 0\nstdout = \"\"\"\nUsage: stdio-fixture[EXE] [OPTIONS] [NAME] [ENV] [COMMAND]\n\nCommands:\n  more                    \n  test                    Subcommand with one visible alias [aliases: do-stuff]\n  test_2                  several visible aliases [aliases: do-other-stuff, tests]\n  test_3, --test          several visible long flag aliases [aliases: --testing, --testall, --test_all]\n  test_4, -t              several visible short flag aliases [aliases: -q, -w]\n  test_5, -e, --test-hdr  all kinds of visible aliases [aliases: -r, -y, --thetests, --t4k, tests_4k]\n  help                    Print this message or the help of the given subcommand(s)\n\nArguments:\n  [NAME]\n          Set the instance app name\n          \n          [default: clap]\n          [aliases: --app-name]\n\n  [ENV]\n          Read from env var when arg is not present.\n          \n          [env: ENV_ARG=]\n\nOptions:\n      --verbose\n          more log\n\n  -c, --config <MODE>\n          Speed configuration\n\n          Possible values:\n          - fast\n          - slow: slower than fast\n          \n          [default: fast]\n\n  -f <FRUITS>\n          List of fruits\n          \n          [default: apple banane orange]\n          [aliases: -b]\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n\"\"\"\nstderr = \"\"\n"
  },
  {
    "path": "tests/ui/version_flag_stdout.toml",
    "content": "bin.name = \"stdio-fixture\"\nargs = [\"--version\"]\nstatus.code = 0\nstdout = \"\"\"\nstdio-fixture 1.0 - a2132c\n\"\"\"\nstderr = \"\"\n"
  },
  {
    "path": "tests/ui.rs",
    "content": "#[test]\n#[cfg(feature = \"help\")]\n#[cfg(feature = \"error-context\")]\n#[cfg(feature = \"usage\")]\nfn ui_tests() {\n    let t = trycmd::TestCases::new();\n    let features = [\n        // Default\n        #[cfg(feature = \"std\")]\n        \"std\",\n        #[cfg(feature = \"color\")]\n        \"color\",\n        #[cfg(feature = \"help\")]\n        \"help\",\n        #[cfg(feature = \"usage\")]\n        \"usage\",\n        #[cfg(feature = \"error-context\")]\n        \"error-context\",\n        #[cfg(feature = \"suggestions\")]\n        \"suggestions\",\n        // Optional\n        #[cfg(feature = \"derive\")]\n        \"derive\",\n        #[cfg(feature = \"cargo\")]\n        \"cargo\",\n        #[cfg(feature = \"wrap_help\")]\n        \"wrap_help\",\n        #[cfg(feature = \"env\")]\n        \"env\",\n        #[cfg(feature = \"unicode\")]\n        \"unicode\",\n        #[cfg(feature = \"string\")]\n        \"string\",\n        // In-work\n        //#[cfg(feature = \"unstable-v5\")]  // Currently has failures\n        //\"unstable-v5\",\n    ]\n    .join(\" \");\n    t.register_bins(trycmd::cargo::compile_examples([\"--features\", &features]).unwrap());\n    t.case(\"tests/ui/*.toml\");\n}\n"
  },
  {
    "path": "typos.toml",
    "content": "files.extend-exclude = [\n  \"CHANGELOG.md\",\n  \"tests\",\n]\n[default.extend-words]\n# Acronyms\nals = \"als\"\nlits = \"lits\"\n"
  }
]