Skip to content

Commit 2bac0b6

Browse files
committed
feat: Add custom completer for completing cargo build --packge <TAB> / cargo tree --package <TAB>
1 parent 845bb8b commit 2bac0b6

File tree

1 file changed

+38
-2
lines changed

1 file changed

+38
-2
lines changed

src/cargo/util/command_prelude.rs

+38-2
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,18 @@ pub trait CommandExt: Sized {
8989
}
9090

9191
fn arg_package_spec_simple(self, package: &'static str) -> Self {
92+
let name = self._name();
9293
self._arg(
9394
optional_multi_opt("package", "SPEC", package)
9495
.short('p')
95-
.help_heading(heading::PACKAGE_SELECTION),
96+
.help_heading(heading::PACKAGE_SELECTION)
97+
.add(clap_complete::ArgValueCandidates::new(move || {
98+
if ["build", "tree"].contains(&name.as_str()) {
99+
get_ws_member_candidates()
100+
} else {
101+
vec![]
102+
}
103+
})),
96104
)
97105
}
98106

@@ -101,7 +109,10 @@ pub trait CommandExt: Sized {
101109
optional_opt("package", package)
102110
.short('p')
103111
.value_name("SPEC")
104-
.help_heading(heading::PACKAGE_SELECTION),
112+
.help_heading(heading::PACKAGE_SELECTION)
113+
.add(clap_complete::ArgValueCandidates::new(
114+
get_ws_member_candidates,
115+
)),
105116
)
106117
}
107118

@@ -1304,6 +1315,31 @@ fn get_packages() -> CargoResult<Vec<Package>> {
13041315
Ok(packages)
13051316
}
13061317

1318+
fn get_ws_member_candidates() -> Vec<clap_complete::CompletionCandidate> {
1319+
get_ws_member_packages()
1320+
.unwrap_or_default()
1321+
.into_iter()
1322+
.map(|pkg| {
1323+
clap_complete::CompletionCandidate::new(pkg.name().as_str()).help(
1324+
pkg.manifest()
1325+
.metadata()
1326+
.description
1327+
.to_owned()
1328+
.map(From::from),
1329+
)
1330+
})
1331+
.collect::<Vec<_>>()
1332+
}
1333+
1334+
fn get_ws_member_packages() -> CargoResult<Vec<Package>> {
1335+
let gctx = new_gctx_for_completions()?;
1336+
let ws = Workspace::new(&find_root_manifest_for_wd(gctx.cwd())?, &gctx)?;
1337+
1338+
let packages = ws.members().map(|pkg| pkg.to_owned()).collect::<Vec<_>>();
1339+
1340+
Ok(packages)
1341+
}
1342+
13071343
fn new_gctx_for_completions() -> CargoResult<GlobalContext> {
13081344
let cwd = std::env::current_dir()?;
13091345
let mut gctx = GlobalContext::new(shell::Shell::new(), cwd.clone(), cargo_home_with_cwd(&cwd)?);

0 commit comments

Comments
 (0)