diff options
Diffstat (limited to 'tvix/eval/src/value/attrs.rs')
-rw-r--r-- | tvix/eval/src/value/attrs.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/tvix/eval/src/value/attrs.rs b/tvix/eval/src/value/attrs.rs new file mode 100644 index 000000000000..69688d3c5122 --- /dev/null +++ b/tvix/eval/src/value/attrs.rs @@ -0,0 +1,36 @@ +/// This module implements Nix attribute sets. They have flexible +/// backing implementations, as they are used in very versatile +/// use-cases that are all exposed the same way in the language +/// surface. +use std::collections::BTreeMap; +use std::fmt::Display; + +use super::string::NixString; +use super::Value; + +#[derive(Debug)] +pub enum NixAttrs { + Map(BTreeMap<NixString, Value>), + KV { name: NixString, value: Value }, +} + +impl Display for NixAttrs { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str("{ ")?; + + match self { + NixAttrs::KV { name, value } => { + f.write_fmt(format_args!("name = \"{}\"; ", name))?; + f.write_fmt(format_args!("value = {}; ", value))?; + } + + NixAttrs::Map(map) => { + for (name, value) in map { + f.write_fmt(format_args!("{} = {}; ", name, value))?; + } + } + } + + f.write_str("}") + } +} |