about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-08-08T14·27+0300
committertazjin <tazjin@tvl.su>2022-08-13T11·50+0000
commit2ed38a7cdbd248deb518afff790977243f169a8f (patch)
tree00aab465bde13cde5eed4c82df439be6288b08c6
parentba03226e514b9bc55e5da35830d5fe6cadcf988c (diff)
feat(tvix/eval): add Value variants for strings & attrsets r/4423
Change-Id: Idebf663ab7fde3955aae50f635320f7eb6c353e8
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6087
Tested-by: BuildkiteCI
Reviewed-by: grfn <grfn@gws.fyi>
-rw-r--r--tvix/eval/src/value/attrs.rs6
-rw-r--r--tvix/eval/src/value/mod.rs15
-rw-r--r--tvix/eval/src/value/string.rs2
-rw-r--r--tvix/eval/src/vm.rs4
4 files changed, 21 insertions, 6 deletions
diff --git a/tvix/eval/src/value/attrs.rs b/tvix/eval/src/value/attrs.rs
index 69688d3c51..1658d69c7e 100644
--- a/tvix/eval/src/value/attrs.rs
+++ b/tvix/eval/src/value/attrs.rs
@@ -34,3 +34,9 @@ impl Display for NixAttrs {
         f.write_str("}")
     }
 }
+
+impl PartialEq for NixAttrs {
+    fn eq(&self, _other: &Self) -> bool {
+        todo!("attrset equality")
+    }
+}
diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs
index 628eefb8fd..ea0c89e6b6 100644
--- a/tvix/eval/src/value/mod.rs
+++ b/tvix/eval/src/value/mod.rs
@@ -1,18 +1,23 @@
 //! This module implements the backing representation of runtime
 //! values in the Nix language.
 use std::fmt::Display;
-
-use crate::errors::{Error, EvalResult};
+use std::rc::Rc;
 
 mod attrs;
 mod string;
 
-#[derive(Clone, Copy, Debug, PartialEq)]
+use crate::errors::{Error, EvalResult};
+use attrs::NixAttrs;
+use string::NixString;
+
+#[derive(Clone, Debug, PartialEq)]
 pub enum Value {
     Null,
     Bool(bool),
     Integer(i64),
     Float(f64),
+    String(NixString),
+    Attrs(Rc<NixAttrs>),
 }
 
 impl Value {
@@ -30,6 +35,8 @@ impl Value {
             Value::Bool(_) => "bool",
             Value::Integer(_) => "int",
             Value::Float(_) => "float",
+            Value::String(_) => "string",
+            Value::Attrs(_) => "set",
         }
     }
 
@@ -52,6 +59,8 @@ impl Display for Value {
             Value::Bool(false) => f.write_str("false"),
             Value::Integer(num) => f.write_fmt(format_args!("{}", num)),
             Value::Float(num) => f.write_fmt(format_args!("{}", num)),
+            Value::String(s) => s.fmt(f),
+            Value::Attrs(attrs) => attrs.fmt(f),
         }
     }
 }
diff --git a/tvix/eval/src/value/string.rs b/tvix/eval/src/value/string.rs
index c123fc3ee1..7e6f5ecf3b 100644
--- a/tvix/eval/src/value/string.rs
+++ b/tvix/eval/src/value/string.rs
@@ -3,7 +3,7 @@ use std::fmt::Display;
 /// This module implements Nix language strings and their different
 /// backing implementations.
 
-#[derive(Debug, Hash, PartialEq)]
+#[derive(Clone, Debug, Hash, PartialEq)]
 pub struct NixString(String);
 
 impl Display for NixString {
diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs
index 6841ac4706..9a718500b5 100644
--- a/tvix/eval/src/vm.rs
+++ b/tvix/eval/src/vm.rs
@@ -36,7 +36,7 @@ impl VM {
 
             (Value::Float(f1), Value::Integer(i2)) => Ok(NumberPair::Floats(f1, i2 as f64)),
 
-            _ => Err(Error::TypeError {
+            (v1, v2) => Err(Error::TypeError {
                 expected: "number (either int or float)",
                 actual: if v1.is_number() {
                     v2.type_of()
@@ -105,7 +105,7 @@ impl VM {
                         (Value::Float(f), Value::Integer(i))
                         | (Value::Integer(i), Value::Float(f)) => f == (i as f64),
 
-                        _ => v2 == v2,
+                        (v1, v2) => v1 == v2,
                     };
 
                     self.push(Value::Bool(eq))