feat(tvix/eval): implement correct toString behavior

Implement C++ Nix's `EvalState::coerceToString` minus some of the Path
/ store handling. This is currently only used for `toString` which does
all possible coercions, but we've already prepared the weaker coercion
variant which is e.g. used for builtins that expect string arguments.

`EvalState::coerceToPath` is still missing for builtins that need a
path, but it'll be easy to build on top of this.

Change-Id: I78d15576b18921791d04b6b1e964b951fdef22c6
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6571
Autosubmit: sterni <sternenseemann@systemli.org>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
sterni 2022-09-13 15:37:19 +02:00
parent 16da548f93
commit da1d71a4e8
6 changed files with 196 additions and 14 deletions

View file

@ -1 +1 @@
[ "1" ]
[ "1" "4.200000" "" "" "1" "foo" "/etc" "Hello World" "Hello World" "1" "out" "2" "1 4.200000 1 foo /etc Hello World Hello World 1 out 2" ]

View file

@ -1,6 +1,23 @@
# TODO: add some examples for the "weird" types
[
(toString 1)
# TODO: floats must be padded to 6 digits
# (toString 4.2)
]
let
toStringableSet = {
__toString = self: self.content;
content = "Hello World";
};
toStringExamples = [
(toString 1)
(toString 4.2)
(toString null)
(toString false)
(toString true)
(toString "foo")
(toString /etc)
(toString toStringableSet)
(toString { __toString = _: toStringableSet; })
(toString { __toString = _: true; })
(toString { outPath = "out"; })
(toString { outPath = { outPath = { __toString = _: 2; }; }; })
];
in
toStringExamples ++ [ (toString toStringExamples) ]