1use crate::{Error, FormatVersion, buf::TailReadBytes, Result, params::{SerializerParams, LengthEncoder }};
2use crate::params::{AscendingOrder, PortableBinary, NativeBinary};
3use crate::primitives::SerializableValue;
4use serde::de::IntoDeserializer;
5
6pub struct Deserializer<R, P> {
10 reader: R,
11 params: P,
12}
13
14impl<'de, R, P> Deserializer<R, P>
15 where R: TailReadBytes,
16 P: SerializerParams,
17{
18 #[must_use]
19 pub fn new(reader: R, params: P) -> Self {
20 Deserializer { reader, params }
21 }
22 pub fn into_reader(self) -> R { self.reader }
23
24 fn visit_bytebuf<V, F>(&mut self, f: F) -> Result<V::Value>
25 where V: serde::de::Visitor<'de>,
26 F: FnOnce(&[u8]) -> Result<V::Value>
27 {
28 let len = P::SeqLenEncoder::read(&mut self.reader)?;
29 self.reader.read(len, f)
30 }
31}
32
33impl<W> FormatVersion<AscendingOrder> for Deserializer<W, AscendingOrder> {
34 const VERSION: u32 = 1;
35}
36
37impl<W> FormatVersion<PortableBinary> for Deserializer<W, PortableBinary> {
38 const VERSION: u32 = 1;
39}
40
41impl<W> FormatVersion<NativeBinary> for Deserializer<W, NativeBinary> {
42 const VERSION: u32 = 1;
43}
44
45macro_rules! impl_nums {
46 ($ty:ty, $dser_method:ident, $visitor_method:ident) => {
47 #[inline]
48 fn $dser_method<V>(self, visitor: V) -> Result<V::Value>
49 where V: serde::de::Visitor<'de>,
50 {
51 let value = <$ty>::from_reader(&mut self.reader, self.params)?;
52 visitor.$visitor_method(value)
53 }
54 }
55}
56
57impl<'a, 'de: 'a, R, P> serde::Deserializer<'de> for &'a mut Deserializer<R, P>
58 where
59 R: TailReadBytes,
60 P: SerializerParams,
61{
62 type Error = Error;
63
64 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value>
65 where
66 V: serde::de::Visitor<'de>,
67 {
68 Err(Error::DeserializeAnyNotSupported)
69 }
70 impl_nums!(u8, deserialize_u8, visit_u8);
71 impl_nums!(u16, deserialize_u16, visit_u16);
72 impl_nums!(u32, deserialize_u32, visit_u32);
73 impl_nums!(u64, deserialize_u64, visit_u64);
74 impl_nums!(i8, deserialize_i8, visit_i8);
75 impl_nums!(i16, deserialize_i16, visit_i16);
76 impl_nums!(i32, deserialize_i32, visit_i32);
77 impl_nums!(i64, deserialize_i64, visit_i64);
78 impl_nums!(f32, deserialize_f32, visit_f32);
79 impl_nums!(f64, deserialize_f64, visit_f64);
80 impl_nums!(bool, deserialize_bool, visit_bool);
81
82 serde_if_integer128! {
83 impl_nums!(u128, deserialize_u128, visit_u128);
84 impl_nums!(i128, deserialize_i128, visit_i128);
85 }
86 impl_nums!(char, deserialize_char, visit_char);
87
88 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
89 where
90 V: serde::de::Visitor<'de>,
91 {
92 self.visit_bytebuf::<V,_>(|buf| {
93 visitor.visit_str(core::str::from_utf8(buf).map_err(|_| Error::InvalidUtf8Encoding)?)
94 })
95 }
96 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
97 where
98 V: serde::de::Visitor<'de>,
99 {
100 #[cfg(not(feature="std"))] return self.deserialize_str(visitor);
101 #[cfg(feature="std")] return self.visit_bytebuf::<V,_>(|buf| {
102 visitor.visit_string(String::from_utf8(Vec::from(buf)).
103 map_err(|_| Error::InvalidUtf8Encoding)?)
104 });
105 }
106 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
107 where
108 V: serde::de::Visitor<'de>,
109 {
110 self.visit_bytebuf::<V,_>(|buf| {
111 visitor.visit_bytes(buf)
112 })
113 }
114 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
115 where
116 V: serde::de::Visitor<'de>,
117 {
118 self.deserialize_bytes(visitor)
119 }
120 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
121 where
122 V: serde::de::Visitor<'de>,
123 {
124 let value = <u8>::from_reader(&mut self.reader, self.params)?;
125 match value {
126 0 => visitor.visit_none(),
127 1 => visitor.visit_some(&mut *self),
128 _ => Err(Error::InvalidTagEncoding),
129 }
130 }
131 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
132 where
133 V: serde::de::Visitor<'de>,
134 {
135 visitor.visit_unit()
136 }
137 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
138 where
139 V: serde::de::Visitor<'de>,
140 {
141 visitor.visit_unit()
142 }
143 fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value>
144 where
145 V: serde::de::Visitor<'de>,
146 {
147 visitor.visit_newtype_struct(self)
148 }
149 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
150 where
151 V: serde::de::Visitor<'de>,
152 {
153 let len = P::SeqLenEncoder::read(&mut self.reader)?;
154 self.deserialize_tuple(len, visitor)
155 }
156 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value>
157 where
158 V: serde::de::Visitor<'de>,
159 {
160 visitor.visit_seq(SeqAccess { deserializer: self, len })
161 }
162
163 fn deserialize_tuple_struct<V>(
164 self,
165 _name: &'static str,
166 len: usize,
167 visitor: V,
168 ) -> Result<V::Value>
169 where
170 V: serde::de::Visitor<'de>,
171 {
172 self.deserialize_tuple(len, visitor)
173 }
174 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
175 where V: serde::de::Visitor<'de>,
176 {
177 let len = P::SeqLenEncoder::read(&mut self.reader)?;
178 visitor.visit_map(MapAccess { deserializer: self, len })
179 }
180 fn deserialize_struct<V>(
181 self,
182 _name: &str,
183 fields: &'static [&'static str],
184 visitor: V,
185 ) -> Result<V::Value>
186 where
187 V: serde::de::Visitor<'de>,
188 {
189 self.deserialize_tuple(fields.len(), visitor)
190 }
191 fn deserialize_enum<V>(
192 self,
193 _enum: &'static str,
194 _variants: &'static [&'static str],
195 visitor: V,
196 ) -> Result<V::Value>
197 where
198 V: serde::de::Visitor<'de>,
199 {
200 impl<'a, 'de: 'a, R, P> serde::de::EnumAccess<'de> for &'a mut Deserializer<R, P>
201 where
202 R: TailReadBytes,
203 P: SerializerParams,
204 {
205 type Error = Error;
206 type Variant = Self;
207
208 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
209 where
210 V: serde::de::DeserializeSeed<'de>,
211 {
212 let idx = P::DiscriminantEncoder::read(&mut self.reader)?;
213 let val: Result<_> = seed.deserialize(idx.into_deserializer());
214 Ok((val?, self))
215 }
216 }
217 visitor.visit_enum(self)
218 }
219 fn deserialize_identifier<V>(self, _visitor: V) -> Result<V::Value>
220 where
221 V: serde::de::Visitor<'de>,
222 {
223 Err(Error::DeserializeIdentifierNotSupported)
224 }
225
226 fn deserialize_ignored_any<V>(self, _visitor: V) -> Result<V::Value>
227 where
228 V: serde::de::Visitor<'de>,
229 {
230 Err(Error::DeserializeIgnoredAny)
231 }
232 fn is_human_readable(&self) -> bool {
233 false
234 }
235}
236
237struct SeqAccess<'a, R: TailReadBytes, P: SerializerParams> {
238 deserializer: &'a mut Deserializer<R, P>,
239 len: usize,
240}
241
242impl<'a, 'de: 'a, R: TailReadBytes, P: SerializerParams> serde::de::SeqAccess<'de> for SeqAccess<'a, R, P>
243{
244 type Error = Error;
245 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
246 where
247 T: serde::de::DeserializeSeed<'de>,
248 {
249 if self.len > 0 {
250 self.len -= 1;
251 let value = seed.deserialize(&mut *self.deserializer)?;
252 Ok(Some(value))
253 } else {
254 Ok(None)
255 }
256 }
257 fn size_hint(&self) -> Option<usize> {
258 Some(self.len)
259 }
260}
261
262struct MapAccess<'a, R: TailReadBytes, P: SerializerParams> {
263 deserializer: &'a mut Deserializer<R, P>,
264 len: usize,
265}
266impl<'a, 'de: 'a, R: TailReadBytes, P: SerializerParams> serde::de::MapAccess<'de> for MapAccess<'a, R, P>
267{
268 type Error = Error;
269 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
270 where
271 K: serde::de::DeserializeSeed<'de>,
272 {
273 if self.len > 0 {
274 self.len -= 1;
275 let key = seed.deserialize(&mut *self.deserializer)?;
276 Ok(Some(key))
277 } else {
278 Ok(None)
279 }
280 }
281 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
282 where
283 V: serde::de::DeserializeSeed<'de>,
284 {
285 let value = seed.deserialize(&mut *self.deserializer)?;
286 Ok(value)
287 }
288 fn size_hint(&self) -> Option<usize> {
289 Some(self.len)
290 }
291}
292
293impl<'a, 'de: 'a, R, P> serde::de::VariantAccess<'de> for &'a mut Deserializer<R, P>
294 where R: TailReadBytes,
295 P: SerializerParams,
296{
297 type Error = Error;
298
299 fn unit_variant(self) -> Result {
300 Ok(())
301 }
302 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
303 where
304 T: serde::de::DeserializeSeed<'de>,
305 {
306 seed.deserialize(self)
307 }
308
309 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
310 where
311 V: serde::de::Visitor<'de>,
312 {
313 serde::Deserializer::deserialize_tuple(self, len, visitor)
314 }
315
316 fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value>
317 where
318 V: serde::de::Visitor<'de>,
319 {
320 serde::Deserializer::deserialize_tuple(self, fields.len(), visitor)
321 }
322}
323