1use super::{de_borrowed::borrow_decode_from_slice, DecodeError as SerdeDecodeError};
2use crate::{
3 config::Config,
4 de::{read::Reader, Decode, Decoder, DecoderImpl},
5 error::DecodeError,
6};
7use serde::de::*;
8
9#[cfg(feature = "std")]
10use crate::features::IoReader;
11
12pub struct OwnedSerdeDecoder<DE: Decoder> {
14 pub(super) de: DE,
15}
16
17impl<DE: Decoder> OwnedSerdeDecoder<DE> {
18 pub fn as_deserializer<'a>(
20 &'a mut self,
21 ) -> impl for<'de> serde::Deserializer<'de, Error = DecodeError> + 'a {
22 SerdeDecoder { de: &mut self.de }
23 }
24}
25
26#[cfg(feature = "std")]
27impl<'r, C: Config, R: std::io::Read> OwnedSerdeDecoder<DecoderImpl<IoReader<&'r mut R>, C, ()>> {
28 pub fn from_std_read(
30 src: &'r mut R,
31 config: C,
32 ) -> OwnedSerdeDecoder<DecoderImpl<IoReader<&'r mut R>, C, ()>>
33 where
34 C: Config,
35 {
36 let reader = IoReader::new(src);
37 let decoder = DecoderImpl::new(reader, config, ());
38 Self { de: decoder }
39 }
40}
41
42impl<C: Config, R: Reader> OwnedSerdeDecoder<DecoderImpl<R, C, ()>> {
43 pub fn from_reader(reader: R, config: C) -> OwnedSerdeDecoder<DecoderImpl<R, C, ()>>
45 where
46 C: Config,
47 {
48 let decoder = DecoderImpl::new(reader, config, ());
49 Self { de: decoder }
50 }
51}
52
53pub fn decode_from_slice<D, C>(slice: &[u8], config: C) -> Result<(D, usize), DecodeError>
62where
63 D: DeserializeOwned,
64 C: Config,
65{
66 borrow_decode_from_slice(slice, config)
67}
68
69#[cfg(feature = "std")]
75#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
76pub fn decode_from_std_read<'r, D: DeserializeOwned, C: Config, R: std::io::Read>(
77 src: &'r mut R,
78 config: C,
79) -> Result<D, DecodeError> {
80 let mut serde_decoder =
81 OwnedSerdeDecoder::<DecoderImpl<IoReader<&'r mut R>, C, ()>>::from_std_read(src, config);
82 D::deserialize(serde_decoder.as_deserializer())
83}
84
85pub fn decode_from_reader<D: DeserializeOwned, R: Reader, C: Config>(
91 reader: R,
92 config: C,
93) -> Result<D, DecodeError> {
94 let mut serde_decoder = OwnedSerdeDecoder::<DecoderImpl<R, C, ()>>::from_reader(reader, config);
95 D::deserialize(serde_decoder.as_deserializer())
96}
97
98pub(super) struct SerdeDecoder<'a, DE: Decoder> {
99 pub(super) de: &'a mut DE,
100}
101
102impl<'de, DE: Decoder> Deserializer<'de> for SerdeDecoder<'_, DE> {
103 type Error = DecodeError;
104
105 fn deserialize_any<V>(self, _: V) -> Result<V::Value, Self::Error>
106 where
107 V: serde::de::Visitor<'de>,
108 {
109 Err(SerdeDecodeError::AnyNotSupported.into())
110 }
111
112 fn deserialize_bool<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
113 where
114 V: serde::de::Visitor<'de>,
115 {
116 visitor.visit_bool(Decode::decode(&mut self.de)?)
117 }
118
119 fn deserialize_i8<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
120 where
121 V: serde::de::Visitor<'de>,
122 {
123 visitor.visit_i8(Decode::decode(&mut self.de)?)
124 }
125
126 fn deserialize_i16<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
127 where
128 V: serde::de::Visitor<'de>,
129 {
130 visitor.visit_i16(Decode::decode(&mut self.de)?)
131 }
132
133 fn deserialize_i32<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
134 where
135 V: serde::de::Visitor<'de>,
136 {
137 visitor.visit_i32(Decode::decode(&mut self.de)?)
138 }
139
140 fn deserialize_i64<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
141 where
142 V: serde::de::Visitor<'de>,
143 {
144 visitor.visit_i64(Decode::decode(&mut self.de)?)
145 }
146
147 fn deserialize_i128<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
148 where
149 V: serde::de::Visitor<'de>,
150 {
151 visitor.visit_i128(Decode::decode(&mut self.de)?)
152 }
153
154 fn deserialize_u8<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
155 where
156 V: serde::de::Visitor<'de>,
157 {
158 visitor.visit_u8(Decode::decode(&mut self.de)?)
159 }
160
161 fn deserialize_u16<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
162 where
163 V: serde::de::Visitor<'de>,
164 {
165 visitor.visit_u16(Decode::decode(&mut self.de)?)
166 }
167
168 fn deserialize_u32<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
169 where
170 V: serde::de::Visitor<'de>,
171 {
172 visitor.visit_u32(Decode::decode(&mut self.de)?)
173 }
174
175 fn deserialize_u64<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
176 where
177 V: serde::de::Visitor<'de>,
178 {
179 visitor.visit_u64(Decode::decode(&mut self.de)?)
180 }
181
182 fn deserialize_u128<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
183 where
184 V: serde::de::Visitor<'de>,
185 {
186 visitor.visit_u128(Decode::decode(&mut self.de)?)
187 }
188
189 fn deserialize_f32<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
190 where
191 V: serde::de::Visitor<'de>,
192 {
193 visitor.visit_f32(Decode::decode(&mut self.de)?)
194 }
195
196 fn deserialize_f64<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
197 where
198 V: serde::de::Visitor<'de>,
199 {
200 visitor.visit_f64(Decode::decode(&mut self.de)?)
201 }
202
203 fn deserialize_char<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
204 where
205 V: serde::de::Visitor<'de>,
206 {
207 visitor.visit_char(Decode::decode(&mut self.de)?)
208 }
209
210 #[cfg(feature = "alloc")]
211 fn deserialize_str<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
212 where
213 V: serde::de::Visitor<'de>,
214 {
215 visitor.visit_string(Decode::decode(&mut self.de)?)
216 }
217
218 #[cfg(not(feature = "alloc"))]
219 fn deserialize_str<V>(self, _: V) -> Result<V::Value, Self::Error>
220 where
221 V: serde::de::Visitor<'de>,
222 {
223 Err(SerdeDecodeError::CannotBorrowOwnedData.into())
224 }
225
226 #[cfg(feature = "alloc")]
227 fn deserialize_string<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
228 where
229 V: serde::de::Visitor<'de>,
230 {
231 visitor.visit_string(Decode::decode(&mut self.de)?)
232 }
233
234 #[cfg(not(feature = "alloc"))]
235 fn deserialize_string<V>(self, _: V) -> Result<V::Value, Self::Error>
236 where
237 V: serde::de::Visitor<'de>,
238 {
239 Err(SerdeDecodeError::CannotAllocate.into())
240 }
241
242 #[cfg(feature = "alloc")]
243 fn deserialize_bytes<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
244 where
245 V: serde::de::Visitor<'de>,
246 {
247 visitor.visit_byte_buf(Decode::decode(&mut self.de)?)
248 }
249
250 #[cfg(not(feature = "alloc"))]
251 fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
252 where
253 V: serde::de::Visitor<'de>,
254 {
255 Err(SerdeDecodeError::CannotBorrowOwnedData.into())
256 }
257
258 #[cfg(feature = "alloc")]
259 fn deserialize_byte_buf<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
260 where
261 V: serde::de::Visitor<'de>,
262 {
263 visitor.visit_byte_buf(Decode::decode(&mut self.de)?)
264 }
265 #[cfg(not(feature = "alloc"))]
266 fn deserialize_byte_buf<V>(self, _: V) -> Result<V::Value, Self::Error>
267 where
268 V: serde::de::Visitor<'de>,
269 {
270 Err(SerdeDecodeError::CannotAllocate.into())
271 }
272
273 fn deserialize_option<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
274 where
275 V: serde::de::Visitor<'de>,
276 {
277 let variant = crate::de::decode_option_variant(&mut self.de, "Option<T>")?;
278 if variant.is_some() {
279 visitor.visit_some(self)
280 } else {
281 visitor.visit_none()
282 }
283 }
284
285 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
286 where
287 V: serde::de::Visitor<'de>,
288 {
289 visitor.visit_unit()
290 }
291
292 fn deserialize_unit_struct<V>(
293 self,
294 _name: &'static str,
295 visitor: V,
296 ) -> Result<V::Value, Self::Error>
297 where
298 V: serde::de::Visitor<'de>,
299 {
300 visitor.visit_unit()
301 }
302
303 fn deserialize_newtype_struct<V>(
304 self,
305 _name: &'static str,
306 visitor: V,
307 ) -> Result<V::Value, Self::Error>
308 where
309 V: serde::de::Visitor<'de>,
310 {
311 visitor.visit_newtype_struct(self)
312 }
313
314 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
315 where
316 V: serde::de::Visitor<'de>,
317 {
318 let len = usize::decode(&mut self.de)?;
319 self.deserialize_tuple(len, visitor)
320 }
321
322 fn deserialize_tuple<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
323 where
324 V: serde::de::Visitor<'de>,
325 {
326 struct Access<'a, 'b, DE: Decoder> {
327 deserializer: &'a mut SerdeDecoder<'b, DE>,
328 len: usize,
329 }
330
331 impl<'de, 'a, 'b: 'a, DE: Decoder + 'b> SeqAccess<'de> for Access<'a, 'b, DE> {
332 type Error = DecodeError;
333
334 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, DecodeError>
335 where
336 T: DeserializeSeed<'de>,
337 {
338 if self.len > 0 {
339 self.len -= 1;
340 let value = DeserializeSeed::deserialize(
341 seed,
342 SerdeDecoder {
343 de: self.deserializer.de,
344 },
345 )?;
346 Ok(Some(value))
347 } else {
348 Ok(None)
349 }
350 }
351
352 fn size_hint(&self) -> Option<usize> {
353 Some(self.len)
354 }
355 }
356
357 visitor.visit_seq(Access {
358 deserializer: &mut self,
359 len,
360 })
361 }
362
363 fn deserialize_tuple_struct<V>(
364 self,
365 _name: &'static str,
366 len: usize,
367 visitor: V,
368 ) -> Result<V::Value, Self::Error>
369 where
370 V: serde::de::Visitor<'de>,
371 {
372 self.deserialize_tuple(len, visitor)
373 }
374
375 fn deserialize_map<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
376 where
377 V: serde::de::Visitor<'de>,
378 {
379 struct Access<'a, 'b, DE: Decoder> {
380 deserializer: &'a mut SerdeDecoder<'b, DE>,
381 len: usize,
382 }
383
384 impl<'de, 'a, 'b: 'a, DE: Decoder + 'b> MapAccess<'de> for Access<'a, 'b, DE> {
385 type Error = DecodeError;
386
387 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, DecodeError>
388 where
389 K: DeserializeSeed<'de>,
390 {
391 if self.len > 0 {
392 self.len -= 1;
393 let key = DeserializeSeed::deserialize(
394 seed,
395 SerdeDecoder {
396 de: self.deserializer.de,
397 },
398 )?;
399 Ok(Some(key))
400 } else {
401 Ok(None)
402 }
403 }
404
405 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, DecodeError>
406 where
407 V: DeserializeSeed<'de>,
408 {
409 let value = DeserializeSeed::deserialize(
410 seed,
411 SerdeDecoder {
412 de: self.deserializer.de,
413 },
414 )?;
415 Ok(value)
416 }
417
418 fn size_hint(&self) -> Option<usize> {
419 Some(self.len)
420 }
421 }
422
423 let len = usize::decode(&mut self.de)?;
424
425 visitor.visit_map(Access {
426 deserializer: &mut self,
427 len,
428 })
429 }
430
431 fn deserialize_struct<V>(
432 self,
433 _name: &'static str,
434 fields: &'static [&'static str],
435 visitor: V,
436 ) -> Result<V::Value, Self::Error>
437 where
438 V: serde::de::Visitor<'de>,
439 {
440 self.deserialize_tuple(fields.len(), visitor)
441 }
442
443 fn deserialize_enum<V>(
444 self,
445 _name: &'static str,
446 _variants: &'static [&'static str],
447 visitor: V,
448 ) -> Result<V::Value, Self::Error>
449 where
450 V: serde::de::Visitor<'de>,
451 {
452 visitor.visit_enum(self)
453 }
454
455 fn deserialize_identifier<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
456 where
457 V: serde::de::Visitor<'de>,
458 {
459 Err(SerdeDecodeError::IdentifierNotSupported.into())
460 }
461
462 fn deserialize_ignored_any<V>(self, _: V) -> Result<V::Value, Self::Error>
463 where
464 V: serde::de::Visitor<'de>,
465 {
466 Err(SerdeDecodeError::IgnoredAnyNotSupported.into())
467 }
468
469 fn is_human_readable(&self) -> bool {
470 false
471 }
472}
473
474impl<'de, DE: Decoder> EnumAccess<'de> for SerdeDecoder<'_, DE> {
475 type Error = DecodeError;
476 type Variant = Self;
477
478 fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
479 where
480 V: DeserializeSeed<'de>,
481 {
482 let idx = u32::decode(&mut self.de)?;
483 let val = seed.deserialize(idx.into_deserializer())?;
484 Ok((val, self))
485 }
486}
487
488impl<'de, DE: Decoder> VariantAccess<'de> for SerdeDecoder<'_, DE> {
489 type Error = DecodeError;
490
491 fn unit_variant(self) -> Result<(), Self::Error> {
492 Ok(())
493 }
494
495 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
496 where
497 T: DeserializeSeed<'de>,
498 {
499 DeserializeSeed::deserialize(seed, self)
500 }
501
502 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
503 where
504 V: Visitor<'de>,
505 {
506 Deserializer::deserialize_tuple(self, len, visitor)
507 }
508
509 fn struct_variant<V>(
510 self,
511 fields: &'static [&'static str],
512 visitor: V,
513 ) -> Result<V::Value, Self::Error>
514 where
515 V: Visitor<'de>,
516 {
517 Deserializer::deserialize_tuple(self, fields.len(), visitor)
518 }
519}