// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. use std::collections::{HashMap, HashSet, BTreeMap, BTreeSet}; use std::collections::hash_map::Hasher; use std::hash::Hash; use std::iter::FromIterator; use std::num::{self, FromPrimitive}; use std::option; use std::rc::Rc; use std::string; use std::sync::Arc; #[derive(Clone, PartialEq, Debug)] pub enum Token { Null, Bool(bool), Isize(isize), I8(i8), I16(i16), I32(i32), I64(i64), Usize(usize), U8(u8), U16(u16), U32(u32), U64(u64), F32(f32), F64(f64), Char(char), Str(&'static str), String(String), Option(bool), TupleStart(usize), StructStart(&'static str, usize), EnumStart(&'static str, &'static str, usize), SeqStart(usize), MapStart(usize), End, } impl Token { pub fn to_kind(&self) -> TokenKind { match *self { Token::Null => TokenKind::NullKind, Token::Bool(_) => TokenKind::BoolKind, Token::Isize(_) => TokenKind::IsizeKind, Token::I8(_) => TokenKind::I8Kind, Token::I16(_) => TokenKind::I16Kind, Token::I32(_) => TokenKind::I32Kind, Token::I64(_) => TokenKind::I64Kind, Token::Usize(_) => TokenKind::UsizeKind, Token::U8(_) => TokenKind::U8Kind, Token::U16(_) => TokenKind::U16Kind, Token::U32(_) => TokenKind::U32Kind, Token::U64(_) => TokenKind::U64Kind, Token::F32(_) => TokenKind::F32Kind, Token::F64(_) => TokenKind::F64Kind, Token::Char(_) => TokenKind::CharKind, Token::Str(_) => TokenKind::StrKind, Token::String(_) => TokenKind::StringKind, Token::Option(_) => TokenKind::OptionKind, Token::TupleStart(_) => TokenKind::TupleStartKind, Token::StructStart(_, _) => TokenKind::StructStartKind, Token::EnumStart(_, _, _) => TokenKind::EnumStartKind, Token::SeqStart(_) => TokenKind::SeqStartKind, Token::MapStart(_) => TokenKind::MapStartKind, Token::End => TokenKind::EndKind, } } } #[derive(Copy, Clone, PartialEq, Eq)] pub enum TokenKind { NullKind, BoolKind, IsizeKind, I8Kind, I16Kind, I32Kind, I64Kind, UsizeKind, U8Kind, U16Kind, U32Kind, U64Kind, F32Kind, F64Kind, CharKind, StrKind, StringKind, OptionKind, TupleStartKind, StructStartKind, EnumStartKind, SeqStartKind, MapStartKind, EndKind, } static PRIMITIVE_TOKEN_KINDS: &'static [TokenKind] = &[ TokenKind::IsizeKind, TokenKind::I8Kind, TokenKind::I16Kind, TokenKind::I32Kind, TokenKind::I64Kind, TokenKind::UsizeKind, TokenKind::U8Kind, TokenKind::U16Kind, TokenKind::U32Kind, TokenKind::U64Kind, TokenKind::F32Kind, TokenKind::F64Kind, ]; static STR_TOKEN_KINDS: &'static [TokenKind] = &[ TokenKind::StrKind, TokenKind::StringKind, ]; static COMPOUND_TOKEN_KINDS: &'static [TokenKind] = &[ TokenKind::OptionKind, TokenKind::EnumStartKind, TokenKind::StructStartKind, TokenKind::TupleStartKind, TokenKind::SeqStartKind, TokenKind::MapStartKind, ]; impl ::std::fmt::Debug for TokenKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match *self { TokenKind::NullKind => "Null".fmt(f), TokenKind::BoolKind => "Bool".fmt(f), TokenKind::IsizeKind => "Isize".fmt(f), TokenKind::I8Kind => "I8".fmt(f), TokenKind::I16Kind => "I16".fmt(f), TokenKind::I32Kind => "I32".fmt(f), TokenKind::I64Kind => "I64".fmt(f), TokenKind::UsizeKind => "Usize".fmt(f), TokenKind::U8Kind => "U8".fmt(f), TokenKind::U16Kind => "U16".fmt(f), TokenKind::U32Kind => "U32".fmt(f), TokenKind::U64Kind => "U64".fmt(f), TokenKind::F32Kind => "F32".fmt(f), TokenKind::F64Kind => "F64".fmt(f), TokenKind::CharKind => "Char".fmt(f), TokenKind::StrKind => "Str".fmt(f), TokenKind::StringKind => "String".fmt(f), TokenKind::OptionKind => "Option".fmt(f), TokenKind::TupleStartKind => "TupleStart".fmt(f), TokenKind::StructStartKind => "StructStart".fmt(f), TokenKind::EnumStartKind => "EnumStart".fmt(f), TokenKind::SeqStartKind => "SeqStart".fmt(f), TokenKind::MapStartKind => "MapStart".fmt(f), TokenKind::EndKind => "Token::End".fmt(f), } } } macro_rules! to_result { ($expr:expr, $err:expr) => { match $expr { Some(value) => Ok(value), None => Err($err), } } } pub trait Deserializer: Iterator> + Sized { /// Called when a `Deserialize` expected more tokens, but the /// `Deserializer` was empty. fn end_of_stream_error(&mut self) -> E; /// Called when a `Deserializer` was unable to properly parse the stream. fn syntax_error(&mut self, token: Token, expected: &'static [TokenKind]) -> E; /// Called when a named structure or enum got a name that it didn't expect. fn unexpected_name_error(&mut self, token: Token) -> E; /// Called when a value was unable to be coerced into another value. fn conversion_error(&mut self, token: Token) -> E; /// Called when a `Deserialize` structure did not deserialize a field /// named `field`. fn missing_field< T: Deserialize >(&mut self, field: &'static str) -> Result; /* /// Called when a `Deserialize` has decided to not consume this token. fn ignore_field(&mut self, _token: Token) -> Result<(), E> { let _: IgnoreTokens = try!(Deserialize::deserialize(self)); Ok(()) } */ #[inline] fn expect_token(&mut self) -> Result { self.next().unwrap_or_else(|| Err(self.end_of_stream_error())) } #[inline] fn expect_null(&mut self, token: Token) -> Result<(), E> { match token { Token::Null => Ok(()), Token::TupleStart(_) | Token::SeqStart(_) => { match try!(self.expect_token()) { Token::End => Ok(()), token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::EndKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::NullKind, TokenKind::TupleStartKind, TokenKind::SeqStartKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_bool(&mut self, token: Token) -> Result { match token { Token::Bool(value) => Ok(value), token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::BoolKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_num(&mut self, token: Token) -> Result { match token { Token::Isize(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::I8(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::I16(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::I32(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::I64(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::Usize(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::U8(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::U16(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::U32(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::U64(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::F32(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), Token::F64(x) => to_result!(num::cast(x), self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), token => Err(self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), } } #[inline] fn expect_from_primitive(&mut self, token: Token) -> Result { match token { Token::Isize(x) => to_result!(num::from_int(x), self.conversion_error(token)), Token::I8(x) => to_result!(num::from_i8(x), self.conversion_error(token)), Token::I16(x) => to_result!(num::from_i16(x), self.conversion_error(token)), Token::I32(x) => to_result!(num::from_i32(x), self.conversion_error(token)), Token::I64(x) => to_result!(num::from_i64(x), self.conversion_error(token)), Token::Usize(x) => to_result!(num::from_uint(x), self.conversion_error(token)), Token::U8(x) => to_result!(num::from_u8(x), self.conversion_error(token)), Token::U16(x) => to_result!(num::from_u16(x), self.conversion_error(token)), Token::U32(x) => to_result!(num::from_u32(x), self.conversion_error(token)), Token::U64(x) => to_result!(num::from_u64(x), self.conversion_error(token)), Token::F32(x) => to_result!(num::from_f32(x), self.conversion_error(token)), Token::F64(x) => to_result!(num::from_f64(x), self.conversion_error(token)), token => Err(self.syntax_error(token, PRIMITIVE_TOKEN_KINDS)), } } #[inline] fn expect_char(&mut self, token: Token) -> Result { match token { Token::Char(value) => Ok(value), Token::Str(value) if value.chars().count() == 1 => { Ok(value.char_at(0)) } Token::String(ref value) if value[].chars().count() == 1 => { Ok(value[].char_at(0)) } token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::CharKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_str(&mut self, token: Token) -> Result<&'static str, E> { match token { Token::Str(value) => Ok(value), token => Err(self.syntax_error(token, STR_TOKEN_KINDS)), } } #[inline] fn expect_string(&mut self, token: Token) -> Result { match token { Token::Char(value) => Ok(value.to_string()), Token::Str(value) => Ok(value.to_string()), Token::String(value) => Ok(value), token => Err(self.syntax_error(token, STR_TOKEN_KINDS)), } } #[inline] fn expect_option< T: Deserialize >(&mut self, token: Token) -> Result, E> { match token { Token::Option(false) => Ok(None), Token::Option(true) => { let value: T = try!(Deserialize::deserialize(self)); Ok(Some(value)) } token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::OptionKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_tuple_start(&mut self, token: Token) -> Result { match token { Token::TupleStart(len) => Ok(len), Token::SeqStart(len) => Ok(len), token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::TupleStartKind, TokenKind::SeqStartKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_tuple_elt< T: Deserialize >(&mut self) -> Result { Deserialize::deserialize(self) } #[inline] fn expect_tuple_end(&mut self) -> Result<(), E> { match try!(self.expect_token()) { Token::End => Ok(()), token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::EndKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_struct_start(&mut self, token: Token, name: &str) -> Result<(), E> { match token { Token::StructStart(n, _) => { if name == n { Ok(()) } else { Err(self.unexpected_name_error(token)) } } _ => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::StructStartKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_struct_field_or_end(&mut self, fields: &'static [&'static str] ) -> Result>, E> { match try!(self.expect_token()) { Token::End => { Ok(None) } Token::Str(n) => { Ok(Some(fields.iter().position(|field| *field == n))) } Token::String(n) => { Ok(Some(fields.iter().position(|field| *field == &n[]))) } token => { Err(self.syntax_error(token, STR_TOKEN_KINDS)) } } } #[inline] fn expect_struct_value< T: Deserialize >(&mut self) -> Result { Deserialize::deserialize(self) } #[inline] fn expect_struct_end(&mut self) -> Result<(), E> { match try!(self.expect_token()) { Token::End => Ok(()), token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::EndKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_enum_start(&mut self, token: Token, name: &str, variants: &[&str]) -> Result { match token { Token::EnumStart(n, v, _) => { if name == n { match variants.iter().position(|variant| *variant == v) { Some(position) => Ok(position), None => Err(self.unexpected_name_error(token)), } } else { Err(self.unexpected_name_error(token)) } } token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::EnumStartKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_enum_elt< T: Deserialize >(&mut self) -> Result { Deserialize::deserialize(self) } #[inline] fn expect_enum_end(&mut self) -> Result<(), E> { match try!(self.expect_token()) { Token::End => Ok(()), token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::EndKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_seq_start(&mut self, token: Token) -> Result { match token { Token::TupleStart(len) => Ok(len), Token::SeqStart(len) => Ok(len), token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::TupleStartKind, TokenKind::SeqStartKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_seq_elt_or_end< T: Deserialize >(&mut self) -> Result, E> { match try!(self.expect_token()) { Token::End => Ok(None), token => { let value = try!(Deserialize::deserialize_token(self, token)); Ok(Some(value)) } } } #[inline] fn expect_seq< T: Deserialize, C: FromIterator >(&mut self, token: Token) -> Result { let len = try!(self.expect_seq_start(token)); let mut err = None; let collection: C = { let d = SeqDeserializer { d: self, len: len, err: &mut err, }; d.collect() }; match err { Some(err) => Err(err), None => Ok(collection), } } #[inline] fn expect_map_start(&mut self, token: Token) -> Result { match token { Token::MapStart(len) => Ok(len), _ => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::MapStartKind, ]; Err(self.syntax_error(token, EXPECTED_TOKENS)) } } } #[inline] fn expect_map_elt_or_end< K: Deserialize, V: Deserialize >(&mut self) -> Result, E> { match try!(self.expect_token()) { Token::End => Ok(None), token => { let key = try!(Deserialize::deserialize_token(self, token)); let value = try!(Deserialize::deserialize(self)); Ok(Some((key, value))) } } } #[inline] fn expect_map< K: Deserialize, V: Deserialize, C: FromIterator<(K, V)> >(&mut self, token: Token) -> Result { let len = try!(self.expect_map_start(token)); let mut err = None; let collection: C = { let d = MapDeserializer { d: self, len: len, err: &mut err, }; d.collect() }; match err { Some(err) => Err(err), None => Ok(collection), } } } ////////////////////////////////////////////////////////////////////////////// struct SeqDeserializer<'a, D: 'a, E: 'a, T> { d: &'a mut D, len: usize, err: &'a mut Option, } impl< 'a, D: Deserializer, E, T: Deserialize > Iterator for SeqDeserializer<'a, D, E, T> { type Item = T; #[inline] fn next(&mut self) -> option::Option { match self.d.expect_seq_elt_or_end() { Ok(next) => { self.len -= 1; next } Err(err) => { *self.err = Some(err); None } } } #[inline] fn size_hint(&self) -> (usize, option::Option) { (self.len, Some(self.len)) } } ////////////////////////////////////////////////////////////////////////////// struct MapDeserializer<'a, D:'a, E: 'a, K, V> { d: &'a mut D, len: usize, err: &'a mut option::Option, } impl< 'a, D: Deserializer, E, K: Deserialize, V: Deserialize > Iterator for MapDeserializer<'a, D, E, K, V> { type Item = (K, V); #[inline] fn next(&mut self) -> option::Option<(K, V)> { match self.d.expect_map_elt_or_end() { Ok(next) => next, Err(err) => { *self.err = Some(err); None } } } #[inline] fn size_hint(&self) -> (usize, option::Option) { (self.len, Some(self.len)) } } ////////////////////////////////////////////////////////////////////////////// pub trait Deserialize, E>: Sized { #[inline] fn deserialize(d: &mut D) -> Result { let token = try!(d.expect_token()); Deserialize::deserialize_token(d, token) } fn deserialize_token(d: &mut D, token: Token) -> Result; } ////////////////////////////////////////////////////////////////////////////// macro_rules! impl_deserialize { ($ty:ty, $method:ident) => { impl, E> Deserialize for $ty { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result<$ty, E> { d.$method(token) } } } } impl_deserialize!(bool, expect_bool); impl_deserialize!(isize, expect_num); impl_deserialize!(i8, expect_num); impl_deserialize!(i16, expect_num); impl_deserialize!(i32, expect_num); impl_deserialize!(i64, expect_num); impl_deserialize!(usize, expect_num); impl_deserialize!(u8, expect_num); impl_deserialize!(u16, expect_num); impl_deserialize!(u32, expect_num); impl_deserialize!(u64, expect_num); impl_deserialize!(f32, expect_num); impl_deserialize!(f64, expect_num); impl_deserialize!(char, expect_char); impl_deserialize!(&'static str, expect_str); impl_deserialize!(string::String, expect_string); ////////////////////////////////////////////////////////////////////////////// impl< D: Deserializer, E, T: Deserialize > Deserialize for Box { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result, E> { Ok(Box::new(try!(Deserialize::deserialize_token(d, token)))) } } impl< D: Deserializer, E, T: Deserialize > Deserialize for Rc { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result, E> { Ok(Rc::new(try!(Deserialize::deserialize_token(d, token)))) } } impl< D: Deserializer, E, T: Deserialize + Send + Sync > Deserialize for Arc { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result, E> { Ok(Arc::new(try!(Deserialize::deserialize_token(d, token)))) } } ////////////////////////////////////////////////////////////////////////////// impl< D: Deserializer, E, T: Deserialize > Deserialize for option::Option { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_option(token) } } ////////////////////////////////////////////////////////////////////////////// impl< D: Deserializer, E, T: Deserialize > Deserialize for Vec { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_seq(token) } } ////////////////////////////////////////////////////////////////////////////// impl< D: Deserializer, E, K: Deserialize + Eq + Hash, V: Deserialize > Deserialize for HashMap { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_map(token) } } impl< D: Deserializer, E, K: Deserialize + Ord, V: Deserialize > Deserialize for BTreeMap { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_map(token) } } ////////////////////////////////////////////////////////////////////////////// impl< D: Deserializer, E, T: Deserialize + Eq + Hash > Deserialize for HashSet { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_seq(token) } } impl< D: Deserializer, E, T: Deserialize + Ord > Deserialize for BTreeSet { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_seq(token) } } ////////////////////////////////////////////////////////////////////////////// macro_rules! peel { ($name:ident, $($other:ident,)*) => ( impl_deserialize_tuple!($($other,)*); ) } macro_rules! impl_deserialize_tuple { () => { impl< D: Deserializer, E > Deserialize for () { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result<(), E> { d.expect_null(token) } } }; ( $($name:ident,)+ ) => { impl< D: Deserializer, E, $($name: Deserialize),* > Deserialize for ($($name,)*) { #[inline] #[allow(non_snake_case)] fn deserialize_token(d: &mut D, token: Token) -> Result<($($name,)*), E> { try!(d.expect_tuple_start(token)); let result = ($({ let $name = try!(d.expect_tuple_elt()); $name },)*); try!(d.expect_tuple_end()); Ok(result) } } peel!($($name,)*); } } impl_deserialize_tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, } ////////////////////////////////////////////////////////////////////////////// /// Helper struct that will ignore tokens while taking in consideration /// recursive structures. #[derive(Copy)] pub struct IgnoreTokens; impl, E> Deserialize for IgnoreTokens { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result { match token { Token::Option(true) => { Deserialize::deserialize(d) } Token::EnumStart(_, _, _) => { loop { match try!(d.expect_token()) { Token::End => { return Ok(IgnoreTokens); } token => { let _: IgnoreTokens = try!(Deserialize::deserialize_token(d, token)); } } } } Token::StructStart(_, _) => { loop { match try!(d.expect_token()) { Token::End => { return Ok(IgnoreTokens); } Token::Str(_) | Token::String(_) => { let _: IgnoreTokens = try!(Deserialize::deserialize(d)); } _token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::EndKind, TokenKind::StrKind, TokenKind::StringKind, ]; return Err(d.syntax_error(token, EXPECTED_TOKENS)); } } } } Token::TupleStart(_) => { loop { match try!(d.expect_token()) { Token::End => { return Ok(IgnoreTokens); } token => { let _: IgnoreTokens = try!(Deserialize::deserialize_token(d, token)); } } } } Token::SeqStart(_) => { loop { match try!(d.expect_token()) { Token::End => { return Ok(IgnoreTokens); } token => { let _: IgnoreTokens = try!(Deserialize::deserialize_token(d, token)); } } } } Token::MapStart(_) => { loop { match try!(d.expect_token()) { Token::End => { return Ok(IgnoreTokens); } token => { let _: IgnoreTokens = try!(Deserialize::deserialize_token(d, token)); let _: IgnoreTokens = try!(Deserialize::deserialize(d)); } } } } Token::End => { Err(d.syntax_error(token, COMPOUND_TOKEN_KINDS)) } _ => Ok(IgnoreTokens), } } } ////////////////////////////////////////////////////////////////////////////// /// Helper struct that will gather tokens while taking in consideration /// recursive structures. pub struct GatherTokens { tokens: Vec, } impl GatherTokens { #[inline] pub fn unwrap(self) -> Vec { self.tokens } #[inline] fn gather, E>(&mut self, d: &mut D) -> Result<(), E> { let token = try!(d.expect_token()); self.gather_token(d, token) } #[inline] fn gather_token, E>(&mut self, d: &mut D, token: Token) -> Result<(), E> { match token { token @ Token::Option(true) => { self.tokens.push(token); self.gather(d) } Token::EnumStart(name, variant, len) => { self.tokens.reserve(len + 1); self.tokens.push(Token::EnumStart(name, variant, len)); self.gather_seq(d) } Token::StructStart(name, len) => { self.tokens.reserve(len + 1); self.tokens.push(Token::StructStart(name, len)); self.gather_struct(d) } Token::TupleStart(len) => { self.tokens.reserve(len + 1); self.tokens.push(Token::TupleStart(len)); self.gather_seq(d) } Token::SeqStart(len) => { self.tokens.reserve(len + 1); self.tokens.push(Token::SeqStart(len)); self.gather_seq(d) } Token::MapStart(len) => { self.tokens.reserve(len + 1); self.tokens.push(Token::MapStart(len)); self.gather_map(d) } Token::End => { Err(d.syntax_error(token, COMPOUND_TOKEN_KINDS)) } token => { self.tokens.push(token); Ok(()) } } } #[inline] fn gather_seq, E>(&mut self, d: &mut D) -> Result<(), E> { loop { match try!(d.expect_token()) { token @ Token::End => { self.tokens.push(token); return Ok(()); } token => { try!(self.gather_token(d, token)); } } } } #[inline] fn gather_struct, E>(&mut self, d: &mut D) -> Result<(), E> { loop { match try!(d.expect_token()) { token @ Token::End => { self.tokens.push(token); return Ok(()); } token @ Token::Str(_) | token @ Token::String(_) => { self.tokens.push(token); try!(self.gather(d)) } token => { static EXPECTED_TOKENS: &'static [TokenKind] = &[ TokenKind::EndKind, TokenKind::StrKind, TokenKind::StringKind, ]; return Err(d.syntax_error(token, EXPECTED_TOKENS)); } } } } #[inline] fn gather_map, E>(&mut self, d: &mut D) -> Result<(), E> { loop { match try!(d.expect_token()) { Token::End => { self.tokens.push(Token::End); return Ok(()); } token => { try!(self.gather_token(d, token)); try!(self.gather(d)) } } } } } impl, E> Deserialize for GatherTokens { #[inline] fn deserialize_token(d: &mut D, token: Token) -> Result { let mut tokens = GatherTokens { tokens: vec!(), }; try!(tokens.gather_token(d, token)); Ok(tokens) } }