From 5597f077870e17d235d23d1dd458b9630e85232e Mon Sep 17 00:00:00 2001 From: Glint Dev Date: Tue, 21 Jul 2026 20:29:02 +0300 Subject: [PATCH] Phase 1.1: define Value enum in types.rs --- src/interpreter/types.rs | 85 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/src/interpreter/types.rs b/src/interpreter/types.rs index 3b1e152..a497702 100644 --- a/src/interpreter/types.rs +++ b/src/interpreter/types.rs @@ -3,6 +3,91 @@ use std::collections::HashMap; use std::fmt; use super::style::{ComputedStyle, StyleSheet}; +use compact_str::CompactStr; + +#[derive(Clone, Debug)] +pub enum Value { + Str(CompactStr), + Int(i64), + Float(f64), + Bool(bool), + Array(Vec), + None, +} + +impl Value { + pub fn as_str(&self) -> Option<&str> { + match self { + Value::Str(s) => Some(s.as_str()), + _ => None, + } + } + + pub fn to_owned_string(&self) -> CompactStr { + match self { + Value::Str(s) => s.clone(), + Value::Int(i) => CompactStr::new(i.to_string()), + Value::Float(f) => CompactStr::new(if f.fract() == 0.0 { + format!("{:.1}", f) + } else { + f.to_string() + }), + Value::Bool(b) => CompactStr::new(b.to_string()), + Value::Array(a) => CompactStr::new(a.iter().map(|v| v.to_owned_string()).collect::>().join(",")), + Value::None => CompactStr::new_empty(), + } + } +} + +impl From<&str> for Value { + fn from(s: &str) -> Self { + Value::Str(CompactStr::new(s)) + } +} + +impl From for Value { + fn from(s: String) -> Self { + Value::Str(CompactStr::new(s)) + } +} + +impl From for Value { + fn from(i: i64) -> Self { + Value::Int(i) + } +} + +impl From for Value { + fn from(f: f64) -> Self { + Value::Float(f) + } +} + +impl From for Value { + fn from(b: bool) -> Self { + Value::Bool(b) + } +} + +impl> From> for Value { + fn from(v: Vec) -> Self { + Value::Array(v.into_iter().map(Into::into).collect()) + } +} + +impl PartialEq for Value { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Value::Str(a), Value::Str(b)) => a == b, + (Value::Int(a), Value::Int(b)) => a == b, + (Value::Float(a), Value::Float(b)) => (a - b).abs() < f64::EPSILON, + (Value::Bool(a), Value::Bool(b)) => a == b, + (Value::Array(a), Value::Array(b)) => a == b, + (Value::None, Value::None) => true, + _ => false, + } + } +} #[derive(Debug, Clone)] pub struct Element<'a> {