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 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> {
|
||||||
|
|||||||
Reference in New Issue
Block a user