use core::marker::PhantomData;
use serde::de::Deserializer;
use super::DeserializeIn;
use crate::Lexicon;
#[derive(Debug)]
pub struct DeserializeInSeed<'a, T, I: Lexicon + ?Sized> {
interner: &'a mut I,
marker: PhantomData<fn() -> T>,
}
impl<'a, T, I: Lexicon + ?Sized> DeserializeInSeed<'a, T, I> {
#[must_use]
pub const fn new(interner: &'a mut I) -> Self {
Self {
interner,
marker: PhantomData,
}
}
}
impl<'de, T, I> serde::de::DeserializeSeed<'de> for DeserializeInSeed<'_, T, I>
where
T: DeserializeIn<'de, I>,
I: Lexicon + ?Sized,
{
type Value = T;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
T::deserialize_in(self.interner, deserializer)
}
}
#[doc(hidden)]
#[derive(Debug)]
pub struct DeserializeSeed<T>(PhantomData<fn() -> T>);
impl<T> DeserializeSeed<T> {
#[must_use]
pub const fn new() -> Self {
Self(PhantomData)
}
}
impl<T> Default for DeserializeSeed<T> {
fn default() -> Self {
Self::new()
}
}
impl<'de, T: serde::Deserialize<'de>> serde::de::DeserializeSeed<'de> for DeserializeSeed<T> {
type Value = T;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
T::deserialize(deserializer)
}
}