fix(tvix/eval): handle __toString when JSON-serialising attrsets

These must be serialised to a JSON string of the *result* of coercing
the function application to a string.

Change-Id: Ib7f49ccd950503ddbdbf99643cd59565e26b50da
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8204
Reviewed-by: raitobezarius <tvl@lahfa.xyz>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2023-03-03 23:55:00 +03:00 committed by tazjin
parent a9f44721e5
commit 7d339d2762
5 changed files with 29 additions and 0 deletions

View file

@ -0,0 +1,5 @@
# attribute sets with a non-callable `__toString` can not be
# serialised to JSON.
builtins.toJSON {
__toString = 42;
}

View file

@ -0,0 +1,6 @@
# String coercions when using builtins.toJSON on an attribute set with
# a `__toString` attribute should be weak.
builtins.toJSON {
__toString = self: self.x;
x = 42;
}

View file

@ -0,0 +1 @@
"\"it's 42\""

View file

@ -0,0 +1,8 @@
# Attribute sets with a `__toString` attribute JSON-serialise with a
# string coercion of the function call result.
builtins.toJSON {
__toString = self: "it's " + (builtins.toString (self.x * self.y));
x = 21;
y = 2;
}