From ba03226e514b9bc55e5da35830d5fe6cadcf988c Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Mon, 8 Aug 2022 17:09:50 +0300 Subject: feat(tvix/eval): add module for attribute set implementations Change-Id: I6002bd5e5596b93325dea6c862370ba5235c0f08 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6086 Tested-by: BuildkiteCI Reviewed-by: grfn --- tvix/eval/src/value/attrs.rs | 36 ++++++++++++++++++++++++++++++++++++ tvix/eval/src/value/mod.rs | 1 + 2 files changed, 37 insertions(+) create mode 100644 tvix/eval/src/value/attrs.rs diff --git a/tvix/eval/src/value/attrs.rs b/tvix/eval/src/value/attrs.rs new file mode 100644 index 0000000000..69688d3c51 --- /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), + 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 7052df3d4e..628eefb8fd 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)] -- cgit 1.4.1