#[derive(Copy, Clone, Debug, PartialEq)]
pub enum Integer {
U64(u64),
I64(i64),
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum Float {
F32(f32),
F64(f64),
}
#[derive(Clone, Debug, PartialEq)]
pub enum Value {
Nil,
Boolean(bool),
Integer(Integer),
Float(Float),
String(String),
Binary(Vec<u8>),
Array(Vec<Value>),
Map(Vec<(Value, Value)>),
Ext(i8, Vec<u8>),
}
#[derive(Clone, Debug, PartialEq)]
pub enum ValueRef<'a> {
Nil,
Boolean(bool),
Integer(Integer),
Float(Float),
String(&'a str),
Binary(&'a [u8]),
Array(Vec<ValueRef<'a>>),
Map(Vec<(ValueRef<'a>, ValueRef<'a>)>),
Ext(i8, &'a [u8]),
}
impl<'a> ValueRef<'a> {
pub fn to_owned(&self) -> Value {
match self {
&ValueRef::Nil => Value::Nil,
&ValueRef::Boolean(val) => Value::Boolean(val),
&ValueRef::Integer(val) => Value::Integer(val),
&ValueRef::Float(val) => Value::Float(val),
&ValueRef::String(val) => Value::String(val.to_owned()),
&ValueRef::Binary(val) => Value::Binary(val.to_vec()),
&ValueRef::Array(ref val) => {
Value::Array(val.iter().map(|v| v.to_owned()).collect())
}
&ValueRef::Map(ref val) => {
Value::Map(val.iter().map(|&(ref k, ref v)| (k.to_owned(), v.to_owned())).collect())
}
&ValueRef::Ext(ty, buf) => Value::Ext(ty, buf.to_vec()),
}
}
}