use array::Array;
use bytes::Bytes;
use ducc::Ducc;
use error::Result;
use function::Function;
use object::Object;
use std::iter::FromIterator;
use std::ops::{Deref, DerefMut};
use std::{slice, vec};
use string::String;
#[derive(Clone, Debug)]
pub enum Value<'ducc> {
Undefined,
Null,
Boolean(bool),
Number(f64),
String(String<'ducc>),
Function(Function<'ducc>),
Array(Array<'ducc>),
Object(Object<'ducc>),
Bytes(Bytes<'ducc>),
}
impl<'ducc> Value<'ducc> {
pub fn is_undefined(&self) -> bool {
if let Value::Undefined = *self { true } else { false }
}
pub fn is_null(&self) -> bool {
if let Value::Null = *self { true } else { false }
}
pub fn is_boolean(&self) -> bool {
if let Value::Boolean(_) = *self { true } else { false }
}
pub fn is_number(&self) -> bool {
if let Value::Number(_) = *self { true } else { false }
}
pub fn is_string(&self) -> bool {
if let Value::String(_) = *self { true } else { false }
}
pub fn is_function(&self) -> bool {
if let Value::Function(_) = *self { true } else { false }
}
pub fn is_array(&self) -> bool {
if let Value::Array(_) = *self { true } else { false }
}
pub fn is_object(&self) -> bool {
if let Value::Object(_) = *self { true } else { false }
}
pub fn is_bytes(&self) -> bool {
if let Value::Bytes(_) = *self { true } else { false }
}
pub fn as_undefined(&self) -> Option<()> {
if let Value::Undefined = *self { Some(()) } else { None }
}
pub fn as_null(&self) -> Option<()> {
if let Value::Undefined = *self { Some(()) } else { None }
}
pub fn as_boolean(&self) -> Option<bool> {
if let Value::Boolean(value) = *self { Some(value) } else { None }
}
pub fn as_number(&self) -> Option<f64> {
if let Value::Number(value) = *self { Some(value) } else { None }
}
pub fn as_string(&self) -> Option<&String<'ducc>> {
if let Value::String(ref value) = *self { Some(value) } else { None }
}
pub fn as_function(&self) -> Option<&Function<'ducc>> {
if let Value::Function(ref value) = *self { Some(value) } else { None }
}
pub fn as_array(&self) -> Option<&Array<'ducc>> {
if let Value::Array(ref value) = *self { Some(value) } else { None }
}
pub fn as_object(&self) -> Option<&Object<'ducc>> {
if let Value::Object(ref value) = *self { Some(value) } else { None }
}
pub fn as_bytes(&self) -> Option<&Bytes<'ducc>> {
if let Value::Bytes(ref value) = *self { Some(value) } else { None }
}
pub fn into<T: FromValue<'ducc>>(self, ducc: &'ducc Ducc) -> Result<T> {
T::from_value(self, ducc)
}
pub(crate) fn type_name(&self) -> &'static str {
match *self {
Value::Undefined => "undefined",
Value::Null => "null",
Value::Boolean(_) => "boolean",
Value::Number(_) => "number",
Value::String(_) => "string",
Value::Function(_) => "function",
Value::Array(_) => "array",
Value::Object(_) => "object",
Value::Bytes(_) => "bytes",
}
}
}
pub trait ToValue<'ducc> {
fn to_value(self, ducc: &'ducc Ducc) -> Result<Value<'ducc>>;
}
pub trait FromValue<'ducc>: Sized {
fn from_value(value: Value<'ducc>, ducc: &'ducc Ducc) -> Result<Self>;
}
#[derive(Clone, Debug)]
pub struct Values<'ducc>(Vec<Value<'ducc>>);
impl<'ducc> Values<'ducc> {
pub fn new() -> Values<'ducc> {
Values(Vec::new())
}
pub fn from_vec(vec: Vec<Value<'ducc>>) -> Values<'ducc> {
Values(vec)
}
pub fn into_vec(self) -> Vec<Value<'ducc>> {
self.0
}
pub fn get(&self, index: usize) -> Value<'ducc> {
self.0.get(index).map(Clone::clone).unwrap_or(Value::Undefined)
}
pub fn from<T: FromValue<'ducc>>(&self, ducc: &'ducc Ducc, index: usize) -> Result<T> {
T::from_value(self.0.get(index).map(Clone::clone).unwrap_or(Value::Undefined), ducc)
}
pub fn into<T: FromValues<'ducc>>(self, ducc: &'ducc Ducc) -> Result<T> {
T::from_values(self, ducc)
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn iter<'a>(&'a self) -> impl Iterator<Item = &'a Value<'ducc>> {
self.0.iter()
}
}
impl<'ducc> FromIterator<Value<'ducc>> for Values<'ducc> {
fn from_iter<I: IntoIterator<Item = Value<'ducc>>>(iter: I) -> Self {
Values::from_vec(Vec::from_iter(iter))
}
}
impl<'ducc> IntoIterator for Values<'ducc> {
type Item = Value<'ducc>;
type IntoIter = vec::IntoIter<Value<'ducc>>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl<'a, 'ducc> IntoIterator for &'a Values<'ducc> {
type Item = &'a Value<'ducc>;
type IntoIter = slice::Iter<'a, Value<'ducc>>;
fn into_iter(self) -> Self::IntoIter {
(&self.0).into_iter()
}
}
pub trait ToValues<'ducc> {
fn to_values(self, ducc: &'ducc Ducc) -> Result<Values<'ducc>>;
}
pub trait FromValues<'ducc>: Sized {
fn from_values(values: Values<'ducc>, ducc: &'ducc Ducc) -> Result<Self>;
}
#[derive(Clone, Debug)]
pub struct Variadic<T>(pub(crate) Vec<T>);
impl<T> Variadic<T> {
pub fn new() -> Variadic<T> {
Variadic(Vec::new())
}
pub fn from_vec(vec: Vec<T>) -> Variadic<T> {
Variadic(vec)
}
pub fn into_vec(self) -> Vec<T> {
self.0
}
}
impl<T> FromIterator<T> for Variadic<T> {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
Variadic(Vec::from_iter(iter))
}
}
impl<T> IntoIterator for Variadic<T> {
type Item = T;
type IntoIter = <Vec<T> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl<T> Deref for Variadic<T> {
type Target = Vec<T>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T> DerefMut for Variadic<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}