use std::marker::PhantomData;
use crate::serde::{self, Deserialize, Serialize};
mod collections;
pub use collections::{List, Map, Set};
pub trait State: Serialize + for<'de> Deserialize<'de> {
type Target: Serialize + for<'de> Deserialize<'de>;
}
struct StateDeserializer<T>(pub PhantomData<T>);
impl<'de, T: serde::Deserialize<'de>> serde::de::DeserializeSeed<'de> for StateDeserializer<T> {
type Value = T;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: serde::Deserializer<'de>,
{
T::deserialize(deserializer)
}
}
macro_rules! impl_state_for_primitive {
($($t:ty),*) => {
$(
impl State for $t {
type Target = Self;
}
)*
};
}
impl_state_for_primitive!(
bool, i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, f32, f64, char, String
);
impl<T: State> State for Option<T> {
type Target = Option<T::Target>;
}
impl<T: State> State for Box<T> {
type Target = Box<T::Target>;
}