serde/src/de.rs

1146 lines
31 KiB
Rust
Raw Normal View History

2014-06-08 14:52:40 -07:00
// 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
2014-05-16 07:15:02 -07:00
2014-06-23 20:44:24 -04:00
use std::collections::{HashMap, TreeMap};
2014-05-16 07:15:02 -07:00
use std::hash::Hash;
2014-05-19 09:48:58 -07:00
use std::num;
2014-05-16 07:15:02 -07:00
2014-05-31 12:28:30 -07:00
#[deriving(Clone, PartialEq, Show)]
2014-05-16 07:15:02 -07:00
pub enum Token {
2014-05-16 21:21:05 -07:00
Null,
Bool(bool),
2014-05-16 07:15:02 -07:00
Int(int),
I8(i8),
I16(i16),
I32(i32),
I64(i64),
Uint(uint),
U8(u8),
U16(u16),
U32(u32),
U64(u64),
F32(f32),
2014-05-16 21:21:05 -07:00
F64(f64),
Char(char),
Str(&'static str),
String(String),
Option(bool),
TupleStart(uint),
2014-05-28 10:46:29 -07:00
StructStart(&'static str, uint),
EnumStart(&'static str, &'static str, uint),
SeqStart(uint),
MapStart(uint),
End,
2014-05-16 07:15:02 -07:00
}
macro_rules! to_result {
($expr:expr, $err:expr) => {
match $expr {
Some(value) => Ok(value),
2014-05-30 23:28:46 -07:00
None => $err,
}
}
}
2014-05-16 07:15:02 -07:00
pub trait Deserializer<E>: Iterator<Result<Token, E>> {
2014-05-30 23:28:46 -07:00
fn end_of_stream_error<T>(&self) -> Result<T, E>;
2014-05-16 07:15:02 -07:00
fn syntax_error<T>(&self, token: Token) -> Result<T, E>;
fn missing_field_error<T>(&self, field: &'static str) -> Result<T, E>;
2014-05-16 07:15:02 -07:00
2014-05-27 07:21:37 -07:00
#[inline]
fn expect_token(&mut self) -> Result<Token, E> {
match self.next() {
Some(Ok(token)) => Ok(token),
Some(Err(err)) => Err(err),
2014-05-30 23:28:46 -07:00
None => self.end_of_stream_error(),
2014-05-27 07:21:37 -07:00
}
}
#[inline]
fn expect_null(&mut self, token: Token) -> Result<(), E> {
match token {
Null => Ok(()),
TupleStart(_) => {
2014-05-27 07:21:37 -07:00
match try!(self.expect_token()) {
End => Ok(()),
token => self.syntax_error(token),
}
}
token => self.syntax_error(token),
}
2014-05-16 21:21:05 -07:00
}
#[inline]
2014-05-25 21:59:58 -07:00
fn expect_bool(&mut self, token: Token) -> Result<bool, E> {
match token {
Bool(value) => Ok(value),
token => self.syntax_error(token),
}
2014-05-16 21:21:05 -07:00
}
2014-05-16 07:15:02 -07:00
#[inline]
fn expect_num<T: NumCast>(&mut self, token: Token) -> Result<T, E> {
match token {
Int(x) => to_result!(num::cast(x), self.syntax_error(Int(x))),
I8(x) => to_result!(num::cast(x), self.syntax_error(I8(x))),
I16(x) => to_result!(num::cast(x), self.syntax_error(I16(x))),
I32(x) => to_result!(num::cast(x), self.syntax_error(I32(x))),
I64(x) => to_result!(num::cast(x), self.syntax_error(I64(x))),
Uint(x) => to_result!(num::cast(x), self.syntax_error(Uint(x))),
U8(x) => to_result!(num::cast(x), self.syntax_error(U8(x))),
U16(x) => to_result!(num::cast(x), self.syntax_error(U16(x))),
U32(x) => to_result!(num::cast(x), self.syntax_error(U32(x))),
U64(x) => to_result!(num::cast(x), self.syntax_error(U64(x))),
F32(x) => to_result!(num::cast(x), self.syntax_error(F32(x))),
F64(x) => to_result!(num::cast(x), self.syntax_error(F64(x))),
token => self.syntax_error(token),
}
}
#[inline]
fn expect_from_primitive<T: FromPrimitive>(&mut self, token: Token) -> Result<T, E> {
match token {
Int(x) => to_result!(num::from_int(x), self.syntax_error(Int(x))),
I8(x) => to_result!(num::from_i8(x), self.syntax_error(I8(x))),
I16(x) => to_result!(num::from_i16(x), self.syntax_error(I16(x))),
I32(x) => to_result!(num::from_i32(x), self.syntax_error(I32(x))),
I64(x) => to_result!(num::from_i64(x), self.syntax_error(I64(x))),
Uint(x) => to_result!(num::from_uint(x), self.syntax_error(Uint(x))),
U8(x) => to_result!(num::from_u8(x), self.syntax_error(U8(x))),
U16(x) => to_result!(num::from_u16(x), self.syntax_error(U16(x))),
U32(x) => to_result!(num::from_u32(x), self.syntax_error(U32(x))),
U64(x) => to_result!(num::from_u64(x), self.syntax_error(U64(x))),
F32(x) => to_result!(num::from_f32(x), self.syntax_error(F32(x))),
F64(x) => to_result!(num::from_f64(x), self.syntax_error(F64(x))),
token => self.syntax_error(token),
2014-05-19 09:48:58 -07:00
}
2014-05-16 21:21:05 -07:00
}
2014-05-16 07:15:02 -07:00
#[inline]
2014-05-25 21:59:58 -07:00
fn expect_char(&mut self, token: Token) -> Result<char, E> {
match token {
Char(value) => Ok(value),
token => self.syntax_error(token),
}
}
#[inline]
2014-05-25 21:59:58 -07:00
fn expect_str(&mut self, token: Token) -> Result<&'static str, E> {
match token {
Str(value) => Ok(value),
token => self.syntax_error(token),
}
}
#[inline]
2014-06-03 06:43:01 -07:00
fn expect_string(&mut self, token: Token) -> Result<String, E> {
2014-05-24 14:08:35 -07:00
match token {
2014-05-29 06:44:38 -07:00
Str(value) => Ok(value.to_string()),
String(value) => Ok(value),
token => self.syntax_error(token),
}
2014-05-16 07:15:02 -07:00
}
#[inline]
fn expect_option<
2014-06-22 16:51:50 -04:00
T: Deserializable
2014-05-25 21:59:58 -07:00
>(&mut self, token: Token) -> Result<Option<T>, E> {
match token {
Option(false) => Ok(None),
Option(true) => {
let value: T = try!(Deserializable::deserialize(self));
Ok(Some(value))
}
token => self.syntax_error(token),
}
}
2014-05-16 07:15:02 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn expect_tuple_start(&mut self, token: Token) -> Result<uint, E> {
match token {
2014-06-22 16:51:50 -04:00
TupleStart(len) => Ok(len),
token => self.syntax_error(token),
}
}
#[inline]
fn expect_tuple_elt<
T: Deserializable
>(&mut self) -> Result<T, E> {
Deserializable::deserialize(self)
}
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
#[inline]
fn expect_tuple_end(&mut self) -> Result<(), E> {
match try!(self.expect_token()) {
End => Ok(()),
token => self.syntax_error(token),
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
}
}
#[inline]
2014-05-25 21:59:58 -07:00
fn expect_struct_start(&mut self, token: Token, name: &str) -> Result<(), E> {
match token {
2014-05-28 10:46:29 -07:00
StructStart(n, _) => {
if name == n {
Ok(())
} else {
self.syntax_error(token)
}
}
_ => self.syntax_error(token),
}
}
#[inline]
fn expect_struct_field<
2014-06-22 16:51:50 -04:00
T: Deserializable
>(&mut self, name: &str) -> Result<T, E> {
2014-05-27 07:21:37 -07:00
match try!(self.expect_token()) {
Str(n) => {
if name != n {
return self.syntax_error(Str(n));
}
}
String(n) => {
if name != n.as_slice() {
return self.syntax_error(String(n));
}
}
token => { return self.syntax_error(token); }
}
Deserializable::deserialize(self)
}
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
#[inline]
fn expect_struct_end(&mut self) -> Result<(), E> {
match try!(self.expect_token()) {
End => Ok(()),
token => self.syntax_error(token),
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
}
}
2014-05-21 08:44:48 -07:00
#[inline]
2014-05-28 10:46:29 -07:00
fn expect_enum_start(&mut self, token: Token, name: &str, variants: &[&str]) -> Result<uint, E> {
2014-05-24 14:08:35 -07:00
match token {
2014-05-28 10:46:29 -07:00
EnumStart(n, v, _) => {
2014-05-21 08:44:48 -07:00
if name == n {
2014-05-24 14:11:25 -07:00
match variants.iter().position(|variant| *variant == v) {
Some(position) => Ok(position),
None => self.syntax_error(token),
2014-05-21 08:44:48 -07:00
}
} else {
self.syntax_error(token)
2014-05-21 08:44:48 -07:00
}
}
_ => self.syntax_error(token),
2014-05-21 08:44:48 -07:00
}
}
#[inline]
2014-07-27 20:16:18 -07:00
fn expect_enum_elt<
T: Deserializable
>(&mut self) -> Result<T, E> {
Deserializable::deserialize(self)
}
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
#[inline]
fn expect_enum_end(&mut self) -> Result<(), E> {
match try!(self.expect_token()) {
End => Ok(()),
token => self.syntax_error(token),
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
}
}
2014-06-28 11:34:46 -07:00
#[inline]
fn expect_seq_start(&mut self, token: Token) -> Result<uint, E> {
match token {
TupleStart(len) => Ok(len),
SeqStart(len) => Ok(len),
token => self.syntax_error(token),
2014-06-28 11:34:46 -07:00
}
}
#[inline]
fn expect_seq_elt_or_end<
T: Deserializable
>(&mut self) -> Result<Option<T>, E> {
match try!(self.expect_token()) {
End => Ok(None),
token => {
let value = try!(Deserializable::deserialize_token(self, token));
Ok(Some(value))
}
}
}
#[inline]
2014-06-23 20:44:24 -04:00
fn expect_seq<
'a,
T: Deserializable,
2014-05-16 07:15:02 -07:00
C: FromIterator<T>
2014-06-23 20:44:24 -04:00
>(&'a mut self, token: Token) -> Result<C, E> {
2014-06-28 11:34:46 -07:00
let len = try!(self.expect_seq_start(token));
2014-05-16 07:15:02 -07:00
2014-06-23 20:44:24 -04:00
let mut d: SeqDeserializer<'a, Self, E> = SeqDeserializer {
d: self,
len: len,
err: None,
};
let collection: C = d.collect();
match d.err {
Some(err) => Err(err),
None => Ok(collection),
}
}
2014-05-16 07:15:02 -07:00
2014-06-28 11:34:46 -07:00
#[inline]
fn expect_map_start(&mut self, token: Token) -> Result<uint, E> {
match token {
MapStart(len) => Ok(len),
_ => self.syntax_error(token),
2014-06-28 11:34:46 -07:00
}
}
#[inline]
fn expect_map_elt_or_end<
K: Deserializable,
V: Deserializable
>(&mut self) -> Result<Option<(K, V)>, E> {
match try!(self.expect_token()) {
End => Ok(None),
token => {
let key = try!(Deserializable::deserialize_token(self, token));
let value = try!(Deserializable::deserialize(self));
Ok(Some((key, value)))
}
}
}
#[inline]
2014-06-23 20:44:24 -04:00
fn expect_map<
'a,
K: Deserializable,
V: Deserializable,
C: FromIterator<(K, V)>
>(&'a mut self, token: Token) -> Result<C, E> {
2014-06-28 11:34:46 -07:00
let len = try!(self.expect_map_start(token));
2014-06-23 20:44:24 -04:00
let mut d: MapDeserializer<'a, Self, E> = MapDeserializer {
d: self,
len: len,
err: None,
};
let collection: C = d.collect();
match d.err {
Some(err) => Err(err),
None => Ok(collection),
}
2014-05-16 07:15:02 -07:00
}
2014-06-23 20:44:24 -04:00
}
//////////////////////////////////////////////////////////////////////////////
struct SeqDeserializer<'a, D, E> {
d: &'a mut D,
len: uint,
err: Option<E>,
}
2014-05-16 07:15:02 -07:00
2014-06-23 20:44:24 -04:00
impl<
'a,
T: Deserializable,
D: Deserializer<E>,
E
> Iterator<T> for SeqDeserializer<'a, D, E> {
2014-05-16 07:15:02 -07:00
#[inline]
2014-06-23 20:44:24 -04:00
fn next(&mut self) -> Option<T> {
2014-06-28 11:34:46 -07:00
match self.d.expect_seq_elt_or_end() {
Ok(next) => next,
2014-06-23 20:44:24 -04:00
Err(err) => {
self.err = Some(err);
None
}
2014-05-25 22:08:37 -07:00
}
2014-05-16 07:15:02 -07:00
}
2014-06-23 20:44:24 -04:00
#[inline]
fn size_hint(&self) -> (uint, Option<uint>) {
(self.len, Some(self.len))
}
2014-05-16 07:15:02 -07:00
}
2014-05-16 21:21:05 -07:00
//////////////////////////////////////////////////////////////////////////////
2014-06-23 20:44:24 -04:00
struct MapDeserializer<'a, D, E> {
d: &'a mut D,
len: uint,
err: Option<E>,
}
impl<
'a,
K: Deserializable,
V: Deserializable,
D: Deserializer<E>,
2014-06-23 20:44:24 -04:00
E
> Iterator<(K, V)> for MapDeserializer<'a, D, E> {
#[inline]
fn next(&mut self) -> Option<(K, V)> {
2014-06-28 11:34:46 -07:00
match self.d.expect_map_elt_or_end() {
Ok(next) => next,
2014-06-23 20:44:24 -04:00
Err(err) => {
self.err = Some(err);
None
}
2014-05-24 15:02:24 -07:00
}
2014-06-23 20:44:24 -04:00
}
2014-06-23 20:44:24 -04:00
#[inline]
fn size_hint(&self) -> (uint, Option<uint>) {
(self.len, Some(self.len))
}
}
//////////////////////////////////////////////////////////////////////////////
2014-06-22 16:51:50 -04:00
pub trait Deserializable {
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize<
D: Deserializer<E>,
E
>(d: &mut D) -> Result<Self, E> {
2014-06-22 21:55:07 -04:00
let token = try!(d.expect_token());
Deserializable::deserialize_token(d, token)
}
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<Self, E>;
2014-05-16 07:15:02 -07:00
}
//////////////////////////////////////////////////////////////////////////////
macro_rules! impl_deserializable {
($ty:ty, $method:ident) => {
2014-06-22 16:51:50 -04:00
impl Deserializable for $ty {
2014-05-19 18:44:20 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<$ty, E> {
d.$method(token)
2014-05-19 18:44:20 -07:00
}
}
2014-05-16 21:21:05 -07:00
}
}
2014-05-25 21:59:58 -07:00
impl_deserializable!(bool, expect_bool)
impl_deserializable!(int, expect_num)
impl_deserializable!(i8, expect_num)
impl_deserializable!(i16, expect_num)
impl_deserializable!(i32, expect_num)
impl_deserializable!(i64, expect_num)
impl_deserializable!(uint, expect_num)
impl_deserializable!(u8, expect_num)
impl_deserializable!(u16, expect_num)
impl_deserializable!(u32, expect_num)
impl_deserializable!(u64, expect_num)
impl_deserializable!(f32, expect_num)
impl_deserializable!(f64, expect_num)
impl_deserializable!(char, expect_char)
impl_deserializable!(&'static str, expect_str)
2014-06-03 06:43:01 -07:00
impl_deserializable!(String, expect_string)
2014-05-16 07:15:02 -07:00
//////////////////////////////////////////////////////////////////////////////
2014-06-22 16:51:50 -04:00
impl<T: Deserializable> Deserializable for Option<T> {
2014-05-19 18:44:20 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<Option<T>, E> {
2014-05-25 21:59:58 -07:00
d.expect_option(token)
2014-05-19 18:44:20 -07:00
}
2014-05-16 07:15:02 -07:00
}
//////////////////////////////////////////////////////////////////////////////
2014-05-25 22:08:37 -07:00
macro_rules! deserialize_seq {
($seq:expr) => {
{
loop {
match d.next() {
Some(Ok(End)) => { break; }
Some(Ok(token)) => {
let v = try!(Deserializable::deserialize_token(d, token));
$seq.push(v)
}
Some(Err(err)) => { return Err(err); }
2014-05-30 23:28:46 -07:00
None => { return d.end_of_stream_error(); }
2014-05-25 22:08:37 -07:00
}
}
Ok($seq)
}
}
}
2014-06-22 16:51:50 -04:00
impl<T: Deserializable> Deserializable for Vec<T> {
2014-05-19 18:44:20 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<Vec<T>, E> {
2014-06-23 20:44:24 -04:00
d.expect_seq(token)
2014-05-25 22:08:37 -07:00
}
}
//////////////////////////////////////////////////////////////////////////////
2014-05-16 07:15:02 -07:00
impl<
2014-06-22 16:51:50 -04:00
K: Deserializable + Eq + Hash,
V: Deserializable
> Deserializable for HashMap<K, V> {
2014-05-19 18:44:20 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<HashMap<K, V>, E> {
2014-06-23 20:44:24 -04:00
d.expect_map(token)
2014-05-19 18:44:20 -07:00
}
2014-05-16 07:15:02 -07:00
}
2014-05-26 12:53:37 -07:00
impl<
2014-06-22 16:51:50 -04:00
K: Deserializable + Ord,
V: Deserializable
> Deserializable for TreeMap<K, V> {
2014-05-26 12:53:37 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<TreeMap<K, V>, E> {
2014-06-23 20:44:24 -04:00
d.expect_map(token)
2014-05-26 12:53:37 -07:00
}
}
2014-05-16 07:15:02 -07:00
//////////////////////////////////////////////////////////////////////////////
2014-06-08 14:52:40 -07:00
macro_rules! peel {
($name:ident, $($other:ident,)*) => (impl_deserialize_tuple!($($other,)*))
}
2014-05-16 07:15:02 -07:00
2014-06-08 14:52:40 -07:00
macro_rules! impl_deserialize_tuple {
2014-06-22 16:51:50 -04:00
() => {
impl Deserializable for () {
#[inline]
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<(), E> {
d.expect_null(token)
}
}
};
2014-06-08 14:52:40 -07:00
( $($name:ident,)+ ) => {
2014-05-19 17:53:24 -07:00
impl<
2014-06-22 16:51:50 -04:00
$($name: Deserializable),*
> Deserializable for ($($name,)*) {
2014-05-19 18:44:20 -07:00
#[inline]
#[allow(uppercase_variables)]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<($($name,)*), E> {
try!(d.expect_tuple_start(token));
2014-05-19 18:44:20 -07:00
let result = ($({
let $name = try!(d.expect_tuple_elt());
$name
},)*);
2014-05-16 07:15:02 -07:00
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
try!(d.expect_tuple_end());
Ok(result)
2014-05-19 17:53:24 -07:00
}
}
peel!($($name,)*)
2014-06-08 14:52:40 -07:00
}
}
2014-05-16 07:15:02 -07:00
2014-06-08 14:52:40 -07:00
impl_deserialize_tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, }
2014-05-16 07:15:02 -07:00
//////////////////////////////////////////////////////////////////////////////
/// Helper struct that will ignore tokens while taking in consideration
/// recursive structures.
pub struct IgnoreTokens;
2014-06-22 16:51:50 -04:00
impl Deserializable for IgnoreTokens {
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<IgnoreTokens, E> {
match token {
Option(true) => {
Deserializable::deserialize(d)
}
EnumStart(_, _, _) => {
loop {
match try!(d.expect_token()) {
End => { return Ok(IgnoreTokens); }
token => {
let _: IgnoreTokens = try!(Deserializable::deserialize_token(d, token));
}
}
}
}
StructStart(_, _) => {
loop {
match try!(d.expect_token()) {
End => { return Ok(IgnoreTokens); }
Str(_) | String(_) => {
let _: IgnoreTokens = try!(Deserializable::deserialize(d));
}
_token => { return d.syntax_error(token); }
}
}
}
TupleStart(_) => {
loop {
match try!(d.expect_token()) {
End => { return Ok(IgnoreTokens); }
token => {
let _: IgnoreTokens = try!(Deserializable::deserialize_token(d, token));
}
}
}
}
SeqStart(_) => {
loop {
match try!(d.expect_token()) {
End => { return Ok(IgnoreTokens); }
token => {
let _: IgnoreTokens = try!(Deserializable::deserialize_token(d, token));
}
}
}
}
MapStart(_) => {
loop {
match try!(d.expect_token()) {
End => { return Ok(IgnoreTokens); }
token => {
let _: IgnoreTokens = try!(Deserializable::deserialize_token(d, token));
let _: IgnoreTokens = try!(Deserializable::deserialize(d));
}
}
}
}
End => d.syntax_error(token),
_ => Ok(IgnoreTokens),
2014-05-30 19:15:05 -07:00
}
}
}
//////////////////////////////////////////////////////////////////////////////
/// Helper struct that will gather tokens while taking in consideration
/// recursive structures.
pub struct GatherTokens {
tokens: Vec<Token>,
}
impl GatherTokens {
#[inline]
pub fn unwrap(self) -> Vec<Token> {
self.tokens
}
#[inline]
2014-06-22 16:51:50 -04:00
fn gather<D: Deserializer<E>, E>(&mut self, d: &mut D) -> Result<(), E> {
2014-05-30 19:15:05 -07:00
let token = try!(d.expect_token());
self.gather_token(d, token)
}
2014-05-30 19:15:05 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn gather_token<D: Deserializer<E>, E>(&mut self, d: &mut D, token: Token) -> Result<(), E> {
2014-05-30 19:15:05 -07:00
match token {
token @ Option(true) => {
self.tokens.push(token);
self.gather(d)
}
EnumStart(name, variant, len) => {
self.tokens.reserve_additional(len + 1);
self.tokens.push(EnumStart(name, variant, len));
self.gather_seq(d)
}
StructStart(name, len) => {
self.tokens.reserve_additional(len + 1);
self.tokens.push(StructStart(name, len));
self.gather_struct(d)
2014-05-30 19:15:05 -07:00
}
TupleStart(len) => {
self.tokens.reserve_additional(len + 1);
self.tokens.push(TupleStart(len));
self.gather_seq(d)
}
SeqStart(len) => {
self.tokens.reserve_additional(len + 1);
self.tokens.push(SeqStart(len));
self.gather_seq(d)
}
MapStart(len) => {
self.tokens.reserve_additional(len + 1);
self.tokens.push(MapStart(len));
self.gather_map(d)
}
End => {
d.syntax_error(token)
2014-05-30 19:15:05 -07:00
}
token => {
self.tokens.push(token);
Ok(())
}
}
}
2014-05-30 19:15:05 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn gather_seq<D: Deserializer<E>, E>(&mut self, d: &mut D) -> Result<(), E> {
2014-05-30 19:15:05 -07:00
loop {
match try!(d.expect_token()) {
token @ End => {
self.tokens.push(token);
return Ok(());
}
token => {
try!(self.gather_token(d, token));
}
}
}
}
#[inline]
2014-06-22 16:51:50 -04:00
fn gather_struct<D: Deserializer<E>, E>(&mut self, d: &mut D) -> Result<(), E> {
2014-05-30 19:15:05 -07:00
loop {
match try!(d.expect_token()) {
token @ End => {
self.tokens.push(token);
return Ok(());
}
token @ Str(_) | token @ String(_) => {
self.tokens.push(token);
try!(self.gather(d))
}
token => { return d.syntax_error(token); }
2014-05-30 19:15:05 -07:00
}
}
}
#[inline]
2014-06-22 16:51:50 -04:00
fn gather_map<D: Deserializer<E>, E>(&mut self, d: &mut D) -> Result<(), E> {
2014-05-30 19:15:05 -07:00
loop {
match try!(d.expect_token()) {
End => {
self.tokens.push(End);
return Ok(());
}
token => {
try!(self.gather_token(d, token));
try!(self.gather(d))
}
}
}
}
}
2014-06-22 16:51:50 -04:00
impl Deserializable for GatherTokens {
2014-05-30 19:15:05 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>,
E
>(d: &mut D, token: Token) -> Result<GatherTokens, E> {
2014-05-30 19:15:05 -07:00
let mut tokens = GatherTokens {
tokens: vec!(),
};
try!(tokens.gather_token(d, token));
Ok(tokens)
}
}
//////////////////////////////////////////////////////////////////////////////
2014-05-16 07:15:02 -07:00
#[cfg(test)]
mod tests {
2014-06-22 16:51:50 -04:00
use std::collections::TreeMap;
2014-05-23 20:41:29 -07:00
use serialize::Decoder;
2014-05-16 07:15:02 -07:00
2014-06-22 16:51:50 -04:00
use super::{Deserializer, Deserializable, Token};
use super::{
Null,
Bool,
Int,
I8,
I16,
I32,
I64,
Uint,
U8,
U16,
U32,
U64,
F32,
F64,
Char,
Str,
String,
Option,
TupleStart,
StructStart,
EnumStart,
SeqStart,
MapStart,
End,
};
macro_rules! treemap {
($($k:expr => $v:expr),*) => ({
let mut _m = ::std::collections::TreeMap::new();
$(_m.insert($k, $v);)*
_m
})
}
2014-05-16 07:15:02 -07:00
//////////////////////////////////////////////////////////////////////////////
2014-05-31 12:28:30 -07:00
#[deriving(Clone, PartialEq, Show, Decodable)]
struct Inner {
a: (),
b: uint,
2014-06-22 16:51:50 -04:00
c: TreeMap<String, Option<char>>,
}
2014-06-22 16:51:50 -04:00
impl Deserializable for Inner {
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>, E
>(d: &mut D, token: Token) -> Result<Inner, E> {
2014-05-25 21:59:58 -07:00
try!(d.expect_struct_start(token, "Inner"));
let a = try!(d.expect_struct_field("a"));
let b = try!(d.expect_struct_field("b"));
let c = try!(d.expect_struct_field("c"));
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
try!(d.expect_struct_end());
Ok(Inner { a: a, b: b, c: c })
}
}
//////////////////////////////////////////////////////////////////////////////
2014-05-31 12:28:30 -07:00
#[deriving(Clone, PartialEq, Show, Decodable)]
struct Outer {
inner: Vec<Inner>,
}
2014-06-22 16:51:50 -04:00
impl Deserializable for Outer {
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>, E
>(d: &mut D, token: Token) -> Result<Outer, E> {
2014-05-25 21:59:58 -07:00
try!(d.expect_struct_start(token, "Outer"));
let inner = try!(d.expect_struct_field("inner"));
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
try!(d.expect_struct_end());
Ok(Outer { inner: inner })
}
}
//////////////////////////////////////////////////////////////////////////////
2014-05-31 12:28:30 -07:00
#[deriving(Clone, PartialEq, Show, Decodable)]
2014-05-21 08:44:48 -07:00
enum Animal {
Dog,
Frog(String, int)
2014-05-21 08:44:48 -07:00
}
2014-06-22 16:51:50 -04:00
impl Deserializable for Animal {
2014-05-21 08:44:48 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn deserialize_token<
D: Deserializer<E>, E
>(d: &mut D, token: Token) -> Result<Animal, E> {
2014-05-25 21:59:58 -07:00
match try!(d.expect_enum_start(token, "Animal", ["Dog", "Frog"])) {
2014-05-21 08:44:48 -07:00
0 => {
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
try!(d.expect_enum_end());
2014-05-21 08:44:48 -07:00
Ok(Dog)
}
1 => {
let x0 = try!(Deserializable::deserialize(d));
let x1 = try!(Deserializable::deserialize(d));
Change the json enum serialization to {"variant":["fields", ...]} test bench_enum::bench_decoder_dog ... bench: 112 ns/iter (+/- 15) test bench_enum::bench_decoder_frog ... bench: 336 ns/iter (+/- 6) test bench_enum::bench_deserializer_dog ... bench: 120 ns/iter (+/- 4) test bench_enum::bench_deserializer_frog ... bench: 317 ns/iter (+/- 15) test bench_map::bench_decoder_000 ... bench: 528 ns/iter (+/- 13) test bench_map::bench_decoder_003 ... bench: 2459 ns/iter (+/- 74) test bench_map::bench_decoder_100 ... bench: 70756 ns/iter (+/- 1979) test bench_map::bench_deserializer_000 ... bench: 753 ns/iter (+/- 30) test bench_map::bench_deserializer_003 ... bench: 2574 ns/iter (+/- 111) test bench_map::bench_deserializer_100 ... bench: 62374 ns/iter (+/- 1714) test bench_struct::bench_decoder_0_0 ... bench: 609 ns/iter (+/- 14) test bench_struct::bench_decoder_1_0 ... bench: 1620 ns/iter (+/- 44) test bench_struct::bench_decoder_1_5 ... bench: 4393 ns/iter (+/- 88) test bench_struct::bench_deserializer_0_0 ... bench: 699 ns/iter (+/- 10) test bench_struct::bench_deserializer_1_0 ... bench: 2160 ns/iter (+/- 53) test bench_struct::bench_deserializer_1_5 ... bench: 4987 ns/iter (+/- 87) test bench_vec::bench_decoder_int_000 ... bench: 20 ns/iter (+/- 1) test bench_vec::bench_decoder_int_003 ... bench: 148 ns/iter (+/- 3) test bench_vec::bench_decoder_int_100 ... bench: 1009 ns/iter (+/- 44) test bench_vec::bench_decoder_u8_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_decoder_u8_003 ... bench: 152 ns/iter (+/- 12) test bench_vec::bench_decoder_u8_100 ... bench: 1457 ns/iter (+/- 95) test bench_vec::bench_deserializer_int_000 ... bench: 16 ns/iter (+/- 0) test bench_vec::bench_deserializer_int_003 ... bench: 153 ns/iter (+/- 9) test bench_vec::bench_deserializer_int_100 ... bench: 1015 ns/iter (+/- 38) test bench_vec::bench_deserializer_u8_000 ... bench: 16 ns/iter (+/- 1) test bench_vec::bench_deserializer_u8_003 ... bench: 160 ns/iter (+/- 130) test bench_vec::bench_deserializer_u8_100 ... bench: 1225 ns/iter (+/- 112) test json::tests::bench_decoder_large ... bench: 1979093 ns/iter (+/- 67769) test json::tests::bench_decoder_small ... bench: 4644 ns/iter (+/- 208) test json::tests::bench_decoder_streaming_large ... bench: 848383 ns/iter (+/- 96301) test json::tests::bench_decoder_streaming_small ... bench: 1834 ns/iter (+/- 120) test json::tests::bench_deserializer_large ... bench: 1882598 ns/iter (+/- 137262) test json::tests::bench_deserializer_small ... bench: 3945 ns/iter (+/- 161) test json::tests::bench_deserializer_streaming_large ... bench: 990086 ns/iter (+/- 157794) test json::tests::bench_deserializer_streaming_small ... bench: 2135 ns/iter (+/- 211)
2014-06-09 07:51:53 -07:00
try!(d.expect_enum_end());
2014-05-21 08:44:48 -07:00
Ok(Frog(x0, x1))
}
_ => unreachable!(),
}
}
}
//////////////////////////////////////////////////////////////////////////////
2014-05-16 07:15:02 -07:00
#[deriving(Show)]
enum Error {
EndOfStream,
SyntaxError,
IncompleteValue,
2014-05-16 07:15:02 -07:00
}
//////////////////////////////////////////////////////////////////////////////
2014-06-22 16:51:50 -04:00
struct TokenDeserializer<Iter> {
tokens: Iter,
2014-05-16 07:15:02 -07:00
}
2014-06-22 16:51:50 -04:00
impl<Iter: Iterator<Token>> TokenDeserializer<Iter> {
2014-05-16 07:15:02 -07:00
#[inline]
2014-06-22 16:51:50 -04:00
fn new(tokens: Iter) -> TokenDeserializer<Iter> {
2014-05-16 07:15:02 -07:00
TokenDeserializer {
tokens: tokens,
}
}
}
2014-06-22 16:51:50 -04:00
impl<Iter: Iterator<Token>> Iterator<Result<Token, Error>> for TokenDeserializer<Iter> {
2014-05-16 07:15:02 -07:00
#[inline]
fn next(&mut self) -> Option<Result<Token, Error>> {
2014-06-22 16:51:50 -04:00
match self.tokens.next() {
2014-05-16 07:15:02 -07:00
None => None,
Some(token) => Some(Ok(token)),
}
}
}
2014-06-22 16:51:50 -04:00
impl<Iter: Iterator<Token>> Deserializer<Error> for TokenDeserializer<Iter> {
2014-05-30 23:28:46 -07:00
fn end_of_stream_error<T>(&self) -> Result<T, Error> {
Err(EndOfStream)
2014-05-16 07:15:02 -07:00
}
fn syntax_error<T>(&self, _token: Token) -> Result<T, Error> {
2014-05-30 23:28:46 -07:00
Err(SyntaxError)
2014-05-16 07:15:02 -07:00
}
fn missing_field_error<T>(&self, _field: &'static str) -> Result<T, Error> {
Err(IncompleteValue)
}
2014-05-16 07:15:02 -07:00
}
//////////////////////////////////////////////////////////////////////////////
2014-06-22 16:51:50 -04:00
macro_rules! test_value {
($name:ident, [$($tokens:expr => $value:expr: $ty:ty),*]) => {
#[test]
fn $name() {
$(
let mut deserializer = TokenDeserializer::new($tokens.move_iter());
let value: $ty = Deserializable::deserialize(&mut deserializer).unwrap();
2014-06-22 16:51:50 -04:00
assert_eq!(value, $value);
)+
}
}
}
2014-06-22 16:51:50 -04:00
test_value!(test_primitives, [
vec!(Null) => (): (),
vec!(Bool(true)) => true: bool,
vec!(Bool(false)) => false: bool,
vec!(Int(5)) => 5: int,
vec!(I8(5)) => 5: i8,
vec!(I16(5)) => 5: i16,
vec!(I32(5)) => 5: i32,
vec!(I64(5)) => 5: i64,
vec!(Uint(5)) => 5: uint,
vec!(U8(5)) => 5: u8,
vec!(U16(5)) => 5: u16,
vec!(U32(5)) => 5: u32,
vec!(U64(5)) => 5: u64,
vec!(F32(5.0)) => 5.0: f32,
vec!(F64(5.0)) => 5.0: f64,
vec!(Char('c')) => 'c': char,
vec!(Str("abc")) => "abc": &str,
vec!(String("abc".to_string())) => "abc".to_string(): String
])
test_value!(test_tuples, [
vec!(
TupleStart(0),
End,
2014-06-22 16:51:50 -04:00
) => (): (),
2014-05-16 07:15:02 -07:00
2014-06-22 16:51:50 -04:00
vec!(
TupleStart(2),
2014-05-16 07:15:02 -07:00
Int(5),
2014-06-22 16:51:50 -04:00
Str("a"),
End,
2014-06-22 16:51:50 -04:00
) => (5, "a"): (int, &'static str),
2014-05-16 07:15:02 -07:00
2014-06-22 16:51:50 -04:00
vec!(
TupleStart(3),
Null,
TupleStart(0),
End,
TupleStart(2),
2014-05-16 07:15:02 -07:00
Int(5),
2014-06-22 16:51:50 -04:00
Str("a"),
End,
End,
2014-06-22 16:51:50 -04:00
) => ((), (), (5, "a")): ((), (), (int, &'static str))
])
2014-05-16 07:15:02 -07:00
2014-06-22 16:51:50 -04:00
test_value!(test_options, [
vec!(Option(false)) => None: Option<int>,
2014-05-16 07:15:02 -07:00
2014-06-22 16:51:50 -04:00
vec!(
Option(true),
Int(5),
) => Some(5): Option<int>
])
2014-06-22 16:51:50 -04:00
test_value!(test_structs, [
vec!(
2014-05-28 10:46:29 -07:00
StructStart("Outer", 1),
Str("inner"),
SeqStart(0),
End,
End,
2014-06-22 16:51:50 -04:00
) => Outer { inner: vec!() }: Outer,
2014-06-22 16:51:50 -04:00
vec!(
2014-05-28 10:46:29 -07:00
StructStart("Outer", 1),
Str("inner"),
SeqStart(1),
2014-05-28 10:46:29 -07:00
StructStart("Inner", 3),
Str("a"),
Null,
Str("b"),
Uint(5),
Str("c"),
MapStart(1),
2014-05-29 06:44:38 -07:00
String("abc".to_string()),
Option(true),
Char('c'),
End,
End,
End,
End,
2014-06-22 16:51:50 -04:00
) => Outer {
inner: vec!(
Inner {
a: (),
b: 5,
c: treemap!("abc".to_string() => Some('c')),
},
),
}: Outer
])
test_value!(test_enums, [
vec!(
2014-05-28 10:46:29 -07:00
EnumStart("Animal", "Dog", 0),
2014-05-21 08:44:48 -07:00
End,
2014-06-22 16:51:50 -04:00
) => Dog: Animal,
2014-05-21 08:44:48 -07:00
2014-06-22 16:51:50 -04:00
vec!(
2014-05-28 10:46:29 -07:00
EnumStart("Animal", "Frog", 2),
2014-05-29 06:44:38 -07:00
String("Henry".to_string()),
2014-05-21 08:44:48 -07:00
Int(349),
End,
2014-06-22 16:51:50 -04:00
) => Frog("Henry".to_string(), 349): Animal
])
2014-05-21 08:44:48 -07:00
2014-06-22 16:51:50 -04:00
test_value!(test_vecs, [
vec!(
SeqStart(0),
End,
2014-06-22 16:51:50 -04:00
) => vec!(): Vec<int>,
2014-05-16 07:15:02 -07:00
2014-06-22 16:51:50 -04:00
vec!(
SeqStart(3),
2014-05-16 07:15:02 -07:00
Int(5),
Int(6),
Int(7),
End,
2014-06-22 16:51:50 -04:00
) => vec!(5, 6, 7): Vec<int>,
2014-05-16 07:15:02 -07:00
2014-06-22 16:51:50 -04:00
vec!(
SeqStart(3),
SeqStart(1),
2014-05-16 07:15:02 -07:00
Int(1),
End,
2014-05-16 07:15:02 -07:00
SeqStart(2),
2014-05-16 07:15:02 -07:00
Int(2),
Int(3),
End,
2014-05-16 07:15:02 -07:00
SeqStart(3),
2014-05-16 07:15:02 -07:00
Int(4),
Int(5),
Int(6),
End,
End,
2014-06-22 16:51:50 -04:00
) => vec!(vec!(1), vec!(2, 3), vec!(4, 5, 6)): Vec<Vec<int>>
])
2014-05-16 07:15:02 -07:00
2014-06-22 16:51:50 -04:00
test_value!(test_treemaps, [
vec!(
MapStart(0),
End,
) => treemap!(): TreeMap<int, String>,
2014-05-16 07:15:02 -07:00
2014-06-22 16:51:50 -04:00
vec!(
MapStart(2),
Int(5),
2014-05-29 06:44:38 -07:00
String("a".to_string()),
2014-05-16 07:15:02 -07:00
Int(6),
2014-05-29 06:44:38 -07:00
String("b".to_string()),
End,
2014-06-27 08:07:03 -07:00
) => treemap!(5i => "a".to_string(), 6i => "b".to_string()): TreeMap<int, String>
2014-06-22 16:51:50 -04:00
])
2014-05-16 07:15:02 -07:00
}