diff --git a/src/cargo/util/command_prelude.rs b/src/cargo/util/command_prelude.rs index 7538089b06a..6bb219bcf23 100644 --- a/src/cargo/util/command_prelude.rs +++ b/src/cargo/util/command_prelude.rs @@ -188,7 +188,10 @@ pub trait CommandExt: Sized { ._arg(flag("examples", examples).help_heading(heading::TARGET_SELECTION)) ._arg( optional_multi_opt("example", "NAME", example) - .help_heading(heading::TARGET_SELECTION), + .help_heading(heading::TARGET_SELECTION) + .add(clap_complete::ArgValueCandidates::new( + get_example_candidates, + )), ) } @@ -206,7 +209,11 @@ pub trait CommandExt: Sized { ) ._arg(flag("bins", bins).help_heading(heading::TARGET_SELECTION)) ._arg( - optional_multi_opt("example", "NAME", example).help_heading(heading::TARGET_SELECTION), + optional_multi_opt("example", "NAME", example) + .help_heading(heading::TARGET_SELECTION) + .add(clap_complete::ArgValueCandidates::new( + get_example_candidates, + )), ) ._arg(flag("examples", examples).help_heading(heading::TARGET_SELECTION)) } @@ -218,7 +225,11 @@ pub trait CommandExt: Sized { .add(clap_complete::ArgValueCandidates::new(get_bin_candidates)), ) ._arg( - optional_multi_opt("example", "NAME", example).help_heading(heading::TARGET_SELECTION), + optional_multi_opt("example", "NAME", example) + .help_heading(heading::TARGET_SELECTION) + .add(clap_complete::ArgValueCandidates::new( + get_example_candidates, + )), ) } @@ -1048,6 +1059,17 @@ pub fn lockfile_path( return Ok(Some(path)); } +fn get_example_candidates() -> Vec { + get_targets_from_metadata() + .unwrap_or_default() + .into_iter() + .filter_map(|target| match target.kind() { + TargetKind::ExampleBin => Some(clap_complete::CompletionCandidate::new(target.name())), + _ => None, + }) + .collect::>() +} + fn get_bench_candidates() -> Vec { get_targets_from_metadata() .unwrap_or_default()