use std::collections::BTreeMap;
#[derive(Clone, Debug, PartialEq)]
pub enum Value {
Null,
Bool(bool),
Int(i64),
Float(f64),
String(String),
List(Vec<Value>),
Map(BTreeMap<String, Value>),
}
impl Value {
pub fn type_name(&self) -> &'static str {
match self {
Value::Null => "null",
Value::Bool(_) => "Boolean",
Value::Int(_) => "Integer",
Value::Float(_) => "Double",
Value::String(_) => "String",
Value::List(_) => "List",
Value::Map(_) => "Map",
}
}
pub fn list(items: impl IntoIterator<Item = Value>) -> Value {
Value::List(items.into_iter().collect())
}
pub fn map(entries: impl IntoIterator<Item = (String, Value)>) -> Value {
Value::Map(entries.into_iter().collect())
}
}
impl From<i64> for Value {
fn from(v: i64) -> Value {
Value::Int(v)
}
}
impl From<i32> for Value {
fn from(v: i32) -> Value {
Value::Int(i64::from(v))
}
}
impl From<bool> for Value {
fn from(v: bool) -> Value {
Value::Bool(v)
}
}
impl From<f64> for Value {
fn from(v: f64) -> Value {
Value::Float(v)
}
}
impl From<&str> for Value {
fn from(v: &str) -> Value {
Value::String(v.to_string())
}
}
impl From<String> for Value {
fn from(v: String) -> Value {
Value::String(v)
}
}
impl From<Vec<Value>> for Value {
fn from(v: Vec<Value>) -> Value {
Value::List(v)
}
}