feat(tvix/eval): teach builtins.toXML context

XmlEmitter gains a NixContext field, and `write_typed_value` extends it
with all context elements present in the passed value.

Once all serialization is done, a into_context() function returns the
collected context, so we can construct a NixString with context.

Tests for this live in tvix-glue, as we use builtins.derivation, which
is not present in the tvix-eval crate.

Fixes b/398.

Change-Id: I85feaaa17b753885f8a017a54e419ec4e602af21
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11704
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: Alyssa Ross <hi@alyssa.is>
This commit is contained in:
Florian Klink 2024-05-23 11:06:30 +02:00 committed by clbot
parent a4a313cdd2
commit ec8d79f3db
4 changed files with 53 additions and 6 deletions

View file

@ -1504,8 +1504,19 @@ mod pure_builtins {
}
let mut buf: Vec<u8> = vec![];
to_xml::value_to_xml(&mut buf, &value)?;
Ok(buf.into())
let context = to_xml::value_to_xml(&mut buf, &value)?;
Ok((
buf,
// FUTUREWORK: We have a distinction between an empty context, and
// no context at all. Fix this.
if !context.is_empty() {
Some(Box::new(context))
} else {
None
},
)
.into())
}
#[builtin("placeholder")]