#![cfg_attr(feature = "nightly", feature(trait_alias))]
#![feature(generic_associated_types)]
use cc_traits::{Get, GetKeyValue, Iter, Keyed, Len, MapIter};
use std::{hash::Hash, ops::Deref};
mod impls;
pub mod number;
mod reference;
mod value;
#[cfg(feature = "nightly")]
mod aliases;
pub use number::Number;
pub use reference::*;
pub use value::*;
#[cfg(feature = "nightly")]
pub use aliases::*;
pub trait Key<M>: Eq + Hash + Deref<Target = str> {
fn metadata(&self) -> &M;
}
impl Key<()> for String {
fn metadata(&self) -> &() {
&()
}
}
#[cfg(feature = "smallkey")]
impl<A: smallvec::Array<Item = u8>> Key<()> for smallstr::SmallString<A> {
fn metadata(&self) -> &() {
&()
}
}
pub trait Json: Sized + Eq {
type MetaData: Clone + Sync + Send;
type Number: Number;
type String: Eq + Deref<Target = str> + for<'a> From<&'a str>;
type Array: Get<usize, Item = Self> + Len + Iter + IntoIterator<Item = Self>;
type Key: Key<Self::MetaData>;
type Object: Keyed<Key = Self::Key, Item = Self>
+ Len
+ for<'a> Get<&'a str>
+ for<'a> GetKeyValue<&'a str>
+ MapIter
+ IntoIterator<Item = (Self::Key, Self)>;
fn as_value_ref(&self) -> ValueRef<'_, Self>;
fn as_value_mut(&mut self) -> ValueMut<'_, Self>;
fn into_parts(self) -> (Value<Self>, Self::MetaData);
fn into_value(self) -> Value<Self> {
self.into_parts().0
}
fn metadata(&self) -> &Self::MetaData;
fn as_pair(&self) -> (ValueRef<'_, Self>, &Self::MetaData) {
(self.as_value_ref(), self.metadata())
}
fn as_pair_mut(&mut self) -> (ValueMut<'_, Self>, &Self::MetaData);
fn is_null(&self) -> bool {
self.as_value_ref().is_null()
}
#[inline]
fn is_empty_array(&self) -> bool {
match self.as_value_ref() {
ValueRef::Array(a) => a.is_empty(),
_ => false,
}
}
#[inline]
fn is_empty_object(&self) -> bool {
match self.as_value_ref() {
ValueRef::Array(a) => a.is_empty(),
_ => false,
}
}
#[inline]
fn is_empty_array_or_object(&self) -> bool {
match self.as_value_ref() {
ValueRef::Array(a) => a.is_empty(),
ValueRef::Object(o) => o.is_empty(),
_ => false,
}
}
fn is_bool(&self) -> bool {
self.as_value_ref().is_bool()
}
fn is_number(&self) -> bool {
self.as_value_ref().is_number()
}
fn is_string(&self) -> bool {
self.as_value_ref().is_string()
}
fn is_array(&self) -> bool {
self.as_value_ref().is_array()
}
fn is_object(&self) -> bool {
self.as_value_ref().is_object()
}
fn as_bool(&self) -> Option<bool> {
self.as_value_ref().as_bool()
}
fn as_number(&self) -> Option<&Self::Number> {
self.as_value_ref().as_number()
}
fn as_u32(&self) -> Option<u32> {
self.as_value_ref().as_u32()
}
fn as_u64(&self) -> Option<u64> {
self.as_value_ref().as_u64()
}
fn as_i32(&self) -> Option<i32> {
self.as_value_ref().as_i32()
}
fn as_i64(&self) -> Option<i64> {
self.as_value_ref().as_i64()
}
fn as_f32(&self) -> Option<f32> {
self.as_value_ref().as_f32()
}
fn as_f32_lossy(&self) -> Option<f32> {
self.as_value_ref().as_f32_lossy()
}
fn as_f64(&self) -> Option<f64> {
self.as_value_ref().as_f64()
}
fn as_f64_lossy(&self) -> Option<f64> {
self.as_value_ref().as_f64_lossy()
}
fn as_str(&self) -> Option<&str> {
self.as_value_ref().into_str()
}
fn as_array(&self) -> Option<&Self::Array> {
self.as_value_ref().as_array()
}
fn as_array_mut(&mut self) -> Option<&mut Self::Array> {
self.as_value_mut().into_array_mut()
}
fn as_object(&self) -> Option<&Self::Object> {
self.as_value_ref().as_object()
}
fn as_object_mut(&mut self) -> Option<&mut Self::Object> {
self.as_value_mut().into_object_mut()
}
}
impl<J: Json> From<J> for Value<J> {
fn from(j: J) -> Value<J> {
j.into_value()
}
}
pub trait JsonNew: Json {
fn new(value: Value<Self>, metadata: Self::MetaData) -> Self;
fn new_key(key: &str, metadata: Self::MetaData) -> Self::Key;
fn null(metadata: Self::MetaData) -> Self {
Self::new(Value::Null, metadata)
}
fn boolean(b: bool, metadata: Self::MetaData) -> Self {
Self::new(Value::Boolean(b), metadata)
}
fn number(n: Self::Number, metadata: Self::MetaData) -> Self {
Self::new(Value::Number(n), metadata)
}
fn string(s: Self::String, metadata: Self::MetaData) -> Self {
Self::new(Value::String(s), metadata)
}
fn array(a: Self::Array, metadata: Self::MetaData) -> Self {
Self::new(Value::Array(a), metadata)
}
fn empty_array(metadata: Self::MetaData) -> Self
where
Self::Array: Default,
{
Self::array(Self::Array::default(), metadata)
}
fn object(o: Self::Object, metadata: Self::MetaData) -> Self {
Self::new(Value::Object(o), metadata)
}
fn empty_object(metadata: Self::MetaData) -> Self
where
Self::Object: Default,
{
Self::object(Self::Object::default(), metadata)
}
}
#[derive(PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
pub struct Null;
impl Json for Null {
type MetaData = ();
type Number = number::Zero;
type String = String;
type Array = Vec<Self>;
type Key = String;
type Object = std::collections::BTreeMap<String, Self>;
fn as_value_ref(&self) -> ValueRef<'_, Self> {
ValueRef::Null
}
fn as_value_mut(&mut self) -> ValueMut<'_, Self> {
ValueMut::Null
}
fn into_parts(self) -> (Value<Self>, Self::MetaData) {
(Value::Null, ())
}
fn metadata(&self) -> &Self::MetaData {
&()
}
fn as_pair_mut(&mut self) -> (ValueMut<'_, Self>, &Self::MetaData) {
(ValueMut::Null, &())
}
}