feat(tvix/eval): Support builtins.attrNames

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
This commit is contained in:
William Carroll 2022-09-05 11:43:17 -07:00 committed by clbot
parent 04503cf063
commit e834a2cbc4
4 changed files with 36 additions and 2 deletions

View file

@ -51,6 +51,18 @@ fn pure_builtins() -> Vec<Builtin> {
args.pop().unwrap().to_str()?.as_str().to_owned(),
));
}),
Builtin::new("attrNames", 1, |args, vm| {
force!(vm, &args[0], value, {
let xs = value.to_attrs()?;
let mut output = Vec::with_capacity(xs.len());
for (key, _val) in xs.iter() {
output.push(Value::String(key.clone()));
}
Ok(Value::List(NixList::construct(output.len(), output)))
})
}),
Builtin::new("catAttrs", 2, |mut args, _| {
let list = args.pop().unwrap().to_list()?;
let key = args.pop().unwrap().to_str()?;