Phase 1.1: define Value enum in types.rs

This commit is contained in:
Glint Dev
2026-07-21 20:29:02 +03:00
parent 06270a2126
commit 5597f07787

View File

@@ -3,6 +3,91 @@ use std::collections::HashMap;
use std::fmt; use std::fmt;
use super::style::{ComputedStyle, StyleSheet}; 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<Value>),
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::<Vec<_>>().join(",")),
Value::None => CompactStr::new_empty(),
}
}
}
impl From<&str> for Value {
fn from(s: &str) -> Self {
Value::Str(CompactStr::new(s))
}
}
impl From<String> for Value {
fn from(s: String) -> Self {
Value::Str(CompactStr::new(s))
}
}
impl From<i64> for Value {
fn from(i: i64) -> Self {
Value::Int(i)
}
}
impl From<f64> for Value {
fn from(f: f64) -> Self {
Value::Float(f)
}
}
impl From<bool> for Value {
fn from(b: bool) -> Self {
Value::Bool(b)
}
}
impl<T: Into<Value>> From<Vec<T>> for Value {
fn from(v: Vec<T>) -> 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)] #[derive(Debug, Clone)]
pub struct Element<'a> { pub struct Element<'a> {