From d26c097d1b5f99ace10e60243280f4687cfc3cb9 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Mon, 8 Aug 2022 17:09:21 +0300 Subject: feat(tvix/eval): add module for string type implementation Change-Id: I5e4465acc4a676c10d7374b14f7a09240202b466 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6085 Tested-by: BuildkiteCI Reviewed-by: grfn --- tvix/eval/src/value.rs | 55 ------------------------------------------ tvix/eval/src/value/mod.rs | 56 +++++++++++++++++++++++++++++++++++++++++++ tvix/eval/src/value/string.rs | 13 ++++++++++ 3 files changed, 69 insertions(+), 55 deletions(-) delete mode 100644 tvix/eval/src/value.rs create mode 100644 tvix/eval/src/value/mod.rs create mode 100644 tvix/eval/src/value/string.rs diff --git a/tvix/eval/src/value.rs b/tvix/eval/src/value.rs deleted file mode 100644 index a4656b1b9c..0000000000 --- a/tvix/eval/src/value.rs +++ /dev/null @@ -1,55 +0,0 @@ -//! This module implements the backing representation of runtime -//! values in the Nix language. - -use std::fmt::Display; - -use crate::errors::{Error, EvalResult}; - -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum Value { - Null, - Bool(bool), - Integer(i64), - Float(f64), -} - -impl Value { - pub fn is_number(&self) -> bool { - match self { - Value::Integer(_) => true, - Value::Float(_) => true, - _ => false, - } - } - - pub fn type_of(&self) -> &'static str { - match self { - Value::Null => "null", - Value::Bool(_) => "bool", - Value::Integer(_) => "int", - Value::Float(_) => "float", - } - } - - pub fn as_bool(self) -> EvalResult { - match self { - Value::Bool(b) => Ok(b), - other => Err(Error::TypeError { - expected: "bool", - actual: other.type_of(), - }), - } - } -} - -impl Display for Value { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Value::Null => f.write_str("null"), - Value::Bool(true) => f.write_str("true"), - 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)), - } - } -} diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs new file mode 100644 index 0000000000..7052df3d4e --- /dev/null +++ b/tvix/eval/src/value/mod.rs @@ -0,0 +1,56 @@ +//! This module implements the backing representation of runtime +//! values in the Nix language. +use std::fmt::Display; + +use crate::errors::{Error, EvalResult}; + +mod string; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum Value { + Null, + Bool(bool), + Integer(i64), + Float(f64), +} + +impl Value { + pub fn is_number(&self) -> bool { + match self { + Value::Integer(_) => true, + Value::Float(_) => true, + _ => false, + } + } + + pub fn type_of(&self) -> &'static str { + match self { + Value::Null => "null", + Value::Bool(_) => "bool", + Value::Integer(_) => "int", + Value::Float(_) => "float", + } + } + + pub fn as_bool(self) -> EvalResult { + match self { + Value::Bool(b) => Ok(b), + other => Err(Error::TypeError { + expected: "bool", + actual: other.type_of(), + }), + } + } +} + +impl Display for Value { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Value::Null => f.write_str("null"), + Value::Bool(true) => f.write_str("true"), + 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)), + } + } +} diff --git a/tvix/eval/src/value/string.rs b/tvix/eval/src/value/string.rs new file mode 100644 index 0000000000..c123fc3ee1 --- /dev/null +++ b/tvix/eval/src/value/string.rs @@ -0,0 +1,13 @@ +use std::fmt::Display; + +/// This module implements Nix language strings and their different +/// backing implementations. + +#[derive(Debug, Hash, PartialEq)] +pub struct NixString(String); + +impl Display for NixString { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(self.0.as_str()) + } +} -- cgit 1.4.1