@@ -817,10 +817,10 @@ impl<'a, 'b> Parser<'a, 'b>
817
817
subcmd_name = Some ( arg_os. to_str ( ) . expect ( INVALID_UTF8 ) . to_owned ( ) ) ;
818
818
break ;
819
819
} else if let Some ( cdate) =
820
- suggestions:: did_you_mean ( & * arg_os. to_string_lossy ( ) ,
821
- self . subcommands
822
- . iter ( )
823
- . map ( |s| & s. p . meta . name ) ) {
820
+ suggestions:: did_you_mean ( & * arg_os. to_string_lossy ( ) ,
821
+ self . subcommands
822
+ . iter ( )
823
+ . map ( |s| & s. p . meta . name ) ) {
824
824
return Err ( Error :: invalid_subcommand ( arg_os. to_string_lossy ( ) . into_owned ( ) ,
825
825
cdate,
826
826
self . meta
@@ -894,51 +894,13 @@ impl<'a, 'b> Parser<'a, 'b>
894
894
}
895
895
}
896
896
897
- self . validate ( needs_val_of, subcmd_name, matcher, it)
898
- }
899
-
900
- fn validate < I , T > ( & mut self ,
901
- needs_val_of : Option < & ' a str > ,
902
- subcmd_name : Option < String > ,
903
- matcher : & mut ArgMatcher < ' a > ,
904
- it : & mut Peekable < I > )
905
- -> ClapResult < ( ) >
906
- where I : Iterator < Item = T > ,
907
- T : Into < OsString > + Clone
908
- {
909
- let mut reqs_validated = false ;
910
- if let Some ( a) = needs_val_of {
911
- debugln ! ( "needs_val_of={:?}" , a) ;
912
- let o = find_by_name ! ( self , & a, opts, iter) . expect ( INTERNAL_ERROR_MSG ) ;
913
- try!( self . validate_required ( matcher) ) ;
914
- reqs_validated = true ;
915
- let should_err = if let Some ( v) = matcher. 0 . args . get ( & * o. b . name ) {
916
- v. vals . is_empty ( ) && !( o. v . min_vals . is_some ( ) && o. v . min_vals . unwrap ( ) == 0 )
917
- } else {
918
- true
919
- } ;
920
- if should_err {
921
- return Err ( Error :: empty_value ( o,
922
- & * self . create_current_usage ( matcher) ,
923
- self . color ( ) ) ) ;
924
- }
925
- }
926
-
927
- try!( self . add_defaults ( matcher) ) ;
928
- try!( self . validate_blacklist ( matcher) ) ;
929
- try!( self . validate_num_args ( matcher) ) ;
930
- matcher. usage ( self . create_usage ( & [ ] ) ) ;
931
-
932
- if !( self . settings . is_set ( AppSettings :: SubcommandsNegateReqs ) && subcmd_name. is_some ( ) ) &&
933
- !reqs_validated {
934
- try!( self . validate_required ( matcher) ) ;
935
- }
936
- if let Some ( pos_sc_name) = subcmd_name {
897
+ if let Some ( ref pos_sc_name) = subcmd_name {
937
898
// is this is a real subcommand, or an alias
938
- let sc_name = if self . subcommands . iter ( ) . any ( |sc| sc. p . meta . name == pos_sc_name) {
939
- pos_sc_name
899
+ if self . subcommands . iter ( ) . any ( |sc| & sc. p . meta . name == pos_sc_name) {
900
+
901
+ try!( self . parse_subcommand ( & * pos_sc_name, matcher, it) ) ;
940
902
} else {
941
- self . subcommands
903
+ let sc_name = & * self . subcommands
942
904
. iter ( )
943
905
. filter ( |sc| sc. p . meta . aliases . is_some ( ) )
944
906
. filter_map ( |sc| if sc. p
@@ -953,9 +915,9 @@ impl<'a, 'b> Parser<'a, 'b>
953
915
None
954
916
} )
955
917
. next ( )
956
- . expect ( INTERNAL_ERROR_MSG )
918
+ . expect ( INTERNAL_ERROR_MSG ) ;
919
+ try!( self . parse_subcommand ( sc_name, matcher, it) ) ;
957
920
} ;
958
- try!( self . parse_subcommand ( sc_name, matcher, it) ) ;
959
921
} else if self . is_set ( AppSettings :: SubcommandRequired ) {
960
922
let bn = self . meta . bin_name . as_ref ( ) . unwrap_or ( & self . meta . name ) ;
961
923
return Err ( Error :: missing_subcommand ( bn,
@@ -970,6 +932,42 @@ impl<'a, 'b> Parser<'a, 'b>
970
932
info : None ,
971
933
} ) ;
972
934
}
935
+
936
+ self . validate ( needs_val_of, subcmd_name, matcher)
937
+ }
938
+
939
+ fn validate ( & mut self ,
940
+ needs_val_of : Option < & ' a str > ,
941
+ subcmd_name : Option < String > ,
942
+ matcher : & mut ArgMatcher < ' a > )
943
+ -> ClapResult < ( ) > {
944
+ let mut reqs_validated = false ;
945
+ if let Some ( a) = needs_val_of {
946
+ debugln ! ( "needs_val_of={:?}" , a) ;
947
+ let o = find_by_name ! ( self , & a, opts, iter) . expect ( INTERNAL_ERROR_MSG ) ;
948
+ try!( self . validate_required ( matcher) ) ;
949
+ reqs_validated = true ;
950
+ let should_err = if let Some ( v) = matcher. 0 . args . get ( & * o. b . name ) {
951
+ v. vals . is_empty ( ) && !( o. v . min_vals . is_some ( ) && o. v . min_vals . unwrap ( ) == 0 )
952
+ } else {
953
+ true
954
+ } ;
955
+ if should_err {
956
+ return Err ( Error :: empty_value ( o,
957
+ & * self . create_current_usage ( matcher) ,
958
+ self . color ( ) ) ) ;
959
+ }
960
+ }
961
+
962
+ try!( self . add_defaults ( matcher) ) ;
963
+ try!( self . validate_blacklist ( matcher) ) ;
964
+ try!( self . validate_num_args ( matcher) ) ;
965
+ matcher. usage ( self . create_usage ( & [ ] ) ) ;
966
+
967
+ if !( self . settings . is_set ( AppSettings :: SubcommandsNegateReqs ) && subcmd_name. is_some ( ) ) &&
968
+ !reqs_validated {
969
+ try!( self . validate_required ( matcher) ) ;
970
+ }
973
971
if matcher. is_empty ( ) && matcher. subcommand_name ( ) . is_none ( ) &&
974
972
self . is_set ( AppSettings :: ArgRequiredElseHelp ) {
975
973
let mut out = vec ! [ ] ;
@@ -1019,7 +1017,7 @@ impl<'a, 'b> Parser<'a, 'b>
1019
1017
}
1020
1018
1021
1019
fn parse_subcommand < I , T > ( & mut self ,
1022
- sc_name : String ,
1020
+ sc_name : & str ,
1023
1021
matcher : & mut ArgMatcher < ' a > ,
1024
1022
it : & mut Peekable < I > )
1025
1023
-> ClapResult < ( ) >
@@ -1750,7 +1748,7 @@ impl<'a, 'b> Parser<'a, 'b>
1750
1748
return true ;
1751
1749
}
1752
1750
}
1753
- }
1751
+ }
1754
1752
if let Some ( ru) = a. required_unless ( ) {
1755
1753
debugln ! ( "Required unless found...{:?}" , ru) ;
1756
1754
let mut found_any = false ;
0 commit comments