serde_brief/
de.rs

1//! Deserialization implementation.
2#![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/// The deserializer for the binary format.
18#[derive(Debug)]
19pub struct Deserializer<I, B = ()> {
20	/// The input to read from.
21	input: I,
22	/// The buffer/scratch to read data to temporarily.
23	buffer: Option<B>,
24}
25
26impl<I> Deserializer<I, ()> {
27	/// Create a new deserializer from the given input, without a scratch/buffer. When reading from
28	/// a non-borrowed source (e.g. a reader), set a read-buffer with
29	/// [with_buffer](Self::with_buffer) or deserialization will fail.
30	#[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		// Same bounds as `serde::Deserializer` impl.
35		I: Input<'de>,
36	{
37		Self { input, buffer: None }
38	}
39
40	/// Create a new deserializer from the given input, without a scratch/buffer. Reading from a
41	/// non-borrowed source will fail (e.g. a reader).
42	#[must_use]
43	pub fn with_buffer<B>(self, buffer: B) -> Deserializer<I, B>
44	where
45		// Same bounds as `serde::Deserializer` impl.
46		B: Buffer,
47	{
48		Deserializer { input: self.input, buffer: Some(buffer) }
49	}
50}
51
52impl<I, B> Deserializer<I, B> {
53	/// Consume the deserializer and return the input.
54	#[inline]
55	pub fn into_input(self) -> I {
56		self.input
57	}
58
59	/// Consume the deserializer and return the inner parts.
60	#[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	/// Reset the buffer, if available.
72	#[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	/// Get the buffer as slice.
81	#[inline]
82	fn buffer_slice(&self) -> Result<&[u8]> {
83		Ok(self.buffer.as_ref().ok_or_else(|| Error::BufferTooSmall)?.as_slice())
84	}
85
86	/// Read a number of bytes, regardless of lifetime.
87	#[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	/// Deserialize a usize/isize and visit it, regardless of size.
102	#[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	/// Deserialize a float.
143	#[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			// Add Float16 once stable.
156			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			// Add Float128 once stable.
171			_ => Err(Error::WrongType(
172				t,
173				&[Type::Float16, Type::Float32, Type::Float64, Type::Float128],
174			)),
175		}
176	}
177
178	/// Deserialize an unsigned integer.
179	#[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	/// Deserialize a signed integer.
211	#[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)?; // Also the previous type byte.
948			}
949			Type::Float32 => {
950				self.input.skip_bytes(5)?; // Also the previous type byte.
951			}
952			Type::Float64 => {
953				self.input.skip_bytes(9)?; // Also the previous type byte.
954			}
955			Type::Float128 => {
956				self.input.skip_bytes(17)?; // Also the previous type byte.
957			}
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/// Deserialize sequence elements until the end of the sequence.
991#[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/// Deserialize into a sequence of bytes.
1023#[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/// Deserialize into a sequence of [char]s.
1050#[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/// Deserialize map entries until the end of the map.
1076#[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/// Deserialize enum variants.
1137#[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		// The `deserialize_enum` method parsed the map start so we are currently inside of a map.
1155		// The seed will be deserializing itself from the key of the map.
1156		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	// If the `Visitor` expected this variant to be a unit variant, the input
1169	// should have been the plain string case handled in `deserialize_enum`.
1170	#[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}