about summary refs log tree commit diff
path: root/tvix/eval/src/value
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2022-09-05T18·43-0700
committerclbot <clbot@tvl.fyi>2022-09-15T20·37+0000
commite834a2cbc47cf18d5f35bb258ccc754c54c4f4e1 (patch)
treef11441a3a3951cf4bb2224b76bbb28b4a2a3233c /tvix/eval/src/value
parent04503cf063340464fb4e8a185fe3b550ed48fa34 (diff)
feat(tvix/eval): Support builtins.attrNames r/4864
Define `.len()` method on `NixAttrs` to preallocate the capacity of the result
vector.

Also anchor an errant comment to its context (I think).

Change-Id: I268f15025d453d7b3ae1146558c80e51433dd2a8
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6546
Reviewed-by: wpcarro <wpcarro@gmail.com>
Reviewed-by: sterni <sternenseemann@systemli.org>
Autosubmit: wpcarro <wpcarro@gmail.com>
Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval/src/value')
-rw-r--r--tvix/eval/src/value/attrs.rs12
1 files changed, 10 insertions, 2 deletions
diff --git a/tvix/eval/src/value/attrs.rs b/tvix/eval/src/value/attrs.rs
index 4c18ad2f55b2..86e52206b846 100644
--- a/tvix/eval/src/value/attrs.rs
+++ b/tvix/eval/src/value/attrs.rs
@@ -207,6 +207,15 @@ impl NixAttrs {
         }
     }
 
+    /// Return the number of key-value entries in an attrset.
+    pub fn len(&self) -> usize {
+        match &self.0 {
+            AttrsRep::Map(map) => map.len(),
+            AttrsRep::Empty => 0,
+            AttrsRep::KV { .. } => 2,
+        }
+    }
+
     /// Select a value from an attribute set by key.
     pub fn select(&self, key: &str) -> Option<&Value> {
         self.0.select(key)
@@ -216,6 +225,7 @@ impl NixAttrs {
         self.0.contains(key)
     }
 
+    /// Provide an iterator over all values of the attribute set.
     #[allow(clippy::needless_lifetimes)]
     pub fn iter<'a>(&'a self) -> Iter<KeyValue<'a>> {
         Iter(match &self.0 {
@@ -233,8 +243,6 @@ impl NixAttrs {
         })
     }
 
-    /// Provide an iterator over all values of the attribute set.
-
     /// Implement construction logic of an attribute set, to encapsulate
     /// logic about attribute set optimisations inside of this module.
     pub fn construct(count: usize, mut stack_slice: Vec<Value>) -> Result<Self, ErrorKind> {