@@ -90,7 +90,10 @@ pub trait CommandExt: Sized {
90
90
self . _arg (
91
91
optional_multi_opt ( "package" , "SPEC" , package)
92
92
. 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
+ ) ) ,
94
97
)
95
98
}
96
99
@@ -99,7 +102,10 @@ pub trait CommandExt: Sized {
99
102
optional_opt ( "package" , package)
100
103
. short ( 'p' )
101
104
. 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
+ ) ) ,
103
109
)
104
110
}
105
111
@@ -1298,6 +1304,31 @@ fn get_packages() -> CargoResult<Vec<Package>> {
1298
1304
Ok ( packages)
1299
1305
}
1300
1306
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
+
1301
1332
fn new_gctx_for_completions ( ) -> CargoResult < GlobalContext > {
1302
1333
let cwd = std:: env:: current_dir ( ) ?;
1303
1334
let mut gctx = GlobalContext :: new ( shell:: Shell :: new ( ) , cwd. clone ( ) , cargo_home_with_cwd ( & cwd) ?) ;
0 commit comments