use crate::value::{Value, NestedValue, Map, Domain}; use crate::value::value::{Float, Double}; use num::traits::cast::ToPrimitive; use serde::Deserialize; use serde::de::{Visitor, SeqAccess, MapAccess, EnumAccess, VariantAccess, DeserializeSeed}; use std::convert::TryFrom; use std::iter::Iterator; use std::marker::PhantomData; pub mod error { use num::bigint::BigInt; use crate::value::{PlainValue, Domain}; #[derive(Debug)] pub enum Error { Message(String), InvalidUnicodeScalar(u32), NumberTooLarge(BigInt), CannotDeserializeAny, Expected(ExpectedKind, PlainValue), } #[derive(Debug)] pub enum ExpectedKind { Boolean, Float, Double, SignedInteger, String, ByteString, Symbol, Record(Option), SimpleRecord(&'static str, Option), Option, Sequence, Dictionary, } impl serde::ser::Error for Error { fn custom(msg: T) -> Self { Self::Message(msg.to_string()) } } impl serde::de::Error for Error { fn custom(msg: T) -> Self { Self::Message(msg.to_string()) } } impl std::error::Error for Error {} impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{:?}", self) } } } pub use error::Error; use error::ExpectedKind; pub type Result = std::result::Result>; pub struct Deserializer<'de, N: NestedValue, D: Domain> { input: &'de N, phantom: PhantomData, } pub fn from_value<'a, T, N: NestedValue, D: 'a + Domain>(v: &'a N) -> Result where T: Deserialize<'a> { let mut de = Deserializer::from_value(v); let t = T::deserialize(&mut de)?; Ok(t) } impl<'de, N: NestedValue, D: 'de + Domain> Deserializer<'de, N, D> { pub fn from_value(v: &'de N) -> Self { Deserializer{ input: v, phantom: PhantomData } } fn check<'a, T, F>(&'a mut self, f: F, k: ExpectedKind) -> Result where F: FnOnce(&'de Value) -> Option { f(self.input.value()).ok_or_else(|| Error::Expected(k, self.input.copy_via())) } } impl<'de, 'a, N: NestedValue, D: 'de + Domain> serde::de::Deserializer<'de> for &'a mut Deserializer<'de, N, D> { type Error = Error; fn deserialize_any(self, visitor: V) -> Result where V: Visitor<'de> { let v = self.input.value(); match v { Value::Boolean(b) => visitor.visit_bool(*b), Value::Float(Float(f)) => visitor.visit_f32(*f), Value::Double(Double(d)) => visitor.visit_f64(*d), Value::SignedInteger(ref i) => match i.to_i64() { None => match i.to_u64() { None => Err(Error::NumberTooLarge(i.clone())), Some(n) => visitor.visit_u64(n), } Some(n) => visitor.visit_i64(n), } Value::String(ref s) => visitor.visit_str(&s), Value::ByteString(_) => self.deserialize_bytes(visitor), Value::Record(_) => if v.is_simple_record("tuple", Some(0)) { self.deserialize_unit(visitor) } else if v.is_simple_record("UnicodeScalar", Some(1)) { self.deserialize_char(visitor) } else if v.is_simple_record("None", Some(0)) || v.is_simple_record("Some", Some(1)) { self.deserialize_option(visitor) } else if v.is_simple_record("tuple", None) { visitor.visit_seq(VecSeq::new(self, v.as_simple_record("tuple", None).unwrap())) } else { Err(Error::CannotDeserializeAny) } Value::Sequence(ref v) => visitor.visit_seq(VecSeq::new(self, v)), Value::Dictionary(ref d) => visitor.visit_map(DictMap::new(self, d)), _ => Err(Error::CannotDeserializeAny), } } fn deserialize_bool(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_bool(self.check(|v| v.as_boolean(), ExpectedKind::Boolean)?) } fn deserialize_i8(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_i8(i.to_i8().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } fn deserialize_i16(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_i16(i.to_i16().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } fn deserialize_i32(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_i32(i.to_i32().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } fn deserialize_i64(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_i64(i.to_i64().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } fn deserialize_u8(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_u8(i.to_u8().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } fn deserialize_u16(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_u16(i.to_u16().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } fn deserialize_u32(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_u32(i.to_u32().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } fn deserialize_u64(self, visitor: V) -> Result where V: Visitor<'de> { let i = self.check(|v| v.as_signedinteger(), ExpectedKind::SignedInteger)?; visitor.visit_u64(i.to_u64().ok_or_else(|| Error::NumberTooLarge(i.clone()))?) } fn deserialize_f32(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_f32(self.check(|v| v.as_float(), ExpectedKind::Float)?) } fn deserialize_f64(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_f64(self.check(|v| v.as_double(), ExpectedKind::Double)?) } fn deserialize_char(self, visitor: V) -> Result where V: Visitor<'de> { let fs = self.check(|v| v.as_simple_record("UnicodeScalar", Some(1)), ExpectedKind::SimpleRecord("UnicodeScalar", Some(1)))?; let c = fs[0].value().as_u32() .ok_or_else(|| Error::Expected(ExpectedKind::SignedInteger, self.input.copy_via()))?; visitor.visit_char(char::try_from(c).or(Err(Error::InvalidUnicodeScalar(c)))?) } fn deserialize_str(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_borrowed_str(&self.check(|v| v.as_string(), ExpectedKind::String)?) } 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> { visitor.visit_borrowed_bytes(&self.check(|v| v.as_bytestring(), ExpectedKind::ByteString)?) } fn deserialize_byte_buf(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_byte_buf(self.check(|v| v.as_bytestring(), ExpectedKind::ByteString)?.clone()) } fn deserialize_option(self, visitor: V) -> Result where V: Visitor<'de> { match self.input.value().as_simple_record("None", Some(0)) { Some(_fs) => visitor.visit_none(), None => match self.input.value().as_simple_record("Some", Some(1)) { Some(fs) => { self.input = &fs[0]; visitor.visit_some(self) } None => Err(Error::Expected(ExpectedKind::Option, self.input.copy_via())) } } } fn deserialize_unit(self, visitor: V) -> Result where V: Visitor<'de> { if self.input.value().is_simple_record("tuple", Some(0)) { visitor.visit_unit() } else { Err(Error::Expected(ExpectedKind::SimpleRecord("tuple", Some(0)), self.input.copy_via())) } } fn deserialize_unit_struct(self, name: &'static str, visitor: V) -> Result where V: Visitor<'de> { if self.input.value().is_simple_record(name, Some(0)) { visitor.visit_unit() } else { Err(Error::Expected(ExpectedKind::SimpleRecord(name, Some(0)), self.input.copy_via())) } } fn deserialize_newtype_struct(self, name: &'static str, visitor: V) -> Result where V: Visitor<'de> { if name == crate::value::value::MAGIC_VALUE { let v: Box> = Box::new(self.input.clone().value_owned()); visitor.visit_u64(Box::into_raw(v) as u64) } else if name == crate::value::value::MAGIC_NESTEDVALUE { let v: Box = Box::new(self.input.clone()); visitor.visit_u64(Box::into_raw(v) as u64) } else { let fs = self.check(|v| v.as_simple_record(name, Some(1)), ExpectedKind::SimpleRecord(name, Some(1)))?; self.input = &fs[0]; visitor.visit_newtype_struct(self) } } fn deserialize_seq(self, visitor: V) -> Result where V: Visitor<'de> { let vs = self.check(|v| v.as_sequence(), ExpectedKind::Sequence)?; visitor.visit_seq(VecSeq::new(self, vs)) } fn deserialize_tuple(self, len: usize, visitor: V) -> Result where V: Visitor<'de> { let fs = self.check(|v| v.as_simple_record("tuple", Some(len)), ExpectedKind::SimpleRecord("tuple", Some(len)))?; visitor.visit_seq(VecSeq::new(self, fs)) } fn deserialize_tuple_struct(self, name: &'static str, len: usize, visitor: V) -> Result where V: Visitor<'de> { let fs = self.check(|v| v.as_simple_record(name, Some(len)), ExpectedKind::SimpleRecord(name, Some(len)))?; visitor.visit_seq(VecSeq::new(self, fs)) } fn deserialize_map(self, visitor: V) -> Result where V: Visitor<'de> { let d = self.check(|v| v.as_dictionary(), ExpectedKind::Dictionary)?; visitor.visit_map(DictMap::new(self, d)) } fn deserialize_struct(self, name: &'static str, fields: &'static [&'static str], visitor: V) -> Result where V: Visitor<'de> { let fs = self.check(|v| v.as_simple_record(name, Some(fields.len())), ExpectedKind::SimpleRecord(name, Some(fields.len())))?; visitor.visit_seq(VecSeq::new(self, fs)) } 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> { visitor.visit_borrowed_str(&self.check(|v| v.as_symbol(), ExpectedKind::Symbol)?) } fn deserialize_ignored_any(self, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_none() } } pub struct VecSeq<'a, 'de: 'a, N: NestedValue, D: Domain> { index: usize, vec: &'de [N], de: &'a mut Deserializer<'de, N, D>, } impl<'de, 'a, N: NestedValue, D: Domain> VecSeq<'a, 'de, N, D> { fn new(de: &'a mut Deserializer<'de, N, D>, vec: &'de [N]) -> Self { VecSeq{ index: 0, vec, de } } } impl<'de, 'a, N: NestedValue, D: 'de + Domain> SeqAccess<'de> for VecSeq<'a, 'de, N, D> { type Error = Error; fn next_element_seed(&mut self, seed: T) -> Result, D> where T: DeserializeSeed<'de> { if self.index == self.vec.len() { return Ok(None) } self.de.input = &self.vec[self.index]; self.index += 1; let value = seed.deserialize(&mut *self.de)?; Ok(Some(value)) } } pub struct DictMap<'a, 'de: 'a, N: NestedValue, D: Domain> { pending: Option<&'de N>, iter: Box + 'a>, de: &'a mut Deserializer<'de, N, D>, } impl<'de, 'a, N: NestedValue, D: Domain> DictMap<'a, 'de, N, D> { fn new(de: &'a mut Deserializer<'de, N, D>, d: &'de Map) -> Self { DictMap{ pending: None, iter: Box::new(d.iter()), de } } } impl<'de, 'a, N: NestedValue, D: 'de + Domain> MapAccess<'de> for DictMap<'a, 'de, N, D> { type Error = Error; fn next_key_seed(&mut self, seed: K) -> Result, D> where K: DeserializeSeed<'de> { match self.iter.next() { None => Ok(None), Some((k, v)) => { self.pending = Some(v); self.de.input = k; Ok(Some(seed.deserialize(&mut *self.de)?)) } } } fn next_value_seed(&mut self, seed: V) -> Result where V: DeserializeSeed<'de> { let v = self.pending.unwrap(); self.pending = None; self.de.input = v; Ok(seed.deserialize(&mut *self.de)?) } } impl<'a, 'de, N: NestedValue, D: 'de + Domain> EnumAccess<'de> for &'a mut Deserializer<'de, N, D> { type Error = Error; type Variant = Self; fn variant_seed(self, seed: V) -> Result<(V::Value, Self::Variant), D> where V: DeserializeSeed<'de> { let (lp, _) = self.check(|v| v.as_record(None), ExpectedKind::Record(None))?; let v = self.input; self.input = N::boxunwrap(lp); let variant = seed.deserialize(&mut *self)?; self.input = v; Ok((variant, self)) } } impl<'a, 'de, N: NestedValue, D: 'de + Domain> VariantAccess<'de> for &'a mut Deserializer<'de, N, D> { type Error = Error; fn unit_variant(self) -> Result<(), D> { Ok(()) } fn newtype_variant_seed(self, seed: T) -> Result where T: DeserializeSeed<'de> { let (_, fs) = self.check(|v| v.as_record(Some(1)), ExpectedKind::Record(Some(1)))?; self.input = &fs[0]; seed.deserialize(&mut *self) } fn tuple_variant(self, _len: usize, visitor: V) -> Result where V: Visitor<'de> { visitor.visit_seq(VecSeq::new(self, &self.input.value().as_record(None).unwrap().1)) } fn struct_variant(self, fields: &'static [&'static str], visitor: V) -> Result where V: Visitor<'de> { visitor.visit_seq(VecSeq::new(self, &self.input.value().as_record(Some(fields.len())).unwrap().1)) } }