use crate::{Json, JsonNew, Key, Number, Value, ValueMut, ValueRef};
use ijson::{
Destructured, DestructuredMut, DestructuredRef, IArray, INumber, IObject, IString, IValue,
};
impl Key<()> for IString {
fn metadata(&self) -> &() {
&()
}
}
impl Number for INumber {
#[inline(always)]
fn as_u32(&self) -> Option<u32> {
self.to_u32()
}
#[inline(always)]
fn as_u64(&self) -> Option<u64> {
self.to_u64()
}
#[inline(always)]
fn as_i32(&self) -> Option<i32> {
self.to_i32()
}
#[inline(always)]
fn as_i64(&self) -> Option<i64> {
self.to_i64()
}
#[inline(always)]
fn as_f32(&self) -> Option<f32> {
self.to_f32()
}
#[inline(always)]
fn as_f32_lossy(&self) -> f32 {
self.to_f32_lossy()
}
#[inline(always)]
fn as_f64(&self) -> Option<f64> {
self.to_f64()
}
#[inline(always)]
fn as_f64_lossy(&self) -> f64 {
self.to_f64_lossy()
}
}
impl Json for IValue {
type MetaData = ();
type Number = INumber;
type String = IString;
type Array = IArray;
type Key = IString;
type Object = IObject;
fn as_value_ref(&self) -> ValueRef<'_, Self> {
match self.destructure_ref() {
DestructuredRef::Null => ValueRef::Null,
DestructuredRef::Bool(b) => ValueRef::Boolean(b),
DestructuredRef::Number(n) => ValueRef::Number(n),
DestructuredRef::String(s) => ValueRef::String(s),
DestructuredRef::Array(a) => ValueRef::Array(a),
DestructuredRef::Object(o) => ValueRef::Object(o),
}
}
fn as_value_mut(&mut self) -> ValueMut<'_, Self> {
match self.destructure_mut() {
DestructuredMut::Null => ValueMut::Null,
DestructuredMut::Bool(b) => ValueMut::Boolean(b.get()),
DestructuredMut::Number(n) => ValueMut::Number(n),
DestructuredMut::String(s) => ValueMut::String(s),
DestructuredMut::Array(a) => ValueMut::Array(a),
DestructuredMut::Object(o) => ValueMut::Object(o),
}
}
fn into_parts(self) -> (Value<Self>, Self::MetaData) {
let value = match self.destructure() {
Destructured::Null => Value::Null,
Destructured::Bool(b) => Value::Boolean(b),
Destructured::Number(n) => Value::Number(n),
Destructured::String(s) => Value::String(s),
Destructured::Array(a) => Value::Array(a),
Destructured::Object(o) => Value::Object(o),
};
(value, ())
}
fn metadata(&self) -> &Self::MetaData {
&()
}
fn as_pair_mut(&mut self) -> (ValueMut<'_, Self>, &Self::MetaData) {
(self.as_value_mut(), &())
}
}
impl JsonNew for IValue {
fn new(value: Value<Self>, _: ()) -> Self {
match value {
Value::Null => IValue::NULL,
Value::Boolean(true) => IValue::TRUE,
Value::Boolean(false) => IValue::FALSE,
Value::Number(n) => n.into(),
Value::String(s) => s.into(),
Value::Array(a) => a.into(),
Value::Object(o) => o.into(),
}
}
fn new_key(key: &str, _: ()) -> IString {
key.into()
}
}
impl<'a> From<&'a IValue> for ValueRef<'a, IValue> {
fn from(value: &'a IValue) -> Self {
match value.destructure_ref() {
DestructuredRef::Null => ValueRef::Null,
DestructuredRef::Bool(b) => ValueRef::Boolean(b),
DestructuredRef::Number(n) => ValueRef::Number(n),
DestructuredRef::String(s) => ValueRef::String(s),
DestructuredRef::Array(a) => ValueRef::Array(a),
DestructuredRef::Object(o) => ValueRef::Object(o),
}
}
}
impl<'a> From<&'a mut IValue> for ValueMut<'a, IValue> {
fn from(value: &'a mut IValue) -> Self {
match value.destructure_mut() {
DestructuredMut::Null => ValueMut::Null,
DestructuredMut::Bool(b) => ValueMut::Boolean(b.get()),
DestructuredMut::Number(n) => ValueMut::Number(n),
DestructuredMut::String(s) => ValueMut::String(s),
DestructuredMut::Array(a) => ValueMut::Array(a),
DestructuredMut::Object(o) => ValueMut::Object(o),
}
}
}