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