feat(tvix/eval): add builtins.stringLength

Fairly straightforward, only thing of note is that we coerce (weakly) to
string here as well.

Change-Id: I03b427e657e402f1f9eb0f795b689bbf5092aba1
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6745
Tested-by: BuildkiteCI
Reviewed-by: wpcarro <wpcarro@gmail.com>
Reviewed-by: tazjin <tazjin@tvl.su>
This commit is contained in:
sterni 2022-09-21 22:30:39 +02:00
parent 64d3efcc2c
commit bd9cda2af7
3 changed files with 16 additions and 0 deletions

View file

@ -234,6 +234,11 @@ fn pure_builtins() -> Vec<Builtin> {
.collect::<Vec<Value>>();
Ok(Value::List(NixList::construct(parts.len(), parts)))
}),
Builtin::new("stringLength", &[false], |args, vm| {
// also forces the value
let s = args[0].coerce_to_string(CoercionKind::Weak, vm)?;
Ok(Value::Integer(s.as_str().len() as i64))
}),
Builtin::new(
"sub",
&[false, false],

View file

@ -0,0 +1 @@
[ 3 "hello" 9 4 ]

View file

@ -0,0 +1,10 @@
[
(builtins.stringLength "foo")
(let s = "hello"; in (builtins.substring 0 (builtins.stringLength s) s))
(builtins.stringLength ("foo" + "${"bar" + "baz"}"))
# feel free to delete this test case at any time, it's just to show: This is a
# thing at the moment. We may want to break compatibility with this aspect of
# the C++ Nix implementation at any time.
(builtins.stringLength "😀")
]