Phase 1.1: define Value enum in types.rs
This commit is contained in:
@@ -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<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)]
|
||||
pub struct Element<'a> {
|
||||
|
||||
Reference in New Issue
Block a user