feat(tvix/eval): Implement builtins.tryEval
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
This commit is contained in:
parent
0b8a967aca
commit
4fd18cbc9a
4 changed files with 32 additions and 0 deletions
|
@ -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]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue