diff options
author | Griffin Smith <grfn@gws.fyi> | 2022-10-13T04·04-0400 |
---|---|---|
committer | grfn <grfn@gws.fyi> | 2022-10-15T20·35+0000 |
commit | 3f45f6191d44f0abdab75f86827a8f26ff9c496f (patch) | |
tree | e0ab00465e77dc23d05224332608be198a07c2e0 /tvix/eval/src/builtins | |
parent | 03a3189a3d8e3e9d198ccf73bc0a836aaa6b6e3d (diff) |
feat(tvix/eval): Implement builtins.intersectAttrs r/5137
Change-Id: Iaba9bcfa19f283cd0c1931be2f211e2528a1a940 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6998 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su> Reviewed-by: kanepyork <rikingcoding@gmail.com>
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 0082d36d5735..03466af65f89 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -309,6 +309,21 @@ fn pure_builtins() -> Vec<Builtin> { None => Err(ErrorKind::IndexOutOfBounds { index: 0 }), } }), + Builtin::new( + "intersectAttrs", + &[true, true], + |args: Vec<Value>, _: &mut VM| { + let mut res = BTreeMap::new(); + let attrs1 = args[0].to_attrs()?; + let attrs2 = args[1].to_attrs()?; + for (k, v) in attrs2.iter() { + if attrs1.contains(k) { + res.insert(k.clone(), v.clone()); + } + } + Ok(Value::attrs(NixAttrs::from_map(res))) + }, + ), // For `is*` predicates we force manually, as Value::force also unwraps any Thunks Builtin::new("isAttrs", &[false], |args: Vec<Value>, vm: &mut VM| { let value = args[0].force(vm)?; |