diff options
Diffstat (limited to 'tvix/eval')
-rw-r--r-- | tvix/eval/builtin-macros/src/lib.rs | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/tvix/eval/builtin-macros/src/lib.rs b/tvix/eval/builtin-macros/src/lib.rs index 5cc9807f54fe..9b14aee44605 100644 --- a/tvix/eval/builtin-macros/src/lib.rs +++ b/tvix/eval/builtin-macros/src/lib.rs @@ -281,31 +281,45 @@ pub fn builtins(args: TokenStream, item: TokenStream) -> TokenStream { let ty = &arg.ty; let ident = &arg.name; - if arg.strict { - if arg.catch { - f.block = Box::new(parse_quote_spanned! {arg.span=> { - let #ident: #ty = tvix_eval::generators::request_force(&co, values.pop() - .expect("Tvix bug: builtin called with incorrect number of arguments")).await; + f.block = Box::new(match arg { + BuiltinArgument { + strict: true, + catch: true, + .. + } => parse_quote_spanned! { + arg.span => { + let #ident: #ty = tvix_eval::generators::request_force( + &co, values.pop().expect("Tvix bug: builtin called with incorrect number of arguments") + ).await; #block - }}); - } else { - f.block = Box::new(parse_quote_spanned! {arg.span=> { - let #ident: #ty = tvix_eval::generators::request_force(&co, values.pop() - .expect("Tvix bug: builtin called with incorrect number of arguments")).await; + } + }, + BuiltinArgument { + strict: true, + catch: false, + .. + } => parse_quote_spanned! { + arg.span => { + let #ident: #ty = tvix_eval::generators::request_force( + &co, values.pop().expect("Tvix bug: builtin called with incorrect number of arguments") + ).await; if #ident.is_catchable() { return Ok(#ident); } #block - }}); - } - } else { - f.block = Box::new(parse_quote_spanned! {arg.span=> { - let #ident: #ty = values.pop() - .expect("Tvix bug: builtin called with incorrect number of arguments"); - - #block - }}) - } + } + }, + BuiltinArgument { + strict: false, + catch: _, + .. + } => parse_quote_spanned! { + arg.span => { + let #ident: #ty = values.pop().expect("Tvix bug: builtin called with incorrect number of arguments"); + #block + } + }, + }); } let fn_name = f.sig.ident.clone(); |