use crate::structs::{Settings, StructError, StructResult}; use crate::ArchiveError; use serde::de; pub struct ArchiveDeserializer<'de> { bytes: &'de [u8], pointer: usize, settings: Settings, } struct SeqDeserializer<'a, 'de: 'a> { de: &'a mut ArchiveDeserializer<'de>, len: usize, } struct EnumDeserializer<'a, 'de: 'a> { de: &'a mut ArchiveDeserializer<'de>, } impl<'de> ArchiveDeserializer<'de> { pub fn new(bytes: &'de [u8], settings: Settings) -> Self { Self { bytes, pointer: 0, settings, } } fn take(&mut self) -> StructResult<[u8; S]> { let bytes = self .bytes .get(self.pointer..self.pointer + S) .ok_or(StructError::UnexpectedEOF)? .try_into() .unwrap(); self.pointer += S; Ok(bytes) } fn take_byte(&mut self) -> StructResult { let byte = self .bytes .get(self.pointer) .ok_or(StructError::UnexpectedEOF)?; self.pointer += 1; Ok(*byte) } } impl<'a, 'de> SeqDeserializer<'a, 'de> { pub fn new(de: &'a mut ArchiveDeserializer<'de>, len: usize) -> Self { Self { de, len } } } impl<'a, 'de> EnumDeserializer<'a, 'de> { pub fn new(de: &'a mut ArchiveDeserializer<'de>) -> Self { Self { de } } } impl<'de> de::Deserializer<'de> for &mut ArchiveDeserializer<'de> { type Error = ArchiveError; fn deserialize_any(self, _visitor: V) -> StructResult where V: de::Visitor<'de>, { Err(StructError::DeserializationNotSupported { type_name: "any" }.into()) } fn deserialize_bool(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { visitor.visit_bool(self.take_byte()? != 0) } fn deserialize_i8(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { visitor.visit_i8(self.take_byte()? as i8) } fn deserialize_i16(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { let bytes = self.take()?; visitor.visit_i16(self.settings.byte_order.to_i16(bytes)) } fn deserialize_i32(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { let bytes = self.take()?; visitor.visit_i32(self.settings.byte_order.to_i32(bytes)) } fn deserialize_i64(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { let bytes = self.take()?; visitor.visit_i64(self.settings.byte_order.to_i64(bytes)) } fn deserialize_u8(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { visitor.visit_u8(self.take_byte()?) } fn deserialize_u16(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { let bytes = self.take()?; visitor.visit_u16(self.settings.byte_order.to_u16(bytes)) } fn deserialize_u32(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { let bytes = self.take()?; visitor.visit_u32(self.settings.byte_order.to_u32(bytes)) } fn deserialize_u64(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { let bytes = self.take()?; visitor.visit_u64(self.settings.byte_order.to_u64(bytes)) } fn deserialize_f32(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { let bytes = self.take()?; visitor.visit_f32(self.settings.byte_order.to_f32(bytes)) } fn deserialize_f64(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { let bytes = self.take()?; visitor.visit_f64(self.settings.byte_order.to_f64(bytes)) } fn deserialize_char(self, _visitor: V) -> StructResult where V: de::Visitor<'de>, { Err(StructError::DeserializationNotSupported { type_name: "char" }.into()) } fn deserialize_str(self, _visitor: V) -> StructResult where V: de::Visitor<'de>, { Err(StructError::DeserializationNotSupported { type_name: "str" }.into()) } fn deserialize_string(self, _visitor: V) -> StructResult where V: de::Visitor<'de>, { Err(StructError::DeserializationNotSupported { type_name: "string", } .into()) } fn deserialize_bytes(self, _visitor: V) -> StructResult where V: de::Visitor<'de>, { Err(StructError::DeserializationNotSupported { type_name: "bytes" }.into()) } fn deserialize_byte_buf(self, _visitor: V) -> StructResult where V: de::Visitor<'de>, { Err(StructError::DeserializationNotSupported { type_name: "bytes" }.into()) } fn deserialize_option(self, _visitor: V) -> StructResult where V: de::Visitor<'de>, { Err(StructError::DeserializationNotSupported { type_name: "optional", } .into()) } fn deserialize_unit(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { visitor.visit_unit() } fn deserialize_unit_struct(self, _name: &'static str, visitor: V) -> StructResult where V: de::Visitor<'de>, { self.deserialize_unit(visitor) } fn deserialize_newtype_struct( self, _name: &'static str, visitor: V, ) -> StructResult where V: de::Visitor<'de>, { visitor.visit_newtype_struct(self) } fn deserialize_seq(self, _visitor: V) -> StructResult where V: de::Visitor<'de>, { Err(StructError::DeserializationNotSupported { type_name: "seq" }.into()) } fn deserialize_tuple(self, len: usize, visitor: V) -> StructResult where V: de::Visitor<'de>, { visitor.visit_seq(SeqDeserializer::new(self, len)) } fn deserialize_tuple_struct( self, _name: &'static str, len: usize, visitor: V, ) -> StructResult where V: de::Visitor<'de>, { self.deserialize_tuple(len, visitor) } fn deserialize_map(self, _visitor: V) -> StructResult where V: de::Visitor<'de>, { Err(StructError::DeserializationNotSupported { type_name: "map" }.into()) } fn deserialize_struct( self, _name: &'static str, fields: &'static [&'static str], visitor: V, ) -> StructResult where V: de::Visitor<'de>, { self.deserialize_tuple(fields.len(), visitor) } fn deserialize_enum( self, _name: &'static str, _variants: &'static [&'static str], visitor: V, ) -> StructResult where V: de::Visitor<'de>, { visitor.visit_enum(EnumDeserializer::new(self)) } fn deserialize_identifier(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { match self.settings.variant_index_type { super::VariantIndexType::U8 => self.deserialize_u8(visitor), super::VariantIndexType::U16 => self.deserialize_u16(visitor), super::VariantIndexType::U32 => self.deserialize_u32(visitor), super::VariantIndexType::U64 => self.deserialize_u64(visitor), } } #[inline] fn deserialize_ignored_any(self, visitor: V) -> StructResult where V: de::Visitor<'de>, { self.deserialize_any(visitor) } } impl<'a, 'de> de::SeqAccess<'de> for SeqDeserializer<'a, 'de> { type Error = ArchiveError; fn next_element_seed(&mut self, seed: T) -> Result, Self::Error> where T: de::DeserializeSeed<'de>, { if self.len == 0 { return Ok(None); } seed.deserialize(&mut *self.de).map(Some) } } impl<'a, 'de> de::EnumAccess<'de> for EnumDeserializer<'a, 'de> { type Error = ArchiveError; type Variant = Self; fn variant_seed(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: de::DeserializeSeed<'de>, { Ok((seed.deserialize(&mut *self.de)?, self)) } } impl<'a, 'de> de::VariantAccess<'de> for EnumDeserializer<'a, 'de> { type Error = ArchiveError; fn unit_variant(self) -> Result<(), Self::Error> { Ok(()) } fn newtype_variant_seed(self, seed: T) -> Result where T: de::DeserializeSeed<'de>, { seed.deserialize(&mut *self.de) } fn tuple_variant(self, len: usize, visitor: V) -> Result where V: de::Visitor<'de>, { de::Deserializer::deserialize_tuple(self.de, len, visitor) } fn struct_variant( self, fields: &'static [&'static str], visitor: V, ) -> Result where V: de::Visitor<'de>, { de::Deserializer::deserialize_tuple(self.de, fields.len(), visitor) } }