Skip to content

Commit 1aaae04

Browse files
committed
feat: Add custom completer for completing cargo build --packge <TAB>
1 parent 75ab4e5 commit 1aaae04

File tree

1 file changed

+27
-3
lines changed

1 file changed

+27
-3
lines changed

src/cargo/util/command_prelude.rs

+27-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::core::compiler::{BuildConfig, MessageFormat, TimingOutput};
22
use crate::core::resolver::CliFeatures;
3-
use crate::core::{shell, Edition, Target, TargetKind, Workspace};
3+
use crate::core::{shell, Edition, Package, Target, TargetKind, Workspace};
44
use crate::ops::lockfile::LOCKFILE_NAME;
55
use crate::ops::registry::RegistryOrIndex;
66
use crate::ops::{CompileFilter, CompileOptions, NewOptions, Packages, VersionControl};
@@ -86,7 +86,10 @@ pub trait CommandExt: Sized {
8686
self._arg(
8787
optional_multi_opt("package", "SPEC", package)
8888
.short('p')
89-
.help_heading(heading::PACKAGE_SELECTION),
89+
.help_heading(heading::PACKAGE_SELECTION)
90+
.add(clap_complete::ArgValueCandidates::new(
91+
get_package_candidates,
92+
)),
9093
)
9194
}
9295

@@ -95,7 +98,10 @@ pub trait CommandExt: Sized {
9598
optional_opt("package", package)
9699
.short('p')
97100
.value_name("SPEC")
98-
.help_heading(heading::PACKAGE_SELECTION),
101+
.help_heading(heading::PACKAGE_SELECTION)
102+
.add(clap_complete::ArgValueCandidates::new(
103+
get_package_candidates,
104+
)),
99105
)
100106
}
101107

@@ -1067,6 +1073,24 @@ fn get_targets_from_metadata() -> CargoResult<Vec<Target>> {
10671073
Ok(targets)
10681074
}
10691075

1076+
fn get_package_candidates() -> Vec<clap_complete::CompletionCandidate> {
1077+
get_packages_from_metadata()
1078+
.unwrap_or_default()
1079+
.into_iter()
1080+
.map(|pkg| clap_complete::CompletionCandidate::new(pkg.name().as_str()))
1081+
.collect::<Vec<_>>()
1082+
}
1083+
1084+
fn get_packages_from_metadata() -> CargoResult<Vec<Package>> {
1085+
let cwd = std::env::current_dir()?;
1086+
let gctx = GlobalContext::new(shell::Shell::new(), cwd.clone(), cargo_home_with_cwd(&cwd)?);
1087+
let ws = Workspace::new(&find_root_manifest_for_wd(&cwd)?, &gctx)?;
1088+
1089+
let packages = ws.members().map(|pkg| pkg.clone()).collect::<Vec<_>>();
1090+
1091+
Ok(packages)
1092+
}
1093+
10701094
#[track_caller]
10711095
pub fn ignore_unknown<T: Default>(r: Result<T, clap::parser::MatchesError>) -> T {
10721096
match r {

0 commit comments

Comments
 (0)