facet_dom/deserializer/
entrypoints.rs1use facet_core::Facet;
7use facet_reflect::{HeapValue, Partial};
8
9use super::DomDeserializer;
10use crate::DomParser;
11use crate::error::DomDeserializeError;
12
13impl<'de, P> DomDeserializer<'de, true, P>
14where
15 P: DomParser<'de>,
16{
17 pub fn new(parser: P) -> Self {
19 Self {
20 parser,
21 _marker: std::marker::PhantomData,
22 }
23 }
24}
25
26impl<'de, P> DomDeserializer<'de, false, P>
27where
28 P: DomParser<'de>,
29{
30 pub fn new_owned(parser: P) -> Self {
32 Self {
33 parser,
34 _marker: std::marker::PhantomData,
35 }
36 }
37}
38
39impl<'de, P> DomDeserializer<'de, true, P>
40where
41 P: DomParser<'de>,
42{
43 pub fn deserialize<T>(&mut self) -> Result<T, DomDeserializeError<P::Error>>
45 where
46 T: Facet<'de>,
47 {
48 let wip: Partial<'de, true> =
49 Partial::alloc::<T>().map_err(DomDeserializeError::Reflect)?;
50 let partial = self.deserialize_into(wip)?;
51 let heap_value: HeapValue<'de, true> =
52 partial.build().map_err(DomDeserializeError::Reflect)?;
53 heap_value
54 .materialize::<T>()
55 .map_err(DomDeserializeError::Reflect)
56 }
57}
58
59impl<'de, P> DomDeserializer<'de, false, P>
60where
61 P: DomParser<'de>,
62{
63 pub fn deserialize<T>(&mut self) -> Result<T, DomDeserializeError<P::Error>>
65 where
66 T: Facet<'static>,
67 {
68 #[allow(unsafe_code)]
73 let wip: Partial<'de, false> = unsafe {
74 core::mem::transmute::<Partial<'static, false>, Partial<'de, false>>(
75 Partial::alloc_owned::<T>().map_err(DomDeserializeError::Reflect)?,
76 )
77 };
78 let partial = self.deserialize_into(wip)?;
79 #[allow(unsafe_code)]
83 let heap_value: HeapValue<'static, false> = unsafe {
84 core::mem::transmute::<HeapValue<'de, false>, HeapValue<'static, false>>(
85 partial.build().map_err(DomDeserializeError::Reflect)?,
86 )
87 };
88 heap_value
89 .materialize::<T>()
90 .map_err(DomDeserializeError::Reflect)
91 }
92}