use super::DecodeError as SerdeDecodeError; use crate::{ config::Config, de::{BorrowDecode, BorrowDecoder, Decode}, error::DecodeError, }; use core::marker::PhantomData; use serde_incl::de::*; /// Decode a borrowed type from the given slice. Some parts of the decoded type are expected to be referring to the given slice pub fn decode_borrowed_from_slice<'de, T, C>(slice: &'de [u8], config: C) -> Result where T: Deserialize<'de>, C: Config, { if C::SKIP_FIXED_ARRAY_LENGTH { return Err(SerdeDecodeError::SkipFixedArrayLengthNotSupported.into()); } let reader = crate::de::read::SliceReader::new(slice); let mut decoder = crate::de::DecoderImpl::new(reader, config); let serde_decoder = SerdeDecoder { de: &mut decoder, pd: PhantomData, }; T::deserialize(serde_decoder) } pub(super) struct SerdeDecoder<'a, 'de, DE: BorrowDecoder<'de>> { pub(super) de: &'a mut DE, pub(super) pd: PhantomData<&'de ()>, } impl<'a, 'de, DE: BorrowDecoder<'de>> Deserializer<'de> for SerdeDecoder<'a, 'de, DE> { type Error = DecodeError; fn deserialize_any(self, _: V) -> Result where V: serde_incl::de::Visitor<'de>, { Err(SerdeDecodeError::AnyNotSupported.into()) } fn deserialize_bool(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_bool(Decode::decode(&mut self.de)?) } fn deserialize_i8(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_i8(Decode::decode(&mut self.de)?) } fn deserialize_i16(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_i16(Decode::decode(&mut self.de)?) } fn deserialize_i32(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_i32(Decode::decode(&mut self.de)?) } fn deserialize_i64(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_i64(Decode::decode(&mut self.de)?) } serde_incl::serde_if_integer128! { fn deserialize_i128(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_i128(Decode::decode(&mut self.de)?) } } fn deserialize_u8(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_u8(Decode::decode(&mut self.de)?) } fn deserialize_u16(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_u16(Decode::decode(&mut self.de)?) } fn deserialize_u32(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_u32(Decode::decode(&mut self.de)?) } fn deserialize_u64(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_u64(Decode::decode(&mut self.de)?) } serde_incl::serde_if_integer128! { fn deserialize_u128(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_u128(Decode::decode(&mut self.de)?) } } fn deserialize_f32(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_f32(Decode::decode(&mut self.de)?) } fn deserialize_f64(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_f64(Decode::decode(&mut self.de)?) } fn deserialize_char(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_char(Decode::decode(&mut self.de)?) } fn deserialize_str(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { let str = <&'de str>::borrow_decode(&mut self.de)?; visitor.visit_borrowed_str(str) } #[cfg(not(feature = "alloc"))] fn deserialize_string(self, _: V) -> Result where V: serde_incl::de::Visitor<'de>, { Err(SerdeDecodeError::CannotBorrowOwnedData.into()) } #[cfg(feature = "alloc")] fn deserialize_string(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_string(Decode::decode(&mut self.de)?) } fn deserialize_bytes(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { let bytes = <&'de [u8]>::borrow_decode(&mut self.de)?; visitor.visit_borrowed_bytes(bytes) } #[cfg(not(feature = "alloc"))] fn deserialize_byte_buf(self, _: V) -> Result where V: serde_incl::de::Visitor<'de>, { Err(SerdeDecodeError::CannotBorrowOwnedData.into()) } #[cfg(feature = "alloc")] fn deserialize_byte_buf(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_byte_buf(Decode::decode(&mut self.de)?) } fn deserialize_option(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { let variant = crate::de::decode_option_variant(&mut self.de, "Option")?; if variant.is_some() { visitor.visit_some(self) } else { visitor.visit_none() } } fn deserialize_unit(self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_unit() } fn deserialize_unit_struct( self, _name: &'static str, visitor: V, ) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_unit() } fn deserialize_newtype_struct( self, _name: &'static str, visitor: V, ) -> Result where V: serde_incl::de::Visitor<'de>, { visitor.visit_newtype_struct(self) } fn deserialize_seq(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { let len = usize::decode(&mut self.de)?; self.deserialize_tuple(len, visitor) } fn deserialize_tuple(mut self, len: usize, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { struct Access<'a, 'b, 'de, DE: BorrowDecoder<'de>> { deserializer: &'a mut SerdeDecoder<'b, 'de, DE>, len: usize, } impl<'de, 'a, 'b: 'a, DE: BorrowDecoder<'de> + 'b> SeqAccess<'de> for Access<'a, 'b, 'de, DE> { type Error = DecodeError; fn next_element_seed(&mut self, seed: T) -> Result, DecodeError> where T: DeserializeSeed<'de>, { if self.len > 0 { self.len -= 1; let value = DeserializeSeed::deserialize( seed, SerdeDecoder { de: self.deserializer.de, pd: PhantomData, }, )?; Ok(Some(value)) } else { Ok(None) } } fn size_hint(&self) -> Option { Some(self.len) } } visitor.visit_seq(Access { deserializer: &mut self, len, }) } fn deserialize_tuple_struct( self, _name: &'static str, len: usize, visitor: V, ) -> Result where V: serde_incl::de::Visitor<'de>, { self.deserialize_tuple(len, visitor) } fn deserialize_map(mut self, visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { struct Access<'a, 'b, 'de, DE: BorrowDecoder<'de>> { deserializer: &'a mut SerdeDecoder<'b, 'de, DE>, len: usize, } impl<'de, 'a, 'b: 'a, DE: BorrowDecoder<'de> + 'b> MapAccess<'de> for Access<'a, 'b, 'de, DE> { type Error = DecodeError; fn next_key_seed(&mut self, seed: K) -> Result, DecodeError> where K: DeserializeSeed<'de>, { if self.len > 0 { self.len -= 1; let key = DeserializeSeed::deserialize( seed, SerdeDecoder { de: self.deserializer.de, pd: PhantomData, }, )?; Ok(Some(key)) } else { Ok(None) } } fn next_value_seed(&mut self, seed: V) -> Result where V: DeserializeSeed<'de>, { let value = DeserializeSeed::deserialize( seed, SerdeDecoder { de: self.deserializer.de, pd: PhantomData, }, )?; Ok(value) } fn size_hint(&self) -> Option { Some(self.len) } } let len = usize::decode(&mut self.de)?; visitor.visit_map(Access { deserializer: &mut self, len, }) } fn deserialize_struct( self, _name: &'static str, fields: &'static [&'static str], visitor: V, ) -> Result where V: serde_incl::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: serde_incl::de::Visitor<'de>, { visitor.visit_enum(self) } fn deserialize_identifier(self, _visitor: V) -> Result where V: serde_incl::de::Visitor<'de>, { Err(SerdeDecodeError::IdentifierNotSupported.into()) } fn deserialize_ignored_any(self, _: V) -> Result where V: serde_incl::de::Visitor<'de>, { Err(SerdeDecodeError::IgnoredAnyNotSupported.into()) } fn is_human_readable(&self) -> bool { false } } impl<'de, 'a, DE: BorrowDecoder<'de>> EnumAccess<'de> for SerdeDecoder<'a, 'de, DE> { type Error = DecodeError; type Variant = Self; fn variant_seed(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: DeserializeSeed<'de>, { let idx = u32::decode(&mut self.de)?; let val = seed.deserialize(idx.into_deserializer())?; Ok((val, self)) } } impl<'de, 'a, DE: BorrowDecoder<'de>> VariantAccess<'de> for SerdeDecoder<'a, 'de, DE> { type Error = DecodeError; fn unit_variant(self) -> Result<(), Self::Error> { Ok(()) } fn newtype_variant_seed(self, seed: T) -> Result where T: DeserializeSeed<'de>, { DeserializeSeed::deserialize(seed, self) } fn tuple_variant(self, len: usize, visitor: V) -> Result where V: Visitor<'de>, { Deserializer::deserialize_tuple(self, len, visitor) } fn struct_variant( self, fields: &'static [&'static str], visitor: V, ) -> Result where V: Visitor<'de>, { Deserializer::deserialize_tuple(self, fields.len(), visitor) } }