@@ -7,6 +7,9 @@ macro_rules! arg_check {
77 }
88 } ;
99 ( $vm: ident, $args: ident, required=[ $( ( $arg_name: ident, $arg_type: expr) ) ,* ] ) => {
10+ arg_check!( $vm, $args, required=[ $( ( $arg_name, $arg_type) ) ,* ] , optional=[ ] ) ;
11+ } ;
12+ ( $vm: ident, $args: ident, required=[ $( ( $arg_name: ident, $arg_type: expr) ) ,* ] , optional=[ $( ( $optional_arg_name: ident, $optional_arg_type: expr) ) ,* ] ) => {
1013 let mut expected_args: Vec <( usize , & str , Option <PyObjectRef >) > = vec![ ] ;
1114 let mut arg_count = 0 ;
1215
@@ -26,10 +29,31 @@ macro_rules! arg_check {
2629 }
2730 ) *
2831
29- if $args. args. len( ) != expected_args. len( ) {
32+ let minimum_arg_count = arg_count;
33+
34+ $(
35+ let $optional_arg_name = if arg_count < $args. args. len( ) {
36+ expected_args. push( ( arg_count, stringify!( $optional_arg_name) , $optional_arg_type) ) ;
37+ let ret = Some ( & $args. args[ arg_count] ) ;
38+ #[ allow( unused_assignments) ]
39+ {
40+ arg_count += 1 ;
41+ }
42+ ret
43+ } else {
44+ None
45+ } ;
46+ ) *
47+
48+ if $args. args. len( ) < minimum_arg_count || $args. args. len( ) > expected_args. len( ) {
49+ let expected_str = if minimum_arg_count == arg_count {
50+ format!( "{}" , arg_count)
51+ } else {
52+ format!( "{}-{}" , minimum_arg_count, arg_count)
53+ } ;
3054 return Err ( $vm. new_type_error( format!(
3155 "Expected {} arguments (got: {})" ,
32- expected_args . len ( ) ,
56+ expected_str ,
3357 $args. args. len( )
3458 ) ) ) ;
3559 } ;
0 commit comments