diff options
author | Griffin Smith <root@gws.fyi> | 2022-10-10T15·54-0400 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2022-10-10T20·31+0000 |
commit | 4fd18cbc9a756ea51dd04fa7bde9cfc79f4f8fa3 (patch) | |
tree | 28b13aa1da306a365646ac2896fabf4b2283c73a /tvix/eval/src/builtins | |
parent | 0b8a967acac26b527ebedfff6658117f63f7c861 (diff) |
feat(tvix/eval): Implement builtins.tryEval r/5089
With asserts compiled using conditional jumps, this ends up being quite straightforward - the only real tricky bit is that we have to know whether an error can or can't be handled. Change-Id: I75617da73b7a9c5cdd888c0e26ae81d2c5c0d714 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6924 Reviewed-by: sterni <sternenseemann@systemli.org> Autosubmit: grfn <grfn@gws.fyi> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval/src/builtins')
-rw-r--r-- | tvix/eval/src/builtins/mod.rs | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index 08b8299e4803..1fc833641766 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -431,6 +431,21 @@ fn pure_builtins() -> Vec<Builtin> { Builtin::new("throw", &[true], |args: Vec<Value>, _: &mut VM| { Err(ErrorKind::Throw(args[0].to_str()?.to_string())) }), + Builtin::new("tryEval", &[false], |args: Vec<Value>, vm: &mut VM| { + let mut res = BTreeMap::new(); + match args[0].force(vm) { + Ok(value) => { + res.insert("value".into(), (*value).clone()); + res.insert("success".into(), true.into()); + } + Err(e) if e.is_catchable() => { + res.insert("value".into(), false.into()); + res.insert("success".into(), false.into()); + } + Err(e) => return Err(e), + } + Ok(Value::attrs(NixAttrs::from_map(res))) + }), // coerce_to_string forces for us Builtin::new("toString", &[false], |args: Vec<Value>, vm: &mut VM| { args[0] |