diff options
Diffstat (limited to 'tvix/eval/src')
-rw-r--r-- | tvix/eval/src/value/attrs.rs | 36 | ||||
-rw-r--r-- | tvix/eval/src/value/mod.rs | 1 |
2 files changed, 37 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("}") + } +} diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs index 7052df3d4e66..628eefb8fdd8 100644 --- a/tvix/eval/src/value/mod.rs +++ b/tvix/eval/src/value/mod.rs @@ -4,6 +4,7 @@ use std::fmt::Display; use crate::errors::{Error, EvalResult}; +mod attrs; mod string; #[derive(Clone, Copy, Debug, PartialEq)] |