1#![cfg_attr(
3 feature = "tracing",
4 allow(clippy::used_underscore_binding, reason = "Only used in tracing::instrument")
5)]
6
7use ::core::str;
8use ::serde::de::{IntoDeserializer, Unexpected, Visitor};
9
10use crate::{
11 Error, Result,
12 buffer::Buffer,
13 format::{Type, VarInt},
14 io::Input,
15};
16
17#[derive(Debug)]
19pub struct Deserializer<I, B = ()> {
20 input: I,
22 buffer: Option<B>,
24}
25
26impl<I> Deserializer<I, ()> {
27 #[expect(clippy::missing_const_for_fn, reason = "Probably not const in the future")]
31 #[must_use]
32 pub fn new<'de>(input: I) -> Self
33 where
34 I: Input<'de>,
36 {
37 Self { input, buffer: None }
38 }
39
40 #[must_use]
43 pub fn with_buffer<B>(self, buffer: B) -> Deserializer<I, B>
44 where
45 B: Buffer,
47 {
48 Deserializer { input: self.input, buffer: Some(buffer) }
49 }
50}
51
52impl<I, B> Deserializer<I, B> {
53 #[inline]
55 pub fn into_input(self) -> I {
56 self.input
57 }
58
59 #[inline]
61 pub fn into_parts(self) -> (I, Option<B>) {
62 (self.input, self.buffer)
63 }
64}
65
66impl<'de, I, B> Deserializer<I, B>
67where
68 I: Input<'de>,
69 B: Buffer,
70{
71 #[inline]
73 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self)))]
74 fn reset_buffer(&mut self) {
75 if let Some(buffer) = self.buffer.as_mut() {
76 buffer.clear();
77 }
78 }
79
80 #[inline]
82 fn buffer_slice(&self) -> Result<&[u8]> {
83 Ok(self.buffer.as_ref().ok_or_else(|| Error::BufferTooSmall)?.as_slice())
84 }
85
86 #[inline]
88 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self)))]
89 fn read_bytes<'s>(&'s mut self, len: usize) -> Result<&'s [u8]>
90 where
91 'de: 's,
92 {
93 self.reset_buffer();
94 if let Some(data) = self.input.read_bytes(len, self.buffer.as_mut())? {
95 Ok(data)
96 } else {
97 self.buffer_slice()
98 }
99 }
100
101 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
103 #[allow(clippy::cast_possible_truncation, reason = "Integer casting is necessary")]
104 fn deserialize_ptr<V>(&mut self, visitor: V) -> Result<V::Value>
105 where
106 V: Visitor<'de>,
107 {
108 let byte = self.input.peek_byte()?;
109 let t = Type::try_from(byte)?;
110 match t {
111 Type::Null => {
112 _ = self.input.read_byte()?;
113 visitor.visit_none()
114 }
115 Type::UnsignedInt => {
116 _ = self.input.read_byte()?;
117 let number = usize::decode(&mut self.input)?;
118 match size_of::<usize>() {
119 1 => visitor.visit_u8(number as u8),
120 2 => visitor.visit_u16(number as u16),
121 4 => visitor.visit_u32(number as u32),
122 8 => visitor.visit_u64(number as u64),
123 16 => visitor.visit_u128(number as u128),
124 _ => unreachable!("usize must have one of these sizes"),
125 }
126 }
127 Type::SignedInt => {
128 _ = self.input.read_byte()?;
129 let number = isize::decode(&mut self.input)?;
130 match size_of::<isize>() {
131 1 => visitor.visit_i8(number as i8),
132 2 => visitor.visit_i16(number as i16),
133 4 => visitor.visit_i32(number as i32),
134 8 => visitor.visit_i64(number as i64),
135 16 => visitor.visit_i128(number as i128),
136 _ => unreachable!("isize must have one of these sizes"),
137 }
138 }
139 _ => Err(Error::WrongType(t, &[Type::UnsignedInt, Type::SignedInt])),
140 }
141 }
142
143 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
145 fn deserialize_float<V>(&mut self, visitor: V) -> Result<V::Value>
146 where
147 V: Visitor<'de>,
148 {
149 let byte = self.input.peek_byte()?;
150 let t = Type::try_from(byte)?;
151 match t {
152 Type::Null => {
153 _ = self.input.read_byte()?;
154 visitor.visit_none()
155 }
156 Type::Float32 => {
158 _ = self.input.read_byte()?;
159 let mut bytes = [0; 4];
160 self.input.read_exact(&mut bytes)?;
161 let value = f32::from_le_bytes(bytes);
162 visitor.visit_f32(value)
163 }
164 Type::Float64 => {
165 _ = self.input.read_byte()?;
166 let mut bytes = [0; 8];
167 self.input.read_exact(&mut bytes)?;
168 let value = f64::from_le_bytes(bytes);
169 visitor.visit_f64(value)
170 }
171 _ => Err(Error::WrongType(
173 t,
174 &[Type::Float16, Type::Float32, Type::Float64, Type::Float128],
175 )),
176 }
177 }
178
179 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
181 #[allow(clippy::cast_possible_truncation, reason = "Integer casting is necessary")]
182 fn deserialize_unsigned_int<V>(&mut self, visitor: V) -> Result<V::Value>
183 where
184 V: Visitor<'de>,
185 {
186 let byte = self.input.peek_byte()?;
187 let t = Type::try_from(byte)?;
188 match t {
189 Type::Null => {
190 _ = self.input.read_byte()?;
191 visitor.visit_none()
192 }
193 Type::UnsignedInt => {
194 _ = self.input.read_byte()?;
195 let value = u128::decode(&mut self.input)?;
196 if value <= u128::from(u8::MAX) {
197 visitor.visit_u8(value as u8)
198 } else if value <= u128::from(u16::MAX) {
199 visitor.visit_u16(value as u16)
200 } else if value <= u128::from(u32::MAX) {
201 visitor.visit_u32(value as u32)
202 } else if value <= u128::from(u64::MAX) {
203 visitor.visit_u64(value as u64)
204 } else {
205 visitor.visit_u128(value)
206 }
207 }
208 _ => Err(Error::WrongType(t, &[Type::UnsignedInt])),
209 }
210 }
211
212 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
214 #[allow(clippy::cast_possible_truncation, reason = "Integer casting is necessary")]
215 fn deserialize_signed_int<V>(&mut self, visitor: V) -> Result<V::Value>
216 where
217 V: Visitor<'de>,
218 {
219 let byte = self.input.peek_byte()?;
220 let t = Type::try_from(byte)?;
221 match t {
222 Type::Null => {
223 _ = self.input.read_byte()?;
224 visitor.visit_none()
225 }
226 #[allow(clippy::cast_lossless, reason = "We won't change it")]
227 Type::SignedInt => {
228 _ = self.input.read_byte()?;
229 let value = i128::decode(&mut self.input)?;
230 if (i8::MIN as i128 ..= i8::MAX as i128).contains(&value) {
231 visitor.visit_i8(value as i8)
232 } else if (i16::MIN as i128 ..= i16::MAX as i128).contains(&value) {
233 visitor.visit_i16(value as i16)
234 } else if (i32::MIN as i128 ..= i32::MAX as i128).contains(&value) {
235 visitor.visit_i32(value as i32)
236 } else if (i64::MIN as i128 ..= i64::MAX as i128).contains(&value) {
237 visitor.visit_i64(value as i64)
238 } else {
239 visitor.visit_i128(value)
240 }
241 }
242 _ => Err(Error::WrongType(t, &[Type::SignedInt])),
243 }
244 }
245}
246
247impl<'de, I, B> ::serde::Deserializer<'de> for &mut Deserializer<I, B>
248where
249 I: Input<'de>,
250 B: Buffer,
251{
252 type Error = crate::Error;
253
254 #[inline]
255 fn is_human_readable(&self) -> bool {
256 false
257 }
258
259 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
260 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
261 where
262 V: Visitor<'de>,
263 {
264 let byte = self.input.peek_byte()?;
265 let t = Type::try_from(byte)?;
266 match t {
267 Type::Null => self.deserialize_unit(visitor),
268 Type::BooleanFalse | Type::BooleanTrue => self.deserialize_bool(visitor),
269 Type::UnsignedInt => self.deserialize_unsigned_int(visitor),
270 Type::SignedInt => self.deserialize_signed_int(visitor),
271 Type::Float16 | Type::Float32 | Type::Float64 | Type::Float128 => {
272 self.deserialize_float(visitor)
273 }
274 Type::Bytes => self.deserialize_byte_buf(visitor),
275 Type::String => self.deserialize_string(visitor),
276 Type::SeqStart => self.deserialize_seq(visitor),
277 Type::MapStart => self.deserialize_map(visitor),
278 Type::SeqEnd | Type::MapEnd => Err(Error::WrongType(
279 t,
280 &[
281 Type::Null,
282 Type::BooleanFalse,
283 Type::BooleanTrue,
284 Type::UnsignedInt,
285 Type::SignedInt,
286 Type::Float16,
287 Type::Float32,
288 Type::Float64,
289 Type::Float128,
290 Type::Bytes,
291 Type::String,
292 Type::SeqStart,
293 Type::MapStart,
294 ],
295 )),
296 }
297 }
298
299 #[inline]
300 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
301 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
302 where
303 V: Visitor<'de>,
304 {
305 let byte = self.input.peek_byte()?;
306 let t = Type::try_from(byte)?;
307 match t {
308 Type::Null => {
309 _ = self.input.read_byte()?;
310 visitor.visit_unit()
311 }
312 _ => Err(Error::WrongType(t, &[Type::Null])),
313 }
314 }
315
316 #[inline]
317 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
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: Visitor<'de>,
325 {
326 let byte = self.input.peek_byte()?;
327 let t = Type::try_from(byte)?;
328 match t {
329 Type::Null => {
330 _ = self.input.read_byte()?;
331 visitor.visit_unit()
332 }
333 _ => Err(Error::WrongType(t, &[Type::Null])),
334 }
335 }
336
337 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
338 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
339 where
340 V: Visitor<'de>,
341 {
342 let byte = self.input.peek_byte()?;
343 let t = Type::try_from(byte)?;
344 match t {
345 Type::BooleanFalse => {
346 _ = self.input.read_byte()?;
347 visitor.visit_bool(false)
348 }
349 Type::BooleanTrue => {
350 _ = self.input.read_byte()?;
351 visitor.visit_bool(true)
352 }
353 Type::Null => {
354 _ = self.input.read_byte()?;
355 visitor.visit_none()
356 }
357 Type::UnsignedInt | Type::SignedInt => self.deserialize_ptr(visitor),
358 _ => Err(Error::WrongType(t, &[Type::BooleanFalse, Type::BooleanTrue])),
359 }
360 }
361
362 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
363 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
364 where
365 V: Visitor<'de>,
366 {
367 let byte = self.input.peek_byte()?;
368 let t = Type::try_from(byte)?;
369 match t {
370 Type::Null => {
371 _ = self.input.read_byte()?;
372 visitor.visit_none()
373 }
374 Type::SignedInt => {
375 _ = self.input.read_byte()?;
376 let value = i8::decode(&mut self.input)?;
377 visitor.visit_i8(value)
378 }
379 _ => Err(Error::WrongType(t, &[Type::SignedInt])),
380 }
381 }
382
383 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
384 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
385 where
386 V: Visitor<'de>,
387 {
388 let byte = self.input.peek_byte()?;
389 let t = Type::try_from(byte)?;
390 match t {
391 Type::Null => {
392 _ = self.input.read_byte()?;
393 visitor.visit_none()
394 }
395 Type::SignedInt => {
396 _ = self.input.read_byte()?;
397 let value = i16::decode(&mut self.input)?;
398 visitor.visit_i16(value)
399 }
400 _ => Err(Error::WrongType(t, &[Type::SignedInt])),
401 }
402 }
403
404 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
405 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
406 where
407 V: Visitor<'de>,
408 {
409 let byte = self.input.peek_byte()?;
410 let t = Type::try_from(byte)?;
411 match t {
412 Type::Null => {
413 _ = self.input.read_byte()?;
414 visitor.visit_none()
415 }
416 Type::SignedInt => {
417 _ = self.input.read_byte()?;
418 let value = i32::decode(&mut self.input)?;
419 visitor.visit_i32(value)
420 }
421 _ => Err(Error::WrongType(t, &[Type::SignedInt])),
422 }
423 }
424
425 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
426 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
427 where
428 V: Visitor<'de>,
429 {
430 let byte = self.input.peek_byte()?;
431 let t = Type::try_from(byte)?;
432 match t {
433 Type::Null => {
434 _ = self.input.read_byte()?;
435 visitor.visit_none()
436 }
437 Type::SignedInt => {
438 _ = self.input.read_byte()?;
439 let value = i64::decode(&mut self.input)?;
440 visitor.visit_i64(value)
441 }
442 _ => Err(Error::WrongType(t, &[Type::SignedInt])),
443 }
444 }
445
446 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
447 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
448 where
449 V: Visitor<'de>,
450 {
451 let byte = self.input.peek_byte()?;
452 let t = Type::try_from(byte)?;
453 match t {
454 Type::Null => {
455 _ = self.input.read_byte()?;
456 visitor.visit_none()
457 }
458 Type::SignedInt => {
459 _ = self.input.read_byte()?;
460 let value = i128::decode(&mut self.input)?;
461 visitor.visit_i128(value)
462 }
463 _ => Err(Error::WrongType(t, &[Type::SignedInt])),
464 }
465 }
466
467 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
468 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
469 where
470 V: Visitor<'de>,
471 {
472 let byte = self.input.peek_byte()?;
473 let t = Type::try_from(byte)?;
474 match t {
475 Type::Null => {
476 _ = self.input.read_byte()?;
477 visitor.visit_none()
478 }
479 Type::UnsignedInt => {
480 _ = self.input.read_byte()?;
481 let value = u8::decode(&mut self.input)?;
482 visitor.visit_u8(value)
483 }
484 Type::BooleanFalse => {
485 _ = self.input.read_byte()?;
486 visitor.visit_bool(false)
487 }
488 Type::BooleanTrue => {
489 _ = self.input.read_byte()?;
490 visitor.visit_bool(true)
491 }
492 _ => Err(Error::WrongType(t, &[Type::UnsignedInt])),
493 }
494 }
495
496 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
497 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
498 where
499 V: Visitor<'de>,
500 {
501 let byte = self.input.peek_byte()?;
502 let t = Type::try_from(byte)?;
503 match t {
504 Type::Null => {
505 _ = self.input.read_byte()?;
506 visitor.visit_none()
507 }
508 Type::UnsignedInt => {
509 _ = self.input.read_byte()?;
510 let value = u16::decode(&mut self.input)?;
511 visitor.visit_u16(value)
512 }
513 Type::BooleanFalse => {
514 _ = self.input.read_byte()?;
515 visitor.visit_bool(false)
516 }
517 Type::BooleanTrue => {
518 _ = self.input.read_byte()?;
519 visitor.visit_bool(true)
520 }
521 _ => Err(Error::WrongType(t, &[Type::UnsignedInt])),
522 }
523 }
524
525 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
526 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
527 where
528 V: Visitor<'de>,
529 {
530 let byte = self.input.peek_byte()?;
531 let t = Type::try_from(byte)?;
532 match t {
533 Type::Null => {
534 _ = self.input.read_byte()?;
535 visitor.visit_none()
536 }
537 Type::UnsignedInt => {
538 _ = self.input.read_byte()?;
539 let value = u32::decode(&mut self.input)?;
540 visitor.visit_u32(value)
541 }
542 Type::BooleanFalse => {
543 _ = self.input.read_byte()?;
544 visitor.visit_bool(false)
545 }
546 Type::BooleanTrue => {
547 _ = self.input.read_byte()?;
548 visitor.visit_bool(true)
549 }
550 _ => Err(Error::WrongType(t, &[Type::UnsignedInt])),
551 }
552 }
553
554 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
555 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
556 where
557 V: Visitor<'de>,
558 {
559 let byte = self.input.peek_byte()?;
560 let t = Type::try_from(byte)?;
561 match t {
562 Type::Null => {
563 _ = self.input.read_byte()?;
564 visitor.visit_none()
565 }
566 Type::UnsignedInt => {
567 _ = self.input.read_byte()?;
568 let value = u64::decode(&mut self.input)?;
569 visitor.visit_u64(value)
570 }
571 Type::BooleanFalse => {
572 _ = self.input.read_byte()?;
573 visitor.visit_bool(false)
574 }
575 Type::BooleanTrue => {
576 _ = self.input.read_byte()?;
577 visitor.visit_bool(true)
578 }
579 _ => Err(Error::WrongType(t, &[Type::UnsignedInt])),
580 }
581 }
582
583 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
584 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
585 where
586 V: Visitor<'de>,
587 {
588 let byte = self.input.peek_byte()?;
589 let t = Type::try_from(byte)?;
590 match t {
591 Type::Null => {
592 _ = self.input.read_byte()?;
593 visitor.visit_none()
594 }
595 Type::UnsignedInt => {
596 _ = self.input.read_byte()?;
597 let value = u128::decode(&mut self.input)?;
598 visitor.visit_u128(value)
599 }
600 Type::BooleanFalse => {
601 _ = self.input.read_byte()?;
602 visitor.visit_bool(false)
603 }
604 Type::BooleanTrue => {
605 _ = self.input.read_byte()?;
606 visitor.visit_bool(true)
607 }
608 _ => Err(Error::WrongType(t, &[Type::UnsignedInt])),
609 }
610 }
611
612 #[inline]
613 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
614 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
615 where
616 V: Visitor<'de>,
617 {
618 self.deserialize_float(visitor)
619 }
620
621 #[inline]
622 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
623 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
624 where
625 V: Visitor<'de>,
626 {
627 self.deserialize_float(visitor)
628 }
629
630 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
631 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
632 where
633 V: Visitor<'de>,
634 {
635 let byte = self.input.peek_byte()?;
636 let t = Type::try_from(byte)?;
637 match t {
638 Type::Null => {
639 _ = self.input.read_byte()?;
640 visitor.visit_none()
641 }
642 Type::String => {
643 _ = self.input.read_byte()?;
644 let len = usize::decode(&mut self.input)?;
645 let bytes = self.read_bytes(len)?;
646 let s = str::from_utf8(bytes)?;
647
648 let mut chars = s.chars();
649 let c = chars.next().ok_or_else(|| Error::NotOneChar)?;
650 if chars.next().is_some() {
651 return Err(Error::NotOneChar);
652 }
653
654 visitor.visit_char(c)
655 }
656 _ => Err(Error::WrongType(t, &[Type::String])),
657 }
658 }
659
660 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
661 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
662 where
663 V: Visitor<'de>,
664 {
665 let byte = self.input.peek_byte()?;
666 let t = Type::try_from(byte)?;
667 match t {
668 Type::Null => {
669 _ = self.input.read_byte()?;
670 visitor.visit_none()
671 }
672 Type::String => {
673 _ = self.input.read_byte()?;
674 let len = usize::decode(&mut self.input)?;
675
676 self.reset_buffer();
677 let borrowed = self.input.read_bytes(len, self.buffer.as_mut())?;
678 if let Some(borrowed) = borrowed {
679 let s = str::from_utf8(borrowed)?;
680 visitor.visit_borrowed_str(s)
681 } else {
682 let s = str::from_utf8(self.buffer_slice()?)?;
683 visitor.visit_str(s)
684 }
685 }
686 _ => Err(Error::WrongType(t, &[Type::String])),
687 }
688 }
689
690 #[inline]
691 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
692 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
693 where
694 V: Visitor<'de>,
695 {
696 self.deserialize_str(visitor)
697 }
698
699 #[inline]
700 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
701 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
702 where
703 V: Visitor<'de>,
704 {
705 let byte = self.input.peek_byte()?;
706 let t = Type::try_from(byte)?;
707 match t {
708 Type::UnsignedInt => self.deserialize_u32(visitor),
709 Type::String => self.deserialize_str(visitor),
710 _ => Err(Error::WrongType(t, &[Type::UnsignedInt, Type::String])),
711 }
712 }
713
714 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
715 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
716 where
717 V: Visitor<'de>,
718 {
719 let byte = self.input.peek_byte()?;
720 let t = Type::try_from(byte)?;
721 match t {
722 Type::Null => {
723 _ = self.input.read_byte()?;
724 visitor.visit_none()
725 }
726 Type::Bytes | Type::String => {
727 _ = self.input.read_byte()?;
728 let len = usize::decode(&mut self.input)?;
729
730 self.reset_buffer();
731 let borrowed = self.input.read_bytes(len, self.buffer.as_mut())?;
732 if let Some(borrowed) = borrowed {
733 visitor.visit_borrowed_bytes(borrowed)
734 } else {
735 visitor.visit_bytes(self.buffer_slice()?)
736 }
737 }
738 _ => Err(Error::WrongType(t, &[Type::Bytes])),
739 }
740 }
741
742 #[inline]
743 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
744 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
745 where
746 V: Visitor<'de>,
747 {
748 self.deserialize_bytes(visitor)
749 }
750
751 #[inline]
752 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
753 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
754 where
755 V: Visitor<'de>,
756 {
757 let byte = self.input.peek_byte()?;
758 let t = Type::try_from(byte)?;
759 match t {
760 Type::Null => {
761 _ = self.input.read_byte()?;
762 visitor.visit_none()
763 }
764 _ => visitor.visit_some(self),
765 }
766 }
767
768 #[inline]
769 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
770 fn deserialize_newtype_struct<V>(
771 self,
772 _name: &'static str,
773 visitor: V,
774 ) -> Result<V::Value, Self::Error>
775 where
776 V: Visitor<'de>,
777 {
778 visitor.visit_newtype_struct(self)
779 }
780
781 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
782 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
783 where
784 V: Visitor<'de>,
785 {
786 let byte = self.input.peek_byte()?;
787 let t = Type::try_from(byte)?;
788 match t {
789 Type::Null => {
790 _ = self.input.read_byte()?;
791 visitor.visit_none()
792 }
793 Type::SeqStart => {
794 _ = self.input.read_byte()?;
795 let value = visitor.visit_seq(SequenceDeserializer(self))?;
796
797 let byte = self.input.read_byte()?;
798 let t = Type::try_from(byte)?;
799 if t == Type::SeqEnd {
800 Ok(value)
801 } else {
802 Err(Error::WrongType(t, &[Type::SeqEnd]))
803 }
804 }
805 Type::Bytes => {
806 _ = self.input.read_byte()?;
807 let len = usize::decode(&mut self.input)?;
808 let bytes = self.read_bytes(len)?;
809 let value = visitor.visit_seq(ByteSequenceDeserializer(bytes))?;
810 Ok(value)
811 }
812 Type::String => {
813 _ = self.input.read_byte()?;
814 let len = usize::decode(&mut self.input)?;
815 let bytes = self.read_bytes(len)?;
816 let s = str::from_utf8(bytes)?;
817 let value = visitor.visit_seq(CharSequenceDeserializer(s.chars()))?;
818 Ok(value)
819 }
820 _ => Err(Error::WrongType(t, &[Type::SeqStart])),
821 }
822 }
823
824 #[inline]
825 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
826 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
827 where
828 V: Visitor<'de>,
829 {
830 self.deserialize_seq(visitor)
831 }
832
833 #[inline]
834 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
835 fn deserialize_tuple_struct<V>(
836 self,
837 _name: &'static str,
838 _len: usize,
839 visitor: V,
840 ) -> Result<V::Value, Self::Error>
841 where
842 V: Visitor<'de>,
843 {
844 self.deserialize_seq(visitor)
845 }
846
847 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
848 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
849 where
850 V: Visitor<'de>,
851 {
852 let byte = self.input.peek_byte()?;
853 let t = Type::try_from(byte)?;
854 match t {
855 Type::Null => {
856 _ = self.input.read_byte()?;
857 visitor.visit_none()
858 }
859 Type::MapStart => {
860 _ = self.input.read_byte()?;
861 let value = visitor.visit_map(MapDeserializer(self))?;
862
863 let byte = self.input.read_byte()?;
864 let t = Type::try_from(byte)?;
865 if t == Type::MapEnd {
866 Ok(value)
867 } else {
868 Err(Error::WrongType(t, &[Type::MapEnd]))
869 }
870 }
871 _ => Err(Error::WrongType(t, &[Type::MapStart])),
872 }
873 }
874
875 #[inline]
876 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
877 fn deserialize_struct<V>(
878 self,
879 _name: &'static str,
880 _fields: &'static [&'static str],
881 visitor: V,
882 ) -> Result<V::Value, Self::Error>
883 where
884 V: Visitor<'de>,
885 {
886 self.deserialize_map(visitor)
887 }
888
889 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
890 fn deserialize_enum<V>(
891 self,
892 _name: &'static str,
893 _variants: &'static [&'static str],
894 visitor: V,
895 ) -> Result<V::Value, Self::Error>
896 where
897 V: Visitor<'de>,
898 {
899 let byte = self.input.peek_byte()?;
900 let t = Type::try_from(byte)?;
901 match t {
902 Type::Null => {
903 _ = self.input.read_byte()?;
904 visitor.visit_none()
905 }
906 Type::UnsignedInt => {
907 _ = self.input.read_byte()?;
908 let index = u32::decode(&mut self.input)?;
909 visitor.visit_enum(index.into_deserializer())
910 }
911 Type::String => {
912 _ = self.input.read_byte()?;
913 let len = usize::decode(&mut self.input)?;
914 let bytes = self.read_bytes(len)?;
915 let s = str::from_utf8(bytes)?;
916 visitor.visit_enum(s.into_deserializer())
917 }
918 Type::MapStart => {
919 _ = self.input.read_byte()?;
920 let value = visitor.visit_enum(EnumMapDeserializer(self))?;
921
922 let byte = self.input.read_byte()?;
923 let t = Type::try_from(byte)?;
924 if t == Type::MapEnd {
925 Ok(value)
926 } else {
927 Err(Error::WrongType(t, &[Type::MapEnd]))
928 }
929 }
930 _ => Err(Error::WrongType(t, &[Type::Null, Type::String, Type::MapStart])),
931 }
932 }
933
934 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
935 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
936 where
937 V: Visitor<'de>,
938 {
939 let byte = self.input.peek_byte()?;
940 let t = Type::try_from(byte)?;
941 match t {
942 Type::Null | Type::BooleanFalse | Type::BooleanTrue => {
943 _ = self.input.read_byte()?;
944 }
945 Type::UnsignedInt | Type::SignedInt => {
946 _ = self.input.read_byte()?;
947 while self.input.read_byte()? & 0x80 != 0 {}
948 }
949 Type::Float16 => {
950 self.input.skip_bytes(3)?; }
952 Type::Float32 => {
953 self.input.skip_bytes(5)?; }
955 Type::Float64 => {
956 self.input.skip_bytes(9)?; }
958 Type::Float128 => {
959 self.input.skip_bytes(17)?; }
961 Type::Bytes | Type::String => {
962 _ = self.input.read_byte()?;
963 let len = usize::decode(&mut self.input)?;
964 self.input.skip_bytes(len)?;
965 }
966 Type::SeqStart => return self.deserialize_seq(visitor),
967 Type::MapStart => return self.deserialize_map(visitor),
968 Type::SeqEnd | Type::MapEnd => {
969 return Err(Error::WrongType(
970 t,
971 &[
972 Type::Null,
973 Type::BooleanFalse,
974 Type::BooleanTrue,
975 Type::UnsignedInt,
976 Type::SignedInt,
977 Type::Float16,
978 Type::Float32,
979 Type::Float64,
980 Type::Float128,
981 Type::Bytes,
982 Type::String,
983 Type::SeqStart,
984 Type::MapStart,
985 ],
986 ));
987 }
988 }
989 visitor.visit_unit()
990 }
991}
992
993#[derive(Debug)]
995pub struct SequenceDeserializer<'a, I, B>(&'a mut Deserializer<I, B>);
996
997impl<'de, I, B> ::serde::de::SeqAccess<'de> for SequenceDeserializer<'_, I, B>
998where
999 I: Input<'de>,
1000 B: Buffer,
1001{
1002 type Error = Error;
1003
1004 #[inline]
1005 fn size_hint(&self) -> Option<usize> {
1006 None
1007 }
1008
1009 #[inline]
1010 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
1011 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1012 where
1013 T: ::serde::de::DeserializeSeed<'de>,
1014 {
1015 let byte = self.0.input.peek_byte()?;
1016 let t = Type::try_from(byte)?;
1017 if t == Type::SeqEnd {
1018 return Ok(None);
1019 }
1020
1021 seed.deserialize(&mut *self.0).map(Some)
1022 }
1023}
1024
1025#[derive(Debug)]
1027pub struct ByteSequenceDeserializer<'a>(&'a [u8]);
1028
1029impl<'de> ::serde::de::SeqAccess<'de> for ByteSequenceDeserializer<'_> {
1030 type Error = Error;
1031
1032 #[inline]
1033 fn size_hint(&self) -> Option<usize> {
1034 Some(self.0.len())
1035 }
1036
1037 #[inline]
1038 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
1039 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1040 where
1041 T: ::serde::de::DeserializeSeed<'de>,
1042 {
1043 if let Some((byte, remaining)) = self.0.split_first() {
1044 self.0 = remaining;
1045 seed.deserialize(byte.into_deserializer()).map(Some)
1046 } else {
1047 Ok(None)
1048 }
1049 }
1050}
1051
1052#[derive(Debug)]
1054pub struct CharSequenceDeserializer<'a>(::core::str::Chars<'a>);
1055
1056impl<'de> ::serde::de::SeqAccess<'de> for CharSequenceDeserializer<'_> {
1057 type Error = Error;
1058
1059 #[inline]
1060 fn size_hint(&self) -> Option<usize> {
1061 None
1062 }
1063
1064 #[inline]
1065 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
1066 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1067 where
1068 T: ::serde::de::DeserializeSeed<'de>,
1069 {
1070 if let Some(c) = self.0.next() {
1071 seed.deserialize(c.into_deserializer()).map(Some)
1072 } else {
1073 Ok(None)
1074 }
1075 }
1076}
1077
1078#[derive(Debug)]
1080pub struct MapDeserializer<'a, I, B>(&'a mut Deserializer<I, B>);
1081
1082impl<'de, I, B> ::serde::de::MapAccess<'de> for MapDeserializer<'_, I, B>
1083where
1084 I: Input<'de>,
1085 B: Buffer,
1086{
1087 type Error = Error;
1088
1089 #[inline]
1090 fn size_hint(&self) -> Option<usize> {
1091 None
1092 }
1093
1094 #[inline]
1095 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
1096 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
1097 where
1098 K: ::serde::de::DeserializeSeed<'de>,
1099 {
1100 let byte = self.0.input.peek_byte()?;
1101 let t = Type::try_from(byte)?;
1102 if t == Type::MapEnd {
1103 return Ok(None);
1104 }
1105
1106 seed.deserialize(&mut *self.0).map(Some)
1107 }
1108
1109 #[inline]
1110 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
1111 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
1112 where
1113 V: ::serde::de::DeserializeSeed<'de>,
1114 {
1115 seed.deserialize(&mut *self.0)
1116 }
1117
1118 #[inline]
1119 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
1120 #[allow(clippy::type_complexity, reason = "Tracing makes this trigger, also it's serde trait")]
1121 fn next_entry_seed<K, V>(
1122 &mut self,
1123 kseed: K,
1124 vseed: V,
1125 ) -> Result<Option<(K::Value, V::Value)>, Self::Error>
1126 where
1127 K: ::serde::de::DeserializeSeed<'de>,
1128 V: ::serde::de::DeserializeSeed<'de>,
1129 {
1130 if let Some(key) = self.next_key_seed(kseed)? {
1131 let value = self.next_value_seed(vseed)?;
1132 Ok(Some((key, value)))
1133 } else {
1134 Ok(None)
1135 }
1136 }
1137}
1138
1139#[derive(Debug)]
1141pub struct EnumMapDeserializer<'a, I, B>(&'a mut Deserializer<I, B>);
1142
1143impl<'de, I, B> ::serde::de::EnumAccess<'de> for EnumMapDeserializer<'_, I, B>
1144where
1145 I: Input<'de>,
1146 B: Buffer,
1147{
1148 type Error = Error;
1149 type Variant = Self;
1150
1151 #[inline]
1152 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
1153 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
1154 where
1155 V: ::serde::de::DeserializeSeed<'de>,
1156 {
1157 let value = seed.deserialize(&mut *self.0)?;
1160 Ok((value, self))
1161 }
1162}
1163
1164impl<'de, I, B> ::serde::de::VariantAccess<'de> for EnumMapDeserializer<'_, I, B>
1165where
1166 I: Input<'de>,
1167 B: Buffer,
1168{
1169 type Error = Error;
1170
1171 #[inline]
1174 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
1175 fn unit_variant(self) -> Result<(), Self::Error> {
1176 let byte = self.0.input.peek_byte()?;
1177 let t = Type::try_from(byte)?;
1178 let found = match t {
1179 Type::SeqStart => Unexpected::TupleVariant,
1180 Type::MapStart => Unexpected::StructVariant,
1181 _ => Unexpected::NewtypeVariant,
1182 };
1183 Err(::serde::de::Error::invalid_type(found, &"unit variant"))
1184 }
1185
1186 #[inline]
1187 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip_all))]
1188 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
1189 where
1190 T: ::serde::de::DeserializeSeed<'de>,
1191 {
1192 seed.deserialize(self.0)
1193 }
1194
1195 #[inline]
1196 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
1197 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1198 where
1199 V: Visitor<'de>,
1200 {
1201 ::serde::de::Deserializer::deserialize_seq(self.0, visitor)
1202 }
1203
1204 #[inline]
1205 #[cfg_attr(feature = "tracing", ::tracing::instrument(skip(self, visitor)))]
1206 fn struct_variant<V>(
1207 self,
1208 _fields: &'static [&'static str],
1209 visitor: V,
1210 ) -> Result<V::Value, Self::Error>
1211 where
1212 V: Visitor<'de>,
1213 {
1214 ::serde::de::Deserializer::deserialize_map(self.0, visitor)
1215 }
1216}