use std::fmt::Display; use crate::ser::NetworkReadExt; use super::{Read, ReadingError}; use serde::de::{self, DeserializeSeed, SeqAccess}; pub struct Deserializer { inner: R, } impl de::Error for ReadingError { fn custom(msg: T) -> Self { Self::Message(msg.to_string()) } } impl Deserializer { pub fn new(read: R) -> Self { Self { inner: read } } } impl<'de, R: Read> de::Deserializer<'de> for &mut Deserializer { type Error = ReadingError; fn deserialize_any(self, _visitor: V) -> Result where V: de::Visitor<'de>, { unimplemented!( "This is impossible to do, since you cannot infer the data structure from the packet" ) } fn deserialize_bool(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_bool(self.inner.get_bool()?) } fn deserialize_i8(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_i8(self.inner.get_i8_be()?) } fn deserialize_i16(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_i16(self.inner.get_i16_be()?) } fn deserialize_i32(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_i32(self.inner.get_i32_be()?) } fn deserialize_i64(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_i64(self.inner.get_i64_be()?) } fn deserialize_u8(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_u8(self.inner.get_u8_be()?) } fn deserialize_u16(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_u16(self.inner.get_u16_be()?) } fn deserialize_u32(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_u32(self.inner.get_u32_be()?) } fn deserialize_u64(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_u64(self.inner.get_u64_be()?) } fn deserialize_f32(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_f32(self.inner.get_f32_be()?) } fn deserialize_f64(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_f64(self.inner.get_f64_be()?) } fn deserialize_char(self, _visitor: V) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_str(self, visitor: V) -> Result where V: de::Visitor<'de>, { self.deserialize_string(visitor) } fn deserialize_string(self, visitor: V) -> Result where V: de::Visitor<'de>, { visitor.visit_str(&self.inner.get_string()?) } fn deserialize_bytes(self, _visitor: V) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_byte_buf(self, _visitor: V) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_option(self, visitor: V) -> Result where V: de::Visitor<'de>, { if self.inner.get_bool()? { visitor.visit_some(self) } else { visitor.visit_none() } } fn deserialize_unit(self, _visitor: V) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_unit_struct( self, _name: &'static str, _visitor: V, ) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_newtype_struct( self, _name: &'static str, _visitor: V, ) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_seq(self, visitor: V) -> Result where V: de::Visitor<'de>, { struct Access<'a, R: Read> { deserializer: &'a mut Deserializer, } impl<'de, R: Read> SeqAccess<'de> for Access<'_, R> { type Error = ReadingError; fn next_element_seed(&mut self, seed: T) -> Result, Self::Error> where T: de::DeserializeSeed<'de>, { let value = DeserializeSeed::deserialize(seed, &mut *self.deserializer)?; Ok(Some(value)) } } visitor.visit_seq(Access { deserializer: self }) } fn deserialize_tuple(self, len: usize, visitor: V) -> Result where V: de::Visitor<'de>, { struct Access<'a, R: Read> { deserializer: &'a mut Deserializer, len: usize, } impl<'de, R: Read> SeqAccess<'de> for Access<'_, R> { type Error = ReadingError; fn next_element_seed(&mut self, seed: T) -> Result, Self::Error> where T: de::DeserializeSeed<'de>, { if self.len > 0 { self.len -= 1; let value = DeserializeSeed::deserialize(seed, &mut *self.deserializer)?; Ok(Some(value)) } else { Ok(None) } } } visitor.visit_seq(Access { deserializer: self, len, }) } fn deserialize_tuple_struct( self, _name: &'static str, _len: usize, _visitor: V, ) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_map(self, _visitor: V) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_struct( self, _name: &'static str, fields: &'static [&'static str], visitor: V, ) -> Result where V: de::Visitor<'de>, { self.deserialize_tuple(fields.len(), visitor) } fn deserialize_enum( self, _name: &'static str, _variants: &'static [&'static str], _visitor: V, ) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_identifier(self, _visitor: V) -> Result where V: de::Visitor<'de>, { unimplemented!() } fn deserialize_ignored_any(self, _visitor: V) -> Result where V: de::Visitor<'de>, { unimplemented!() } }