use serde::Deserialize; use serde::de::{Visitor, SeqAccess, MapAccess, EnumAccess, VariantAccess, DeserializeSeed}; use std::borrow::Cow; use std::marker::PhantomData; use super::value::PackedReader; use super::value::reader::{Reader, IOBinarySource, BytesBinarySource}; pub use super::error::Error; pub type Result = std::result::Result; pub struct Deserializer<'de, 'r, R: Reader<'de>> { pub read: &'r mut R, phantom: PhantomData<&'de ()>, } pub fn from_bytes<'de, T>(bytes: &'de [u8]) -> Result where T: Deserialize<'de> { from_reader(&mut PackedReader::new(BytesBinarySource::new(bytes))) } pub fn from_read<'de, 'r, IOR: std::io::Read, T>(read: &'r mut IOR) -> Result where T: Deserialize<'de> { from_reader(&mut PackedReader::new(IOBinarySource::new(read))) } pub fn from_reader<'r, 'de, R: Reader<'de>, T>(read: &'r mut R) -> Result where T: Deserialize<'de> { let mut de = Deserializer::from_reader(read); let t = T::deserialize(&mut de)?; Ok(t) } impl<'r, 'de, R: Reader<'de>> Deserializer<'de, 'r, R> { pub fn from_reader(read: &'r mut R) -> Self { Deserializer { read, phantom: PhantomData } } } impl<'r, 'de, 'a, R: Reader<'de>> serde::de::Deserializer<'de> for &'a mut Deserializer<'de, 'r, R> { type Error = Error; fn deserialize_any(self, _visitor: V) -> Result where V: Visitor<'de> { // Won't support this here -- use value::de::Deserializer for this Err(Error::CannotDeserializeAny) } fn deserialize_bool(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_bool(self.read.next_boolean()?) } fn deserialize_i8(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_i8(self.read.next_i8()?) } fn deserialize_i16(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_i16(self.read.next_i16()?) } fn deserialize_i32(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_i32(self.read.next_i32()?) } fn deserialize_i64(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_i64(self.read.next_i64()?) } fn deserialize_u8(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_u8(self.read.next_u8()?) } fn deserialize_u16(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_u16(self.read.next_u16()?) } fn deserialize_u32(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_u32(self.read.next_u32()?) } fn deserialize_u64(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_u64(self.read.next_u64()?) } fn deserialize_f32(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_f32(self.read.next_f32()?) } fn deserialize_f64(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_f64(self.read.next_f64()?) } fn deserialize_char(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_char(self.read.next_char()?) } fn deserialize_str(self, visitor: V) -> Result where V: Visitor<'de> { match self.read.next_str()? { Cow::Borrowed(s) => visitor.visit_borrowed_str(s), Cow::Owned(s) => visitor.visit_str(&s), } } fn deserialize_string(self, visitor: V) -> Result where V: Visitor<'de> { self.deserialize_str(visitor) } fn deserialize_bytes(self, visitor: V) -> Result where V: Visitor<'de> { match self.read.next_bytestring()? { Cow::Borrowed(bs) => visitor.visit_borrowed_bytes(bs), Cow::Owned(bs) => visitor.visit_bytes(&bs), } } fn deserialize_byte_buf(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_byte_buf(self.read.next_bytestring()?.into_owned()) } fn deserialize_option(self, visitor: V) -> Result where V: Visitor<'de> { let is_some = self.read.open_option()?; let result = if is_some { self.read.ensure_more_expected()?; visitor.visit_some(&mut *self)? } else { visitor.visit_none::()? }; self.read.ensure_complete()?; Ok(result) } fn deserialize_unit(self, visitor: V) -> Result where V: Visitor<'de> { self.read.open_simple_record("tuple", Some(0))?; let result = visitor.visit_unit::()?; self.read.ensure_complete()?; Ok(result) } fn deserialize_unit_struct(self, name: &'static str, visitor: V) -> Result where V: Visitor<'de> { self.read.open_simple_record(name, Some(0))?; let result = visitor.visit_unit::()?; self.read.ensure_complete()?; Ok(result) } fn deserialize_newtype_struct(self, name: &'static str, visitor: V) -> Result where V: Visitor<'de> { match super::value::magic::transmit_input_value( name, || Ok(self.read.demand_next(false)?))? { Some(v) => visitor.visit_u64(v), None => { self.read.open_simple_record(name, Some(1))?; self.read.ensure_more_expected()?; let result = visitor.visit_newtype_struct(&mut *self)?; self.read.ensure_complete()?; Ok(result) } } } fn deserialize_seq(self, visitor: V) -> Result where V: Visitor<'de> { // Hack around serde's model: Deserialize *sets* as sequences, // too, and reconstruct them as Rust Sets on the visitor side. self.read.open_sequence_or_set()?; visitor.visit_seq(Seq::new(self)) } fn deserialize_tuple(self, len: usize, visitor: V) -> Result where V: Visitor<'de> { self.read.open_simple_record("tuple", Some(len))?; let mut seq = Seq::new(self); let result = visitor.visit_seq(&mut seq)?; seq.skip_remainder()?; Ok(result) } fn deserialize_tuple_struct(self, name: &'static str, len: usize, visitor: V) -> Result where V: Visitor<'de> { self.read.open_simple_record(name, Some(len))?; let mut seq = Seq::new(self); let result = visitor.visit_seq(&mut seq)?; seq.skip_remainder()?; Ok(result) } fn deserialize_map(self, visitor: V) -> Result where V: Visitor<'de> { self.read.open_dictionary()?; let mut seq = Seq::new(self); let result = visitor.visit_map(&mut seq)?; Ok(result) } fn deserialize_struct(self, name: &'static str, fields: &'static [&'static str], visitor: V) -> Result where V: Visitor<'de> { self.read.open_simple_record(name, Some(fields.len()))?; let mut seq = Seq::new(self); let result = visitor.visit_seq(&mut seq)?; seq.skip_remainder()?; Ok(result) } fn deserialize_enum(self, _name: &'static str, _variants: &'static [&'static str], visitor: V) -> Result where V: Visitor<'de> { visitor.visit_enum(self) } fn deserialize_identifier(self, visitor: V) -> Result where V: Visitor<'de> { match self.read.next_symbol()? { Cow::Borrowed(s) => visitor.visit_borrowed_str(s), Cow::Owned(s) => visitor.visit_str(&s), } } fn deserialize_ignored_any(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_none() } } pub struct Seq<'de, 'r, 'a, R: Reader<'de>> { de: &'a mut Deserializer<'de, 'r, R>, } impl<'de, 'r, 'a, R: Reader<'de>> Seq<'de, 'r, 'a, R> { fn new(de: &'a mut Deserializer<'de, 'r, R>) -> Self { Seq { de } } fn skip_remainder(&mut self) -> Result<()> { self.de.read.skip_remainder() } fn next_item(&mut self, seed: T) -> Result> where T: DeserializeSeed<'de> { match self.de.read.close_compound()? { true => Ok(None), false => Ok(Some(seed.deserialize(&mut *self.de)?)), } } } impl<'de, 'r, 'a, R: Reader<'de>> SeqAccess<'de> for Seq<'de, 'r, 'a, R> { type Error = Error; fn next_element_seed(&mut self, seed: T) -> Result> where T: DeserializeSeed<'de> { self.next_item(seed) } } impl<'de, 'r, 'a, R: Reader<'de>> MapAccess<'de> for Seq<'de, 'r, 'a, R> { type Error = Error; fn next_key_seed(&mut self, seed: K) -> Result> where K: DeserializeSeed<'de> { self.next_item(seed) } fn next_value_seed(&mut self, seed: V) -> Result where V: DeserializeSeed<'de> { match self.next_item(seed)? { Some(item) => Ok(item), None => Err(Error::MissingItem), } } } impl<'de, 'r, 'a, R: Reader<'de>> EnumAccess<'de> for &'a mut Deserializer<'de, 'r, R> { type Error = Error; type Variant = Seq<'de, 'r, 'a, R>; fn variant_seed(self, seed: V) -> Result<(V::Value, Self::Variant)> where V: DeserializeSeed<'de> { self.read.open_record(None)?; let variant = seed.deserialize(&mut *self)?; Ok((variant, Seq::new(self))) } } impl<'de, 'r, 'a, R: Reader<'de>> VariantAccess<'de> for Seq<'de, 'r, 'a, R> { type Error = Error; fn unit_variant(mut self) -> Result<()> { self.skip_remainder() } fn newtype_variant_seed(mut self, seed: T) -> Result where T: DeserializeSeed<'de> { match self.next_item(seed)? { None => Err(Error::MissingItem), Some(v) => { self.skip_remainder()?; Ok(v) } } } fn tuple_variant(mut self, _len: usize, visitor: V) -> Result where V: Visitor<'de> { let result = visitor.visit_seq(&mut self)?; self.skip_remainder()?; Ok(result) } fn struct_variant(mut self, _fields: &'static [&'static str], visitor: V) -> Result where V: Visitor<'de> { let result = visitor.visit_seq(&mut self)?; self.skip_remainder()?; Ok(result) } }