2018-04-12 22:58:24 -07:00
|
|
|
use serde::de::value::{MapAccessDeserializer, SeqAccessDeserializer};
|
2018-05-05 00:56:12 -07:00
|
|
|
use serde::de::{
|
|
|
|
self, Deserialize, DeserializeSeed, EnumAccess, IntoDeserializer, MapAccess, SeqAccess,
|
|
|
|
VariantAccess, Visitor,
|
|
|
|
};
|
2015-08-27 20:01:09 -07:00
|
|
|
|
2016-06-28 21:47:54 -07:00
|
|
|
use error::Error;
|
|
|
|
use token::Token;
|
2015-08-27 20:01:09 -07:00
|
|
|
|
2017-04-13 11:04:16 -07:00
|
|
|
#[derive(Debug)]
|
2017-04-05 00:22:00 -07:00
|
|
|
pub struct Deserializer<'de> {
|
|
|
|
tokens: &'de [Token],
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
2017-04-19 11:38:57 -07:00
|
|
|
macro_rules! assert_next_token {
|
|
|
|
($de:expr, $expected:expr) => {
|
|
|
|
match $de.next_token_opt() {
|
|
|
|
Some(token) if token == $expected => {}
|
2018-04-12 22:58:24 -07:00
|
|
|
Some(other) => panic!(
|
|
|
|
"expected Token::{} but deserialization wants Token::{}",
|
|
|
|
other, $expected
|
|
|
|
),
|
|
|
|
None => panic!(
|
|
|
|
"end of tokens but deserialization wants Token::{}",
|
|
|
|
$expected
|
|
|
|
),
|
2017-04-19 11:38:57 -07:00
|
|
|
}
|
2018-04-12 22:58:24 -07:00
|
|
|
};
|
2017-04-19 11:38:57 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! unexpected {
|
|
|
|
($token:expr) => {
|
|
|
|
panic!("deserialization did not expect this token: {}", $token)
|
2018-04-12 22:58:24 -07:00
|
|
|
};
|
2017-04-19 11:38:57 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! end_of_tokens {
|
|
|
|
() => {
|
|
|
|
panic!("ran out of tokens to deserialize")
|
2018-04-12 22:58:24 -07:00
|
|
|
};
|
2017-04-19 11:38:57 -07:00
|
|
|
}
|
|
|
|
|
2017-04-05 00:22:00 -07:00
|
|
|
impl<'de> Deserializer<'de> {
|
|
|
|
pub fn new(tokens: &'de [Token]) -> Self {
|
2017-11-03 16:12:43 +01:00
|
|
|
Deserializer { tokens: tokens }
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
2017-04-19 11:38:57 -07:00
|
|
|
fn peek_token_opt(&self) -> Option<Token> {
|
|
|
|
self.tokens.first().cloned()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn peek_token(&self) -> Token {
|
|
|
|
match self.peek_token_opt() {
|
|
|
|
Some(token) => token,
|
|
|
|
None => end_of_tokens!(),
|
2017-04-05 00:22:00 -07:00
|
|
|
}
|
2016-06-28 21:47:54 -07:00
|
|
|
}
|
|
|
|
|
2017-04-19 11:38:57 -07:00
|
|
|
pub fn next_token_opt(&mut self) -> Option<Token> {
|
|
|
|
match self.tokens.split_first() {
|
|
|
|
Some((&first, rest)) => {
|
|
|
|
self.tokens = rest;
|
|
|
|
Some(first)
|
|
|
|
}
|
|
|
|
None => None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn next_token(&mut self) -> Token {
|
|
|
|
match self.tokens.split_first() {
|
|
|
|
Some((&first, rest)) => {
|
|
|
|
self.tokens = rest;
|
|
|
|
first
|
2017-01-09 00:32:50 -08:00
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
None => end_of_tokens!(),
|
2017-01-09 00:32:50 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-19 10:41:58 -07:00
|
|
|
pub fn remaining(&self) -> usize {
|
|
|
|
self.tokens.len()
|
|
|
|
}
|
|
|
|
|
2017-04-13 12:28:23 -07:00
|
|
|
fn visit_seq<V>(
|
|
|
|
&mut self,
|
|
|
|
len: Option<usize>,
|
|
|
|
end: Token,
|
|
|
|
visitor: V,
|
|
|
|
) -> Result<V::Value, Error>
|
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2019-08-16 11:25:12 -07:00
|
|
|
let value = visitor.visit_seq(DeserializerSeqVisitor {
|
2017-12-23 20:13:08 -08:00
|
|
|
de: self,
|
|
|
|
len: len,
|
|
|
|
end: end,
|
2019-08-16 11:25:12 -07:00
|
|
|
})?;
|
2017-04-19 11:38:57 -07:00
|
|
|
assert_next_token!(self, end);
|
2017-01-09 00:32:50 -08:00
|
|
|
Ok(value)
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
2017-04-13 12:28:23 -07:00
|
|
|
fn visit_map<V>(
|
|
|
|
&mut self,
|
|
|
|
len: Option<usize>,
|
|
|
|
end: Token,
|
|
|
|
visitor: V,
|
|
|
|
) -> Result<V::Value, Error>
|
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2019-08-16 11:25:12 -07:00
|
|
|
let value = visitor.visit_map(DeserializerMapVisitor {
|
2017-12-23 20:13:08 -08:00
|
|
|
de: self,
|
|
|
|
len: len,
|
|
|
|
end: end,
|
2019-08-16 11:25:12 -07:00
|
|
|
})?;
|
2017-04-19 11:38:57 -07:00
|
|
|
assert_next_token!(self, end);
|
2017-01-09 00:32:50 -08:00
|
|
|
Ok(value)
|
2016-02-12 22:05:02 -08:00
|
|
|
}
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
2017-04-05 00:22:00 -07:00
|
|
|
impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
|
2015-08-27 20:01:09 -07:00
|
|
|
type Error = Error;
|
|
|
|
|
2017-04-14 12:50:35 -07:00
|
|
|
forward_to_deserialize_any! {
|
2018-05-19 16:31:32 -07:00
|
|
|
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
|
|
|
|
bytes byte_buf unit seq map identifier ignored_any
|
2016-07-21 10:11:04 +02:00
|
|
|
}
|
2016-07-20 10:26:31 +02:00
|
|
|
|
2017-04-14 12:50:35 -07:00
|
|
|
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
let token = self.next_token();
|
2017-04-05 09:48:23 -07:00
|
|
|
match token {
|
|
|
|
Token::Bool(v) => visitor.visit_bool(v),
|
|
|
|
Token::I8(v) => visitor.visit_i8(v),
|
|
|
|
Token::I16(v) => visitor.visit_i16(v),
|
|
|
|
Token::I32(v) => visitor.visit_i32(v),
|
|
|
|
Token::I64(v) => visitor.visit_i64(v),
|
|
|
|
Token::U8(v) => visitor.visit_u8(v),
|
|
|
|
Token::U16(v) => visitor.visit_u16(v),
|
|
|
|
Token::U32(v) => visitor.visit_u32(v),
|
|
|
|
Token::U64(v) => visitor.visit_u64(v),
|
|
|
|
Token::F32(v) => visitor.visit_f32(v),
|
|
|
|
Token::F64(v) => visitor.visit_f64(v),
|
|
|
|
Token::Char(v) => visitor.visit_char(v),
|
|
|
|
Token::Str(v) => visitor.visit_str(v),
|
|
|
|
Token::BorrowedStr(v) => visitor.visit_borrowed_str(v),
|
|
|
|
Token::String(v) => visitor.visit_string(v.to_owned()),
|
|
|
|
Token::Bytes(v) => visitor.visit_bytes(v),
|
|
|
|
Token::BorrowedBytes(v) => visitor.visit_borrowed_bytes(v),
|
|
|
|
Token::ByteBuf(v) => visitor.visit_byte_buf(v.to_vec()),
|
2017-04-05 10:30:46 -07:00
|
|
|
Token::None => visitor.visit_none(),
|
|
|
|
Token::Some => visitor.visit_some(self),
|
2017-11-06 22:27:38 -08:00
|
|
|
Token::Unit | Token::UnitStruct { .. } => visitor.visit_unit(),
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::NewtypeStruct { .. } => visitor.visit_newtype_struct(self),
|
2017-04-19 12:20:17 -07:00
|
|
|
Token::Seq { len } => self.visit_seq(len, Token::SeqEnd, visitor),
|
|
|
|
Token::Tuple { len } => self.visit_seq(Some(len), Token::TupleEnd, visitor),
|
2017-12-23 20:13:08 -08:00
|
|
|
Token::TupleStruct { len, .. } => {
|
|
|
|
self.visit_seq(Some(len), Token::TupleStructEnd, visitor)
|
|
|
|
}
|
2017-04-19 12:20:17 -07:00
|
|
|
Token::Map { len } => self.visit_map(len, Token::MapEnd, visitor),
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::Struct { len, .. } => self.visit_map(Some(len), Token::StructEnd, visitor),
|
|
|
|
Token::Enum { .. } => {
|
2017-04-19 11:38:57 -07:00
|
|
|
let variant = self.next_token();
|
|
|
|
let next = self.peek_token();
|
2017-04-05 08:54:30 -07:00
|
|
|
match (variant, next) {
|
|
|
|
(Token::Str(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_str(variant)
|
|
|
|
}
|
2020-10-22 11:15:39 +05:00
|
|
|
(Token::BorrowedStr(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_borrowed_str(variant)
|
|
|
|
}
|
|
|
|
(Token::String(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_string(variant.to_string())
|
|
|
|
}
|
2017-04-05 08:54:30 -07:00
|
|
|
(Token::Bytes(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_bytes(variant)
|
|
|
|
}
|
2020-10-22 11:15:39 +05:00
|
|
|
(Token::BorrowedBytes(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_borrowed_bytes(variant)
|
|
|
|
}
|
|
|
|
(Token::ByteBuf(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_byte_buf(variant.to_vec())
|
|
|
|
}
|
|
|
|
(Token::U8(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_u8(variant)
|
|
|
|
}
|
|
|
|
(Token::U16(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_u16(variant)
|
|
|
|
}
|
2017-04-05 08:54:30 -07:00
|
|
|
(Token::U32(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_u32(variant)
|
|
|
|
}
|
2020-10-22 11:15:39 +05:00
|
|
|
(Token::U64(variant), Token::Unit) => {
|
|
|
|
self.next_token();
|
|
|
|
visitor.visit_u64(variant)
|
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
(variant, Token::Unit) => unexpected!(variant),
|
2017-04-05 08:54:30 -07:00
|
|
|
(variant, _) => {
|
2017-04-05 09:42:24 -07:00
|
|
|
visitor.visit_map(EnumMapVisitor::new(self, variant, EnumFormat::Any))
|
2017-04-05 08:54:30 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::UnitVariant { variant, .. } => visitor.visit_str(variant),
|
2017-12-23 20:13:08 -08:00
|
|
|
Token::NewtypeVariant { variant, .. } => visitor.visit_map(EnumMapVisitor::new(
|
|
|
|
self,
|
|
|
|
Token::Str(variant),
|
|
|
|
EnumFormat::Any,
|
|
|
|
)),
|
|
|
|
Token::TupleVariant { variant, .. } => visitor.visit_map(EnumMapVisitor::new(
|
|
|
|
self,
|
|
|
|
Token::Str(variant),
|
|
|
|
EnumFormat::Seq,
|
|
|
|
)),
|
|
|
|
Token::StructVariant { variant, .. } => visitor.visit_map(EnumMapVisitor::new(
|
|
|
|
self,
|
|
|
|
Token::Str(variant),
|
|
|
|
EnumFormat::Map,
|
|
|
|
)),
|
|
|
|
Token::SeqEnd
|
|
|
|
| Token::TupleEnd
|
|
|
|
| Token::TupleStructEnd
|
|
|
|
| Token::MapEnd
|
|
|
|
| Token::StructEnd
|
|
|
|
| Token::TupleVariantEnd
|
|
|
|
| Token::StructVariantEnd => {
|
2017-04-19 11:38:57 -07:00
|
|
|
unexpected!(token);
|
2017-04-13 12:28:23 -07:00
|
|
|
}
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-14 13:22:10 -08:00
|
|
|
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.peek_token() {
|
2017-12-23 20:13:08 -08:00
|
|
|
Token::Unit | Token::None => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2015-08-27 20:01:09 -07:00
|
|
|
visitor.visit_none()
|
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
Token::Some => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2015-08-27 20:01:09 -07:00
|
|
|
visitor.visit_some(self)
|
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => self.deserialize_any(visitor),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-13 12:28:23 -07:00
|
|
|
fn deserialize_enum<V>(
|
|
|
|
self,
|
2017-04-19 11:38:57 -07:00
|
|
|
name: &'static str,
|
2017-04-13 12:28:23 -07:00
|
|
|
_variants: &'static [&'static str],
|
|
|
|
visitor: V,
|
|
|
|
) -> Result<V::Value, Error>
|
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.peek_token() {
|
2017-04-19 12:20:17 -07:00
|
|
|
Token::Enum { name: n } if name == n => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2015-08-27 20:01:09 -07:00
|
|
|
|
2017-02-12 21:59:04 -08:00
|
|
|
visitor.visit_enum(DeserializerEnumVisitor { de: self })
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-12-23 20:13:08 -08:00
|
|
|
Token::UnitVariant { name: n, .. }
|
|
|
|
| Token::NewtypeVariant { name: n, .. }
|
|
|
|
| Token::TupleVariant { name: n, .. }
|
2018-07-08 19:02:44 -07:00
|
|
|
| Token::StructVariant { name: n, .. }
|
|
|
|
if name == n =>
|
2017-12-23 20:13:08 -08:00
|
|
|
{
|
2017-02-12 21:59:04 -08:00
|
|
|
visitor.visit_enum(DeserializerEnumVisitor { de: self })
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2021-01-23 13:39:12 -08:00
|
|
|
_ => self.deserialize_any(visitor),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-19 11:38:57 -07:00
|
|
|
fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.peek_token() {
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::UnitStruct { .. } => {
|
2017-04-19 12:20:17 -07:00
|
|
|
assert_next_token!(self, Token::UnitStruct { name: name });
|
2017-04-19 11:38:57 -07:00
|
|
|
visitor.visit_unit()
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => self.deserialize_any(visitor),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-23 20:13:08 -08:00
|
|
|
fn deserialize_newtype_struct<V>(
|
|
|
|
self,
|
|
|
|
name: &'static str,
|
|
|
|
visitor: V,
|
|
|
|
) -> Result<V::Value, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.peek_token() {
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::NewtypeStruct { .. } => {
|
2017-04-19 12:20:17 -07:00
|
|
|
assert_next_token!(self, Token::NewtypeStruct { name: name });
|
2017-04-19 11:38:57 -07:00
|
|
|
visitor.visit_newtype_struct(self)
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => self.deserialize_any(visitor),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-12 21:59:04 -08:00
|
|
|
fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2016-02-23 05:15:44 -08:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.peek_token() {
|
2017-12-23 20:13:08 -08:00
|
|
|
Token::Unit | Token::UnitStruct { .. } => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2016-02-23 05:15:44 -08:00
|
|
|
visitor.visit_unit()
|
|
|
|
}
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::Seq { .. } => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2017-04-05 09:42:24 -07:00
|
|
|
self.visit_seq(Some(len), Token::SeqEnd, visitor)
|
2016-02-23 05:15:44 -08:00
|
|
|
}
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::Tuple { .. } => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2017-04-05 09:42:24 -07:00
|
|
|
self.visit_seq(Some(len), Token::TupleEnd, visitor)
|
2016-02-23 05:15:44 -08:00
|
|
|
}
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::TupleStruct { .. } => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2017-04-13 12:28:23 -07:00
|
|
|
self.visit_seq(Some(len), Token::TupleStructEnd, visitor)
|
2016-02-23 05:15:44 -08:00
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => self.deserialize_any(visitor),
|
2016-02-23 05:15:44 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-13 12:28:23 -07:00
|
|
|
fn deserialize_tuple_struct<V>(
|
|
|
|
self,
|
2017-04-19 11:38:57 -07:00
|
|
|
name: &'static str,
|
2017-04-13 12:28:23 -07:00
|
|
|
len: usize,
|
|
|
|
visitor: V,
|
|
|
|
) -> Result<V::Value, Error>
|
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.peek_token() {
|
|
|
|
Token::Unit => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2016-02-23 05:15:44 -08:00
|
|
|
visitor.visit_unit()
|
|
|
|
}
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::UnitStruct { .. } => {
|
2017-04-19 12:20:17 -07:00
|
|
|
assert_next_token!(self, Token::UnitStruct { name: name });
|
2017-04-19 11:38:57 -07:00
|
|
|
visitor.visit_unit()
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::Seq { .. } => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2017-04-05 09:42:24 -07:00
|
|
|
self.visit_seq(Some(len), Token::SeqEnd, visitor)
|
2016-02-23 05:15:44 -08:00
|
|
|
}
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::Tuple { .. } => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2017-04-05 09:42:24 -07:00
|
|
|
self.visit_seq(Some(len), Token::TupleEnd, visitor)
|
2016-02-23 05:15:44 -08:00
|
|
|
}
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::TupleStruct { len: n, .. } => {
|
2017-04-19 12:20:17 -07:00
|
|
|
assert_next_token!(self, Token::TupleStruct { name: name, len: n });
|
2017-04-19 11:38:57 -07:00
|
|
|
self.visit_seq(Some(len), Token::TupleStructEnd, visitor)
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => self.deserialize_any(visitor),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-13 12:28:23 -07:00
|
|
|
fn deserialize_struct<V>(
|
|
|
|
self,
|
2017-04-19 11:38:57 -07:00
|
|
|
name: &'static str,
|
2017-04-13 12:28:23 -07:00
|
|
|
fields: &'static [&'static str],
|
|
|
|
visitor: V,
|
|
|
|
) -> Result<V::Value, Error>
|
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.peek_token() {
|
2017-11-29 22:07:29 -08:00
|
|
|
Token::Struct { len: n, .. } => {
|
|
|
|
assert_next_token!(self, Token::Struct { name: name, len: n });
|
2017-04-19 11:38:57 -07:00
|
|
|
self.visit_map(Some(fields.len()), Token::StructEnd, visitor)
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::Map { .. } => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.next_token();
|
2017-04-05 09:42:24 -07:00
|
|
|
self.visit_map(Some(fields.len()), Token::MapEnd, visitor)
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => self.deserialize_any(visitor),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
2017-09-07 15:56:22 +02:00
|
|
|
|
|
|
|
fn is_human_readable(&self) -> bool {
|
2017-11-03 16:12:43 +01:00
|
|
|
panic!(
|
2017-11-06 22:46:24 -08:00
|
|
|
"Types which have different human-readable and compact representations \
|
2017-11-03 16:12:43 +01:00
|
|
|
must explicitly mark their test cases with `serde_test::Configure`"
|
|
|
|
);
|
2017-09-07 15:56:22 +02:00
|
|
|
}
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2017-04-05 00:22:00 -07:00
|
|
|
struct DeserializerSeqVisitor<'a, 'de: 'a> {
|
|
|
|
de: &'a mut Deserializer<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
len: Option<usize>,
|
2017-04-05 00:17:50 -07:00
|
|
|
end: Token,
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
impl<'de, 'a> SeqAccess<'de> for DeserializerSeqVisitor<'a, 'de> {
|
2015-08-27 20:01:09 -07:00
|
|
|
type Error = Error;
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
T: DeserializeSeed<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
if self.de.peek_token_opt() == Some(self.end) {
|
2017-02-02 12:10:07 -08:00
|
|
|
return Ok(None);
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-04-05 09:42:24 -07:00
|
|
|
self.len = self.len.map(|len| len.saturating_sub(1));
|
|
|
|
seed.deserialize(&mut *self.de).map(Some)
|
2016-02-12 22:05:02 -08:00
|
|
|
}
|
|
|
|
|
2017-04-14 13:27:42 -07:00
|
|
|
fn size_hint(&self) -> Option<usize> {
|
|
|
|
self.len
|
2016-02-12 22:05:02 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2017-04-05 00:22:00 -07:00
|
|
|
struct DeserializerMapVisitor<'a, 'de: 'a> {
|
|
|
|
de: &'a mut Deserializer<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
len: Option<usize>,
|
2017-04-05 00:17:50 -07:00
|
|
|
end: Token,
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
impl<'de, 'a> MapAccess<'de> for DeserializerMapVisitor<'a, 'de> {
|
2015-08-27 20:01:09 -07:00
|
|
|
type Error = Error;
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
K: DeserializeSeed<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
if self.de.peek_token_opt() == Some(self.end) {
|
2017-02-02 12:10:07 -08:00
|
|
|
return Ok(None);
|
|
|
|
}
|
2017-04-05 09:42:24 -07:00
|
|
|
self.len = self.len.map(|len| len.saturating_sub(1));
|
|
|
|
seed.deserialize(&mut *self.de).map(Some)
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: DeserializeSeed<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-01-19 01:24:33 -08:00
|
|
|
seed.deserialize(&mut *self.de)
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
2017-04-14 13:27:42 -07:00
|
|
|
fn size_hint(&self) -> Option<usize> {
|
|
|
|
self.len
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2017-04-05 00:22:00 -07:00
|
|
|
struct DeserializerEnumVisitor<'a, 'de: 'a> {
|
|
|
|
de: &'a mut Deserializer<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
impl<'de, 'a> EnumAccess<'de> for DeserializerEnumVisitor<'a, 'de> {
|
2015-08-27 20:01:09 -07:00
|
|
|
type Error = Error;
|
2017-01-14 13:22:10 -08:00
|
|
|
type Variant = Self;
|
2015-08-27 20:01:09 -07:00
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self), Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: DeserializeSeed<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.de.peek_token() {
|
2017-12-23 20:13:08 -08:00
|
|
|
Token::UnitVariant { variant: v, .. }
|
|
|
|
| Token::NewtypeVariant { variant: v, .. }
|
|
|
|
| Token::TupleVariant { variant: v, .. }
|
|
|
|
| Token::StructVariant { variant: v, .. } => {
|
2017-01-14 13:22:10 -08:00
|
|
|
let de = v.into_deserializer();
|
2019-08-16 11:25:12 -07:00
|
|
|
let value = seed.deserialize(de)?;
|
2017-01-14 13:22:10 -08:00
|
|
|
Ok((value, self))
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => {
|
2019-08-16 11:25:12 -07:00
|
|
|
let value = seed.deserialize(&mut *self.de)?;
|
2017-01-14 13:22:10 -08:00
|
|
|
Ok((value, self))
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-01-14 13:22:10 -08:00
|
|
|
}
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
impl<'de, 'a> VariantAccess<'de> for DeserializerEnumVisitor<'a, 'de> {
|
2017-01-14 13:22:10 -08:00
|
|
|
type Error = Error;
|
2015-08-27 20:01:09 -07:00
|
|
|
|
2017-04-15 12:35:04 -07:00
|
|
|
fn unit_variant(self) -> Result<(), Error> {
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.de.peek_token() {
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::UnitVariant { .. } => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.de.next_token();
|
2015-08-27 20:01:09 -07:00
|
|
|
Ok(())
|
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => Deserialize::deserialize(self.de),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-15 12:35:04 -07:00
|
|
|
fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
T: DeserializeSeed<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.de.peek_token() {
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::NewtypeVariant { .. } => {
|
2017-04-05 00:22:00 -07:00
|
|
|
self.de.next_token();
|
2017-01-19 01:24:33 -08:00
|
|
|
seed.deserialize(self.de)
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => seed.deserialize(self.de),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-15 12:35:04 -07:00
|
|
|
fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.de.peek_token() {
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::TupleVariant { len: enum_len, .. } => {
|
2017-04-19 11:38:57 -07:00
|
|
|
let token = self.de.next_token();
|
2015-08-27 20:01:09 -07:00
|
|
|
|
2016-02-12 22:05:02 -08:00
|
|
|
if len == enum_len {
|
2017-04-13 12:28:23 -07:00
|
|
|
self.de
|
|
|
|
.visit_seq(Some(len), Token::TupleVariantEnd, visitor)
|
2016-02-12 22:05:02 -08:00
|
|
|
} else {
|
2017-04-19 11:38:57 -07:00
|
|
|
unexpected!(token);
|
2016-02-12 22:05:02 -08:00
|
|
|
}
|
|
|
|
}
|
2017-12-23 20:13:08 -08:00
|
|
|
Token::Seq {
|
|
|
|
len: Some(enum_len),
|
|
|
|
} => {
|
2017-04-19 11:38:57 -07:00
|
|
|
let token = self.de.next_token();
|
2016-02-12 22:05:02 -08:00
|
|
|
|
2015-08-27 20:01:09 -07:00
|
|
|
if len == enum_len {
|
2017-04-05 09:42:24 -07:00
|
|
|
self.de.visit_seq(Some(len), Token::SeqEnd, visitor)
|
2015-08-27 20:01:09 -07:00
|
|
|
} else {
|
2017-04-19 11:38:57 -07:00
|
|
|
unexpected!(token);
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => de::Deserializer::deserialize_any(self.de, visitor),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-23 20:13:08 -08:00
|
|
|
fn struct_variant<V>(
|
|
|
|
self,
|
|
|
|
fields: &'static [&'static str],
|
|
|
|
visitor: V,
|
|
|
|
) -> Result<V::Value, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: Visitor<'de>,
|
2015-08-27 20:01:09 -07:00
|
|
|
{
|
2017-04-19 11:38:57 -07:00
|
|
|
match self.de.peek_token() {
|
2017-11-06 22:24:23 -08:00
|
|
|
Token::StructVariant { len: enum_len, .. } => {
|
2017-04-19 11:38:57 -07:00
|
|
|
let token = self.de.next_token();
|
2015-08-27 20:01:09 -07:00
|
|
|
|
2016-02-12 22:05:02 -08:00
|
|
|
if fields.len() == enum_len {
|
2017-04-13 12:28:23 -07:00
|
|
|
self.de
|
|
|
|
.visit_map(Some(fields.len()), Token::StructVariantEnd, visitor)
|
2016-02-12 22:05:02 -08:00
|
|
|
} else {
|
2017-04-19 11:38:57 -07:00
|
|
|
unexpected!(token);
|
2016-02-12 22:05:02 -08:00
|
|
|
}
|
|
|
|
}
|
2017-12-23 20:13:08 -08:00
|
|
|
Token::Map {
|
|
|
|
len: Some(enum_len),
|
|
|
|
} => {
|
2017-04-19 11:38:57 -07:00
|
|
|
let token = self.de.next_token();
|
2016-02-12 22:05:02 -08:00
|
|
|
|
2015-08-27 20:01:09 -07:00
|
|
|
if fields.len() == enum_len {
|
2017-04-13 12:28:23 -07:00
|
|
|
self.de
|
|
|
|
.visit_map(Some(fields.len()), Token::MapEnd, visitor)
|
2015-08-27 20:01:09 -07:00
|
|
|
} else {
|
2017-04-19 11:38:57 -07:00
|
|
|
unexpected!(token);
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
2017-04-19 11:38:57 -07:00
|
|
|
_ => de::Deserializer::deserialize_any(self.de, visitor),
|
2015-08-27 20:01:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-02-24 13:47:04 -08:00
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2017-04-05 00:22:00 -07:00
|
|
|
struct EnumMapVisitor<'a, 'de: 'a> {
|
|
|
|
de: &'a mut Deserializer<'de>,
|
2017-04-05 08:54:30 -07:00
|
|
|
variant: Option<Token>,
|
2017-04-05 09:42:24 -07:00
|
|
|
format: EnumFormat,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum EnumFormat {
|
|
|
|
Seq,
|
|
|
|
Map,
|
|
|
|
Any,
|
2017-02-24 13:47:04 -08:00
|
|
|
}
|
|
|
|
|
2017-04-05 00:22:00 -07:00
|
|
|
impl<'a, 'de> EnumMapVisitor<'a, 'de> {
|
2017-04-05 09:42:24 -07:00
|
|
|
fn new(de: &'a mut Deserializer<'de>, variant: Token, format: EnumFormat) -> Self {
|
2017-02-24 13:47:04 -08:00
|
|
|
EnumMapVisitor {
|
|
|
|
de: de,
|
|
|
|
variant: Some(variant),
|
2017-04-05 09:42:24 -07:00
|
|
|
format: format,
|
2017-02-24 13:47:04 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
impl<'de, 'a> MapAccess<'de> for EnumMapVisitor<'a, 'de> {
|
2017-02-24 13:47:04 -08:00
|
|
|
type Error = Error;
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
K: DeserializeSeed<'de>,
|
2017-02-24 13:47:04 -08:00
|
|
|
{
|
|
|
|
match self.variant.take() {
|
2017-04-13 12:28:23 -07:00
|
|
|
Some(Token::Str(variant)) => seed.deserialize(variant.into_deserializer()).map(Some),
|
2018-05-19 17:33:30 -07:00
|
|
|
Some(Token::Bytes(variant)) => seed
|
|
|
|
.deserialize(BytesDeserializer { value: variant })
|
2017-12-23 20:13:08 -08:00
|
|
|
.map(Some),
|
2017-04-13 12:28:23 -07:00
|
|
|
Some(Token::U32(variant)) => seed.deserialize(variant.into_deserializer()).map(Some),
|
2017-04-19 11:38:57 -07:00
|
|
|
Some(other) => unexpected!(other),
|
2017-02-24 13:47:04 -08:00
|
|
|
None => Ok(None),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-14 11:58:29 -07:00
|
|
|
fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: DeserializeSeed<'de>,
|
2017-02-24 13:47:04 -08:00
|
|
|
{
|
2017-04-05 09:42:24 -07:00
|
|
|
match self.format {
|
|
|
|
EnumFormat::Seq => {
|
2017-02-24 13:47:04 -08:00
|
|
|
let value = {
|
|
|
|
let visitor = DeserializerSeqVisitor {
|
|
|
|
de: self.de,
|
|
|
|
len: None,
|
2017-04-05 10:30:46 -07:00
|
|
|
end: Token::TupleVariantEnd,
|
2017-02-24 13:47:04 -08:00
|
|
|
};
|
2019-08-16 11:25:12 -07:00
|
|
|
seed.deserialize(SeqAccessDeserializer::new(visitor))?
|
2017-02-24 13:47:04 -08:00
|
|
|
};
|
2017-04-19 11:38:57 -07:00
|
|
|
assert_next_token!(self.de, Token::TupleVariantEnd);
|
2017-02-24 13:47:04 -08:00
|
|
|
Ok(value)
|
|
|
|
}
|
2017-04-05 09:42:24 -07:00
|
|
|
EnumFormat::Map => {
|
2017-02-24 13:47:04 -08:00
|
|
|
let value = {
|
|
|
|
let visitor = DeserializerMapVisitor {
|
|
|
|
de: self.de,
|
|
|
|
len: None,
|
2017-04-05 10:30:46 -07:00
|
|
|
end: Token::StructVariantEnd,
|
2017-02-24 13:47:04 -08:00
|
|
|
};
|
2019-08-16 11:25:12 -07:00
|
|
|
seed.deserialize(MapAccessDeserializer::new(visitor))?
|
2017-02-24 13:47:04 -08:00
|
|
|
};
|
2017-04-19 11:38:57 -07:00
|
|
|
assert_next_token!(self.de, Token::StructVariantEnd);
|
2017-02-24 13:47:04 -08:00
|
|
|
Ok(value)
|
|
|
|
}
|
2017-04-05 09:42:24 -07:00
|
|
|
EnumFormat::Any => seed.deserialize(&mut *self.de),
|
2017-02-24 13:47:04 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-04-05 08:54:30 -07:00
|
|
|
|
|
|
|
struct BytesDeserializer {
|
|
|
|
value: &'static [u8],
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'de> de::Deserializer<'de> for BytesDeserializer {
|
|
|
|
type Error = Error;
|
|
|
|
|
2017-04-14 12:50:35 -07:00
|
|
|
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
2017-04-13 12:28:23 -07:00
|
|
|
where
|
|
|
|
V: de::Visitor<'de>,
|
2017-04-05 08:54:30 -07:00
|
|
|
{
|
|
|
|
visitor.visit_bytes(self.value)
|
|
|
|
}
|
|
|
|
|
2017-04-14 12:50:35 -07:00
|
|
|
forward_to_deserialize_any! {
|
2018-05-19 16:31:32 -07:00
|
|
|
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
|
|
|
|
bytes byte_buf option unit unit_struct newtype_struct seq tuple
|
|
|
|
tuple_struct map struct enum identifier ignored_any
|
2017-04-05 08:54:30 -07:00
|
|
|
}
|
|
|
|
}
|