1#[cfg(feature = "alloc")]
82use alloc::string::String;
83
84#[cfg(feature = "alloc")]
85use alloc::vec::Vec;
86
87use crate::error::{Error, Result};
88
89pub trait Deserialize: Sized {
141 fn deserialize<D>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error>
144 where
145 D: Deserializer;
146}
147
148pub trait Deserializer: Sized {
153 type Error: From<Error>;
155
156 fn deserialize_bool(&mut self, name: &str) -> core::result::Result<bool, Self::Error>;
158
159 fn deserialize_u8(&mut self, name: &str) -> core::result::Result<u8, Self::Error>;
161
162 fn deserialize_i8(&mut self, name: &str) -> core::result::Result<i8, Self::Error>;
164
165 fn deserialize_u16(&mut self, name: &str) -> core::result::Result<u16, Self::Error>;
167
168 fn deserialize_i16(&mut self, name: &str) -> core::result::Result<i16, Self::Error>;
170
171 fn deserialize_u32(&mut self, name: &str) -> core::result::Result<u32, Self::Error>;
173
174 fn deserialize_i32(&mut self, name: &str) -> core::result::Result<i32, Self::Error>;
176
177 fn deserialize_u64(&mut self, name: &str) -> core::result::Result<u64, Self::Error>;
179
180 fn deserialize_i64(&mut self, name: &str) -> core::result::Result<i64, Self::Error>;
182
183 fn deserialize_u128(&mut self, name: &str) -> core::result::Result<u128, Self::Error>;
185
186 fn deserialize_i128(&mut self, name: &str) -> core::result::Result<i128, Self::Error>;
188
189 fn deserialize_f32(&mut self, name: &str) -> core::result::Result<f32, Self::Error>;
191
192 fn deserialize_f64(&mut self, name: &str) -> core::result::Result<f64, Self::Error>;
194
195 fn deserialize_bytes(&mut self, name: &str, buffer: &mut [u8]) -> core::result::Result<usize, Self::Error>;
197
198 #[cfg(feature = "alloc")]
200 fn deserialize_string(&mut self, name: &str) -> core::result::Result<String, Self::Error>;
201
202 #[cfg(feature = "alloc")]
204 fn deserialize_vec<T>(&mut self, name: &str) -> core::result::Result<Vec<T>, Self::Error>
205 where
206 T: Deserialize;
207
208 fn deserialize_array<T, const N: usize>(&mut self, name: &str) -> core::result::Result<[T; N], Self::Error>
210 where
211 T: Deserialize;
212
213 fn deserialize_struct_start(&mut self, _name: &str) -> core::result::Result<(), Self::Error> {
215 Ok(())
216 }
217
218 fn deserialize_field<T>(&mut self, name: &str) -> core::result::Result<T, Self::Error>
220 where
221 T: Deserialize {
222 T::deserialize(self, name)
223 }
224
225 fn deserialize_struct_end(&mut self) -> core::result::Result<(), Self::Error> {
227 Ok(())
228 }
229}
230
231pub struct ByteDeserializer<'a> {
299 buffer: &'a [u8],
300 position: usize,
301}
302
303impl<'a> ByteDeserializer<'a> {
304 pub fn new(buffer: &'a [u8]) -> Self {
306 Self {
307 buffer,
308 position: 0,
309 }
310 }
311
312 pub fn position(&self) -> usize {
314 self.position
315 }
316
317 fn read_bytes(&mut self, len: usize) -> Result<&[u8]> {
319 if self.position + len > self.buffer.len() {
320 return Err(Error::UnexpectedEof);
321 }
322 let bytes = &self.buffer[self.position..self.position + len];
323 self.position += len;
324 Ok(bytes)
325 }
326}
327
328impl<'a> Deserializer for ByteDeserializer<'a> {
329 type Error = Error;
330
331 fn deserialize_bool(&mut self, _name: &str) -> Result<bool> {
332 Ok(self.deserialize_u8("")? != 0)
333 }
334
335 fn deserialize_u8(&mut self, _name: &str) -> Result<u8> {
336 let bytes = self.read_bytes(1)?;
337 Ok(bytes[0])
338 }
339
340 fn deserialize_i8(&mut self, _name: &str) -> Result<i8> {
341 let bytes = self.read_bytes(1)?;
342 Ok(i8::from_le_bytes([bytes[0]]))
343 }
344
345 fn deserialize_u16(&mut self, _name: &str) -> Result<u16> {
346 let bytes = self.read_bytes(2)?;
347 let mut buf = [0u8; 2];
348 buf.copy_from_slice(bytes);
349 Ok(u16::from_le_bytes(buf))
350 }
351
352 fn deserialize_i16(&mut self, _name: &str) -> Result<i16> {
353 let bytes = self.read_bytes(2)?;
354 let mut buf = [0u8; 2];
355 buf.copy_from_slice(bytes);
356 Ok(i16::from_le_bytes(buf))
357 }
358
359 fn deserialize_u32(&mut self, _name: &str) -> Result<u32> {
360 let bytes = self.read_bytes(4)?;
361 let mut buf = [0u8; 4];
362 buf.copy_from_slice(bytes);
363 Ok(u32::from_le_bytes(buf))
364 }
365
366 fn deserialize_i32(&mut self, _name: &str) -> Result<i32> {
367 let bytes = self.read_bytes(4)?;
368 let mut buf = [0u8; 4];
369 buf.copy_from_slice(bytes);
370 Ok(i32::from_le_bytes(buf))
371 }
372
373 fn deserialize_u64(&mut self, _name: &str) -> Result<u64> {
374 let bytes = self.read_bytes(8)?;
375 let mut buf = [0u8; 8];
376 buf.copy_from_slice(bytes);
377 Ok(u64::from_le_bytes(buf))
378 }
379
380 fn deserialize_i64(&mut self, _name: &str) -> Result<i64> {
381 let bytes = self.read_bytes(8)?;
382 let mut buf = [0u8; 8];
383 buf.copy_from_slice(bytes);
384 Ok(i64::from_le_bytes(buf))
385 }
386
387 fn deserialize_u128(&mut self, _name: &str) -> Result<u128> {
388 let bytes = self.read_bytes(16)?;
389 let mut buf = [0u8; 16];
390 buf.copy_from_slice(bytes);
391 Ok(u128::from_le_bytes(buf))
392 }
393
394 fn deserialize_i128(&mut self, _name: &str) -> Result<i128> {
395 let bytes = self.read_bytes(16)?;
396 let mut buf = [0u8; 16];
397 buf.copy_from_slice(bytes);
398 Ok(i128::from_le_bytes(buf))
399 }
400
401 fn deserialize_f32(&mut self, _name: &str) -> Result<f32> {
402 let bytes = self.read_bytes(4)?;
403 let mut buf = [0u8; 4];
404 buf.copy_from_slice(bytes);
405 Ok(f32::from_le_bytes(buf))
406 }
407
408 fn deserialize_f64(&mut self, _name: &str) -> Result<f64> {
409 let bytes = self.read_bytes(8)?;
410 let mut buf = [0u8; 8];
411 buf.copy_from_slice(bytes);
412 Ok(f64::from_le_bytes(buf))
413 }
414
415 fn deserialize_bytes(&mut self, _name: &str, buffer: &mut [u8]) -> Result<usize> {
416 let len = self.deserialize_u32("")? as usize;
418 if len > buffer.len() {
419 return Err(Error::BufferTooSmall);
420 }
421 let bytes = self.read_bytes(len)?;
422 buffer[..len].copy_from_slice(bytes);
423 Ok(len)
424 }
425
426 #[cfg(feature = "alloc")]
427 fn deserialize_string(&mut self, _name: &str) -> Result<String> {
428 let len = self.deserialize_u32("")? as usize;
429 let bytes = self.read_bytes(len)?;
430 String::from_utf8(bytes.to_vec())
431 .map_err(|_| Error::InvalidData)
432 }
433
434 #[cfg(feature = "alloc")]
435 fn deserialize_vec<T>(&mut self, _name: &str) -> Result<Vec<T>>
436 where
437 T: Deserialize {
438 let len = self.deserialize_u32("")? as usize;
439 let mut vec = Vec::with_capacity(len);
440 for _ in 0..len {
441 vec.push(T::deserialize(self, "")?);
442 }
443 Ok(vec)
444 }
445
446 fn deserialize_array<T, const N: usize>(&mut self, _name: &str) -> Result<[T; N]>
447 where
448 T: Deserialize {
449 let mut result = core::mem::MaybeUninit::<[T; N]>::uninit();
450 let result_ptr = result.as_mut_ptr() as *mut T;
451
452 for i in 0..N {
453 unsafe {
454 result_ptr.add(i).write(T::deserialize(self, "")?);
455 }
456 }
457
458 Ok(unsafe { result.assume_init() })
459 }
460}
461
462impl Deserialize for bool {
465 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
466 deserializer.deserialize_bool(name)
467 }
468}
469
470impl Deserialize for u8 {
471 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
472 deserializer.deserialize_u8(name)
473 }
474}
475
476impl Deserialize for i8 {
477 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
478 deserializer.deserialize_i8(name)
479 }
480}
481
482impl Deserialize for u16 {
483 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
484 deserializer.deserialize_u16(name)
485 }
486}
487
488impl Deserialize for i16 {
489 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
490 deserializer.deserialize_i16(name)
491 }
492}
493
494impl Deserialize for u32 {
495 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
496 deserializer.deserialize_u32(name)
497 }
498}
499
500impl Deserialize for i32 {
501 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
502 deserializer.deserialize_i32(name)
503 }
504}
505
506impl Deserialize for u64 {
507 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
508 deserializer.deserialize_u64(name)
509 }
510}
511
512impl Deserialize for i64 {
513 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
514 deserializer.deserialize_i64(name)
515 }
516}
517
518impl Deserialize for u128 {
519 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
520 deserializer.deserialize_u128(name)
521 }
522}
523
524impl Deserialize for i128 {
525 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
526 deserializer.deserialize_i128(name)
527 }
528}
529
530impl Deserialize for f32 {
531 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
532 deserializer.deserialize_f32(name)
533 }
534}
535
536impl Deserialize for f64 {
537 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
538 deserializer.deserialize_f64(name)
539 }
540}
541
542#[cfg(feature = "alloc")]
543impl Deserialize for String {
544 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
545 deserializer.deserialize_string(name)
546 }
547}
548
549impl<T, const N: usize> Deserialize for [T; N]
551where
552 T: Deserialize
553{
554 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
555 deserializer.deserialize_array::<T, N>(name)
556 }
557}
558
559#[cfg(feature = "alloc")]
561impl<T> Deserialize for Vec<T>
562where
563 T: Deserialize
564{
565 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
566 deserializer.deserialize_vec::<T>(name)
567 }
568}
569
570impl<T1: Deserialize, T2: Deserialize> Deserialize for (T1, T2)
572where
573 T1: Deserialize,
574 T2: Deserialize
575{
576 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
577 Ok((
578 T1::deserialize(deserializer, name)?,
579 T2::deserialize(deserializer, name)?,
580 ))
581 }
582}
583
584impl<T1: Deserialize, T2: Deserialize, T3: Deserialize> Deserialize for (T1, T2, T3)
585where
586 T1: Deserialize,
587 T2: Deserialize,
588 T3: Deserialize,
589{
590 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
591 Ok((
592 T1::deserialize(deserializer, name)?,
593 T2::deserialize(deserializer, name)?,
594 T3::deserialize(deserializer, name)?,
595 ))
596 }
597}
598
599impl<T> Deserialize for Option<T>
601where T: Deserialize
602{
603 fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
604 let tag = deserializer.deserialize_u8(name)?;
605 match tag {
606 0 => Ok(None),
607 1 => Ok(Some(T::deserialize(deserializer, name)?)),
608 _ => Err(Error::InvalidData.into()),
609 }
610 }
611}