Skip to content

Commit f7b43ea

Browse files
committed
Add optional positional arguments to arg_check!
1 parent 8f74759 commit f7b43ea

1 file changed

Lines changed: 26 additions & 2 deletions

File tree

vm/src/macros.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)