Finish adding support for optional params (#530)

This commit is contained in:
JT 2021-12-20 17:58:09 +11:00 committed by GitHub
parent e949658381
commit caf73c36f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 8 deletions

View file

@ -39,18 +39,24 @@ fn eval_call(
let block = engine_state.get_block(block_id);
let mut stack = stack.collect_captures(&block.captures);
for (arg, param) in call.positional.iter().zip(
decl.signature()
.required_positional
.iter()
.chain(decl.signature().optional_positional.iter()),
) {
let result = eval_expression(engine_state, &mut stack, arg)?;
for (param_idx, param) in decl
.signature()
.required_positional
.iter()
.chain(decl.signature().optional_positional.iter())
.enumerate()
{
let var_id = param
.var_id
.expect("internal error: all custom parameters must have var_ids");
stack.add_var(var_id, result);
if let Some(arg) = call.positional.get(param_idx) {
let result = eval_expression(engine_state, &mut stack, arg)?;
stack.add_var(var_id, result);
} else {
stack.add_var(var_id, Value::nothing(call.head));
}
}
if let Some(rest_positional) = decl.signature().rest_positional {

View file

@ -1300,3 +1300,11 @@ fn get_table_columns_1() -> TestResult {
fn get_table_columns_2() -> TestResult {
run_test("[[name, age, grade]; [paul,21,a]] | columns | nth 1", "age")
}
#[test]
fn allow_missing_optional_params() -> TestResult {
run_test(
"def foo [x?:int] { if $x != $nothing { $x + 10 } else { 5 } }; foo",
"5",
)
}