From 863c4207cc2adbbcbfa539fbfb4765c135801e77 Mon Sep 17 00:00:00 2001 From: Ryan Lahfa Date: Mon, 25 Mar 2024 03:36:32 +0100 Subject: feat(tvix/eval): contextful JSON operations `toJSON` transform a Nix structure into a JSON string. For each context in that Nix structure, the JSON string must possess it. Thus, it is necessary to take the union of all contexts and attach it to the final structure. Unfortunately, the return type of `into_json` is a serde's JSON object, not a string. Therefore, it is not possible to reuse `NixString` machinery. Context tests are reinforced as Nix does not test those behaviors. Fixes b/393. Change-Id: I5afdbc4e18dd70469192c1aa657d1049ba330149 Signed-off-by: Ryan Lahfa Reviewed-on: https://cl.tvl.fyi/c/depot/+/11266 Reviewed-by: flokli Tested-by: BuildkiteCI --- tvix/eval/src/vm/generators.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'tvix/eval/src/vm') diff --git a/tvix/eval/src/vm/generators.rs b/tvix/eval/src/vm/generators.rs index d5b5f1de4979..79de6886923a 100644 --- a/tvix/eval/src/vm/generators.rs +++ b/tvix/eval/src/vm/generators.rs @@ -493,7 +493,7 @@ where VMRequest::ToJson(value) => { self.reenqueue_generator(name, span.clone(), generator); self.enqueue_generator("to_json", span, |co| { - value.into_json_generator(co) + value.into_contextful_json_generator(co) }); return Ok(false); } @@ -778,9 +778,9 @@ pub(crate) async fn request_span(co: &GenCo) -> LightSpan { pub(crate) async fn request_to_json( co: &GenCo, value: Value, -) -> Result { +) -> Result<(serde_json::Value, NixContext), CatchableErrorKind> { match co.yield_(VMRequest::ToJson(value)).await { - VMResponse::Value(Value::Json(json)) => Ok(*json), + VMResponse::Value(Value::Json(json_with_ctx)) => Ok(*json_with_ctx), VMResponse::Value(Value::Catchable(cek)) => Err(*cek), msg => panic!( "Tvix bug: VM responded with incorrect generator message: {}", -- cgit 1.4.1