mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-02 19:39:49 +09:00
Add optional positional arguments to arg_check!
This commit is contained in:
@@ -7,6 +7,9 @@ macro_rules! arg_check {
|
||||
}
|
||||
};
|
||||
( $vm: ident, $args:ident, required=[$( ($arg_name:ident, $arg_type:expr) ),*] ) => {
|
||||
arg_check!($vm, $args, required=[$( ($arg_name, $arg_type) ),*], optional=[]);
|
||||
};
|
||||
( $vm: ident, $args:ident, required=[$( ($arg_name:ident, $arg_type:expr) ),*], optional=[$( ($optional_arg_name:ident, $optional_arg_type:expr) ),*] ) => {
|
||||
let mut expected_args: Vec<(usize, &str, Option<PyObjectRef>)> = vec![];
|
||||
let mut arg_count = 0;
|
||||
|
||||
@@ -26,10 +29,31 @@ macro_rules! arg_check {
|
||||
}
|
||||
)*
|
||||
|
||||
if $args.args.len() != expected_args.len() {
|
||||
let minimum_arg_count = arg_count;
|
||||
|
||||
$(
|
||||
let $optional_arg_name = if arg_count < $args.args.len() {
|
||||
expected_args.push((arg_count, stringify!($optional_arg_name), $optional_arg_type));
|
||||
let ret = Some(&$args.args[arg_count]);
|
||||
#[allow(unused_assignments)]
|
||||
{
|
||||
arg_count += 1;
|
||||
}
|
||||
ret
|
||||
} else {
|
||||
None
|
||||
};
|
||||
)*
|
||||
|
||||
if $args.args.len() < minimum_arg_count || $args.args.len() > expected_args.len() {
|
||||
let expected_str = if minimum_arg_count == arg_count {
|
||||
format!("{}", arg_count)
|
||||
} else {
|
||||
format!("{}-{}", minimum_arg_count, arg_count)
|
||||
};
|
||||
return Err($vm.new_type_error(format!(
|
||||
"Expected {} arguments (got: {})",
|
||||
expected_args.len(),
|
||||
expected_str,
|
||||
$args.args.len()
|
||||
)));
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user