use facet_core::Facet;
use facet_reflect::{HeapValue, Partial};
use super::DomDeserializer;
use crate::DomParser;
use crate::error::DomDeserializeError;
impl<'de, P> DomDeserializer<'de, true, P>
where
P: DomParser<'de>,
{
pub fn new(parser: P) -> Self {
Self {
parser,
_marker: std::marker::PhantomData,
}
}
}
impl<'de, P> DomDeserializer<'de, false, P>
where
P: DomParser<'de>,
{
pub fn new_owned(parser: P) -> Self {
Self {
parser,
_marker: std::marker::PhantomData,
}
}
}
impl<'de, P> DomDeserializer<'de, true, P>
where
P: DomParser<'de>,
{
pub fn deserialize<T>(&mut self) -> Result<T, DomDeserializeError<P::Error>>
where
T: Facet<'de>,
{
let wip: Partial<'de, true> = Partial::alloc::<T>()?;
let partial = self.deserialize_into(wip)?;
let heap_value: HeapValue<'de, true> = partial.build()?;
Ok(heap_value.materialize::<T>()?)
}
}
impl<'de, P> DomDeserializer<'de, false, P>
where
P: DomParser<'de>,
{
pub fn deserialize<T>(&mut self) -> Result<T, DomDeserializeError<P::Error>>
where
T: Facet<'static>,
{
#[allow(unsafe_code)]
let wip: Partial<'de, false> = unsafe {
core::mem::transmute::<Partial<'static, false>, Partial<'de, false>>(
Partial::alloc_owned::<T>()?,
)
};
let partial = self.deserialize_into(wip)?;
#[allow(unsafe_code)]
let heap_value: HeapValue<'static, false> = unsafe {
core::mem::transmute::<HeapValue<'de, false>, HeapValue<'static, false>>(
partial.build()?,
)
};
Ok(heap_value.materialize::<T>()?)
}
}