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