@@ -22,6 +22,7 @@ use SubCommand;
22
22
use fmt:: Format ;
23
23
use osstringext:: OsStrExt2 ;
24
24
use app:: meta:: AppMeta ;
25
+ use args:: MatchedArg ;
25
26
26
27
pub struct Parser < ' a , ' b > where ' a : ' b {
27
28
required : Vec < & ' b str > ,
@@ -1043,8 +1044,7 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1043
1044
// Increment or create the group "args"
1044
1045
self . groups_for_arg ( opt. name ) . and_then ( |vec| Some ( matcher. inc_occurrences_of ( & * vec) ) ) ;
1045
1046
1046
- if ( opt. is_set ( ArgSettings :: Multiple ) || opt. num_vals ( ) . is_some ( ) )
1047
- || val. is_none ( ) {
1047
+ if val. is_none ( ) || opt. is_set ( ArgSettings :: Multiple ) {
1048
1048
return Ok ( Some ( opt. name ) ) ;
1049
1049
}
1050
1050
Ok ( None )
@@ -1056,18 +1056,24 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1056
1056
matcher : & mut ArgMatcher < ' a > )
1057
1057
-> ClapResult < Option < & ' a str > >
1058
1058
where A : AnyArg < ' a , ' b > + Display {
1059
- matcher. add_val_to ( & * arg. name ( ) , val) ;
1060
-
1061
- // Increment or create the group "args"
1062
- if let Some ( grps) = self . groups_for_arg ( & * arg. name ( ) ) {
1063
- for grp in grps {
1064
- matcher. add_val_to ( & * grp, val) ;
1059
+ debugln ! ( "fn=add_val_to_arg;" ) ;
1060
+ let mut ret = None ;
1061
+ for v in val. split ( b',' ) {
1062
+ debugln ! ( "adding val: {:?}" , v) ;
1063
+ matcher. add_val_to ( & * arg. name ( ) , v) ;
1064
+
1065
+ // Increment or create the group "args"
1066
+ if let Some ( grps) = self . groups_for_arg ( & * arg. name ( ) ) {
1067
+ for grp in grps {
1068
+ matcher. add_val_to ( & * grp, v) ;
1069
+ }
1065
1070
}
1066
- }
1067
1071
1068
- // The validation must come AFTER inserting into 'matcher' or the usage string
1069
- // can't be built
1070
- self . validate_value ( arg, val, matcher)
1072
+ // The validation must come AFTER inserting into 'matcher' or the usage string
1073
+ // can't be built
1074
+ ret = try!( self . validate_value ( arg, v, matcher) ) ;
1075
+ }
1076
+ Ok ( ret)
1071
1077
}
1072
1078
1073
1079
fn validate_value < A > ( & self , arg : & A , val : & OsStr , matcher : & ArgMatcher < ' a > ) -> ClapResult < Option < & ' a str > >
@@ -1186,6 +1192,7 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1186
1192
}
1187
1193
1188
1194
fn validate_num_args ( & self , matcher : & mut ArgMatcher ) -> ClapResult < ( ) > {
1195
+ debugln ! ( "fn=validate_num_args;" ) ;
1189
1196
for ( name, ma) in matcher. iter ( ) {
1190
1197
if self . groups . contains_key ( & * * name) {
1191
1198
continue ;
@@ -1194,97 +1201,76 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
1194
1201
. iter ( )
1195
1202
. filter ( |o| & o. name == name)
1196
1203
. next ( ) {
1197
- if let Some ( num) = opt. num_vals {
1198
- let should_err = if opt. settings . is_set ( ArgSettings :: Multiple ) {
1199
- ( ( ma. vals . len ( ) as u8 ) % num) != 0
1200
- } else {
1201
- num != ( ma. vals . len ( ) as u8 )
1202
- } ;
1203
- if should_err {
1204
- return Err ( Error :: wrong_number_of_values (
1205
- opt,
1206
- num,
1207
- if opt. settings . is_set ( ArgSettings :: Multiple ) {
1208
- ( ma. vals . len ( ) % num as usize )
1209
- } else {
1210
- ma. vals . len ( )
1211
- } ,
1212
- if ma. vals . len ( ) == 1 ||
1213
- ( opt. settings . is_set ( ArgSettings :: Multiple ) &&
1214
- ( ma. vals . len ( ) % num as usize ) == 1 ) {
1215
- "as"
1216
- } else {
1217
- "ere"
1218
- } ,
1219
- & * self . create_current_usage ( matcher) ) ) ;
1220
- }
1221
- }
1222
- if let Some ( num) = opt. max_vals {
1223
- if ( ma. vals . len ( ) as u8 ) > num {
1224
- return Err ( Error :: too_many_values (
1225
- ma. vals . get ( & ma. vals . keys ( )
1226
- . last ( )
1227
- . expect ( INTERNAL_ERROR_MSG ) )
1228
- . expect ( INTERNAL_ERROR_MSG ) . to_str ( ) . expect ( INVALID_UTF8 ) ,
1229
- opt,
1230
- & * self . create_current_usage ( matcher) ) ) ;
1231
- }
1232
- }
1233
- if let Some ( num) = opt. min_vals {
1234
- if ( ma. vals . len ( ) as u8 ) < num {
1235
- return Err ( Error :: too_few_values (
1236
- opt,
1237
- num,
1238
- ma. vals . len ( ) ,
1239
- & * self . create_current_usage ( matcher) ) ) ;
1240
- }
1241
- }
1204
+ try!( self . _validate_num_vals ( opt, ma, matcher) ) ;
1242
1205
} else if let Some ( pos) = self . positionals
1243
1206
. values ( )
1244
1207
. filter ( |p| & p. name == name)
1245
1208
. next ( ) {
1246
- if let Some ( num) = pos. num_vals {
1247
- if num != ma. vals . len ( ) as u8 {
1248
- return Err ( Error :: wrong_number_of_values (
1249
- pos,
1250
- num,
1251
- ma. vals . len ( ) ,
1252
- if ma. vals . len ( ) == 1 {
1253
- "as"
1254
- } else {
1255
- "ere"
1256
- } ,
1257
- & * self . create_current_usage ( matcher) ) ) ;
1258
- }
1259
- } else if let Some ( max) = pos. max_vals {
1260
- if ( ma. vals . len ( ) as u8 ) > max {
1261
- return Err (
1262
- Error :: too_many_values (
1263
- ma. vals . get ( & ma. vals . keys ( )
1264
- . last ( )
1265
- . expect ( INTERNAL_ERROR_MSG ) )
1266
- . expect ( INTERNAL_ERROR_MSG )
1267
- . to_string_lossy ( )
1268
- . into_owned ( ) ,
1269
- pos,
1270
- & * self . create_current_usage ( matcher) ) ) ;
1271
- }
1272
- }
1273
- if let Some ( min) = pos. min_vals {
1274
- if ( ma. vals . len ( ) as u8 ) < min {
1275
- return Err ( Error :: too_few_values (
1276
- pos,
1277
- min,
1278
- ma. vals . len ( ) ,
1279
- & * self . create_current_usage ( matcher) ) ) ;
1280
- }
1281
- }
1209
+ try!( self . _validate_num_vals ( pos, ma, matcher) ) ;
1282
1210
}
1283
1211
}
1284
1212
}
1285
1213
Ok ( ( ) )
1286
1214
}
1287
1215
1216
+ fn _validate_num_vals < A > ( & self , a : & A , ma : & MatchedArg , matcher : & ArgMatcher ) -> ClapResult < ( ) >
1217
+ where A : AnyArg < ' a , ' b >
1218
+ {
1219
+ debugln ! ( "fn=_validate_num_vals;" ) ;
1220
+ if let Some ( num) = a. num_vals ( ) {
1221
+ debugln ! ( "num_vals set: {}" , num) ;
1222
+ let should_err = if a. is_set ( ArgSettings :: Multiple ) {
1223
+ ( ( ma. vals . len ( ) as u8 ) % num) != 0
1224
+ } else {
1225
+ num != ( ma. vals . len ( ) as u8 )
1226
+ } ;
1227
+ if should_err {
1228
+ debugln ! ( "Sending error WrongNumberOfValues" ) ;
1229
+ return Err ( Error :: wrong_number_of_values (
1230
+ a,
1231
+ num,
1232
+ if a. is_set ( ArgSettings :: Multiple ) {
1233
+ ( ma. vals . len ( ) % num as usize )
1234
+ } else {
1235
+ ma. vals . len ( )
1236
+ } ,
1237
+ if ma. vals . len ( ) == 1 ||
1238
+ ( a. is_set ( ArgSettings :: Multiple ) &&
1239
+ ( ma. vals . len ( ) % num as usize ) == 1 ) {
1240
+ "as"
1241
+ } else {
1242
+ "ere"
1243
+ } ,
1244
+ & * self . create_current_usage ( matcher) ) ) ;
1245
+ }
1246
+ }
1247
+ if let Some ( num) = a. max_vals ( ) {
1248
+ debugln ! ( "max_vals set: {}" , num) ;
1249
+ if ( ma. vals . len ( ) as u8 ) > num {
1250
+ debugln ! ( "Sending error TooManyValues" ) ;
1251
+ return Err ( Error :: too_many_values (
1252
+ ma. vals . get ( & ma. vals . keys ( )
1253
+ . last ( )
1254
+ . expect ( INTERNAL_ERROR_MSG ) )
1255
+ . expect ( INTERNAL_ERROR_MSG ) . to_str ( ) . expect ( INVALID_UTF8 ) ,
1256
+ a,
1257
+ & * self . create_current_usage ( matcher) ) ) ;
1258
+ }
1259
+ }
1260
+ if let Some ( num) = a. min_vals ( ) {
1261
+ debugln ! ( "min_vals set: {}" , num) ;
1262
+ if ( ma. vals . len ( ) as u8 ) < num {
1263
+ debugln ! ( "Sending error TooFewValues" ) ;
1264
+ return Err ( Error :: too_few_values (
1265
+ a,
1266
+ num,
1267
+ ma. vals . len ( ) ,
1268
+ & * self . create_current_usage ( matcher) ) ) ;
1269
+ }
1270
+ }
1271
+ Ok ( ( ) )
1272
+ }
1273
+
1288
1274
fn validate_required ( & self , matcher : & ArgMatcher ) -> ClapResult < ( ) > {
1289
1275
' outer: for name in & self . required {
1290
1276
if matcher. contains ( name) {
0 commit comments