@@ -72,8 +72,7 @@ pub struct App<'a, 'v, 'ab, 'u, 'h, 'ar> {
72
72
// A list of possible options
73
73
opts : BTreeMap < & ' ar str , OptBuilder < ' ar > > ,
74
74
// A list of positional arguments
75
- positionals_idx : VecMap < PosBuilder < ' ar > > ,
76
- positionals_name : HashMap < & ' ar str , usize > ,
75
+ positionals : VecMap < PosBuilder < ' ar > > ,
77
76
// A list of subcommands
78
77
subcommands : BTreeMap < String , App < ' a , ' v , ' ab , ' u , ' h , ' ar > > ,
79
78
help_short : Option < char > ,
@@ -115,8 +114,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
115
114
version : None ,
116
115
flags : BTreeMap :: new ( ) ,
117
116
opts : BTreeMap :: new ( ) ,
118
- positionals_idx : VecMap :: new ( ) ,
119
- positionals_name : HashMap :: new ( ) ,
117
+ positionals : VecMap :: new ( ) ,
120
118
subcommands : BTreeMap :: new ( ) ,
121
119
help_short : None ,
122
120
version_short : None ,
@@ -734,7 +732,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
734
732
// actually adds the arguments
735
733
fn add_arg ( & mut self , a : Arg < ' ar , ' ar , ' ar , ' ar , ' ar , ' ar > ) {
736
734
if self . flags . contains_key ( a. name ) || self . opts . contains_key ( a. name ) ||
737
- self . positionals_name . contains_key ( a. name ) {
735
+ self . positionals . values ( ) . any ( |p| p . name == a. name ) {
738
736
panic ! ( "Argument name must be unique\n \n \t \" {}\" is already in use" ,
739
737
a. name) ;
740
738
}
@@ -768,19 +766,19 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
768
766
}
769
767
if a. index . is_some ( ) || ( a. short . is_none ( ) && a. long . is_none ( ) ) {
770
768
let i = if a. index . is_none ( ) {
771
- ( self . positionals_idx . len ( ) + 1 )
769
+ ( self . positionals . len ( ) + 1 )
772
770
} else {
773
771
a. index . unwrap ( ) as usize
774
772
} ;
775
- if self . positionals_idx . contains_key ( & i) {
773
+ if self . positionals . contains_key ( & i) {
776
774
panic ! ( "Argument \" {}\" has the same index as another positional \
777
775
argument\n \n \t Perhaps try .multiple(true) to allow one positional argument \
778
776
to take multiple values",
779
777
a. name) ;
780
778
}
781
779
let pb = PosBuilder :: from_arg ( & a, i as u8 , & mut self . required ) ;
782
- self . positionals_name . insert ( pb. name , i) ;
783
- self . positionals_idx . insert ( i, pb) ;
780
+ // self.positionals_name.insert(pb.name, i);
781
+ self . positionals . insert ( i, pb) ;
784
782
} else if a. takes_value {
785
783
let ob = OptBuilder :: from_arg ( & a, & mut self . required ) ;
786
784
self . opts . insert ( ob. name , ob) ;
@@ -1064,7 +1062,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1064
1062
// If it's required we also need to ensure all previous positionals are
1065
1063
// required too
1066
1064
let mut found = false ;
1067
- for p in self . positionals_idx . values ( ) . rev ( ) {
1065
+ for p in self . positionals . values ( ) . rev ( ) {
1068
1066
if found {
1069
1067
reqs. push ( p. name ) ;
1070
1068
continue ;
@@ -1092,15 +1090,15 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1092
1090
1093
1091
// places a '--' in the usage string if there are args and options
1094
1092
// supporting multiple values
1095
- if !self . positionals_idx . is_empty ( ) &&
1093
+ if !self . positionals . is_empty ( ) &&
1096
1094
( self . opts . values ( ) . any ( |a| a. settings . is_set ( & ArgSettings :: Multiple ) ) ||
1097
- self . positionals_idx . values ( ) . any ( |a| a. settings . is_set ( & ArgSettings :: Multiple ) ) ) &&
1095
+ self . positionals . values ( ) . any ( |a| a. settings . is_set ( & ArgSettings :: Multiple ) ) ) &&
1098
1096
!self . opts . values ( ) . any ( |a| a. settings . is_set ( & ArgSettings :: Required ) ) &&
1099
1097
self . subcommands . is_empty ( ) {
1100
1098
usage. push_str ( " [--]" )
1101
1099
}
1102
- if !self . positionals_idx . is_empty ( ) &&
1103
- self . positionals_idx
1100
+ if !self . positionals . is_empty ( ) &&
1101
+ self . positionals
1104
1102
. values ( )
1105
1103
. any ( |a| !a. settings . is_set ( & ArgSettings :: Required ) ) {
1106
1104
usage. push_str ( " [ARGS]" ) ;
@@ -1156,7 +1154,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1156
1154
& self . bin_name. as_ref( ) . unwrap_or( & self . name) [ ..] . replace( " " , "-" ) ,
1157
1155
self . version. unwrap_or( "" ) ) ) ;
1158
1156
let flags = !self . flags . is_empty ( ) ;
1159
- let pos = !self . positionals_idx . is_empty ( ) ;
1157
+ let pos = !self . positionals . is_empty ( ) ;
1160
1158
let opts = !self . opts . is_empty ( ) ;
1161
1159
let subcmds = !self . subcommands . is_empty ( ) ;
1162
1160
let unified_help = self . settings . is_set ( & AppSettings :: UnifiedHelpMessage ) ;
@@ -1180,7 +1178,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1180
1178
}
1181
1179
}
1182
1180
let mut longest_pos = 0 ;
1183
- for pl in self . positionals_idx
1181
+ for pl in self . positionals
1184
1182
. values ( )
1185
1183
. filter ( |p| !p. settings . is_set ( & ArgSettings :: Hidden ) )
1186
1184
. map ( |f| f. to_string ( ) . len ( ) ) {
@@ -1267,7 +1265,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1267
1265
}
1268
1266
if pos {
1269
1267
try!( write ! ( w, "\n ARGS:\n " ) ) ;
1270
- for v in self . positionals_idx
1268
+ for v in self . positionals
1271
1269
. values ( )
1272
1270
. filter ( |p| !p. settings . is_set ( & ArgSettings :: Hidden ) ) {
1273
1271
try!( v. write_help ( w, tab, longest_pos) ) ;
@@ -1852,12 +1850,12 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1852
1850
1853
1851
// Did the developer even define any valid positionals? Since we reached this
1854
1852
// far, it's not a subcommand
1855
- if self . positionals_idx . is_empty ( ) {
1853
+ if self . positionals . is_empty ( ) {
1856
1854
return Err ( error_builder:: UnexpectedArgument (
1857
1855
arg_slice,
1858
1856
self . bin_name . as_ref ( ) . unwrap_or ( & self . name ) ,
1859
1857
& * self . create_current_usage ( matches) ) ) ;
1860
- } else if let Some ( p) = self . positionals_idx . get ( & pos_counter) {
1858
+ } else if let Some ( p) = self . positionals . get ( & pos_counter) {
1861
1859
// Make sure this one doesn't conflict with anything
1862
1860
if self . blacklist . contains ( & p. name ) {
1863
1861
return Err ( error_builder:: ArgumentConflict (
@@ -1902,7 +1900,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1902
1900
1903
1901
if !pos_only &&
1904
1902
( self . settings . is_set ( & AppSettings :: TrailingVarArg ) &&
1905
- pos_counter == self . positionals_idx . len ( ) ) {
1903
+ pos_counter == self . positionals . len ( ) ) {
1906
1904
pos_only = true ;
1907
1905
}
1908
1906
} else {
@@ -1912,9 +1910,9 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1912
1910
// Was an update made, or is this the first occurrence?
1913
1911
if !done {
1914
1912
if self . overrides . contains ( & p. name ) {
1915
- if let Some ( name) = self . overriden_from ( p. name , matches) {
1916
- matches. args . remove ( & * name) ;
1917
- remove_overriden ! ( self , & * name) ;
1913
+ if let Some ( ref name) = self . overriden_from ( p. name , matches) {
1914
+ matches. args . remove ( name) ;
1915
+ remove_overriden ! ( self , name) ;
1918
1916
}
1919
1917
}
1920
1918
if let Some ( ref or) = p. overrides {
@@ -2013,7 +2011,9 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2013
2011
}
2014
2012
} else {
2015
2013
return Err ( error_builder:: EmptyValue (
2016
- & * format ! ( "{}" , self . positionals_idx. get( self . positionals_name. get( a) . unwrap( ) )
2014
+ & * format ! ( "{}" , self . positionals. values( )
2015
+ . filter( |p| & p. name == a)
2016
+ . next( )
2017
2017
. unwrap( ) ) ,
2018
2018
& * self . create_current_usage ( matches)
2019
2019
) ) ;
@@ -2148,12 +2148,10 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2148
2148
. filter ( |k| {
2149
2149
if let Some ( o) = self . opts . get ( * k) {
2150
2150
!o. settings . is_set ( & ArgSettings :: Required )
2151
- } else if let Some ( p) = self . positionals_name . get ( * k) {
2152
- if let Some ( p) = self . positionals_idx . get ( p) {
2151
+ } else if let Some ( p) = self . positionals . values ( )
2152
+ . filter ( |p| & & p. name == k)
2153
+ . next ( ) {
2153
2154
!p. settings . is_set ( & ArgSettings :: Required )
2154
- } else {
2155
- true
2156
- }
2157
2155
} else {
2158
2156
true
2159
2157
}
@@ -2194,10 +2192,10 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2194
2192
} else if self . groups . contains_key ( n) {
2195
2193
g_vec. push ( * n) ;
2196
2194
} else {
2197
- if let Some ( idx ) = self . positionals_name . get ( n ) {
2198
- if let Some ( p ) = self . positionals_idx . get ( & idx ) {
2199
- args . push ( p . to_string ( ) ) ;
2200
- }
2195
+ if let Some ( p ) = self . positionals . values ( )
2196
+ . filter ( |p| & p . name == n )
2197
+ . next ( ) {
2198
+ args . push ( p . to_string ( ) ) ;
2201
2199
}
2202
2200
}
2203
2201
}
@@ -2227,10 +2225,8 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2227
2225
args. push ( * n) ;
2228
2226
} else if self . groups . contains_key ( n) {
2229
2227
g_vec. push ( * n) ;
2230
- } else {
2231
- if self . positionals_name . contains_key ( n) {
2232
- args. push ( * n) ;
2233
- }
2228
+ } else if self . positionals . values ( ) . any ( |p| & p. name == n) {
2229
+ args. push ( * n) ;
2234
2230
}
2235
2231
}
2236
2232
@@ -2345,10 +2341,8 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2345
2341
if matches. is_some ( ) && matches. as_ref ( ) . unwrap ( ) . is_present ( p) {
2346
2342
continue ;
2347
2343
}
2348
- if let Some ( idx) = self . positionals_name . get ( p) {
2349
- if let Some ( ref p) = self . positionals_idx . get ( & idx) {
2350
- pmap. insert ( p. index , format ! ( "{}" , p) ) ;
2351
- }
2344
+ if let Some ( p) = self . positionals . values ( ) . filter ( |x| & x. name == p) . next ( ) {
2345
+ pmap. insert ( p. index , format ! ( "{}" , p) ) ;
2352
2346
}
2353
2347
}
2354
2348
for ( _, s) in pmap {
@@ -2388,26 +2382,26 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2388
2382
// but no 2)
2389
2383
//
2390
2384
// Next we verify that only the highest index has a .multiple(true) (if any)
2391
- if let Some ( ( idx, ref p) ) = self . positionals_idx . iter ( ) . rev ( ) . next ( ) {
2392
- if idx != self . positionals_idx . len ( ) {
2385
+ if let Some ( ( idx, ref p) ) = self . positionals . iter ( ) . rev ( ) . next ( ) {
2386
+ if idx != self . positionals . len ( ) {
2393
2387
panic ! ( "Found positional argument \" {}\" who's index is {} but there are only {} \
2394
2388
positional arguments defined",
2395
2389
p. name,
2396
2390
idx,
2397
- self . positionals_idx . len( ) ) ;
2391
+ self . positionals . len( ) ) ;
2398
2392
}
2399
2393
}
2400
- assert ! ( !self . positionals_idx
2394
+ assert ! ( !self . positionals
2401
2395
. values( )
2402
2396
. any( |a| a. settings. is_set( & ArgSettings :: Multiple ) &&
2403
- ( a. index as usize != self . positionals_idx . len( ) ) ) ,
2397
+ ( a. index as usize != self . positionals . len( ) ) ) ,
2404
2398
"Found positional argument which accepts multiple values but is not \
2405
2399
the last positional argument (i.e. others have a higher index)") ;
2406
2400
2407
2401
// If it's required we also need to ensure all previous positionals are
2408
2402
// required too
2409
2403
let mut found = false ;
2410
- for ( _, p) in self . positionals_idx . iter_mut ( ) . rev ( ) {
2404
+ for ( _, p) in self . positionals . iter_mut ( ) . rev ( ) {
2411
2405
if found {
2412
2406
p. settings . set ( & ArgSettings :: Required ) ;
2413
2407
self . required . push ( p. name ) ;
@@ -2476,12 +2470,10 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2476
2470
}
2477
2471
}
2478
2472
}
2479
- if let Some ( idx) = self . positionals_name . get ( k) {
2480
- if let Some ( pos) = self . positionals_idx . get ( idx) {
2481
- if let Some ( ref bl) = pos. blacklist {
2482
- if bl. contains ( & name) {
2483
- return Some ( format ! ( "{}" , pos) ) ;
2484
- }
2473
+ if let Some ( pos) = self . positionals . values ( ) . filter ( |p| & p. name == k) . next ( ) {
2474
+ if let Some ( ref bl) = pos. blacklist {
2475
+ if bl. contains ( & name) {
2476
+ return Some ( format ! ( "{}" , pos) ) ;
2485
2477
}
2486
2478
}
2487
2479
}
@@ -2505,12 +2497,10 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2505
2497
}
2506
2498
}
2507
2499
}
2508
- if let Some ( idx) = self . positionals_name . get ( k) {
2509
- if let Some ( pos) = self . positionals_idx . get ( idx) {
2510
- if let Some ( ref bl) = pos. overrides {
2511
- if bl. contains ( & name) {
2512
- return Some ( pos. name ) ;
2513
- }
2500
+ if let Some ( pos) = self . positionals . values ( ) . filter ( |p| & p. name == k) . next ( ) {
2501
+ if let Some ( ref bl) = pos. overrides {
2502
+ if bl. contains ( & name) {
2503
+ return Some ( pos. name ) ;
2514
2504
}
2515
2505
}
2516
2506
}
@@ -2665,7 +2655,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2665
2655
if self . overrides . contains ( & v. name ) {
2666
2656
debugln ! ( "it is..." ) ;
2667
2657
debugln ! ( "checking who defined it..." ) ;
2668
- if let Some ( name) = self . overriden_from ( v. name , matches) {
2658
+ if let Some ( ref name) = self . overriden_from ( v. name , matches) {
2669
2659
debugln ! ( "found {}" , name) ;
2670
2660
if let Some ( ref vec) = self . groups_for_arg ( v. name ) {
2671
2661
for grp in vec {
@@ -2808,7 +2798,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2808
2798
if self . overrides . contains ( & v. name ) {
2809
2799
debugln ! ( "it is..." ) ;
2810
2800
debugln ! ( "checking who defined it..." ) ;
2811
- if let Some ( name) = self . overriden_from ( v. name , matches) {
2801
+ if let Some ( ref name) = self . overriden_from ( v. name , matches) {
2812
2802
debugln ! ( "found {}" , name) ;
2813
2803
matches. args . remove ( name) ;
2814
2804
remove_overriden ! ( self , name) ;
@@ -2999,7 +2989,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2999
2989
self . create_current_usage ( matches) ) ) ;
3000
2990
}
3001
2991
if self . overrides . contains ( & v. name ) {
3002
- if let Some ( name) = self . overriden_from ( v. name , matches) {
2992
+ if let Some ( ref name) = self . overriden_from ( v. name , matches) {
3003
2993
matches. args . remove ( & * name) ;
3004
2994
remove_overriden ! ( self , & * name) ;
3005
2995
}
@@ -3115,7 +3105,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
3115
3105
if self . overrides . contains ( & v. name ) {
3116
3106
debugln ! ( "it is..." ) ;
3117
3107
debugln ! ( "checking who defined it..." ) ;
3118
- if let Some ( name) = self . overriden_from ( v. name , matches) {
3108
+ if let Some ( ref name) = self . overriden_from ( v. name , matches) {
3119
3109
debugln ! ( "found {}" , name) ;
3120
3110
matches. args . remove ( name) ;
3121
3111
remove_overriden ! ( self , name) ;
@@ -3211,7 +3201,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
3211
3201
} else if let Some ( o) = self . opts. get( name) {
3212
3202
o. to_string( )
3213
3203
} else {
3214
- match self . positionals_idx . values( )
3204
+ match self . positionals . values( )
3215
3205
. filter( |p| p. name == * name)
3216
3206
. next( ) {
3217
3207
Some ( p) => p. to_string( ) ,
@@ -3232,7 +3222,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
3232
3222
} else if let Some ( o) = self . opts. get( name) {
3233
3223
o. to_string( )
3234
3224
} else {
3235
- match self . positionals_idx . values( )
3225
+ match self . positionals . values( )
3236
3226
. filter( |p| p. name == n)
3237
3227
. next( ) {
3238
3228
Some ( p) => p. to_string( ) ,
@@ -3300,8 +3290,9 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
3300
3290
& * self . create_current_usage ( matches) ) ) ;
3301
3291
}
3302
3292
}
3303
- } else if let Some ( f) = self . positionals_idx
3304
- . get ( self . positionals_name . get ( name) . unwrap ( ) ) {
3293
+ } else if let Some ( f) = self . positionals . values ( )
3294
+ . filter ( |p| & p. name == name)
3295
+ . next ( ) {
3305
3296
if let Some ( num) = f. num_vals {
3306
3297
if num != vals. len ( ) as u8 {
3307
3298
return Err ( error_builder:: WrongNumValues (
@@ -3385,7 +3376,7 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
3385
3376
}
3386
3377
}
3387
3378
// because positions use different keys, we dont use the macro
3388
- match self . positionals_idx . values ( ) . filter ( |p| & p. name == name) . next ( ) {
3379
+ match self . positionals . values ( ) . filter ( |p| & p. name == name) . next ( ) {
3389
3380
Some ( p) => {
3390
3381
if let Some ( ref bl) = p. blacklist {
3391
3382
for n in bl. iter ( ) {
0 commit comments