@@ -171,15 +171,15 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
171
171
if group. required {
172
172
self . required . push ( group. name . into ( ) ) ;
173
173
if let Some ( ref reqs) = group. requires {
174
- self . required . extend ( reqs) ;
174
+ self . required . extend_from_slice ( reqs) ;
175
175
}
176
176
if let Some ( ref bl) = group. conflicts {
177
- self . blacklist . extend ( bl) ;
177
+ self . blacklist . extend_from_slice ( bl) ;
178
178
}
179
179
}
180
180
let mut found = false ;
181
181
if let Some ( ref mut grp) = self . groups . get_mut ( & group. name ) {
182
- grp. args . extend ( & group. args ) ;
182
+ grp. args . extend_from_slice ( & group. args ) ;
183
183
grp. requires = group. requires . clone ( ) ;
184
184
grp. conflicts = group. conflicts . clone ( ) ;
185
185
grp. required = group. required ;
@@ -216,6 +216,7 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
216
216
self . required . iter ( )
217
217
}
218
218
219
+ #[ cfg_attr( feature = "lints" , allow( for_kv_map) ) ]
219
220
pub fn get_required_from ( & self ,
220
221
reqs : & [ & ' a str ] ,
221
222
matcher : Option < & ArgMatcher < ' a > > )
@@ -535,6 +536,7 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
535
536
}
536
537
}
537
538
539
+ try!( self . add_defaults ( matcher) ) ;
538
540
try!( self . validate_blacklist ( matcher) ) ;
539
541
try!( self . validate_num_args ( matcher) ) ;
540
542
matcher. usage ( self . create_usage ( & [ ] ) ) ;
@@ -730,13 +732,9 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
730
732
let mut args = vec ! [ ] ;
731
733
732
734
for n in & self . groups . get ( group) . unwrap ( ) . args {
733
- if self . flags . iter ( ) . any ( |f| & f. name == n) {
734
- args. push ( * n) ;
735
- } else if self . opts . iter ( ) . any ( |o| & o. name == n) {
736
- args. push ( * n) ;
737
- } else if self . groups . contains_key ( & * * n) {
735
+ if self . groups . contains_key ( & * n) {
738
736
g_vec. push ( * n) ;
739
- } else if self . positionals . values ( ) . any ( |p| & p . name == n ) {
737
+ } else {
740
738
args. push ( * n) ;
741
739
}
742
740
}
@@ -1237,11 +1235,10 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1237
1235
fn _validate_blacklist_required < A > ( & self , a : & A , matcher : & ArgMatcher ) -> bool where A : AnyArg < ' a , ' b > {
1238
1236
if let Some ( bl) = a. blacklist ( ) {
1239
1237
for n in bl. iter ( ) {
1240
- if matcher. contains ( n) {
1241
- return true ;
1242
- } else if self . groups
1243
- . get ( n)
1244
- . map_or ( false , |g| g. args . iter ( ) . any ( |an| matcher. contains ( an) ) ) {
1238
+ if matcher. contains ( n)
1239
+ || self . groups
1240
+ . get ( n)
1241
+ . map_or ( false , |g| g. args . iter ( ) . any ( |an| matcher. contains ( an) ) ) {
1245
1242
return true ;
1246
1243
}
1247
1244
}
@@ -1262,13 +1259,13 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1262
1259
. filter ( |o| o. long . is_some ( ) && o. long . unwrap ( ) == name)
1263
1260
. next ( ) {
1264
1261
self . groups_for_arg ( & * opt. name ) . and_then ( |grps| Some ( matcher. inc_occurrences_of ( & * grps) ) ) ;
1265
- matcher. insert ( & * opt. name . clone ( ) ) ;
1262
+ matcher. insert ( & * opt. name ) ;
1266
1263
} else if let Some ( flg) = self . flags
1267
1264
. iter ( )
1268
1265
. filter ( |f| f. long . is_some ( ) && f. long . unwrap ( ) == name)
1269
1266
. next ( ) {
1270
1267
self . groups_for_arg ( & * flg. name ) . and_then ( |grps| Some ( matcher. inc_occurrences_of ( & * grps) ) ) ;
1271
- matcher. insert ( & * flg. name . clone ( ) ) ;
1268
+ matcher. insert ( & * flg. name ) ;
1272
1269
}
1273
1270
}
1274
1271
@@ -1340,7 +1337,7 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1340
1337
// args, and requirements
1341
1338
fn smart_usage ( & self , usage : & mut String , used : & [ & str ] ) {
1342
1339
let mut hs: Vec < & str > = self . required ( ) . map ( |s| & * * s) . collect ( ) ;
1343
- hs. extend ( used) ;
1340
+ hs. extend_from_slice ( used) ;
1344
1341
let r_string = self . get_required_from ( & hs, None )
1345
1342
. iter ( )
1346
1343
. fold ( String :: new ( ) , |acc, s| acc + & format ! ( " {}" , s) [ ..] ) ;
@@ -1378,6 +1375,7 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1378
1375
self . write_help ( & mut buf_w)
1379
1376
}
1380
1377
1378
+ #[ cfg_attr( feature = "lints" , allow( for_kv_map) ) ]
1381
1379
pub fn write_help < W : Write > ( & self , w : & mut W ) -> ClapResult < ( ) > {
1382
1380
if let Some ( h) = self . meta . help_str {
1383
1381
return writeln ! ( w, "{}" , h) . map_err ( Error :: from) ;
@@ -1465,19 +1463,21 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1465
1463
} else {
1466
1464
if flags {
1467
1465
try!( write ! ( w, "\n FLAGS:\n " ) ) ;
1468
- for ( _ , f ) in self . flags . iter ( )
1466
+ for f in self . flags . iter ( )
1469
1467
. filter ( |f| !f. settings . is_set ( ArgSettings :: Hidden ) )
1470
1468
. map ( |f| ( f. name , f) )
1471
- . collect :: < BTreeMap < _ , _ > > ( ) {
1469
+ . collect :: < BTreeMap < _ , _ > > ( )
1470
+ . values ( ) {
1472
1471
try!( f. write_help ( w, tab, longest) ) ;
1473
1472
}
1474
1473
}
1475
1474
if opts {
1476
1475
try!( write ! ( w, "\n OPTIONS:\n " ) ) ;
1477
- for ( _ , o ) in self . opts . iter ( )
1476
+ for o in self . opts . iter ( )
1478
1477
. filter ( |o| !o. settings . is_set ( ArgSettings :: Hidden ) )
1479
1478
. map ( |o| ( o. name , o) )
1480
- . collect :: < BTreeMap < _ , _ > > ( ) {
1479
+ . collect :: < BTreeMap < _ , _ > > ( )
1480
+ . values ( ) {
1481
1481
try!( o. write_help ( w, tab, longest_opt, self . is_set ( AppSettings :: HidePossibleValuesInHelp ) ) ) ;
1482
1482
}
1483
1483
}
@@ -1518,4 +1518,22 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1518
1518
}
1519
1519
w. flush ( ) . map_err ( Error :: from)
1520
1520
}
1521
+
1522
+ fn add_defaults ( & mut self , matcher : & mut ArgMatcher < ' a > ) -> ClapResult < ( ) > {
1523
+ macro_rules! add_val {
1524
+ ( $_self: ident, $a: ident, $m: ident) => {
1525
+ if $m. get( $a. name) . is_none( ) {
1526
+ try!( $_self. add_val_to_arg( $a, OsStr :: new( $a. default_val. as_ref( ) . unwrap( ) ) , $m) ) ;
1527
+ arg_post_processing!( $_self, $a, $m) ;
1528
+ }
1529
+ } ;
1530
+ }
1531
+ for o in self . opts . iter ( ) . filter ( |o| o. default_val . is_some ( ) ) {
1532
+ add_val ! ( self , o, matcher) ;
1533
+ }
1534
+ for p in self . positionals . values ( ) . filter ( |p| p. default_val . is_some ( ) ) {
1535
+ add_val ! ( self , p, matcher) ;
1536
+ }
1537
+ Ok ( ( ) )
1538
+ }
1521
1539
}
0 commit comments