use super::*;
#[derive(Debug, Clone)]
pub enum Number {
Real(f32),
Natural(u32),
Integer(i32),
}
#[derive(Debug, Clone)]
pub enum Vector {
Real(Vec<f32>),
Natural(Vec<u32>),
Integer(Vec<i32>),
}
impl Vector {
pub fn len(&self) -> usize {
match self {
Vector::Real(x_vec) => x_vec.len(),
Vector::Natural(x_vec) => x_vec.len(),
Vector::Integer(x_vec) => x_vec.len(),
}
}
}
#[derive(Debug, Clone)]
pub enum Value {
Null,
Bool(bool),
Number(Number),
Vector(Vector),
String(String),
}
impl Value {
#[doc(hidden)]
pub(crate) fn blank_list(&self) -> ValueList {
match self {
Value::Null => ValueList::new(),
Value::Bool(..) => BoolList::new(),
Value::Number(..) => NumberList::new(),
Value::String(..) => StringList::new(),
Value::Vector(v) => match v {
Vector::Real(v) => VectorList::from_f32(vec![], v.len()),
Vector::Natural(v) => VectorList::from_u32(vec![], v.len()),
Vector::Integer(v) => VectorList::from_i32(vec![], v.len()),
},
}
}
pub fn value_type(&self) -> &str {
match self {
Value::Null => "Null",
Value::Bool(..) => "Bool",
Value::Number(..) => "Numeric",
Value::String(..) => "String",
Value::Vector(..) => "Vector",
}
}
}
pub type Metadata = IndexMap<String, Value>;