feat(tvix/eval): Implement builtins.fromJSON

Using `serde_json` for parsing JSON here, plus an `impl FromJSON for
Value`. The latter is primarily to stay "dependency light" for now -
likely going with an actual serde `Deserialize` impl in the future is
going to be way better as it allows saving significantly on intermediary
allocations.

Change-Id: I152a0448ff7c87cf7ebaac927c38912b99de1c18
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6920
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
This commit is contained in:
Griffin Smith 2022-10-10 00:32:57 -04:00 committed by grfn
parent 277c69cbe5
commit 5eb89be682
12 changed files with 123 additions and 13 deletions

View file

@ -274,6 +274,12 @@ impl NixAttrs {
NixAttrs(AttrsRep::Map(map))
}
/// Construct an optimized "KV"-style attribute set given the value for the
/// `"name"` key, and the value for the `"value"` key
pub(crate) fn from_kv(name: Value, value: Value) -> Self {
NixAttrs(AttrsRep::KV { name, value })
}
/// Compare `self` against `other` for equality using Nix equality semantics
pub fn nix_eq(&self, other: &Self, vm: &mut VM) -> Result<bool, ErrorKind> {
match (&self.0, &other.0) {
@ -376,10 +382,10 @@ fn attempt_optimise_kv(slice: &mut [Value]) -> Option<NixAttrs> {
}
};
Some(NixAttrs(AttrsRep::KV {
name: slice[name_idx].clone(),
value: slice[value_idx].clone(),
}))
Some(NixAttrs::from_kv(
slice[name_idx].clone(),
slice[value_idx].clone(),
))
}
/// Set an attribute on an in-construction attribute set, while