#[cfg(feature = "alloc")]
use alloc::string::String;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
use crate::error::{Error, Result};
pub trait Deserialize: Sized {
fn deserialize<D>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error>
where
D: Deserializer;
}
pub trait Deserializer: Sized {
type Error: From<Error>;
fn deserialize_bool(&mut self, name: &str) -> core::result::Result<bool, Self::Error>;
fn deserialize_u8(&mut self, name: &str) -> core::result::Result<u8, Self::Error>;
fn deserialize_i8(&mut self, name: &str) -> core::result::Result<i8, Self::Error>;
fn deserialize_u16(&mut self, name: &str) -> core::result::Result<u16, Self::Error>;
fn deserialize_i16(&mut self, name: &str) -> core::result::Result<i16, Self::Error>;
fn deserialize_u32(&mut self, name: &str) -> core::result::Result<u32, Self::Error>;
fn deserialize_i32(&mut self, name: &str) -> core::result::Result<i32, Self::Error>;
fn deserialize_u64(&mut self, name: &str) -> core::result::Result<u64, Self::Error>;
fn deserialize_i64(&mut self, name: &str) -> core::result::Result<i64, Self::Error>;
fn deserialize_u128(&mut self, name: &str) -> core::result::Result<u128, Self::Error>;
fn deserialize_i128(&mut self, name: &str) -> core::result::Result<i128, Self::Error>;
fn deserialize_f32(&mut self, name: &str) -> core::result::Result<f32, Self::Error>;
fn deserialize_f64(&mut self, name: &str) -> core::result::Result<f64, Self::Error>;
fn deserialize_bytes(&mut self, name: &str, buffer: &mut [u8]) -> core::result::Result<usize, Self::Error>;
#[cfg(feature = "alloc")]
fn deserialize_string(&mut self, name: &str) -> core::result::Result<String, Self::Error>;
#[cfg(feature = "alloc")]
fn deserialize_vec<T>(&mut self, name: &str) -> core::result::Result<Vec<T>, Self::Error>
where
T: Deserialize;
fn deserialize_array<T, const N: usize>(&mut self, name: &str) -> core::result::Result<[T; N], Self::Error>
where
T: Deserialize;
fn deserialize_struct_start(&mut self, _name: &str) -> core::result::Result<(), Self::Error> {
Ok(())
}
fn deserialize_field<T>(&mut self, name: &str) -> core::result::Result<T, Self::Error>
where
T: Deserialize {
T::deserialize(self, name)
}
fn deserialize_struct_end(&mut self) -> core::result::Result<(), Self::Error> {
Ok(())
}
}
pub struct ByteDeserializer<'a> {
buffer: &'a [u8],
position: usize,
}
impl<'a> ByteDeserializer<'a> {
pub fn new(buffer: &'a [u8]) -> Self {
Self {
buffer,
position: 0,
}
}
pub fn position(&self) -> usize {
self.position
}
fn read_bytes(&mut self, len: usize) -> Result<&[u8]> {
if self.position + len > self.buffer.len() {
return Err(Error::UnexpectedEof);
}
let bytes = &self.buffer[self.position..self.position + len];
self.position += len;
Ok(bytes)
}
}
impl<'a> Deserializer for ByteDeserializer<'a> {
type Error = Error;
fn deserialize_bool(&mut self, _name: &str) -> Result<bool> {
Ok(self.deserialize_u8("")? != 0)
}
fn deserialize_u8(&mut self, _name: &str) -> Result<u8> {
let bytes = self.read_bytes(1)?;
Ok(bytes[0])
}
fn deserialize_i8(&mut self, _name: &str) -> Result<i8> {
let bytes = self.read_bytes(1)?;
Ok(i8::from_le_bytes([bytes[0]]))
}
fn deserialize_u16(&mut self, _name: &str) -> Result<u16> {
let bytes = self.read_bytes(2)?;
let mut buf = [0u8; 2];
buf.copy_from_slice(bytes);
Ok(u16::from_le_bytes(buf))
}
fn deserialize_i16(&mut self, _name: &str) -> Result<i16> {
let bytes = self.read_bytes(2)?;
let mut buf = [0u8; 2];
buf.copy_from_slice(bytes);
Ok(i16::from_le_bytes(buf))
}
fn deserialize_u32(&mut self, _name: &str) -> Result<u32> {
let bytes = self.read_bytes(4)?;
let mut buf = [0u8; 4];
buf.copy_from_slice(bytes);
Ok(u32::from_le_bytes(buf))
}
fn deserialize_i32(&mut self, _name: &str) -> Result<i32> {
let bytes = self.read_bytes(4)?;
let mut buf = [0u8; 4];
buf.copy_from_slice(bytes);
Ok(i32::from_le_bytes(buf))
}
fn deserialize_u64(&mut self, _name: &str) -> Result<u64> {
let bytes = self.read_bytes(8)?;
let mut buf = [0u8; 8];
buf.copy_from_slice(bytes);
Ok(u64::from_le_bytes(buf))
}
fn deserialize_i64(&mut self, _name: &str) -> Result<i64> {
let bytes = self.read_bytes(8)?;
let mut buf = [0u8; 8];
buf.copy_from_slice(bytes);
Ok(i64::from_le_bytes(buf))
}
fn deserialize_u128(&mut self, _name: &str) -> Result<u128> {
let bytes = self.read_bytes(16)?;
let mut buf = [0u8; 16];
buf.copy_from_slice(bytes);
Ok(u128::from_le_bytes(buf))
}
fn deserialize_i128(&mut self, _name: &str) -> Result<i128> {
let bytes = self.read_bytes(16)?;
let mut buf = [0u8; 16];
buf.copy_from_slice(bytes);
Ok(i128::from_le_bytes(buf))
}
fn deserialize_f32(&mut self, _name: &str) -> Result<f32> {
let bytes = self.read_bytes(4)?;
let mut buf = [0u8; 4];
buf.copy_from_slice(bytes);
Ok(f32::from_le_bytes(buf))
}
fn deserialize_f64(&mut self, _name: &str) -> Result<f64> {
let bytes = self.read_bytes(8)?;
let mut buf = [0u8; 8];
buf.copy_from_slice(bytes);
Ok(f64::from_le_bytes(buf))
}
fn deserialize_bytes(&mut self, _name: &str, buffer: &mut [u8]) -> Result<usize> {
let len = self.deserialize_u32("")? as usize;
if len > buffer.len() {
return Err(Error::BufferTooSmall);
}
let bytes = self.read_bytes(len)?;
buffer[..len].copy_from_slice(bytes);
Ok(len)
}
#[cfg(feature = "alloc")]
fn deserialize_string(&mut self, _name: &str) -> Result<String> {
let len = self.deserialize_u32("")? as usize;
let bytes = self.read_bytes(len)?;
String::from_utf8(bytes.to_vec())
.map_err(|_| Error::InvalidData)
}
#[cfg(feature = "alloc")]
fn deserialize_vec<T>(&mut self, _name: &str) -> Result<Vec<T>>
where
T: Deserialize {
let len = self.deserialize_u32("")? as usize;
let mut vec = Vec::with_capacity(len);
for _ in 0..len {
vec.push(T::deserialize(self, "")?);
}
Ok(vec)
}
fn deserialize_array<T, const N: usize>(&mut self, _name: &str) -> Result<[T; N]>
where
T: Deserialize {
let mut result = core::mem::MaybeUninit::<[T; N]>::uninit();
let result_ptr = result.as_mut_ptr() as *mut T;
for i in 0..N {
unsafe {
result_ptr.add(i).write(T::deserialize(self, "")?);
}
}
Ok(unsafe { result.assume_init() })
}
}
impl Deserialize for bool {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_bool(name)
}
}
impl Deserialize for u8 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_u8(name)
}
}
impl Deserialize for i8 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_i8(name)
}
}
impl Deserialize for u16 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_u16(name)
}
}
impl Deserialize for i16 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_i16(name)
}
}
impl Deserialize for u32 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_u32(name)
}
}
impl Deserialize for i32 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_i32(name)
}
}
impl Deserialize for u64 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_u64(name)
}
}
impl Deserialize for i64 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_i64(name)
}
}
impl Deserialize for u128 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_u128(name)
}
}
impl Deserialize for i128 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_i128(name)
}
}
impl Deserialize for f32 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_f32(name)
}
}
impl Deserialize for f64 {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_f64(name)
}
}
#[cfg(feature = "alloc")]
impl Deserialize for String {
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_string(name)
}
}
impl<T, const N: usize> Deserialize for [T; N]
where
T: Deserialize
{
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_array::<T, N>(name)
}
}
#[cfg(feature = "alloc")]
impl<T> Deserialize for Vec<T>
where
T: Deserialize
{
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
deserializer.deserialize_vec::<T>(name)
}
}
impl<T1: Deserialize, T2: Deserialize> Deserialize for (T1, T2)
where
T1: Deserialize,
T2: Deserialize
{
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
Ok((
T1::deserialize(deserializer, name)?,
T2::deserialize(deserializer, name)?,
))
}
}
impl<T1: Deserialize, T2: Deserialize, T3: Deserialize> Deserialize for (T1, T2, T3)
where
T1: Deserialize,
T2: Deserialize,
T3: Deserialize,
{
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
Ok((
T1::deserialize(deserializer, name)?,
T2::deserialize(deserializer, name)?,
T3::deserialize(deserializer, name)?,
))
}
}
impl<T> Deserialize for Option<T>
where T: Deserialize
{
fn deserialize<D: Deserializer>(deserializer: &mut D, name: &str) -> core::result::Result<Self, D::Error> {
let tag = deserializer.deserialize_u8(name)?;
match tag {
0 => Ok(None),
1 => Ok(Some(T::deserialize(deserializer, name)?)),
_ => Err(Error::InvalidData.into()),
}
}
}