use { crate::toml::toml_span::Spanned, indexmap::IndexMap, std::{ cmp::Ordering, fmt::{Debug, Formatter}, }, }; pub enum Value { String(String), Integer(i64), Float(f64), Boolean(bool), Array(Vec>), Table(IndexMap, Spanned>), } impl Value { pub fn name(&self) -> &'static str { match self { Value::String(_) => "a string", Value::Integer(_) => "an integer", Value::Float(_) => "a float", Value::Boolean(_) => "a boolean", Value::Array(_) => "an array", Value::Table(_) => "a table", } } } impl Debug for Value { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { Value::String(v) => v.fmt(f), Value::Integer(v) => v.fmt(f), Value::Float(v) => v.fmt(f), Value::Boolean(v) => v.fmt(f), Value::Array(v) => v.fmt(f), Value::Table(v) => v.fmt(f), } } } impl PartialEq for Value { fn eq(&self, other: &Self) -> bool { match (self, other) { (Value::String(v1), Value::String(v2)) => v1 == v2, (Value::Integer(v1), Value::Integer(v2)) => v1 == v2, (Value::Float(v1), Value::Float(v2)) => { if v1.is_nan() && v2.is_nan() { true } else { v1.total_cmp(v2) == Ordering::Equal } } (Value::Boolean(v1), Value::Boolean(v2)) => v1 == v2, (Value::Array(v1), Value::Array(v2)) => v1 == v2, (Value::Table(v1), Value::Table(v2)) => v1 == v2, _ => false, } } }