clap-rs / clap

A full featured, fast Command Line Argument Parser for Rust
docs.rs/clap
Apache License 2.0
13.64k stars 1.02k forks source link

Clap complete dynamic doesn't work with `ValueEnum` in args #5498

Closed HKalbasi closed 1 month ago

HKalbasi commented 1 month ago

Please complete the following tasks

Rust Version

1.76

Clap Version

4.5.2

Minimal reproducible code

use clap::{CommandFactory, Parser, ValueEnum};

#[derive(Debug, Parser)]
#[command(version, about, long_about = None)]
struct Cli {
    /// What mode to run the program in
    #[arg(short, long, value_enum)]
    mode: Mode,
}

#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
enum Mode {
    /// Run swiftly
    Fast,
    /// Crawl slowly but steadily
    ///
    /// This paragraph is ignored because there is no long help text for possible values.
    Slow,
}
fn main() {
    let mut cmd = Cli::command();
    let args = std::env::args_os().collect::<Vec<_>>();
    let arg_index = args.len() - 1;
    let r = clap_complete::dynamic::complete(&mut cmd, args, arg_index, None).unwrap();
    dbg!(r);
}

Steps to reproduce the bug with the above code

cargo run -- --mode fa

Actual Behaviour

The output is:

[src/main.rs:25:5] r = []

Expected Behaviour

The output should be:

[src/main.rs:25:5] r = [
    (
        "fast",
        Some(
            StyledStr(
                "Run swiftly",
            ),
        ),
    ),
]

Additional Context

No response

Debug Output

[clap_builder::builder::command]Command::_build: name="clap-test"
[clap_builder::builder::command]Command::_propagate:clap-test
[clap_builder::builder::command]Command::_check_help_and_version:clap-test expand_help_tree=true
[clap_builder::builder::command]Command::long_help_exists
[clap_builder::builder::command]Command::_check_help_and_version: Building default --help
[clap_builder::builder::command]Command::_check_help_and_version: Building default --version
[clap_builder::builder::command]Command::_propagate_global_args:clap-test
[clap_builder::builder::debug_asserts]Command::_debug_asserts
[clap_builder::builder::debug_asserts]Arg::_debug_asserts:mode
[clap_builder::builder::debug_asserts]Arg::_debug_asserts:help
[clap_builder::builder::debug_asserts]Arg::_debug_asserts:version
[clap_builder::builder::debug_asserts]Command::_verify_positionals
[clap_builder::builder::command]Command::_build_bin_names
[ clap_builder::output::usage]Usage::get_required_usage_from: incls=[], matcher=false, incl_last=true
[ clap_builder::output::usage]Usage::get_required_usage_from: unrolled_reqs=["mode"]
[ clap_builder::output::usage]Usage::get_required_usage_from:iter:"mode" arg is_present=false
[ clap_builder::output::usage]Usage::get_required_usage_from: ret_val=[StyledStr("\u{1b}[1m--mode\u{1b}[0m <MODE>")]
[clap_complete::dynamic::completer]     complete::next: Begin parsing '"--mode"'
[clap_complete::dynamic::completer]     complete_arg: arg=ParsedArg { inner: "fa" }, cmd="clap-test", current_dir=None, pos_index=1, is_escaped=false
[clap_complete::dynamic::completer]     complete_subcommand: cmd="clap-test", value="fa"
[clap_complete::dynamic::completer]     subcommands: name=clap-test
[clap_complete::dynamic::completer]     subcommands: Has subcommands...false
HKalbasi commented 1 month ago

Ah, this is duplicate of #3920, sorry for noise.