about summary refs log tree commit diff
path: root/tvix/eval/builtin-macros/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/eval/builtin-macros/src/lib.rs')
-rw-r--r--tvix/eval/builtin-macros/src/lib.rs54
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();