@@ -15,17 +15,22 @@ pub type App = clap::App<'static, 'static>;
15
15
pub trait AppExt : Sized {
16
16
fn _arg ( self , arg : Arg < ' static , ' static > ) -> Self ;
17
17
18
- fn arg_package ( self , package : & ' static str , all : & ' static str , exclude : & ' static str ) -> Self {
19
- self . _arg (
20
- opt ( "package" , package)
21
- . short ( "p" )
22
- . value_name ( "SPEC" )
23
- . multiple ( true ) ,
24
- ) . _arg ( opt ( "all" , all) )
25
- . _arg ( opt ( "exclude" , exclude) . value_name ( "SPEC" ) . multiple ( true ) )
18
+ fn arg_package_spec (
19
+ self ,
20
+ package : & ' static str ,
21
+ all : & ' static str ,
22
+ exclude : & ' static str ,
23
+ ) -> Self {
24
+ self . arg_package_spec_simple ( package)
25
+ . _arg ( opt ( "all" , all) )
26
+ . _arg ( multi_opt ( "exclude" , "SPEC" , exclude) )
26
27
}
27
28
28
- fn arg_single_package ( self , package : & ' static str ) -> Self {
29
+ fn arg_package_spec_simple ( self , package : & ' static str ) -> Self {
30
+ self . _arg ( multi_opt ( "package" , "SPEC" , package) . short ( "p" ) )
31
+ }
32
+
33
+ fn arg_package ( self , package : & ' static str ) -> Self {
29
34
self . _arg ( opt ( "package" , package) . short ( "p" ) . value_name ( "SPEC" ) )
30
35
}
31
36
@@ -51,18 +56,18 @@ pub trait AppExt: Sized {
51
56
all : & ' static str ,
52
57
) -> Self {
53
58
self . arg_targets_lib_bin ( lib, bin, bins)
54
- . _arg ( opt ( "example" , examle ) . value_name ( "NAME" ) . multiple ( true ) )
59
+ . _arg ( multi_opt ( "example" , "NAME" , examle ) )
55
60
. _arg ( opt ( "examples" , examles) )
56
- . _arg ( opt ( "test" , test ) . value_name ( "NAME" ) . multiple ( true ) )
61
+ . _arg ( multi_opt ( "test" , "NAME" , test ) )
57
62
. _arg ( opt ( "tests" , tests) )
58
- . _arg ( opt ( "bench" , bench ) . value_name ( "NAME" ) . multiple ( true ) )
63
+ . _arg ( multi_opt ( "bench" , "NAME" , bench ) )
59
64
. _arg ( opt ( "benches" , benchs) )
60
65
. _arg ( opt ( "all-targets" , all) )
61
66
}
62
67
63
68
fn arg_targets_lib_bin ( self , lib : & ' static str , bin : & ' static str , bins : & ' static str ) -> Self {
64
69
self . _arg ( opt ( "lib" , lib) )
65
- . _arg ( opt ( "bin" , bin ) . value_name ( "NAME" ) . multiple ( true ) )
70
+ . _arg ( multi_opt ( "bin" , "NAME" , bin ) )
66
71
. _arg ( opt ( "bins" , bins) )
67
72
}
68
73
@@ -73,15 +78,15 @@ pub trait AppExt: Sized {
73
78
example : & ' static str ,
74
79
examples : & ' static str ,
75
80
) -> Self {
76
- self . _arg ( opt ( "bin" , bin ) . value_name ( "NAME" ) . multiple ( true ) )
81
+ self . _arg ( multi_opt ( "bin" , "NAME" , bin ) )
77
82
. _arg ( opt ( "bins" , bins) )
78
- . _arg ( opt ( "example" , example ) . value_name ( "NAME" ) . multiple ( true ) )
83
+ . _arg ( multi_opt ( "example" , "NAME" , example ) )
79
84
. _arg ( opt ( "examples" , examples) )
80
85
}
81
86
82
87
fn arg_targets_bin_example ( self , bin : & ' static str , example : & ' static str ) -> Self {
83
- self . _arg ( opt ( "bin" , bin ) . value_name ( "NAME" ) . multiple ( true ) )
84
- . _arg ( opt ( "example" , example ) . value_name ( "NAME" ) . multiple ( true ) )
88
+ self . _arg ( multi_opt ( "bin" , "NAME" , bin ) )
89
+ . _arg ( multi_opt ( "example" , "NAME" , example ) )
85
90
}
86
91
87
92
fn arg_features ( self ) -> Self {
@@ -157,6 +162,21 @@ pub fn opt(name: &'static str, help: &'static str) -> Arg<'static, 'static> {
157
162
Arg :: with_name ( name) . long ( name) . help ( help)
158
163
}
159
164
165
+ pub fn multi_opt (
166
+ name : & ' static str ,
167
+ value_name : & ' static str ,
168
+ help : & ' static str ,
169
+ ) -> Arg < ' static , ' static > {
170
+ // Note that all `.multiple(true)` arguments in Cargo should specify
171
+ // `.number_of_values(1)` as well, so that `--foo val1 val2` is
172
+ // **not** parsed as `foo` with values ["val1", "val2"].
173
+ // `number_of_values` should become the default in clap 3.
174
+ opt ( name, help)
175
+ . value_name ( value_name)
176
+ . multiple ( true )
177
+ . number_of_values ( 1 )
178
+ }
179
+
160
180
pub fn subcommand ( name : & ' static str ) -> App {
161
181
SubCommand :: with_name ( name) . settings ( & [
162
182
AppSettings :: UnifiedHelpMessage ,
0 commit comments