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