Skip to content

Commit 869064b

Browse files
committed
feat: Add custom completer for completing cargo build --packge <TAB>
1 parent 9d66d13 commit 869064b

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

src/cargo/util/command_prelude.rs

+33-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,10 @@ pub trait CommandExt: Sized {
9090
self._arg(
9191
optional_multi_opt("package", "SPEC", package)
9292
.short('p')
93-
.help_heading(heading::PACKAGE_SELECTION),
93+
.help_heading(heading::PACKAGE_SELECTION)
94+
.add(clap_complete::ArgValueCandidates::new(
95+
get_ws_member_candidates,
96+
)),
9497
)
9598
}
9699

@@ -99,7 +102,10 @@ pub trait CommandExt: Sized {
99102
optional_opt("package", package)
100103
.short('p')
101104
.value_name("SPEC")
102-
.help_heading(heading::PACKAGE_SELECTION),
105+
.help_heading(heading::PACKAGE_SELECTION)
106+
.add(clap_complete::ArgValueCandidates::new(
107+
get_ws_member_candidates,
108+
)),
103109
)
104110
}
105111

@@ -1298,6 +1304,31 @@ fn get_packages() -> CargoResult<Vec<Package>> {
12981304
Ok(packages)
12991305
}
13001306

1307+
fn get_ws_member_candidates() -> Vec<clap_complete::CompletionCandidate> {
1308+
get_ws_member_packages()
1309+
.unwrap_or_default()
1310+
.into_iter()
1311+
.map(|pkg| {
1312+
clap_complete::CompletionCandidate::new(pkg.name().as_str()).help(
1313+
pkg.manifest()
1314+
.metadata()
1315+
.description
1316+
.to_owned()
1317+
.map(From::from),
1318+
)
1319+
})
1320+
.collect::<Vec<_>>()
1321+
}
1322+
1323+
fn get_ws_member_packages() -> CargoResult<Vec<Package>> {
1324+
let gctx = new_gctx_for_completions()?;
1325+
let ws = Workspace::new(&find_root_manifest_for_wd(gctx.cwd())?, &gctx)?;
1326+
1327+
let packages = ws.members().map(|pkg| pkg.to_owned()).collect::<Vec<_>>();
1328+
1329+
Ok(packages)
1330+
}
1331+
13011332
fn new_gctx_for_completions() -> CargoResult<GlobalContext> {
13021333
let cwd = std::env::current_dir()?;
13031334
let mut gctx = GlobalContext::new(shell::Shell::new(), cwd.clone(), cargo_home_with_cwd(&cwd)?);

0 commit comments

Comments
 (0)