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	Error, Result,
12	buffer::Buffer,
13	format::{Type, VarInt},
14	io::Input,
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	#[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	/// Deserialize a float.
144	#[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			// Add Float16 once stable.
157			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			// Add Float128 once stable.
172			_ => Err(Error::WrongType(
173				t,
174				&[Type::Float16, Type::Float32, Type::Float64, Type::Float128],
175			)),
176		}
177	}
178
179	/// Deserialize an unsigned integer.
180	#[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	/// Deserialize a signed integer.
213	#[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)?; // Also the previous type byte.
951			}
952			Type::Float32 => {
953				self.input.skip_bytes(5)?; // Also the previous type byte.
954			}
955			Type::Float64 => {
956				self.input.skip_bytes(9)?; // Also the previous type byte.
957			}
958			Type::Float128 => {
959				self.input.skip_bytes(17)?; // Also the previous type byte.
960			}
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/// Deserialize sequence elements until the end of the sequence.
994#[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/// Deserialize into a sequence of bytes.
1026#[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/// Deserialize into a sequence of [char]s.
1053#[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/// Deserialize map entries until the end of the map.
1079#[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/// Deserialize enum variants.
1140#[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		// The `deserialize_enum` method parsed the map start so we are currently inside of a map.
1158		// The seed will be deserializing itself from the key of the map.
1159		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	// If the `Visitor` expected this variant to be a unit variant, the input
1172	// should have been the plain string case handled in `deserialize_enum`.
1173	#[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}