1
1
use crate :: core:: compiler:: { BuildConfig , MessageFormat , TimingOutput } ;
2
2
use crate :: core:: resolver:: CliFeatures ;
3
- use crate :: core:: { shell, Edition , Target , TargetKind , Workspace } ;
3
+ use crate :: core:: { shell, Edition , Package , Target , TargetKind , Workspace } ;
4
4
use crate :: ops:: lockfile:: LOCKFILE_NAME ;
5
5
use crate :: ops:: registry:: RegistryOrIndex ;
6
6
use crate :: ops:: { CompileFilter , CompileOptions , NewOptions , Packages , VersionControl } ;
@@ -86,7 +86,10 @@ pub trait CommandExt: Sized {
86
86
self . _arg (
87
87
optional_multi_opt ( "package" , "SPEC" , package)
88
88
. 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
+ ) ) ,
90
93
)
91
94
}
92
95
@@ -95,7 +98,10 @@ pub trait CommandExt: Sized {
95
98
optional_opt ( "package" , package)
96
99
. short ( 'p' )
97
100
. 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
+ ) ) ,
99
105
)
100
106
}
101
107
@@ -1067,6 +1073,24 @@ fn get_targets_from_metadata() -> CargoResult<Vec<Target>> {
1067
1073
Ok ( targets)
1068
1074
}
1069
1075
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
+
1070
1094
#[ track_caller]
1071
1095
pub fn ignore_unknown < T : Default > ( r : Result < T , clap:: parser:: MatchesError > ) -> T {
1072
1096
match r {
0 commit comments