@@ -663,7 +663,8 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
663
663
max_vals : a. max_vals ,
664
664
help : a. help ,
665
665
global : a. global ,
666
- empty_vals : a. empty_vals
666
+ empty_vals : a. empty_vals ,
667
+ validator : None
667
668
} ;
668
669
if pb. min_vals . is_some ( ) && !pb. multiple {
669
670
panic ! ( "Argument \" {}\" does not allow multiple values, yet it is expecting {} \
@@ -700,6 +701,9 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
700
701
for n in p { phs. insert ( * n) ; }
701
702
pb. possible_vals = Some ( phs) ;
702
703
}
704
+ if let Some ( ref p) = a. validator {
705
+ pb. validator = Some ( p. clone ( ) ) ;
706
+ }
703
707
self . positionals_idx . insert ( i, pb) ;
704
708
} else if a. takes_value {
705
709
if a. short . is_none ( ) && a. long . is_none ( ) {
@@ -722,7 +726,8 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
722
726
val_names : a. val_names . clone ( ) ,
723
727
requires : None ,
724
728
required : a. required ,
725
- empty_vals : a. empty_vals
729
+ empty_vals : a. empty_vals ,
730
+ validator : None
726
731
} ;
727
732
if let Some ( ref vec) = ob. val_names {
728
733
ob. num_vals = Some ( vec. len ( ) as u8 ) ;
@@ -743,6 +748,9 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
743
748
for n in bl { bhs. insert ( * n) ; }
744
749
ob. blacklist = Some ( bhs) ;
745
750
}
751
+ if let Some ( ref p) = a. validator {
752
+ ob. validator = Some ( p. clone ( ) ) ;
753
+ }
746
754
// Check if there is anything in the requires list and add any values
747
755
if let Some ( ref r) = a. requires {
748
756
let mut rhs = HashSet :: new ( ) ;
@@ -764,6 +772,10 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
764
772
}
765
773
self . opts . insert ( a. name , ob) ;
766
774
} else {
775
+ if a. validator . is_some ( ) {
776
+ panic ! ( "The argument '{}' has a validator set, yet was parsed as a flag. Ensure \
777
+ .takes_value(true) or .index(u8) is set.")
778
+ }
767
779
if !a. empty_vals {
768
780
// Empty vals defaults to true, so if it's false it was manually set
769
781
panic ! ( "The argument '{}' cannot have empty_values() set because it is a flag. \
@@ -1758,6 +1770,13 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1758
1770
if let Some ( ref mut o) = matches. args . get_mut ( opt. name ) {
1759
1771
// Options have values, so we can unwrap()
1760
1772
if let Some ( ref mut vals) = o. values {
1773
+ if let Some ( ref vtor) = opt. validator {
1774
+ if let Err ( e) = vtor ( arg_slice. to_owned ( ) ) {
1775
+ self . report_error ( e,
1776
+ true ,
1777
+ Some ( vec ! [ opt. name] ) ) ;
1778
+ }
1779
+ }
1761
1780
let len = vals. len ( ) as u8 + 1 ;
1762
1781
vals. insert ( len, arg_slice. to_owned ( ) ) ;
1763
1782
}
@@ -1928,6 +1947,14 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
1928
1947
Some ( matches. args . keys ( )
1929
1948
. map ( |k| * k) . collect ( ) ) ) ;
1930
1949
}
1950
+ if let Some ( ref vtor) = p. validator {
1951
+ let f = & * vtor;
1952
+ if let Err ( ref e) = f ( arg_slice. to_owned ( ) ) {
1953
+ self . report_error ( e. clone ( ) ,
1954
+ true ,
1955
+ Some ( matches. args . keys ( ) . map ( |k| * k) . collect ( ) ) ) ;
1956
+ }
1957
+ }
1931
1958
bm. insert ( 1 , arg_slice. to_owned ( ) ) ;
1932
1959
matches. args . insert ( p. name , MatchedArg {
1933
1960
occurrences : 1 ,
@@ -2234,6 +2261,13 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2234
2261
Some ( matches. args . keys ( )
2235
2262
. map ( |k| * k) . collect ( ) ) ) ;
2236
2263
}
2264
+ if let Some ( ref vtor) = v. validator {
2265
+ if let Err ( e) = vtor ( arg_val. clone ( ) . unwrap ( ) ) {
2266
+ self . report_error ( e,
2267
+ true ,
2268
+ Some ( matches. args . keys ( ) . map ( |k| * k) . collect ( ) ) ) ;
2269
+ }
2270
+ }
2237
2271
if let Some ( ref mut o) = matches. args . get_mut ( v. name ) {
2238
2272
o. occurrences += 1 ;
2239
2273
if let Some ( ref mut vals) = o. values {
@@ -2250,6 +2284,15 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
2250
2284
Some ( matches. args . keys ( )
2251
2285
. map ( |k| * k) . collect ( ) ) ) ;
2252
2286
}
2287
+ if let Some ( ref val) = arg_val {
2288
+ if let Some ( ref vtor) = v. validator {
2289
+ if let Err ( e) = vtor ( val. clone ( ) ) {
2290
+ self . report_error ( e,
2291
+ true ,
2292
+ Some ( matches. args . keys ( ) . map ( |k| * k) . collect ( ) ) ) ;
2293
+ }
2294
+ }
2295
+ }
2253
2296
matches. args . insert ( v. name , MatchedArg {
2254
2297
occurrences : if arg_val. is_some ( ) { 1 } else { 0 } ,
2255
2298
values : if arg_val. is_some ( ) {
0 commit comments