Compare commits

...

39 Commits

Author SHA1 Message Date
David Tolnay 59ec931d8f Release 0.9.9 2017-02-24 13:57:52 -08:00
David Tolnay 4b3c5ea99e Fix clippy lint in content serializer 2017-02-24 13:56:44 -08:00
David Tolnay d4ea4a7eef Add test for enums containing enums
Fixes #775.
2017-02-24 13:50:47 -08:00
David Tolnay 5fbdadefb2 Deserializing enums in serde_test 2017-02-24 13:47:04 -08:00
David Tolnay 4da77e4200 Serialize to Content 2017-02-24 12:59:35 -08:00
David Tolnay d797504407 Deserialize enums from &Content 2017-02-24 09:32:14 -08:00
David Tolnay 8e5f472e27 Merge pull request #787 from 46bit/issue-775
Fix internally tagged enums by implementing ContentDeserializer::deserialize_enum
2017-02-22 18:23:18 -08:00
David Tolnay 5e7883945b Fix clippy lint in Content::unexpected 2017-02-22 18:16:51 -08:00
David Tolnay a4bd6b9a96 Fix content's SeqDeserializer on no_std 2017-02-22 18:14:56 -08:00
Michael Mokrysz 4c253748c2 Compiles and fixes internally tagged testcases. 2017-02-23 01:05:44 +00:00
Michael Mokrysz 8f6e1fb5b3 Resolved error typing. Needs to adapt to Content::Map with non-String keys.
`EnumDeserializer` is being adapted from:
  `serde_json::Value::Map<Vec<(String, Value)>>`
serde has a Map variant that allows non-String keys:
  `serde::de::Content::Map<Vec<(Content, Content)>>`

There's a lot of assumptions in `EnumDeserializer` about `String` keys and I'm not sure what the adaptation should be.
2017-02-22 23:59:47 +00:00
Michael Mokrysz 4e665a71bd Attempt to port serde_json::Value::deserialize_enum for ContentDeserializer is being derailed by what error types should be used. 2017-02-22 22:55:18 +00:00
David Tolnay 017e6d304f Release 0.9.8 2017-02-21 10:59:42 -08:00
David Tolnay 89cbb81673 Include readme and licenses in crates.io archive
Fixes #772.
2017-02-20 21:11:57 -08:00
David Tolnay c36743fa05 Merge pull request #782 from serde-rs/adjacent
Deserialization of Haskell style enums
2017-02-20 21:04:17 -08:00
David Tolnay 9a3c1243f4 Deserialization of Haskell style enums 2017-02-20 20:05:06 -08:00
David Tolnay 599a1b6607 Fragments that keep track of type of syntax
Fixes #777.
2017-02-20 17:12:35 -08:00
David Tolnay 3d6e086d3e Support custom paths in container attribute serde(default="...") 2017-02-20 17:06:00 -08:00
David Tolnay ad480d2b04 Merge pull request #780 from Thomasdezeeuw/default_container
Add support for `#[serde(default)]` on structs
2017-02-20 16:10:28 -08:00
Thomas de Zeeuw 7bee779514 Only allow #[serde(default)]` on structs 2017-02-21 00:15:00 +01:00
David Tolnay dff919a926 Rename __simple_value to __field0 to be consistent with tuples 2017-02-20 14:16:54 -08:00
David Tolnay bac593573c Drop aster dependency 2017-02-20 13:50:17 -08:00
Thomas de Zeeuw 9444db5f19 Add support for #[serde(default)] on structs
This allows structs to use the default value for each field defined in
the struct’s `std::default::Default` implementation, rather then the
default value for the field’s type.

```
struct StructDefault {
    a: i32,
    b: String,
}

impl Default for StructDefault {
    fn default() -> StructDefault {
        StructDefault{
            a: 100,
            b: "default".to_string(),
        }
    }
}
```

The code above will now return `100` for field `a` and `”default”` for
`b`, rather then `0` and `””` respectively.
2017-02-20 22:35:31 +01:00
David Tolnay 3bf8cda994 Update generics handling to use split_for_impl 2017-02-20 13:04:40 -08:00
David Tolnay f98e7f6ba0 Merge pull request #778 from SimonSapin/serialize_display_bounded_length
Avoid some string allocations.
2017-02-20 11:09:32 -08:00
Simon Sapin 772b22b427 Avoid some string allocations. 2017-02-20 18:36:38 +01:00
David Tolnay 535ab1e04b Merge pull request #771 from elliottslaughter:internally_content_tagged 2017-02-19 16:08:49 -08:00
David Tolnay a3fe03c323 Serialization of Haskell style enums 2017-02-19 16:04:39 -08:00
David Tolnay 7dad6426da Merge pull request #774 from nox/limit-hints
Clamp hints coming from untrusted input to 4096
2017-02-19 13:51:21 -08:00
David Tolnay 792a5f7502 Also clamp the collection impls 2017-02-19 13:47:05 -08:00
Anthony Ramine a4c738a9f3 Clamp hints coming from untrusted input to 4096 2017-02-19 14:29:41 +01:00
Elliott Slaughter 4538143d00 Initial work to support serialization of adjacently tagged enums. 2017-02-18 20:46:37 -08:00
David Tolnay 7f08894a32 Remove dependency on unneeded syn feature 2017-02-17 21:01:42 -08:00
David Tolnay adf7b086b5 Remove outdated comment 2017-02-17 20:38:50 -08:00
David Tolnay c590df13b9 Add compile-fail test for the with attribute 2017-02-16 18:43:04 -08:00
Oliver Schneider afa6dfbbe2 Merge pull request #765 from serde-rs/with
Pair serialize_with and deserialize_with into one attribute
2017-02-15 08:33:14 +01:00
David Tolnay f500db6e91 Pair serialize_with and deserialize_with into one attribute 2017-02-14 17:36:50 -08:00
David Tolnay 090c8a7049 Merge pull request #762 from serde-rs/rustfmt
Use rustfmt
2017-02-13 01:29:25 -08:00
David Tolnay e8651a52e7 Rustfmt 2017-02-12 22:15:59 -08:00
51 changed files with 3843 additions and 1816 deletions
+3 -3
View File
@@ -1,16 +1,16 @@
[package] [package]
name = "serde" name = "serde"
version = "0.9.7" version = "0.9.9"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "A generic serialization/deserialization framework" description = "A generic serialization/deserialization framework"
homepage = "https://serde.rs" homepage = "https://serde.rs"
repository = "https://github.com/serde-rs/serde" repository = "https://github.com/serde-rs/serde"
documentation = "https://docs.serde.rs/serde/" documentation = "https://docs.serde.rs/serde/"
readme = "../README.md"
keywords = ["serde", "serialization", "no_std"] keywords = ["serde", "serialization", "no_std"]
categories = ["encoding"] categories = ["encoding"]
include = ["Cargo.toml", "src/**/*.rs"] readme = "../README.md"
include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
[badges] [badges]
travis-ci = { repository = "serde-rs/serde" } travis-ci = { repository = "serde-rs/serde" }
+1
View File
@@ -0,0 +1 @@
../LICENSE-APACHE
+1
View File
@@ -0,0 +1 @@
../LICENSE-MIT
+1
View File
@@ -0,0 +1 @@
../README.md
+22 -17
View File
@@ -60,9 +60,7 @@ pub struct Bytes<'a> {
impl<'a> Bytes<'a> { impl<'a> Bytes<'a> {
/// Wrap an existing `&[u8]`. /// Wrap an existing `&[u8]`.
pub fn new(bytes: &'a [u8]) -> Self { pub fn new(bytes: &'a [u8]) -> Self {
Bytes { Bytes { bytes: bytes }
bytes: bytes,
}
} }
} }
@@ -98,7 +96,9 @@ impl<'a> Into<&'a [u8]> for Bytes<'a> {
impl<'a> ops::Deref for Bytes<'a> { impl<'a> ops::Deref for Bytes<'a> {
type Target = [u8]; type Target = [u8];
fn deref(&self) -> &[u8] { self.bytes } fn deref(&self) -> &[u8] {
self.bytes
}
} }
impl<'a> ser::Serialize for Bytes<'a> { impl<'a> ser::Serialize for Bytes<'a> {
@@ -114,6 +114,7 @@ impl<'a> ser::Serialize for Bytes<'a> {
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
mod bytebuf { mod bytebuf {
use core::cmp;
use core::ops; use core::ops;
use core::fmt; use core::fmt;
use core::fmt::Write; use core::fmt::Write;
@@ -161,9 +162,7 @@ mod bytebuf {
/// Wrap existing bytes in a `ByteBuf`. /// Wrap existing bytes in a `ByteBuf`.
pub fn from<T: Into<Vec<u8>>>(bytes: T) -> Self { pub fn from<T: Into<Vec<u8>>>(bytes: T) -> Self {
ByteBuf { ByteBuf { bytes: bytes.into() }
bytes: bytes.into(),
}
} }
} }
@@ -216,11 +215,15 @@ mod bytebuf {
impl ops::Deref for ByteBuf { impl ops::Deref for ByteBuf {
type Target = [u8]; type Target = [u8];
fn deref(&self) -> &[u8] { &self.bytes[..] } fn deref(&self) -> &[u8] {
&self.bytes[..]
}
} }
impl ops::DerefMut for ByteBuf { impl ops::DerefMut for ByteBuf {
fn deref_mut(&mut self) -> &mut [u8] { &mut self.bytes[..] } fn deref_mut(&mut self) -> &mut [u8] {
&mut self.bytes[..]
}
} }
impl ser::Serialize for ByteBuf { impl ser::Serialize for ByteBuf {
@@ -243,16 +246,16 @@ mod bytebuf {
#[inline] #[inline]
fn visit_unit<E>(self) -> Result<ByteBuf, E> fn visit_unit<E>(self) -> Result<ByteBuf, E>
where E: de::Error, where E: de::Error
{ {
Ok(ByteBuf::new()) Ok(ByteBuf::new())
} }
#[inline] #[inline]
fn visit_seq<V>(self, mut visitor: V) -> Result<ByteBuf, V::Error> fn visit_seq<V>(self, mut visitor: V) -> Result<ByteBuf, V::Error>
where V: de::SeqVisitor, where V: de::SeqVisitor
{ {
let (len, _) = visitor.size_hint(); let len = cmp::min(visitor.size_hint().0, 4096);
let mut values = Vec::with_capacity(len); let mut values = Vec::with_capacity(len);
while let Some(value) = try!(visitor.visit()) { while let Some(value) = try!(visitor.visit()) {
@@ -264,26 +267,26 @@ mod bytebuf {
#[inline] #[inline]
fn visit_bytes<E>(self, v: &[u8]) -> Result<ByteBuf, E> fn visit_bytes<E>(self, v: &[u8]) -> Result<ByteBuf, E>
where E: de::Error, where E: de::Error
{ {
Ok(ByteBuf::from(v)) Ok(ByteBuf::from(v))
} }
#[inline] #[inline]
fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<ByteBuf, E> fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<ByteBuf, E>
where E: de::Error, where E: de::Error
{ {
Ok(ByteBuf::from(v)) Ok(ByteBuf::from(v))
} }
fn visit_str<E>(self, v: &str) -> Result<ByteBuf, E> fn visit_str<E>(self, v: &str) -> Result<ByteBuf, E>
where E: de::Error, where E: de::Error
{ {
Ok(ByteBuf::from(v)) Ok(ByteBuf::from(v))
} }
fn visit_string<E>(self, v: String) -> Result<ByteBuf, E> fn visit_string<E>(self, v: String) -> Result<ByteBuf, E>
where E: de::Error, where E: de::Error
{ {
Ok(ByteBuf::from(v)) Ok(ByteBuf::from(v))
} }
@@ -302,7 +305,9 @@ mod bytebuf {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#[inline] #[inline]
fn escape_bytestring<'a>(bytes: &'a [u8]) -> iter::FlatMap<slice::Iter<'a, u8>, char::EscapeDefault, fn(&u8) -> char::EscapeDefault> { fn escape_bytestring<'a>
(bytes: &'a [u8])
-> iter::FlatMap<slice::Iter<'a, u8>, char::EscapeDefault, fn(&u8) -> char::EscapeDefault> {
fn f(b: &u8) -> char::EscapeDefault { fn f(b: &u8) -> char::EscapeDefault {
char::from_u32(*b as u32).unwrap().escape_default() char::from_u32(*b as u32).unwrap().escape_default()
} }
+549 -33
View File
@@ -10,6 +10,7 @@
#![doc(hidden)] #![doc(hidden)]
use core::cmp;
use core::fmt; use core::fmt;
use core::marker::PhantomData; use core::marker::PhantomData;
@@ -19,16 +20,8 @@ use collections::{String, Vec};
#[cfg(all(feature = "alloc", not(feature = "std")))] #[cfg(all(feature = "alloc", not(feature = "std")))]
use alloc::boxed::Box; use alloc::boxed::Box;
use de::{ use de::{self, Deserialize, DeserializeSeed, Deserializer, Visitor, SeqVisitor, MapVisitor,
self, EnumVisitor, Unexpected};
Deserialize,
DeserializeSeed,
Deserializer,
Visitor,
SeqVisitor,
MapVisitor,
EnumVisitor,
};
/// Used from generated code to buffer the contents of the Deserializer when /// Used from generated code to buffer the contents of the Deserializer when
/// deserializing untagged enums and internally tagged enums. /// deserializing untagged enums and internally tagged enums.
@@ -36,7 +29,6 @@ use de::{
/// Not public API. Use serde-value instead. /// Not public API. Use serde-value instead.
#[derive(Debug)] #[derive(Debug)]
pub enum Content { pub enum Content {
// Don't mind the PhantomData, just need to use E somewhere.
Bool(bool), Bool(bool),
U8(u8), U8(u8),
@@ -65,6 +57,32 @@ pub enum Content {
Map(Vec<(Content, Content)>), Map(Vec<(Content, Content)>),
} }
impl Content {
fn unexpected(&self) -> Unexpected {
match *self {
Content::Bool(b) => Unexpected::Bool(b),
Content::U8(n) => Unexpected::Unsigned(n as u64),
Content::U16(n) => Unexpected::Unsigned(n as u64),
Content::U32(n) => Unexpected::Unsigned(n as u64),
Content::U64(n) => Unexpected::Unsigned(n),
Content::I8(n) => Unexpected::Signed(n as i64),
Content::I16(n) => Unexpected::Signed(n as i64),
Content::I32(n) => Unexpected::Signed(n as i64),
Content::I64(n) => Unexpected::Signed(n),
Content::F32(f) => Unexpected::Float(f as f64),
Content::F64(f) => Unexpected::Float(f),
Content::Char(c) => Unexpected::Char(c),
Content::String(ref s) => Unexpected::Str(s),
Content::Bytes(ref b) => Unexpected::Bytes(b),
Content::None | Content::Some(_) => Unexpected::Option,
Content::Unit => Unexpected::Unit,
Content::Newtype(_) => Unexpected::NewtypeStruct,
Content::Seq(_) => Unexpected::Seq,
Content::Map(_) => Unexpected::Map,
}
}
}
impl Deserialize for Content { impl Deserialize for Content {
fn deserialize<D: Deserializer>(deserializer: D) -> Result<Self, D::Error> { fn deserialize<D: Deserializer>(deserializer: D) -> Result<Self, D::Error> {
// Untagged and internally tagged enums are only supported in // Untagged and internally tagged enums are only supported in
@@ -205,7 +223,7 @@ impl Visitor for ContentVisitor {
fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
where V: SeqVisitor where V: SeqVisitor
{ {
let mut vec = Vec::with_capacity(visitor.size_hint().0); let mut vec = Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096));
while let Some(e) = try!(visitor.visit()) { while let Some(e) = try!(visitor.visit()) {
vec.push(e); vec.push(e);
} }
@@ -215,7 +233,7 @@ impl Visitor for ContentVisitor {
fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
where V: MapVisitor where V: MapVisitor
{ {
let mut vec = Vec::with_capacity(visitor.size_hint().0); let mut vec = Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096));
while let Some(kv) = try!(visitor.visit()) { while let Some(kv) = try!(visitor.visit()) {
vec.push(kv); vec.push(kv);
} }
@@ -243,9 +261,7 @@ struct TagOrContentVisitor {
impl TagOrContentVisitor { impl TagOrContentVisitor {
fn new(name: &'static str) -> Self { fn new(name: &'static str) -> Self {
TagOrContentVisitor { TagOrContentVisitor { name: name }
name: name,
}
} }
} }
@@ -475,7 +491,7 @@ impl<T> Visitor for TaggedContentVisitor<T>
where V: MapVisitor where V: MapVisitor
{ {
let mut tag = None; let mut tag = None;
let mut vec = Vec::with_capacity(visitor.size_hint().0); let mut vec = Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096));
while let Some(k) = try!(visitor.visit_key_seed(TagOrContentVisitor::new(self.tag_name))) { while let Some(k) = try!(visitor.visit_key_seed(TagOrContentVisitor::new(self.tag_name))) {
match k { match k {
TagOrContent::Tag => { TagOrContent::Tag => {
@@ -491,9 +507,7 @@ impl<T> Visitor for TaggedContentVisitor<T>
} }
} }
match tag { match tag {
None => { None => Err(de::Error::missing_field(self.tag_name)),
Err(de::Error::missing_field(self.tag_name))
}
Some(tag) => { Some(tag) => {
Ok(TaggedContent { Ok(TaggedContent {
tag: tag, tag: tag,
@@ -504,6 +518,50 @@ impl<T> Visitor for TaggedContentVisitor<T>
} }
} }
/// Used by generated code to deserialize an adjacently tagged enum.
///
/// Not public API.
pub enum TagOrContentField {
Tag,
Content,
}
/// Not public API.
pub struct TagOrContentFieldVisitor {
pub tag: &'static str,
pub content: &'static str,
}
impl DeserializeSeed for TagOrContentFieldVisitor {
type Value = TagOrContentField;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where D: Deserializer
{
deserializer.deserialize_str(self)
}
}
impl Visitor for TagOrContentFieldVisitor {
type Value = TagOrContentField;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "{:?} or {:?}", self.tag, self.content)
}
fn visit_str<E>(self, field: &str) -> Result<Self::Value, E>
where E: de::Error
{
if field == self.tag {
Ok(TagOrContentField::Tag)
} else if field == self.content {
Ok(TagOrContentField::Content)
} else {
Err(de::Error::invalid_value(Unexpected::Str(field), &self))
}
}
}
/// Not public API /// Not public API
pub struct ContentDeserializer<E> { pub struct ContentDeserializer<E> {
content: Content, content: Content,
@@ -544,14 +602,15 @@ impl<E> Deserializer for ContentDeserializer<E>
let value = try!(visitor.visit_seq(&mut seq_visitor)); let value = try!(visitor.visit_seq(&mut seq_visitor));
try!(seq_visitor.end()); try!(seq_visitor.end());
Ok(value) Ok(value)
}, }
Content::Map(v) => { Content::Map(v) => {
let map = v.into_iter().map(|(k, v)| (ContentDeserializer::new(k), ContentDeserializer::new(v))); let map = v.into_iter()
.map(|(k, v)| (ContentDeserializer::new(k), ContentDeserializer::new(v)));
let mut map_visitor = de::value::MapDeserializer::new(map); let mut map_visitor = de::value::MapDeserializer::new(map);
let value = try!(visitor.visit_map(&mut map_visitor)); let value = try!(visitor.visit_map(&mut map_visitor));
try!(map_visitor.end()); try!(map_visitor.end());
Ok(value) Ok(value)
}, }
Content::Bytes(v) => visitor.visit_byte_buf(v), Content::Bytes(v) => visitor.visit_byte_buf(v),
} }
} }
@@ -563,7 +622,7 @@ impl<E> Deserializer for ContentDeserializer<E>
Content::None => visitor.visit_none(), Content::None => visitor.visit_none(),
Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)), Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),
Content::Unit => visitor.visit_unit(), Content::Unit => visitor.visit_unit(),
_ => visitor.visit_some(self) _ => visitor.visit_some(self),
} }
} }
@@ -573,10 +632,41 @@ impl<E> Deserializer for ContentDeserializer<E>
visitor.visit_newtype_struct(self) visitor.visit_newtype_struct(self)
} }
fn deserialize_enum<V>(self, _name: &str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error>
where V: Visitor,
{
let (variant, value) = match self.content {
Content::Map(value) => {
let mut iter = value.into_iter();
let (variant, value) = match iter.next() {
Some(v) => v,
None => {
return Err(de::Error::invalid_value(de::Unexpected::Map, &"map with a single key"));
}
};
// enums are encoded in json as maps with a single key:value pair
if iter.next().is_some() {
return Err(de::Error::invalid_value(de::Unexpected::Map, &"map with a single key"));
}
(variant, Some(value))
}
Content::String(variant) => (Content::String(variant), None),
other => {
return Err(de::Error::invalid_type(other.unexpected(), &"string or map"));
}
};
visitor.visit_enum(EnumDeserializer {
variant: variant,
value: value,
err: PhantomData,
})
}
forward_to_deserialize! { forward_to_deserialize! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct
struct_field tuple enum ignored_any struct_field tuple ignored_any
} }
} }
@@ -590,6 +680,203 @@ impl<E> ContentDeserializer<E> {
} }
} }
struct EnumDeserializer<E> where E: de::Error {
variant: Content,
value: Option<Content>,
err: PhantomData<E>,
}
impl<E> de::EnumVisitor for EnumDeserializer<E> where E: de::Error {
type Error = E;
type Variant = VariantDeserializer<Self::Error>;
fn visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer<E>), Self::Error>
where V: de::DeserializeSeed,
{
let visitor = VariantDeserializer { value: self.value, err: PhantomData, };
seed.deserialize(ContentDeserializer::new(self.variant)).map(|v| (v, visitor))
}
}
struct VariantDeserializer<E> where E: de::Error {
value: Option<Content>,
err: PhantomData<E>,
}
impl<E> de::VariantVisitor for VariantDeserializer<E> where E: de::Error {
type Error = E;
fn visit_unit(self) -> Result<(), E> {
match self.value {
Some(value) => de::Deserialize::deserialize(ContentDeserializer::new(value)),
None => Ok(()),
}
}
fn visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E>
where T: de::DeserializeSeed
{
match self.value {
Some(value) => seed.deserialize(ContentDeserializer::new(value)),
None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"newtype variant")),
}
}
fn visit_tuple<V>(
self,
_len: usize,
visitor: V
) -> Result<V::Value, Self::Error>
where V: de::Visitor
{
match self.value {
Some(Content::Seq(v)) => {
de::Deserializer::deserialize(SeqDeserializer::new(v), visitor)
}
Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"tuple variant")),
None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"tuple variant"))
}
}
fn visit_struct<V>(
self,
_fields: &'static [&'static str],
visitor: V
) -> Result<V::Value, Self::Error>
where V: de::Visitor
{
match self.value {
Some(Content::Map(v)) => {
de::Deserializer::deserialize(MapDeserializer::new(v), visitor)
}
Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"struct variant")),
_ => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"struct variant"))
}
}
}
struct SeqDeserializer<E> where E: de::Error {
iter: <Vec<Content> as IntoIterator>::IntoIter,
err: PhantomData<E>,
}
impl<E> SeqDeserializer<E> where E: de::Error {
fn new(vec: Vec<Content>) -> Self {
SeqDeserializer {
iter: vec.into_iter(),
err: PhantomData,
}
}
}
impl<E> de::Deserializer for SeqDeserializer<E> where E: de::Error {
type Error = E;
#[inline]
fn deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor,
{
let len = self.iter.len();
if len == 0 {
visitor.visit_unit()
} else {
let ret = try!(visitor.visit_seq(&mut self));
let remaining = self.iter.len();
if remaining == 0 {
Ok(ret)
} else {
Err(de::Error::invalid_length(len, &"fewer elements in array"))
}
}
}
forward_to_deserialize! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct
tuple_struct struct struct_field tuple enum ignored_any
}
}
impl<E> de::SeqVisitor for SeqDeserializer<E> where E: de::Error {
type Error = E;
fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
where T: de::DeserializeSeed,
{
match self.iter.next() {
Some(value) => seed.deserialize(ContentDeserializer::new(value)).map(Some),
None => Ok(None),
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
struct MapDeserializer<E> where E: de::Error {
iter: <Vec<(Content, Content)> as IntoIterator>::IntoIter,
value: Option<Content>,
err: PhantomData<E>,
}
impl<E> MapDeserializer<E> where E: de::Error {
fn new(map: Vec<(Content, Content)>) -> Self {
MapDeserializer {
iter: map.into_iter(),
value: None,
err: PhantomData,
}
}
}
impl<E> de::MapVisitor for MapDeserializer<E> where E: de::Error {
type Error = E;
fn visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
where T: de::DeserializeSeed,
{
match self.iter.next() {
Some((key, value)) => {
self.value = Some(value);
seed.deserialize(ContentDeserializer::new(key)).map(Some)
}
None => Ok(None),
}
}
fn visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
where T: de::DeserializeSeed,
{
match self.value.take() {
Some(value) => seed.deserialize(ContentDeserializer::new(value)),
None => Err(de::Error::custom("value is missing")),
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
impl<E> de::Deserializer for MapDeserializer<E> where E: de::Error {
type Error = E;
#[inline]
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor,
{
visitor.visit_map(self)
}
forward_to_deserialize! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct
tuple_struct struct struct_field tuple enum ignored_any
}
}
/// Not public API. /// Not public API.
pub struct ContentRefDeserializer<'a, E> { pub struct ContentRefDeserializer<'a, E> {
content: &'a Content, content: &'a Content,
@@ -603,7 +890,7 @@ impl<'a, E> Deserializer for ContentRefDeserializer<'a, E>
{ {
type Error = E; type Error = E;
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, E>
where V: Visitor where V: Visitor
{ {
match *self.content { match *self.content {
@@ -630,39 +917,72 @@ impl<'a, E> Deserializer for ContentRefDeserializer<'a, E>
let value = try!(visitor.visit_seq(&mut seq_visitor)); let value = try!(visitor.visit_seq(&mut seq_visitor));
try!(seq_visitor.end()); try!(seq_visitor.end());
Ok(value) Ok(value)
}, }
Content::Map(ref v) => { Content::Map(ref v) => {
let map = v.into_iter().map(|&(ref k, ref v)| (ContentRefDeserializer::new(k), ContentRefDeserializer::new(v))); let map = v.into_iter().map(|&(ref k, ref v)| {
(ContentRefDeserializer::new(k), ContentRefDeserializer::new(v))
});
let mut map_visitor = de::value::MapDeserializer::new(map); let mut map_visitor = de::value::MapDeserializer::new(map);
let value = try!(visitor.visit_map(&mut map_visitor)); let value = try!(visitor.visit_map(&mut map_visitor));
try!(map_visitor.end()); try!(map_visitor.end());
Ok(value) Ok(value)
}, }
Content::Bytes(ref v) => visitor.visit_bytes(v), Content::Bytes(ref v) => visitor.visit_bytes(v),
} }
} }
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E>
where V: Visitor where V: Visitor
{ {
match *self.content { match *self.content {
Content::None => visitor.visit_none(), Content::None => visitor.visit_none(),
Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)), Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
Content::Unit => visitor.visit_unit(), Content::Unit => visitor.visit_unit(),
_ => visitor.visit_some(self) _ => visitor.visit_some(self),
} }
} }
fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E>
where V: Visitor where V: Visitor
{ {
visitor.visit_newtype_struct(self) visitor.visit_newtype_struct(self)
} }
fn deserialize_enum<V>(self, _name: &str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error>
where V: Visitor,
{
let (variant, value) = match *self.content {
Content::Map(ref value) => {
let mut iter = value.into_iter();
let &(ref variant, ref value) = match iter.next() {
Some(v) => v,
None => {
return Err(de::Error::invalid_value(de::Unexpected::Map, &"map with a single key"));
}
};
// enums are encoded in json as maps with a single key:value pair
if iter.next().is_some() {
return Err(de::Error::invalid_value(de::Unexpected::Map, &"map with a single key"));
}
(variant, Some(value))
}
ref s @ Content::String(_) => (s, None),
ref other => {
return Err(de::Error::invalid_type(other.unexpected(), &"string or map"));
}
};
visitor.visit_enum(EnumRefDeserializer {
variant: variant,
value: value,
err: PhantomData,
})
}
forward_to_deserialize! { forward_to_deserialize! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct
struct_field tuple enum ignored_any struct_field tuple ignored_any
} }
} }
@@ -676,6 +996,202 @@ impl<'a, E> ContentRefDeserializer<'a, E> {
} }
} }
struct EnumRefDeserializer<'a, E> where E: de::Error {
variant: &'a Content,
value: Option<&'a Content>,
err: PhantomData<E>,
}
impl<'a, E> de::EnumVisitor for EnumRefDeserializer<'a, E> where E: de::Error {
type Error = E;
type Variant = VariantRefDeserializer<'a, Self::Error>;
fn visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
where V: de::DeserializeSeed,
{
let visitor = VariantRefDeserializer { value: self.value, err: PhantomData, };
seed.deserialize(ContentRefDeserializer::new(self.variant)).map(|v| (v, visitor))
}
}
struct VariantRefDeserializer<'a, E> where E: de::Error {
value: Option<&'a Content>,
err: PhantomData<E>,
}
impl<'a, E> de::VariantVisitor for VariantRefDeserializer<'a, E> where E: de::Error {
type Error = E;
fn visit_unit(self) -> Result<(), E> {
match self.value {
Some(value) => de::Deserialize::deserialize(ContentRefDeserializer::new(value)),
None => Ok(()),
}
}
fn visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E>
where T: de::DeserializeSeed
{
match self.value {
Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"newtype variant")),
}
}
fn visit_tuple<V>(
self,
_len: usize,
visitor: V
) -> Result<V::Value, Self::Error>
where V: de::Visitor
{
match self.value {
Some(&Content::Seq(ref v)) => {
de::Deserializer::deserialize(SeqRefDeserializer::new(v), visitor)
}
Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"tuple variant")),
None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"tuple variant"))
}
}
fn visit_struct<V>(
self,
_fields: &'static [&'static str],
visitor: V
) -> Result<V::Value, Self::Error>
where V: de::Visitor
{
match self.value {
Some(&Content::Map(ref v)) => {
de::Deserializer::deserialize(MapRefDeserializer::new(v), visitor)
}
Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"struct variant")),
_ => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"struct variant"))
}
}
}
struct SeqRefDeserializer<'a, E> where E: de::Error {
iter: <&'a [Content] as IntoIterator>::IntoIter,
err: PhantomData<E>,
}
impl<'a, E> SeqRefDeserializer<'a, E> where E: de::Error {
fn new(vec: &'a [Content]) -> Self {
SeqRefDeserializer {
iter: vec.into_iter(),
err: PhantomData,
}
}
}
impl<'a, E> de::Deserializer for SeqRefDeserializer<'a, E> where E: de::Error {
type Error = E;
#[inline]
fn deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor,
{
let len = self.iter.len();
if len == 0 {
visitor.visit_unit()
} else {
let ret = try!(visitor.visit_seq(&mut self));
let remaining = self.iter.len();
if remaining == 0 {
Ok(ret)
} else {
Err(de::Error::invalid_length(len, &"fewer elements in array"))
}
}
}
forward_to_deserialize! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct
tuple_struct struct struct_field tuple enum ignored_any
}
}
impl<'a, E> de::SeqVisitor for SeqRefDeserializer<'a, E> where E: de::Error {
type Error = E;
fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
where T: de::DeserializeSeed,
{
match self.iter.next() {
Some(value) => seed.deserialize(ContentRefDeserializer::new(value)).map(Some),
None => Ok(None),
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
struct MapRefDeserializer<'a, E> where E: de::Error {
iter: <&'a [(Content, Content)] as IntoIterator>::IntoIter,
value: Option<&'a Content>,
err: PhantomData<E>,
}
impl<'a, E> MapRefDeserializer<'a, E> where E: de::Error {
fn new(map: &'a [(Content, Content)]) -> Self {
MapRefDeserializer {
iter: map.into_iter(),
value: None,
err: PhantomData,
}
}
}
impl<'a, E> de::MapVisitor for MapRefDeserializer<'a, E> where E: de::Error {
type Error = E;
fn visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
where T: de::DeserializeSeed,
{
match self.iter.next() {
Some(&(ref key, ref value)) => {
self.value = Some(value);
seed.deserialize(ContentRefDeserializer::new(key)).map(Some)
}
None => Ok(None),
}
}
fn visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
where T: de::DeserializeSeed,
{
match self.value.take() {
Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
None => Err(de::Error::custom("value is missing")),
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
impl<'a, E> de::Deserializer for MapRefDeserializer<'a, E> where E: de::Error {
type Error = E;
#[inline]
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor,
{
visitor.visit_map(self)
}
forward_to_deserialize! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct
tuple_struct struct struct_field tuple enum ignored_any
}
}
impl<E> de::value::ValueDeserializer<E> for ContentDeserializer<E> impl<E> de::value::ValueDeserializer<E> for ContentDeserializer<E>
where E: de::Error where E: de::Error
{ {
+107 -108
View File
@@ -6,30 +6,16 @@ use std::borrow::Cow;
use collections::borrow::Cow; use collections::borrow::Cow;
#[cfg(all(feature = "collections", not(feature = "std")))] #[cfg(all(feature = "collections", not(feature = "std")))]
use collections::{ use collections::{BinaryHeap, BTreeMap, BTreeSet, LinkedList, VecDeque, Vec, String};
BinaryHeap,
BTreeMap,
BTreeSet,
LinkedList,
VecDeque,
Vec,
String,
};
#[cfg(feature = "std")] #[cfg(feature = "std")]
use std::collections::{ use std::collections::{HashMap, HashSet, BinaryHeap, BTreeMap, BTreeSet, LinkedList, VecDeque};
HashMap,
HashSet,
BinaryHeap,
BTreeMap,
BTreeSet,
LinkedList,
VecDeque,
};
#[cfg(feature = "collections")] #[cfg(feature = "collections")]
use collections::borrow::ToOwned; use collections::borrow::ToOwned;
#[cfg(any(feature = "std", feature = "collections"))]
use core::cmp;
use core::fmt; use core::fmt;
#[cfg(feature = "std")] #[cfg(feature = "std")]
use core::hash::{Hash, BuildHasher}; use core::hash::{Hash, BuildHasher};
@@ -63,17 +49,8 @@ use core::nonzero::{NonZero, Zeroable};
#[allow(deprecated)] // required for impl Deserialize for NonZero<T> #[allow(deprecated)] // required for impl Deserialize for NonZero<T>
use core::num::Zero; use core::num::Zero;
use de::{ use de::{Deserialize, Deserializer, EnumVisitor, Error, MapVisitor, SeqVisitor, Unexpected,
Deserialize, VariantVisitor, Visitor};
Deserializer,
EnumVisitor,
Error,
MapVisitor,
SeqVisitor,
Unexpected,
VariantVisitor,
Visitor,
};
use de::from_primitive::FromPrimitive; use de::from_primitive::FromPrimitive;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@@ -89,13 +66,13 @@ impl Visitor for UnitVisitor {
} }
fn visit_unit<E>(self) -> Result<(), E> fn visit_unit<E>(self) -> Result<(), E>
where E: Error, where E: Error
{ {
Ok(()) Ok(())
} }
fn visit_seq<V>(self, _: V) -> Result<(), V::Error> fn visit_seq<V>(self, _: V) -> Result<(), V::Error>
where V: SeqVisitor, where V: SeqVisitor
{ {
Ok(()) Ok(())
} }
@@ -103,7 +80,7 @@ impl Visitor for UnitVisitor {
impl Deserialize for () { impl Deserialize for () {
fn deserialize<D>(deserializer: D) -> Result<(), D::Error> fn deserialize<D>(deserializer: D) -> Result<(), D::Error>
where D: Deserializer, where D: Deserializer
{ {
deserializer.deserialize_unit(UnitVisitor) deserializer.deserialize_unit(UnitVisitor)
} }
@@ -122,13 +99,13 @@ impl Visitor for BoolVisitor {
} }
fn visit_bool<E>(self, v: bool) -> Result<bool, E> fn visit_bool<E>(self, v: bool) -> Result<bool, E>
where E: Error, where E: Error
{ {
Ok(v) Ok(v)
} }
fn visit_str<E>(self, s: &str) -> Result<bool, E> fn visit_str<E>(self, s: &str) -> Result<bool, E>
where E: Error, where E: Error
{ {
match s.trim_matches(::utils::Pattern_White_Space) { match s.trim_matches(::utils::Pattern_White_Space) {
"true" => Ok(true), "true" => Ok(true),
@@ -140,7 +117,7 @@ impl Visitor for BoolVisitor {
impl Deserialize for bool { impl Deserialize for bool {
fn deserialize<D>(deserializer: D) -> Result<bool, D::Error> fn deserialize<D>(deserializer: D) -> Result<bool, D::Error>
where D: Deserializer, where D: Deserializer
{ {
deserializer.deserialize_bool(BoolVisitor) deserializer.deserialize_bool(BoolVisitor)
} }
@@ -231,14 +208,14 @@ impl Visitor for CharVisitor {
#[inline] #[inline]
fn visit_char<E>(self, v: char) -> Result<char, E> fn visit_char<E>(self, v: char) -> Result<char, E>
where E: Error, where E: Error
{ {
Ok(v) Ok(v)
} }
#[inline] #[inline]
fn visit_str<E>(self, v: &str) -> Result<char, E> fn visit_str<E>(self, v: &str) -> Result<char, E>
where E: Error, where E: Error
{ {
let mut iter = v.chars(); let mut iter = v.chars();
match (iter.next(), iter.next()) { match (iter.next(), iter.next()) {
@@ -251,7 +228,7 @@ impl Visitor for CharVisitor {
impl Deserialize for char { impl Deserialize for char {
#[inline] #[inline]
fn deserialize<D>(deserializer: D) -> Result<char, D::Error> fn deserialize<D>(deserializer: D) -> Result<char, D::Error>
where D: Deserializer, where D: Deserializer
{ {
deserializer.deserialize_char(CharVisitor) deserializer.deserialize_char(CharVisitor)
} }
@@ -271,25 +248,25 @@ impl Visitor for StringVisitor {
} }
fn visit_str<E>(self, v: &str) -> Result<String, E> fn visit_str<E>(self, v: &str) -> Result<String, E>
where E: Error, where E: Error
{ {
Ok(v.to_owned()) Ok(v.to_owned())
} }
fn visit_string<E>(self, v: String) -> Result<String, E> fn visit_string<E>(self, v: String) -> Result<String, E>
where E: Error, where E: Error
{ {
Ok(v) Ok(v)
} }
fn visit_unit<E>(self) -> Result<String, E> fn visit_unit<E>(self) -> Result<String, E>
where E: Error, where E: Error
{ {
Ok(String::new()) Ok(String::new())
} }
fn visit_bytes<E>(self, v: &[u8]) -> Result<String, E> fn visit_bytes<E>(self, v: &[u8]) -> Result<String, E>
where E: Error, where E: Error
{ {
match str::from_utf8(v) { match str::from_utf8(v) {
Ok(s) => Ok(s.to_owned()), Ok(s) => Ok(s.to_owned()),
@@ -298,7 +275,7 @@ impl Visitor for StringVisitor {
} }
fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<String, E> fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<String, E>
where E: Error, where E: Error
{ {
match String::from_utf8(v) { match String::from_utf8(v) {
Ok(s) => Ok(s), Ok(s) => Ok(s),
@@ -310,7 +287,7 @@ impl Visitor for StringVisitor {
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl Deserialize for String { impl Deserialize for String {
fn deserialize<D>(deserializer: D) -> Result<String, D::Error> fn deserialize<D>(deserializer: D) -> Result<String, D::Error>
where D: Deserializer, where D: Deserializer
{ {
deserializer.deserialize_string(StringVisitor) deserializer.deserialize_string(StringVisitor)
} }
@@ -322,9 +299,7 @@ struct OptionVisitor<T> {
marker: PhantomData<T>, marker: PhantomData<T>,
} }
impl< impl<T: Deserialize> Visitor for OptionVisitor<T> {
T: Deserialize,
> Visitor for OptionVisitor<T> {
type Value = Option<T>; type Value = Option<T>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
@@ -333,29 +308,31 @@ impl<
#[inline] #[inline]
fn visit_unit<E>(self) -> Result<Option<T>, E> fn visit_unit<E>(self) -> Result<Option<T>, E>
where E: Error, where E: Error
{ {
Ok(None) Ok(None)
} }
#[inline] #[inline]
fn visit_none<E>(self) -> Result<Option<T>, E> fn visit_none<E>(self) -> Result<Option<T>, E>
where E: Error, where E: Error
{ {
Ok(None) Ok(None)
} }
#[inline] #[inline]
fn visit_some<D>(self, deserializer: D) -> Result<Option<T>, D::Error> fn visit_some<D>(self, deserializer: D) -> Result<Option<T>, D::Error>
where D: Deserializer, where D: Deserializer
{ {
Ok(Some(try!(Deserialize::deserialize(deserializer)))) Ok(Some(try!(Deserialize::deserialize(deserializer))))
} }
} }
impl<T> Deserialize for Option<T> where T: Deserialize { impl<T> Deserialize for Option<T>
where T: Deserialize
{
fn deserialize<D>(deserializer: D) -> Result<Option<T>, D::Error> fn deserialize<D>(deserializer: D) -> Result<Option<T>, D::Error>
where D: Deserializer, where D: Deserializer
{ {
deserializer.deserialize_option(OptionVisitor { marker: PhantomData }) deserializer.deserialize_option(OptionVisitor { marker: PhantomData })
} }
@@ -377,7 +354,7 @@ impl<T> Visitor for PhantomDataVisitor<T> {
#[inline] #[inline]
fn visit_unit<E>(self) -> Result<PhantomData<T>, E> fn visit_unit<E>(self) -> Result<PhantomData<T>, E>
where E: Error, where E: Error
{ {
Ok(PhantomData) Ok(PhantomData)
} }
@@ -385,7 +362,7 @@ impl<T> Visitor for PhantomDataVisitor<T> {
impl<T> Deserialize for PhantomData<T> { impl<T> Deserialize for PhantomData<T> {
fn deserialize<D>(deserializer: D) -> Result<PhantomData<T>, D::Error> fn deserialize<D>(deserializer: D) -> Result<PhantomData<T>, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let visitor = PhantomDataVisitor { marker: PhantomData }; let visitor = PhantomDataVisitor { marker: PhantomData };
deserializer.deserialize_unit_struct("PhantomData", visitor) deserializer.deserialize_unit_struct("PhantomData", visitor)
@@ -467,7 +444,7 @@ seq_impl!(
BinaryHeapVisitor<T: Deserialize + Ord>, BinaryHeapVisitor<T: Deserialize + Ord>,
visitor, visitor,
BinaryHeap::new(), BinaryHeap::new(),
BinaryHeap::with_capacity(visitor.size_hint().0), BinaryHeap::with_capacity(cmp::min(visitor.size_hint().0, 4096)),
BinaryHeap::push); BinaryHeap::push);
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
@@ -495,7 +472,7 @@ seq_impl!(
S: BuildHasher + Default>, S: BuildHasher + Default>,
visitor, visitor,
HashSet::with_hasher(S::default()), HashSet::with_hasher(S::default()),
HashSet::with_capacity_and_hasher(visitor.size_hint().0, S::default()), HashSet::with_capacity_and_hasher(cmp::min(visitor.size_hint().0, 4096), S::default()),
HashSet::insert); HashSet::insert);
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
@@ -504,7 +481,7 @@ seq_impl!(
VecVisitor<T: Deserialize>, VecVisitor<T: Deserialize>,
visitor, visitor,
Vec::new(), Vec::new(),
Vec::with_capacity(visitor.size_hint().0), Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096)),
Vec::push); Vec::push);
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
@@ -513,7 +490,7 @@ seq_impl!(
VecDequeVisitor<T: Deserialize>, VecDequeVisitor<T: Deserialize>,
visitor, visitor,
VecDeque::new(), VecDeque::new(),
VecDeque::with_capacity(visitor.size_hint().0), VecDeque::with_capacity(cmp::min(visitor.size_hint().0, 4096)),
VecDeque::push_back); VecDeque::push_back);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@@ -524,13 +501,13 @@ struct ArrayVisitor<A> {
impl<A> ArrayVisitor<A> { impl<A> ArrayVisitor<A> {
pub fn new() -> Self { pub fn new() -> Self {
ArrayVisitor { ArrayVisitor { marker: PhantomData }
marker: PhantomData,
}
} }
} }
impl<T> Visitor for ArrayVisitor<[T; 0]> where T: Deserialize { impl<T> Visitor for ArrayVisitor<[T; 0]>
where T: Deserialize
{
type Value = [T; 0]; type Value = [T; 0];
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
@@ -539,14 +516,14 @@ impl<T> Visitor for ArrayVisitor<[T; 0]> where T: Deserialize {
#[inline] #[inline]
fn visit_unit<E>(self) -> Result<[T; 0], E> fn visit_unit<E>(self) -> Result<[T; 0], E>
where E: Error, where E: Error
{ {
Ok([]) Ok([])
} }
#[inline] #[inline]
fn visit_seq<V>(self, _: V) -> Result<[T; 0], V::Error> fn visit_seq<V>(self, _: V) -> Result<[T; 0], V::Error>
where V: SeqVisitor, where V: SeqVisitor
{ {
Ok([]) Ok([])
} }
@@ -556,7 +533,7 @@ impl<T> Deserialize for [T; 0]
where T: Deserialize where T: Deserialize
{ {
fn deserialize<D>(deserializer: D) -> Result<[T; 0], D::Error> fn deserialize<D>(deserializer: D) -> Result<[T; 0], D::Error>
where D: Deserializer, where D: Deserializer
{ {
deserializer.deserialize_seq_fixed_size(0, ArrayVisitor::<[T; 0]>::new()) deserializer.deserialize_seq_fixed_size(0, ArrayVisitor::<[T; 0]>::new())
} }
@@ -791,14 +768,14 @@ map_impl!(
S: BuildHasher + Default>, S: BuildHasher + Default>,
visitor, visitor,
HashMap::with_hasher(S::default()), HashMap::with_hasher(S::default()),
HashMap::with_capacity_and_hasher(visitor.size_hint().0, S::default())); HashMap::with_capacity_and_hasher(cmp::min(visitor.size_hint().0, 4096), S::default()));
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Deserialize for net::IpAddr { impl Deserialize for net::IpAddr {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let s = try!(String::deserialize(deserializer)); let s = try!(String::deserialize(deserializer));
match s.parse() { match s.parse() {
@@ -811,7 +788,7 @@ impl Deserialize for net::IpAddr {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Deserialize for net::Ipv4Addr { impl Deserialize for net::Ipv4Addr {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let s = try!(String::deserialize(deserializer)); let s = try!(String::deserialize(deserializer));
match s.parse() { match s.parse() {
@@ -824,7 +801,7 @@ impl Deserialize for net::Ipv4Addr {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Deserialize for net::Ipv6Addr { impl Deserialize for net::Ipv6Addr {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let s = try!(String::deserialize(deserializer)); let s = try!(String::deserialize(deserializer));
match s.parse() { match s.parse() {
@@ -839,7 +816,7 @@ impl Deserialize for net::Ipv6Addr {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Deserialize for net::SocketAddr { impl Deserialize for net::SocketAddr {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let s = try!(String::deserialize(deserializer)); let s = try!(String::deserialize(deserializer));
match s.parse() { match s.parse() {
@@ -852,7 +829,7 @@ impl Deserialize for net::SocketAddr {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Deserialize for net::SocketAddrV4 { impl Deserialize for net::SocketAddrV4 {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let s = try!(String::deserialize(deserializer)); let s = try!(String::deserialize(deserializer));
match s.parse() { match s.parse() {
@@ -865,7 +842,7 @@ impl Deserialize for net::SocketAddrV4 {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Deserialize for net::SocketAddrV6 { impl Deserialize for net::SocketAddrV6 {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let s = try!(String::deserialize(deserializer)); let s = try!(String::deserialize(deserializer));
match s.parse() { match s.parse() {
@@ -889,13 +866,13 @@ impl Visitor for PathBufVisitor {
} }
fn visit_str<E>(self, v: &str) -> Result<path::PathBuf, E> fn visit_str<E>(self, v: &str) -> Result<path::PathBuf, E>
where E: Error, where E: Error
{ {
Ok(From::from(v)) Ok(From::from(v))
} }
fn visit_string<E>(self, v: String) -> Result<path::PathBuf, E> fn visit_string<E>(self, v: String) -> Result<path::PathBuf, E>
where E: Error, where E: Error
{ {
Ok(From::from(v)) Ok(From::from(v))
} }
@@ -904,7 +881,7 @@ impl Visitor for PathBufVisitor {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Deserialize for path::PathBuf { impl Deserialize for path::PathBuf {
fn deserialize<D>(deserializer: D) -> Result<path::PathBuf, D::Error> fn deserialize<D>(deserializer: D) -> Result<path::PathBuf, D::Error>
where D: Deserializer, where D: Deserializer
{ {
deserializer.deserialize_string(PathBufVisitor) deserializer.deserialize_string(PathBufVisitor)
} }
@@ -915,7 +892,7 @@ impl Deserialize for path::PathBuf {
#[cfg(any(feature = "std", feature = "alloc"))] #[cfg(any(feature = "std", feature = "alloc"))]
impl<T: Deserialize> Deserialize for Box<T> { impl<T: Deserialize> Deserialize for Box<T> {
fn deserialize<D>(deserializer: D) -> Result<Box<T>, D::Error> fn deserialize<D>(deserializer: D) -> Result<Box<T>, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let val = try!(Deserialize::deserialize(deserializer)); let val = try!(Deserialize::deserialize(deserializer));
Ok(Box::new(val)) Ok(Box::new(val))
@@ -925,7 +902,7 @@ impl<T: Deserialize> Deserialize for Box<T> {
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<T: Deserialize> Deserialize for Box<[T]> { impl<T: Deserialize> Deserialize for Box<[T]> {
fn deserialize<D>(deserializer: D) -> Result<Box<[T]>, D::Error> fn deserialize<D>(deserializer: D) -> Result<Box<[T]>, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let v: Vec<T> = try!(Deserialize::deserialize(deserializer)); let v: Vec<T> = try!(Deserialize::deserialize(deserializer));
Ok(v.into_boxed_slice()) Ok(v.into_boxed_slice())
@@ -945,7 +922,7 @@ impl Deserialize for Box<str> {
#[cfg(any(feature = "std", feature = "alloc"))] #[cfg(any(feature = "std", feature = "alloc"))]
impl<T: Deserialize> Deserialize for Arc<T> { impl<T: Deserialize> Deserialize for Arc<T> {
fn deserialize<D>(deserializer: D) -> Result<Arc<T>, D::Error> fn deserialize<D>(deserializer: D) -> Result<Arc<T>, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let val = try!(Deserialize::deserialize(deserializer)); let val = try!(Deserialize::deserialize(deserializer));
Ok(Arc::new(val)) Ok(Arc::new(val))
@@ -955,7 +932,7 @@ impl<T: Deserialize> Deserialize for Arc<T> {
#[cfg(any(feature = "std", feature = "alloc"))] #[cfg(any(feature = "std", feature = "alloc"))]
impl<T: Deserialize> Deserialize for Rc<T> { impl<T: Deserialize> Deserialize for Rc<T> {
fn deserialize<D>(deserializer: D) -> Result<Rc<T>, D::Error> fn deserialize<D>(deserializer: D) -> Result<Rc<T>, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let val = try!(Deserialize::deserialize(deserializer)); let val = try!(Deserialize::deserialize(deserializer));
Ok(Rc::new(val)) Ok(Rc::new(val))
@@ -963,10 +940,13 @@ impl<T: Deserialize> Deserialize for Rc<T> {
} }
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<'a, T: ?Sized> Deserialize for Cow<'a, T> where T: ToOwned, T::Owned: Deserialize, { impl<'a, T: ?Sized> Deserialize for Cow<'a, T>
where T: ToOwned,
T::Owned: Deserialize
{
#[inline] #[inline]
fn deserialize<D>(deserializer: D) -> Result<Cow<'a, T>, D::Error> fn deserialize<D>(deserializer: D) -> Result<Cow<'a, T>, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let val = try!(Deserialize::deserialize(deserializer)); let val = try!(Deserialize::deserialize(deserializer));
Ok(Cow::Owned(val)) Ok(Cow::Owned(val))
@@ -986,13 +966,16 @@ impl<'a, T: ?Sized> Deserialize for Cow<'a, T> where T: ToOwned, T::Owned: Deser
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Deserialize for Duration { impl Deserialize for Duration {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer, where D: Deserializer
{ {
enum Field { Secs, Nanos }; enum Field {
Secs,
Nanos,
};
impl Deserialize for Field { impl Deserialize for Field {
fn deserialize<D>(deserializer: D) -> Result<Field, D::Error> fn deserialize<D>(deserializer: D) -> Result<Field, D::Error>
where D: Deserializer, where D: Deserializer
{ {
struct FieldVisitor; struct FieldVisitor;
@@ -1004,7 +987,7 @@ impl Deserialize for Duration {
} }
fn visit_str<E>(self, value: &str) -> Result<Field, E> fn visit_str<E>(self, value: &str) -> Result<Field, E>
where E: Error, where E: Error
{ {
match value { match value {
"secs" => Ok(Field::Secs), "secs" => Ok(Field::Secs),
@@ -1014,7 +997,7 @@ impl Deserialize for Duration {
} }
fn visit_bytes<E>(self, value: &[u8]) -> Result<Field, E> fn visit_bytes<E>(self, value: &[u8]) -> Result<Field, E>
where E: Error, where E: Error
{ {
match value { match value {
b"secs" => Ok(Field::Secs), b"secs" => Ok(Field::Secs),
@@ -1041,7 +1024,7 @@ impl Deserialize for Duration {
} }
fn visit_seq<V>(self, mut visitor: V) -> Result<Duration, V::Error> fn visit_seq<V>(self, mut visitor: V) -> Result<Duration, V::Error>
where V: SeqVisitor, where V: SeqVisitor
{ {
let secs: u64 = match try!(visitor.visit()) { let secs: u64 = match try!(visitor.visit()) {
Some(value) => value, Some(value) => value,
@@ -1059,7 +1042,7 @@ impl Deserialize for Duration {
} }
fn visit_map<V>(self, mut visitor: V) -> Result<Duration, V::Error> fn visit_map<V>(self, mut visitor: V) -> Result<Duration, V::Error>
where V: MapVisitor, where V: MapVisitor
{ {
let mut secs: Option<u64> = None; let mut secs: Option<u64> = None;
let mut nanos: Option<u32> = None; let mut nanos: Option<u32> = None;
@@ -1100,24 +1083,30 @@ impl Deserialize for Duration {
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
#[allow(deprecated)] // num::Zero is deprecated but there is no replacement #[allow(deprecated)] // num::Zero is deprecated but there is no replacement
impl<T> Deserialize for NonZero<T> where T: Deserialize + PartialEq + Zeroable + Zero { impl<T> Deserialize for NonZero<T>
fn deserialize<D>(deserializer: D) -> Result<NonZero<T>, D::Error> where D: Deserializer { where T: Deserialize + PartialEq + Zeroable + Zero
{
fn deserialize<D>(deserializer: D) -> Result<NonZero<T>, D::Error>
where D: Deserializer
{
let value = try!(Deserialize::deserialize(deserializer)); let value = try!(Deserialize::deserialize(deserializer));
if value == Zero::zero() { if value == Zero::zero() {
return Err(Error::custom("expected a non-zero value")) return Err(Error::custom("expected a non-zero value"));
}
unsafe {
Ok(NonZero::new(value))
} }
unsafe { Ok(NonZero::new(value)) }
} }
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
impl<T, E> Deserialize for Result<T, E> where T: Deserialize, E: Deserialize { impl<T, E> Deserialize for Result<T, E>
where T: Deserialize,
E: Deserialize
{
fn deserialize<D>(deserializer: D) -> Result<Result<T, E>, D::Error> fn deserialize<D>(deserializer: D) -> Result<Result<T, E>, D::Error>
where D: Deserializer { where D: Deserializer
{
enum Field { enum Field {
Ok, Ok,
Err, Err,
@@ -1137,15 +1126,21 @@ impl<T, E> Deserialize for Result<T, E> where T: Deserialize, E: Deserialize {
formatter.write_str("`Ok` or `Err`") formatter.write_str("`Ok` or `Err`")
} }
fn visit_u32<E>(self, value: u32) -> Result<Field, E> where E: Error { fn visit_u32<E>(self, value: u32) -> Result<Field, E>
where E: Error
{
match value { match value {
0 => Ok(Field::Ok), 0 => Ok(Field::Ok),
1 => Ok(Field::Err), 1 => Ok(Field::Err),
_ => Err(Error::invalid_value(Unexpected::Unsigned(value as u64), &self)), _ => {
Err(Error::invalid_value(Unexpected::Unsigned(value as u64), &self))
}
} }
} }
fn visit_str<E>(self, value: &str) -> Result<Field, E> where E: Error { fn visit_str<E>(self, value: &str) -> Result<Field, E>
where E: Error
{
match value { match value {
"Ok" => Ok(Field::Ok), "Ok" => Ok(Field::Ok),
"Err" => Ok(Field::Err), "Err" => Ok(Field::Err),
@@ -1153,14 +1148,18 @@ impl<T, E> Deserialize for Result<T, E> where T: Deserialize, E: Deserialize {
} }
} }
fn visit_bytes<E>(self, value: &[u8]) -> Result<Field, E> where E: Error { fn visit_bytes<E>(self, value: &[u8]) -> Result<Field, E>
where E: Error
{
match value { match value {
b"Ok" => Ok(Field::Ok), b"Ok" => Ok(Field::Ok),
b"Err" => Ok(Field::Err), b"Err" => Ok(Field::Err),
_ => { _ => {
match str::from_utf8(value) { match str::from_utf8(value) {
Ok(value) => Err(Error::unknown_variant(value, VARIANTS)), Ok(value) => Err(Error::unknown_variant(value, VARIANTS)),
Err(_) => Err(Error::invalid_value(Unexpected::Bytes(value), &self)), Err(_) => {
Err(Error::invalid_value(Unexpected::Bytes(value), &self))
}
} }
} }
} }
@@ -1208,7 +1207,7 @@ pub struct IgnoredAny;
impl Deserialize for IgnoredAny { impl Deserialize for IgnoredAny {
#[inline] #[inline]
fn deserialize<D>(deserializer: D) -> Result<IgnoredAny, D::Error> fn deserialize<D>(deserializer: D) -> Result<IgnoredAny, D::Error>
where D: Deserializer, where D: Deserializer
{ {
struct IgnoredAnyVisitor; struct IgnoredAnyVisitor;
@@ -1241,7 +1240,7 @@ impl Deserialize for IgnoredAny {
#[inline] #[inline]
fn visit_str<E>(self, _: &str) -> Result<IgnoredAny, E> fn visit_str<E>(self, _: &str) -> Result<IgnoredAny, E>
where E: Error, where E: Error
{ {
Ok(IgnoredAny) Ok(IgnoredAny)
} }
@@ -1253,14 +1252,14 @@ impl Deserialize for IgnoredAny {
#[inline] #[inline]
fn visit_some<D>(self, _: D) -> Result<IgnoredAny, D::Error> fn visit_some<D>(self, _: D) -> Result<IgnoredAny, D::Error>
where D: Deserializer, where D: Deserializer
{ {
Ok(IgnoredAny) Ok(IgnoredAny)
} }
#[inline] #[inline]
fn visit_newtype_struct<D>(self, _: D) -> Result<IgnoredAny, D::Error> fn visit_newtype_struct<D>(self, _: D) -> Result<IgnoredAny, D::Error>
where D: Deserializer, where D: Deserializer
{ {
Ok(IgnoredAny) Ok(IgnoredAny)
} }
@@ -1272,7 +1271,7 @@ impl Deserialize for IgnoredAny {
#[inline] #[inline]
fn visit_seq<V>(self, mut visitor: V) -> Result<IgnoredAny, V::Error> fn visit_seq<V>(self, mut visitor: V) -> Result<IgnoredAny, V::Error>
where V: SeqVisitor, where V: SeqVisitor
{ {
while let Some(_) = try!(visitor.visit::<IgnoredAny>()) { while let Some(_) = try!(visitor.visit::<IgnoredAny>()) {
// Gobble // Gobble
@@ -1282,7 +1281,7 @@ impl Deserialize for IgnoredAny {
#[inline] #[inline]
fn visit_map<V>(self, mut visitor: V) -> Result<IgnoredAny, V::Error> fn visit_map<V>(self, mut visitor: V) -> Result<IgnoredAny, V::Error>
where V: MapVisitor, where V: MapVisitor
{ {
while let Some((_, _)) = try!(visitor.visit::<IgnoredAny, IgnoredAny>()) { while let Some((_, _)) = try!(visitor.visit::<IgnoredAny, IgnoredAny>()) {
// Gobble // Gobble
@@ -1292,7 +1291,7 @@ impl Deserialize for IgnoredAny {
#[inline] #[inline]
fn visit_bytes<E>(self, _: &[u8]) -> Result<IgnoredAny, E> fn visit_bytes<E>(self, _: &[u8]) -> Result<IgnoredAny, E>
where E: Error, where E: Error
{ {
Ok(IgnoredAny) Ok(IgnoredAny)
} }
+102 -93
View File
@@ -181,7 +181,10 @@ pub trait Error: Sized + error::Error {
write!(formatter, "invalid type: {}, expected {}", self.unexp, self.exp) write!(formatter, "invalid type: {}, expected {}", self.unexp, self.exp)
} }
} }
Error::custom(InvalidType { unexp: unexp, exp: exp }) Error::custom(InvalidType {
unexp: unexp,
exp: exp,
})
} }
/// Raised when a `Deserialize` receives a value of the right type but that /// Raised when a `Deserialize` receives a value of the right type but that
@@ -207,7 +210,10 @@ pub trait Error: Sized + error::Error {
write!(formatter, "invalid value: {}, expected {}", self.unexp, self.exp) write!(formatter, "invalid value: {}, expected {}", self.unexp, self.exp)
} }
} }
Error::custom(InvalidValue { unexp: unexp, exp: exp }) Error::custom(InvalidValue {
unexp: unexp,
exp: exp,
})
} }
/// Raised when deserializing a sequence or map and the input data contains /// Raised when deserializing a sequence or map and the input data contains
@@ -229,7 +235,10 @@ pub trait Error: Sized + error::Error {
write!(formatter, "invalid length {}, expected {}", self.len, self.exp) write!(formatter, "invalid length {}, expected {}", self.len, self.exp)
} }
} }
Error::custom(InvalidLength { len: len, exp: exp }) Error::custom(InvalidLength {
len: len,
exp: exp,
})
} }
/// Raised when a `Deserialize` enum type received a variant with an /// Raised when a `Deserialize` enum type received a variant with an
@@ -253,7 +262,10 @@ pub trait Error: Sized + error::Error {
} }
} }
} }
Error::custom(UnknownVariant { variant: variant, expected: expected }) Error::custom(UnknownVariant {
variant: variant,
expected: expected,
})
} }
/// Raised when a `Deserialize` struct type received a field with an /// Raised when a `Deserialize` struct type received a field with an
@@ -277,7 +289,10 @@ pub trait Error: Sized + error::Error {
} }
} }
} }
Error::custom(UnknownField { field: field, expected: expected }) Error::custom(UnknownField {
field: field,
expected: expected,
})
} }
/// Raised when a `Deserialize` struct type expected to receive a required /// Raised when a `Deserialize` struct type expected to receive a required
@@ -470,7 +485,9 @@ pub trait Expected {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result; fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result;
} }
impl<T> Expected for T where T: Visitor { impl<T> Expected for T
where T: Visitor
{
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.expecting(formatter) self.expecting(formatter)
} }
@@ -521,8 +538,7 @@ pub trait Deserialize: Sized {
/// manual for more information about how to implement this method. /// manual for more information about how to implement this method.
/// ///
/// [impl-deserialize]: https://serde.rs/impl-deserialize.html /// [impl-deserialize]: https://serde.rs/impl-deserialize.html
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer;
where D: Deserializer;
} }
/// `DeserializeSeed` is the stateful form of the `Deserialize` trait. If you /// `DeserializeSeed` is the stateful form of the `Deserialize` trait. If you
@@ -670,8 +686,7 @@ pub trait DeserializeSeed: Sized {
/// Equivalent to the more common `Deserialize::deserialize` method, except /// Equivalent to the more common `Deserialize::deserialize` method, except
/// with some initial piece of data (the seed) passed in. /// with some initial piece of data (the seed) passed in.
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer;
where D: Deserializer;
} }
impl<T> DeserializeSeed for PhantomData<T> impl<T> DeserializeSeed for PhantomData<T>
@@ -784,56 +799,43 @@ pub trait Deserializer: Sized {
/// `Deserializer::deserialize` means your data type will be able to /// `Deserializer::deserialize` means your data type will be able to
/// deserialize from self-describing formats only, ruling out Bincode and /// deserialize from self-describing formats only, ruling out Bincode and
/// many others. /// many others.
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a `bool` value. /// Hint that the `Deserialize` type is expecting a `bool` value.
fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a `u8` value. /// Hint that the `Deserialize` type is expecting a `u8` value.
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a `u16` value. /// Hint that the `Deserialize` type is expecting a `u16` value.
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a `u32` value. /// Hint that the `Deserialize` type is expecting a `u32` value.
fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a `u64` value. /// Hint that the `Deserialize` type is expecting a `u64` value.
fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting an `i8` value. /// Hint that the `Deserialize` type is expecting an `i8` value.
fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting an `i16` value. /// Hint that the `Deserialize` type is expecting an `i16` value.
fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting an `i32` value. /// Hint that the `Deserialize` type is expecting an `i32` value.
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting an `i64` value. /// Hint that the `Deserialize` type is expecting an `i64` value.
fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a `f32` value. /// Hint that the `Deserialize` type is expecting a `f32` value.
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a `f64` value. /// Hint that the `Deserialize` type is expecting a `f64` value.
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a `char` value. /// Hint that the `Deserialize` type is expecting a `char` value.
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a string value and does /// Hint that the `Deserialize` type is expecting a string value and does
/// not benefit from taking ownership of buffered data owned by the /// not benefit from taking ownership of buffered data owned by the
@@ -842,8 +844,7 @@ pub trait Deserializer: Sized {
/// If the `Visitor` would benefit from taking ownership of `String` data, /// If the `Visitor` would benefit from taking ownership of `String` data,
/// indiciate this to the `Deserializer` by using `deserialize_string` /// indiciate this to the `Deserializer` by using `deserialize_string`
/// instead. /// instead.
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a string value and would /// Hint that the `Deserialize` type is expecting a string value and would
/// benefit from taking ownership of buffered data owned by the /// benefit from taking ownership of buffered data owned by the
@@ -852,8 +853,7 @@ pub trait Deserializer: Sized {
/// If the `Visitor` would not benefit from taking ownership of `String` /// If the `Visitor` would not benefit from taking ownership of `String`
/// data, indicate that to the `Deserializer` by using `deserialize_str` /// data, indicate that to the `Deserializer` by using `deserialize_str`
/// instead. /// instead.
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a byte array and does not /// Hint that the `Deserialize` type is expecting a byte array and does not
/// benefit from taking ownership of buffered data owned by the /// benefit from taking ownership of buffered data owned by the
@@ -862,8 +862,7 @@ pub trait Deserializer: Sized {
/// If the `Visitor` would benefit from taking ownership of `Vec<u8>` data, /// If the `Visitor` would benefit from taking ownership of `Vec<u8>` data,
/// indicate this to the `Deserializer` by using `deserialize_byte_buf` /// indicate this to the `Deserializer` by using `deserialize_byte_buf`
/// instead. /// instead.
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a byte array and would /// Hint that the `Deserialize` type is expecting a byte array and would
/// benefit from taking ownership of buffered data owned by the /// benefit from taking ownership of buffered data owned by the
@@ -872,44 +871,43 @@ pub trait Deserializer: Sized {
/// If the `Visitor` would not benefit from taking ownership of `Vec<u8>` /// If the `Visitor` would not benefit from taking ownership of `Vec<u8>`
/// data, indicate that to the `Deserializer` by using `deserialize_bytes` /// data, indicate that to the `Deserializer` by using `deserialize_bytes`
/// instead. /// instead.
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting an optional value. /// Hint that the `Deserialize` type is expecting an optional value.
/// ///
/// This allows deserializers that encode an optional value as a nullable /// This allows deserializers that encode an optional value as a nullable
/// value to convert the null value into `None` and a regular value into /// value to convert the null value into `None` and a regular value into
/// `Some(value)`. /// `Some(value)`.
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a unit value. /// Hint that the `Deserialize` type is expecting a unit value.
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a unit struct with a /// Hint that the `Deserialize` type is expecting a unit struct with a
/// particular name. /// particular name.
fn deserialize_unit_struct<V>(self, fn deserialize_unit_struct<V>(self,
name: &'static str, name: &'static str,
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
-> Result<V::Value, Self::Error>
where V: Visitor; where V: Visitor;
/// Hint that the `Deserialize` type is expecting a newtype struct with a /// Hint that the `Deserialize` type is expecting a newtype struct with a
/// particular name. /// particular name.
fn deserialize_newtype_struct<V>(self, fn deserialize_newtype_struct<V>(self,
name: &'static str, name: &'static str,
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
-> Result<V::Value, Self::Error>
where V: Visitor; where V: Visitor;
/// Hint that the `Deserialize` type is expecting a sequence of values. /// Hint that the `Deserialize` type is expecting a sequence of values.
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a sequence of values and /// Hint that the `Deserialize` type is expecting a sequence of values and
/// knows how many values there are without looking at the serialized data. /// knows how many values there are without looking at the serialized data.
fn deserialize_seq_fixed_size<V>(self, fn deserialize_seq_fixed_size<V>(self,
len: usize, len: usize,
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
-> Result<V::Value, Self::Error>
where V: Visitor; where V: Visitor;
/// Hint that the `Deserialize` type is expecting a tuple value with a /// Hint that the `Deserialize` type is expecting a tuple value with a
@@ -922,19 +920,20 @@ pub trait Deserializer: Sized {
fn deserialize_tuple_struct<V>(self, fn deserialize_tuple_struct<V>(self,
name: &'static str, name: &'static str,
len: usize, len: usize,
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
-> Result<V::Value, Self::Error>
where V: Visitor; where V: Visitor;
/// Hint that the `Deserialize` type is expecting a map of key-value pairs. /// Hint that the `Deserialize` type is expecting a map of key-value pairs.
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor;
where V: Visitor;
/// Hint that the `Deserialize` type is expecting a struct with a particular /// Hint that the `Deserialize` type is expecting a struct with a particular
/// name and fields. /// name and fields.
fn deserialize_struct<V>(self, fn deserialize_struct<V>(self,
name: &'static str, name: &'static str,
fields: &'static [&'static str], fields: &'static [&'static str],
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
-> Result<V::Value, Self::Error>
where V: Visitor; where V: Visitor;
/// Hint that the `Deserialize` type is expecting the name of a struct /// Hint that the `Deserialize` type is expecting the name of a struct
@@ -947,7 +946,8 @@ pub trait Deserializer: Sized {
fn deserialize_enum<V>(self, fn deserialize_enum<V>(self,
name: &'static str, name: &'static str,
variants: &'static [&'static str], variants: &'static [&'static str],
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
-> Result<V::Value, Self::Error>
where V: Visitor; where V: Visitor;
/// Hint that the `Deserialize` type needs to deserialize a value whose type /// Hint that the `Deserialize` type needs to deserialize a value whose type
@@ -1016,77 +1016,77 @@ pub trait Visitor: Sized {
/// Deserialize a `bool` into a `Value`. /// Deserialize a `bool` into a `Value`.
fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E> fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
Err(Error::invalid_type(Unexpected::Bool(v), &self)) Err(Error::invalid_type(Unexpected::Bool(v), &self))
} }
/// Deserialize an `i8` into a `Value`. /// Deserialize an `i8` into a `Value`.
fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E> fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_i64(v as i64) self.visit_i64(v as i64)
} }
/// Deserialize an `i16` into a `Value`. /// Deserialize an `i16` into a `Value`.
fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E> fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_i64(v as i64) self.visit_i64(v as i64)
} }
/// Deserialize an `i32` into a `Value`. /// Deserialize an `i32` into a `Value`.
fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E> fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_i64(v as i64) self.visit_i64(v as i64)
} }
/// Deserialize an `i64` into a `Value`. /// Deserialize an `i64` into a `Value`.
fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E> fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
Err(Error::invalid_type(Unexpected::Signed(v), &self)) Err(Error::invalid_type(Unexpected::Signed(v), &self))
} }
/// Deserialize a `u8` into a `Value`. /// Deserialize a `u8` into a `Value`.
fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E> fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_u64(v as u64) self.visit_u64(v as u64)
} }
/// Deserialize a `u16` into a `Value`. /// Deserialize a `u16` into a `Value`.
fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E> fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_u64(v as u64) self.visit_u64(v as u64)
} }
/// Deserialize a `u32` into a `Value`. /// Deserialize a `u32` into a `Value`.
fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E> fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_u64(v as u64) self.visit_u64(v as u64)
} }
/// Deserialize a `u64` into a `Value`. /// Deserialize a `u64` into a `Value`.
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E> fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
Err(Error::invalid_type(Unexpected::Unsigned(v), &self)) Err(Error::invalid_type(Unexpected::Unsigned(v), &self))
} }
/// Deserialize a `f32` into a `Value`. /// Deserialize a `f32` into a `Value`.
fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E> fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_f64(v as f64) self.visit_f64(v as f64)
} }
/// Deserialize a `f64` into a `Value`. /// Deserialize a `f64` into a `Value`.
fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E> fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
Err(Error::invalid_type(Unexpected::Float(v), &self)) Err(Error::invalid_type(Unexpected::Float(v), &self))
} }
@@ -1094,7 +1094,7 @@ pub trait Visitor: Sized {
/// Deserialize a `char` into a `Value`. /// Deserialize a `char` into a `Value`.
#[inline] #[inline]
fn visit_char<E>(self, v: char) -> Result<Self::Value, E> fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_str(::utils::encode_utf8(v).as_str()) self.visit_str(::utils::encode_utf8(v).as_str())
} }
@@ -1110,7 +1110,7 @@ pub trait Visitor: Sized {
/// It is never correct to implement `visit_string` without implementing /// It is never correct to implement `visit_string` without implementing
/// `visit_str`. Implement neither, both, or just `visit_str`. /// `visit_str`. Implement neither, both, or just `visit_str`.
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
Err(Error::invalid_type(Unexpected::Str(v), &self)) Err(Error::invalid_type(Unexpected::Str(v), &self))
} }
@@ -1132,28 +1132,28 @@ pub trait Visitor: Sized {
#[inline] #[inline]
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
fn visit_string<E>(self, v: String) -> Result<Self::Value, E> fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_str(&v) self.visit_str(&v)
} }
/// Deserialize a `()` into a `Value`. /// Deserialize a `()` into a `Value`.
fn visit_unit<E>(self) -> Result<Self::Value, E> fn visit_unit<E>(self) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
Err(Error::invalid_type(Unexpected::Unit, &self)) Err(Error::invalid_type(Unexpected::Unit, &self))
} }
/// Deserialize an absent optional `Value`. /// Deserialize an absent optional `Value`.
fn visit_none<E>(self) -> Result<Self::Value, E> fn visit_none<E>(self) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
Err(Error::invalid_type(Unexpected::Option, &self)) Err(Error::invalid_type(Unexpected::Option, &self))
} }
/// Deserialize a present optional `Value`. /// Deserialize a present optional `Value`.
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let _ = deserializer; let _ = deserializer;
Err(Error::invalid_type(Unexpected::Option, &self)) Err(Error::invalid_type(Unexpected::Option, &self))
@@ -1161,7 +1161,7 @@ pub trait Visitor: Sized {
/// Deserialize `Value` as a newtype struct. /// Deserialize `Value` as a newtype struct.
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where D: Deserializer, where D: Deserializer
{ {
let _ = deserializer; let _ = deserializer;
Err(Error::invalid_type(Unexpected::NewtypeStruct, &self)) Err(Error::invalid_type(Unexpected::NewtypeStruct, &self))
@@ -1169,7 +1169,7 @@ pub trait Visitor: Sized {
/// Deserialize `Value` as a sequence of elements. /// Deserialize `Value` as a sequence of elements.
fn visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error> fn visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error>
where V: SeqVisitor, where V: SeqVisitor
{ {
let _ = visitor; let _ = visitor;
Err(Error::invalid_type(Unexpected::Seq, &self)) Err(Error::invalid_type(Unexpected::Seq, &self))
@@ -1177,7 +1177,7 @@ pub trait Visitor: Sized {
/// Deserialize `Value` as a key-value map. /// Deserialize `Value` as a key-value map.
fn visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error> fn visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error>
where V: MapVisitor, where V: MapVisitor
{ {
let _ = visitor; let _ = visitor;
Err(Error::invalid_type(Unexpected::Map, &self)) Err(Error::invalid_type(Unexpected::Map, &self))
@@ -1185,7 +1185,7 @@ pub trait Visitor: Sized {
/// Deserialize `Value` as an enum. /// Deserialize `Value` as an enum.
fn visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error> fn visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error>
where V: EnumVisitor, where V: EnumVisitor
{ {
let _ = visitor; let _ = visitor;
Err(Error::invalid_type(Unexpected::Enum, &self)) Err(Error::invalid_type(Unexpected::Enum, &self))
@@ -1202,7 +1202,7 @@ pub trait Visitor: Sized {
/// It is never correct to implement `visit_byte_buf` without implementing /// It is never correct to implement `visit_byte_buf` without implementing
/// `visit_bytes`. Implement neither, both, or just `visit_bytes`. /// `visit_bytes`. Implement neither, both, or just `visit_bytes`.
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
let _ = v; let _ = v;
Err(Error::invalid_type(Unexpected::Bytes(v), &self)) Err(Error::invalid_type(Unexpected::Bytes(v), &self))
@@ -1225,7 +1225,7 @@ pub trait Visitor: Sized {
/// `Vec<u8>`. /// `Vec<u8>`.
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
where E: Error, where E: Error
{ {
self.visit_bytes(&v) self.visit_bytes(&v)
} }
@@ -1269,7 +1269,9 @@ pub trait SeqVisitor {
} }
} }
impl<'a, V> SeqVisitor for &'a mut V where V: SeqVisitor { impl<'a, V> SeqVisitor for &'a mut V
where V: SeqVisitor
{
type Error = V::Error; type Error = V::Error;
#[inline] #[inline]
@@ -1326,7 +1328,10 @@ pub trait MapVisitor {
/// `Deserialize` implementations should typically use `MapVisitor::visit` /// `Deserialize` implementations should typically use `MapVisitor::visit`
/// instead. /// instead.
#[inline] #[inline]
fn visit_seed<K, V>(&mut self, kseed: K, vseed: V) -> Result<Option<(K::Value, V::Value)>, Self::Error> fn visit_seed<K, V>(&mut self,
kseed: K,
vseed: V)
-> Result<Option<(K::Value, V::Value)>, Self::Error>
where K: DeserializeSeed, where K: DeserializeSeed,
V: DeserializeSeed V: DeserializeSeed
{ {
@@ -1335,7 +1340,7 @@ pub trait MapVisitor {
let value = try!(self.visit_value_seed(vseed)); let value = try!(self.visit_value_seed(vseed));
Ok(Some((key, value))) Ok(Some((key, value)))
} }
None => Ok(None) None => Ok(None),
} }
} }
@@ -1370,7 +1375,7 @@ pub trait MapVisitor {
#[inline] #[inline]
fn visit<K, V>(&mut self) -> Result<Option<(K, V)>, Self::Error> fn visit<K, V>(&mut self) -> Result<Option<(K, V)>, Self::Error>
where K: Deserialize, where K: Deserialize,
V: Deserialize, V: Deserialize
{ {
self.visit_seed(PhantomData, PhantomData) self.visit_seed(PhantomData, PhantomData)
} }
@@ -1382,7 +1387,9 @@ pub trait MapVisitor {
} }
} }
impl<'a, V_> MapVisitor for &'a mut V_ where V_: MapVisitor { impl<'a, V_> MapVisitor for &'a mut V_
where V_: MapVisitor
{
type Error = V_::Error; type Error = V_::Error;
#[inline] #[inline]
@@ -1400,7 +1407,10 @@ impl<'a, V_> MapVisitor for &'a mut V_ where V_: MapVisitor {
} }
#[inline] #[inline]
fn visit_seed<K, V>(&mut self, kseed: K, vseed: V) -> Result<Option<(K::Value, V::Value)>, Self::Error> fn visit_seed<K, V>(&mut self,
kseed: K,
vseed: V)
-> Result<Option<(K::Value, V::Value)>, Self::Error>
where K: DeserializeSeed, where K: DeserializeSeed,
V: DeserializeSeed V: DeserializeSeed
{ {
@@ -1410,7 +1420,7 @@ impl<'a, V_> MapVisitor for &'a mut V_ where V_: MapVisitor {
#[inline] #[inline]
fn visit<K, V>(&mut self) -> Result<Option<(K, V)>, V_::Error> fn visit<K, V>(&mut self) -> Result<Option<(K, V)>, V_::Error>
where K: Deserialize, where K: Deserialize,
V: Deserialize, V: Deserialize
{ {
(**self).visit() (**self).visit()
} }
@@ -1446,7 +1456,7 @@ pub trait EnumVisitor: Sized {
type Error: Error; type Error: Error;
/// The `Visitor` that will be used to deserialize the content of the enum /// The `Visitor` that will be used to deserialize the content of the enum
/// variant. /// variant.
type Variant: VariantVisitor<Error=Self::Error>; type Variant: VariantVisitor<Error = Self::Error>;
/// `visit_variant` is called to identify which variant to deserialize. /// `visit_variant` is called to identify which variant to deserialize.
/// ///
@@ -1539,9 +1549,7 @@ pub trait VariantVisitor: Sized {
/// Err(Error::invalid_type(unexp, &"tuple variant")) /// Err(Error::invalid_type(unexp, &"tuple variant"))
/// } /// }
/// ``` /// ```
fn visit_tuple<V>(self, fn visit_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
len: usize,
visitor: V) -> Result<V::Value, Self::Error>
where V: Visitor; where V: Visitor;
/// Called when deserializing a struct-like variant. /// Called when deserializing a struct-like variant.
@@ -1564,7 +1572,8 @@ pub trait VariantVisitor: Sized {
/// ``` /// ```
fn visit_struct<V>(self, fn visit_struct<V>(self,
fields: &'static [&'static str], fields: &'static [&'static str],
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
-> Result<V::Value, Self::Error>
where V: Visitor; where V: Visitor;
} }
+3 -8
View File
@@ -3,14 +3,9 @@ use core::marker::PhantomData;
use de::{Deserialize, Deserializer, Error, Visitor}; use de::{Deserialize, Deserializer, Error, Visitor};
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
pub use de::content::{ pub use de::content::{Content, ContentRefDeserializer, ContentDeserializer, TaggedContentVisitor,
Content, TagOrContentField, TagOrContentFieldVisitor, InternallyTaggedUnitVisitor,
ContentRefDeserializer, UntaggedUnitVisitor};
ContentDeserializer,
TaggedContentVisitor,
InternallyTaggedUnitVisitor,
UntaggedUnitVisitor,
};
/// If the missing field is of type `Option<T>` then treat is as `None`, /// If the missing field is of type `Option<T>` then treat is as `None`,
/// otherwise it is an error. /// otherwise it is an error.
+100 -110
View File
@@ -1,31 +1,15 @@
//! This module supports deserializing from primitives with the `ValueDeserializer` trait. //! This module supports deserializing from primitives with the `ValueDeserializer` trait.
#[cfg(feature = "std")] #[cfg(feature = "std")]
use std::collections::{ use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, btree_map, btree_set, hash_map,
BTreeMap, hash_set};
BTreeSet,
HashMap,
HashSet,
btree_map,
btree_set,
hash_map,
hash_set,
};
#[cfg(feature = "std")] #[cfg(feature = "std")]
use std::borrow::Cow; use std::borrow::Cow;
#[cfg(feature = "std")] #[cfg(feature = "std")]
use std::vec; use std::vec;
#[cfg(all(feature = "collections", not(feature = "std")))] #[cfg(all(feature = "collections", not(feature = "std")))]
use collections::{ use collections::{BTreeMap, BTreeSet, Vec, String, btree_map, btree_set, vec};
BTreeMap,
BTreeSet,
Vec,
String,
btree_map,
btree_set,
vec,
};
#[cfg(all(feature = "collections", not(feature = "std")))] #[cfg(all(feature = "collections", not(feature = "std")))]
use collections::borrow::Cow; use collections::borrow::Cow;
#[cfg(all(feature = "collections", not(feature = "std")))] #[cfg(all(feature = "collections", not(feature = "std")))]
@@ -41,7 +25,7 @@ use std::error;
use error; use error;
use core::fmt::{self, Display}; use core::fmt::{self, Display};
use core::iter::{self, Iterator}; use core::iter::{self, Iterator};
use core::marker::PhantomData; use core::marker::PhantomData;
use de::{self, Expected, SeqVisitor}; use de::{self, Expected, SeqVisitor};
@@ -63,16 +47,12 @@ type ErrorImpl = ();
impl de::Error for Error { impl de::Error for Error {
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
fn custom<T: Display>(msg: T) -> Self { fn custom<T: Display>(msg: T) -> Self {
Error { Error { err: msg.to_string().into_boxed_str() }
err: msg.to_string().into_boxed_str(),
}
} }
#[cfg(not(any(feature = "std", feature = "collections")))] #[cfg(not(any(feature = "std", feature = "collections")))]
fn custom<T: Display>(_msg: T) -> Self { fn custom<T: Display>(_msg: T) -> Self {
Error { Error { err: () }
err: (),
}
} }
} }
@@ -105,7 +85,7 @@ impl error::Error for Error {
/// This trait converts primitive types into a deserializer. /// This trait converts primitive types into a deserializer.
pub trait ValueDeserializer<E: de::Error = Error> { pub trait ValueDeserializer<E: de::Error = Error> {
/// The actual deserializer type. /// The actual deserializer type.
type Deserializer: de::Deserializer<Error=E>; type Deserializer: de::Deserializer<Error = E>;
/// Convert this value into a deserializer. /// Convert this value into a deserializer.
fn into_deserializer(self) -> Self::Deserializer; fn into_deserializer(self) -> Self::Deserializer;
@@ -114,14 +94,12 @@ pub trait ValueDeserializer<E: de::Error = Error> {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
impl<E> ValueDeserializer<E> for () impl<E> ValueDeserializer<E> for ()
where E: de::Error, where E: de::Error
{ {
type Deserializer = UnitDeserializer<E>; type Deserializer = UnitDeserializer<E>;
fn into_deserializer(self) -> UnitDeserializer<E> { fn into_deserializer(self) -> UnitDeserializer<E> {
UnitDeserializer { UnitDeserializer { marker: PhantomData }
marker: PhantomData,
}
} }
} }
@@ -142,13 +120,13 @@ impl<E> de::Deserializer for UnitDeserializer<E>
} }
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
visitor.visit_unit() visitor.visit_unit()
} }
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
visitor.visit_none() visitor.visit_none()
} }
@@ -221,7 +199,7 @@ pub struct StrDeserializer<'a, E> {
} }
impl<'a, E> ValueDeserializer<E> for &'a str impl<'a, E> ValueDeserializer<E> for &'a str
where E: de::Error, where E: de::Error
{ {
type Deserializer = StrDeserializer<'a, E>; type Deserializer = StrDeserializer<'a, E>;
@@ -234,21 +212,22 @@ impl<'a, E> ValueDeserializer<E> for &'a str
} }
impl<'a, E> de::Deserializer for StrDeserializer<'a, E> impl<'a, E> de::Deserializer for StrDeserializer<'a, E>
where E: de::Error, where E: de::Error
{ {
type Error = E; type Error = E;
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
visitor.visit_str(self.value) visitor.visit_str(self.value)
} }
fn deserialize_enum<V>(self, fn deserialize_enum<V>(self,
_name: &str, _name: &str,
_variants: &'static [&'static str], _variants: &'static [&'static str],
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
where V: de::Visitor, -> Result<V::Value, Self::Error>
where V: de::Visitor
{ {
visitor.visit_enum(self) visitor.visit_enum(self)
} }
@@ -261,13 +240,13 @@ impl<'a, E> de::Deserializer for StrDeserializer<'a, E>
} }
impl<'a, E> de::EnumVisitor for StrDeserializer<'a, E> impl<'a, E> de::EnumVisitor for StrDeserializer<'a, E>
where E: de::Error, where E: de::Error
{ {
type Error = E; type Error = E;
type Variant = private::UnitOnly<E>; type Variant = private::UnitOnly<E>;
fn visit_variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> fn visit_variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
where T: de::DeserializeSeed, where T: de::DeserializeSeed
{ {
seed.deserialize(self).map(private::unit_only) seed.deserialize(self).map(private::unit_only)
} }
@@ -284,7 +263,7 @@ pub struct StringDeserializer<E> {
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<E> ValueDeserializer<E> for String impl<E> ValueDeserializer<E> for String
where E: de::Error, where E: de::Error
{ {
type Deserializer = StringDeserializer<E>; type Deserializer = StringDeserializer<E>;
@@ -298,21 +277,22 @@ impl<E> ValueDeserializer<E> for String
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<E> de::Deserializer for StringDeserializer<E> impl<E> de::Deserializer for StringDeserializer<E>
where E: de::Error, where E: de::Error
{ {
type Error = E; type Error = E;
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
visitor.visit_string(self.value) visitor.visit_string(self.value)
} }
fn deserialize_enum<V>(self, fn deserialize_enum<V>(self,
_name: &str, _name: &str,
_variants: &'static [&'static str], _variants: &'static [&'static str],
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
where V: de::Visitor, -> Result<V::Value, Self::Error>
where V: de::Visitor
{ {
visitor.visit_enum(self) visitor.visit_enum(self)
} }
@@ -326,13 +306,13 @@ impl<E> de::Deserializer for StringDeserializer<E>
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<'a, E> de::EnumVisitor for StringDeserializer<E> impl<'a, E> de::EnumVisitor for StringDeserializer<E>
where E: de::Error, where E: de::Error
{ {
type Error = E; type Error = E;
type Variant = private::UnitOnly<E>; type Variant = private::UnitOnly<E>;
fn visit_variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> fn visit_variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
where T: de::DeserializeSeed, where T: de::DeserializeSeed
{ {
seed.deserialize(self).map(private::unit_only) seed.deserialize(self).map(private::unit_only)
} }
@@ -349,7 +329,7 @@ pub struct CowStrDeserializer<'a, E> {
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<'a, E> ValueDeserializer<E> for Cow<'a, str> impl<'a, E> ValueDeserializer<E> for Cow<'a, str>
where E: de::Error, where E: de::Error
{ {
type Deserializer = CowStrDeserializer<'a, E>; type Deserializer = CowStrDeserializer<'a, E>;
@@ -363,12 +343,12 @@ impl<'a, E> ValueDeserializer<E> for Cow<'a, str>
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<'a, E> de::Deserializer for CowStrDeserializer<'a, E> impl<'a, E> de::Deserializer for CowStrDeserializer<'a, E>
where E: de::Error, where E: de::Error
{ {
type Error = E; type Error = E;
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
match self.value { match self.value {
Cow::Borrowed(string) => visitor.visit_str(string), Cow::Borrowed(string) => visitor.visit_str(string),
@@ -377,10 +357,11 @@ impl<'a, E> de::Deserializer for CowStrDeserializer<'a, E>
} }
fn deserialize_enum<V>(self, fn deserialize_enum<V>(self,
_name: &str, _name: &str,
_variants: &'static [&'static str], _variants: &'static [&'static str],
visitor: V) -> Result<V::Value, Self::Error> visitor: V)
where V: de::Visitor, -> Result<V::Value, Self::Error>
where V: de::Visitor
{ {
visitor.visit_enum(self) visitor.visit_enum(self)
} }
@@ -394,13 +375,13 @@ impl<'a, E> de::Deserializer for CowStrDeserializer<'a, E>
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<'a, E> de::EnumVisitor for CowStrDeserializer<'a, E> impl<'a, E> de::EnumVisitor for CowStrDeserializer<'a, E>
where E: de::Error, where E: de::Error
{ {
type Error = E; type Error = E;
type Variant = private::UnitOnly<E>; type Variant = private::UnitOnly<E>;
fn visit_variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> fn visit_variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
where T: de::DeserializeSeed, where T: de::DeserializeSeed
{ {
seed.deserialize(self).map(private::unit_only) seed.deserialize(self).map(private::unit_only)
} }
@@ -417,7 +398,7 @@ pub struct SeqDeserializer<I, E> {
impl<I, E> SeqDeserializer<I, E> impl<I, E> SeqDeserializer<I, E>
where I: Iterator, where I: Iterator,
E: de::Error, E: de::Error
{ {
/// Construct a new `SeqDeserializer<I>`. /// Construct a new `SeqDeserializer<I>`.
pub fn new(iter: I) -> Self { pub fn new(iter: I) -> Self {
@@ -446,14 +427,14 @@ impl<I, E> SeqDeserializer<I, E>
} }
impl<I, T, E> de::Deserializer for SeqDeserializer<I, E> impl<I, T, E> de::Deserializer for SeqDeserializer<I, E>
where I: Iterator<Item=T>, where I: Iterator<Item = T>,
T: ValueDeserializer<E>, T: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
type Error = E; type Error = E;
fn deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
let v = try!(visitor.visit_seq(&mut self)); let v = try!(visitor.visit_seq(&mut self));
try!(self.end()); try!(self.end());
@@ -468,9 +449,9 @@ impl<I, T, E> de::Deserializer for SeqDeserializer<I, E>
} }
impl<I, T, E> de::SeqVisitor for SeqDeserializer<I, E> impl<I, T, E> de::SeqVisitor for SeqDeserializer<I, E>
where I: Iterator<Item=T>, where I: Iterator<Item = T>,
T: ValueDeserializer<E>, T: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
type Error = E; type Error = E;
@@ -508,7 +489,7 @@ impl Expected for ExpectedInSeq {
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<T, E> ValueDeserializer<E> for Vec<T> impl<T, E> ValueDeserializer<E> for Vec<T>
where T: ValueDeserializer<E>, where T: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
type Deserializer = SeqDeserializer<vec::IntoIter<T>, E>; type Deserializer = SeqDeserializer<vec::IntoIter<T>, E>;
@@ -520,7 +501,7 @@ impl<T, E> ValueDeserializer<E> for Vec<T>
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<T, E> ValueDeserializer<E> for BTreeSet<T> impl<T, E> ValueDeserializer<E> for BTreeSet<T>
where T: ValueDeserializer<E> + Eq + Ord, where T: ValueDeserializer<E> + Eq + Ord,
E: de::Error, E: de::Error
{ {
type Deserializer = SeqDeserializer<btree_set::IntoIter<T>, E>; type Deserializer = SeqDeserializer<btree_set::IntoIter<T>, E>;
@@ -532,7 +513,7 @@ impl<T, E> ValueDeserializer<E> for BTreeSet<T>
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl<T, E> ValueDeserializer<E> for HashSet<T> impl<T, E> ValueDeserializer<E> for HashSet<T>
where T: ValueDeserializer<E> + Eq + Hash, where T: ValueDeserializer<E> + Eq + Hash,
E: de::Error, E: de::Error
{ {
type Deserializer = SeqDeserializer<hash_set::IntoIter<T>, E>; type Deserializer = SeqDeserializer<hash_set::IntoIter<T>, E>;
@@ -551,20 +532,20 @@ pub struct SeqVisitorDeserializer<V_, E> {
impl<V_, E> SeqVisitorDeserializer<V_, E> impl<V_, E> SeqVisitorDeserializer<V_, E>
where V_: de::SeqVisitor<Error = E>, where V_: de::SeqVisitor<Error = E>,
E: de::Error, E: de::Error
{ {
/// Construct a new `SeqVisitorDeserializer<V_, E>`. /// Construct a new `SeqVisitorDeserializer<V_, E>`.
pub fn new(visitor: V_) -> Self { pub fn new(visitor: V_) -> Self {
SeqVisitorDeserializer{ SeqVisitorDeserializer {
visitor: visitor, visitor: visitor,
marker: PhantomData marker: PhantomData,
} }
} }
} }
impl<V_, E> de::Deserializer for SeqVisitorDeserializer<V_, E> impl<V_, E> de::Deserializer for SeqVisitorDeserializer<V_, E>
where V_: de::SeqVisitor<Error = E>, where V_: de::SeqVisitor<Error = E>,
E: de::Error, E: de::Error
{ {
type Error = E; type Error = E;
@@ -587,7 +568,7 @@ pub struct MapDeserializer<I, E>
I::Item: private::Pair, I::Item: private::Pair,
<I::Item as private::Pair>::First: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>, <I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
iter: iter::Fuse<I>, iter: iter::Fuse<I>,
value: Option<<I::Item as private::Pair>::Second>, value: Option<<I::Item as private::Pair>::Second>,
@@ -600,7 +581,7 @@ impl<I, E> MapDeserializer<I, E>
I::Item: private::Pair, I::Item: private::Pair,
<I::Item as private::Pair>::First: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>, <I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
/// Construct a new `MapDeserializer<I, K, V, E>`. /// Construct a new `MapDeserializer<I, K, V, E>`.
pub fn new(iter: I) -> Self { pub fn new(iter: I) -> Self {
@@ -628,7 +609,9 @@ impl<I, E> MapDeserializer<I, E>
} }
} }
fn next_pair(&mut self) -> Option<(<I::Item as private::Pair>::First, <I::Item as private::Pair>::Second)> { fn next_pair
(&mut self)
-> Option<(<I::Item as private::Pair>::First, <I::Item as private::Pair>::Second)> {
match self.iter.next() { match self.iter.next() {
Some(kv) => { Some(kv) => {
self.count += 1; self.count += 1;
@@ -644,12 +627,12 @@ impl<I, E> de::Deserializer for MapDeserializer<I, E>
I::Item: private::Pair, I::Item: private::Pair,
<I::Item as private::Pair>::First: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>, <I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
type Error = E; type Error = E;
fn deserialize<V_>(mut self, visitor: V_) -> Result<V_::Value, Self::Error> fn deserialize<V_>(mut self, visitor: V_) -> Result<V_::Value, Self::Error>
where V_: de::Visitor, where V_: de::Visitor
{ {
let value = try!(visitor.visit_map(&mut self)); let value = try!(visitor.visit_map(&mut self));
try!(self.end()); try!(self.end());
@@ -657,15 +640,18 @@ impl<I, E> de::Deserializer for MapDeserializer<I, E>
} }
fn deserialize_seq<V_>(mut self, visitor: V_) -> Result<V_::Value, Self::Error> fn deserialize_seq<V_>(mut self, visitor: V_) -> Result<V_::Value, Self::Error>
where V_: de::Visitor, where V_: de::Visitor
{ {
let value = try!(visitor.visit_seq(&mut self)); let value = try!(visitor.visit_seq(&mut self));
try!(self.end()); try!(self.end());
Ok(value) Ok(value)
} }
fn deserialize_seq_fixed_size<V_>(self, _len: usize, visitor: V_) -> Result<V_::Value, Self::Error> fn deserialize_seq_fixed_size<V_>(self,
where V_: de::Visitor, _len: usize,
visitor: V_)
-> Result<V_::Value, Self::Error>
where V_: de::Visitor
{ {
self.deserialize_seq(visitor) self.deserialize_seq(visitor)
} }
@@ -682,12 +668,12 @@ impl<I, E> de::MapVisitor for MapDeserializer<I, E>
I::Item: private::Pair, I::Item: private::Pair,
<I::Item as private::Pair>::First: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>, <I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
type Error = E; type Error = E;
fn visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> fn visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
where T: de::DeserializeSeed, where T: de::DeserializeSeed
{ {
match self.next_pair() { match self.next_pair() {
Some((key, value)) => { Some((key, value)) => {
@@ -699,7 +685,7 @@ impl<I, E> de::MapVisitor for MapDeserializer<I, E>
} }
fn visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> fn visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
where T: de::DeserializeSeed, where T: de::DeserializeSeed
{ {
let value = self.value.take(); let value = self.value.take();
// Panic because this indicates a bug in the program rather than an // Panic because this indicates a bug in the program rather than an
@@ -708,7 +694,10 @@ impl<I, E> de::MapVisitor for MapDeserializer<I, E>
seed.deserialize(value.into_deserializer()) seed.deserialize(value.into_deserializer())
} }
fn visit_seed<TK, TV>(&mut self, kseed: TK, vseed: TV) -> Result<Option<(TK::Value, TV::Value)>, Self::Error> fn visit_seed<TK, TV>(&mut self,
kseed: TK,
vseed: TV)
-> Result<Option<(TK::Value, TV::Value)>, Self::Error>
where TK: de::DeserializeSeed, where TK: de::DeserializeSeed,
TV: de::DeserializeSeed TV: de::DeserializeSeed
{ {
@@ -718,7 +707,7 @@ impl<I, E> de::MapVisitor for MapDeserializer<I, E>
let value = try!(vseed.deserialize(value.into_deserializer())); let value = try!(vseed.deserialize(value.into_deserializer()));
Ok(Some((key, value))) Ok(Some((key, value)))
} }
None => Ok(None) None => Ok(None),
} }
} }
@@ -732,12 +721,12 @@ impl<I, E> de::SeqVisitor for MapDeserializer<I, E>
I::Item: private::Pair, I::Item: private::Pair,
<I::Item as private::Pair>::First: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>, <I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
type Error = E; type Error = E;
fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
where T: de::DeserializeSeed, where T: de::DeserializeSeed
{ {
match self.next_pair() { match self.next_pair() {
Some((k, v)) => { Some((k, v)) => {
@@ -771,13 +760,13 @@ impl<A, B, E> de::Deserializer for PairDeserializer<A, B, E>
} }
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
self.deserialize_seq(visitor) self.deserialize_seq(visitor)
} }
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData); let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData);
let pair = try!(visitor.visit_seq(&mut pair_visitor)); let pair = try!(visitor.visit_seq(&mut pair_visitor));
@@ -792,7 +781,7 @@ impl<A, B, E> de::Deserializer for PairDeserializer<A, B, E>
} }
fn deserialize_seq_fixed_size<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_seq_fixed_size<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
if len == 2 { if len == 2 {
self.deserialize_seq(visitor) self.deserialize_seq(visitor)
@@ -809,12 +798,12 @@ struct PairVisitor<A, B, E>(Option<A>, Option<B>, PhantomData<E>);
impl<A, B, E> de::SeqVisitor for PairVisitor<A, B, E> impl<A, B, E> de::SeqVisitor for PairVisitor<A, B, E>
where A: ValueDeserializer<E>, where A: ValueDeserializer<E>,
B: ValueDeserializer<E>, B: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
type Error = E; type Error = E;
fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
where T: de::DeserializeSeed, where T: de::DeserializeSeed
{ {
if let Some(k) = self.0.take() { if let Some(k) = self.0.take() {
seed.deserialize(k.into_deserializer()).map(Some) seed.deserialize(k.into_deserializer()).map(Some)
@@ -855,7 +844,7 @@ impl Expected for ExpectedInMap {
impl<K, V, E> ValueDeserializer<E> for BTreeMap<K, V> impl<K, V, E> ValueDeserializer<E> for BTreeMap<K, V>
where K: ValueDeserializer<E> + Eq + Ord, where K: ValueDeserializer<E> + Eq + Ord,
V: ValueDeserializer<E>, V: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
type Deserializer = MapDeserializer<btree_map::IntoIter<K, V>, E>; type Deserializer = MapDeserializer<btree_map::IntoIter<K, V>, E>;
@@ -868,7 +857,7 @@ impl<K, V, E> ValueDeserializer<E> for BTreeMap<K, V>
impl<K, V, E> ValueDeserializer<E> for HashMap<K, V> impl<K, V, E> ValueDeserializer<E> for HashMap<K, V>
where K: ValueDeserializer<E> + Eq + Hash, where K: ValueDeserializer<E> + Eq + Hash,
V: ValueDeserializer<E>, V: ValueDeserializer<E>,
E: de::Error, E: de::Error
{ {
type Deserializer = MapDeserializer<hash_map::IntoIter<K, V>, E>; type Deserializer = MapDeserializer<hash_map::IntoIter<K, V>, E>;
@@ -887,20 +876,20 @@ pub struct MapVisitorDeserializer<V_, E> {
impl<V_, E> MapVisitorDeserializer<V_, E> impl<V_, E> MapVisitorDeserializer<V_, E>
where V_: de::MapVisitor<Error = E>, where V_: de::MapVisitor<Error = E>,
E: de::Error, E: de::Error
{ {
/// Construct a new `MapVisitorDeserializer<V_, E>`. /// Construct a new `MapVisitorDeserializer<V_, E>`.
pub fn new(visitor: V_) -> Self { pub fn new(visitor: V_) -> Self {
MapVisitorDeserializer{ MapVisitorDeserializer {
visitor: visitor, visitor: visitor,
marker: PhantomData marker: PhantomData,
} }
} }
} }
impl<V_, E> de::Deserializer for MapVisitorDeserializer<V_, E> impl<V_, E> de::Deserializer for MapVisitorDeserializer<V_, E>
where V_: de::MapVisitor<Error = E>, where V_: de::MapVisitor<Error = E>,
E: de::Error, E: de::Error
{ {
type Error = E; type Error = E;
@@ -918,7 +907,7 @@ impl<V_, E> de::Deserializer for MapVisitorDeserializer<V_, E>
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
impl<'a, E> ValueDeserializer<E> for bytes::Bytes<'a> impl<'a, E> ValueDeserializer<E> for bytes::Bytes<'a>
where E: de::Error, where E: de::Error
{ {
type Deserializer = BytesDeserializer<'a, E>; type Deserializer = BytesDeserializer<'a, E>;
@@ -942,7 +931,7 @@ impl<'a, E> de::Deserializer for BytesDeserializer<'a, E>
type Error = E; type Error = E;
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
visitor.visit_bytes(self.value) visitor.visit_bytes(self.value)
} }
@@ -958,7 +947,7 @@ impl<'a, E> de::Deserializer for BytesDeserializer<'a, E>
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<E> ValueDeserializer<E> for bytes::ByteBuf impl<E> ValueDeserializer<E> for bytes::ByteBuf
where E: de::Error, where E: de::Error
{ {
type Deserializer = ByteBufDeserializer<E>; type Deserializer = ByteBufDeserializer<E>;
@@ -979,12 +968,12 @@ pub struct ByteBufDeserializer<E> {
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<E> de::Deserializer for ByteBufDeserializer<E> impl<E> de::Deserializer for ByteBufDeserializer<E>
where E: de::Error, where E: de::Error
{ {
type Error = E; type Error = E;
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor, where V: de::Visitor
{ {
visitor.visit_byte_buf(self.value) visitor.visit_byte_buf(self.value)
} }
@@ -1020,14 +1009,12 @@ mod private {
} }
fn visit_newtype_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error> fn visit_newtype_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>
where T: de::DeserializeSeed, where T: de::DeserializeSeed
{ {
Err(de::Error::invalid_type(Unexpected::UnitVariant, &"newtype variant")) Err(de::Error::invalid_type(Unexpected::UnitVariant, &"newtype variant"))
} }
fn visit_tuple<V>(self, fn visit_tuple<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>
_len: usize,
_visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor where V: de::Visitor
{ {
Err(de::Error::invalid_type(Unexpected::UnitVariant, &"tuple variant")) Err(de::Error::invalid_type(Unexpected::UnitVariant, &"tuple variant"))
@@ -1035,7 +1022,8 @@ mod private {
fn visit_struct<V>(self, fn visit_struct<V>(self,
_fields: &'static [&'static str], _fields: &'static [&'static str],
_visitor: V) -> Result<V::Value, Self::Error> _visitor: V)
-> Result<V::Value, Self::Error>
where V: de::Visitor where V: de::Visitor
{ {
Err(de::Error::invalid_type(Unexpected::UnitVariant, &"struct variant")) Err(de::Error::invalid_type(Unexpected::UnitVariant, &"struct variant"))
@@ -1053,6 +1041,8 @@ mod private {
impl<A, B> Pair for (A, B) { impl<A, B> Pair for (A, B) {
type First = A; type First = A;
type Second = B; type Second = B;
fn split(self) -> (A, B) { self } fn split(self) -> (A, B) {
self
}
} }
} }
+3 -1
View File
@@ -11,5 +11,7 @@ pub trait Error: Debug + Display {
fn description(&self) -> &str; fn description(&self) -> &str;
/// The lower-level cause of this error, if any. /// The lower-level cause of this error, if any.
fn cause(&self) -> Option<&Error> { None } fn cause(&self) -> Option<&Error> {
None
}
} }
+24 -12
View File
@@ -4,13 +4,13 @@ use std::io;
use std::iter::Peekable; use std::iter::Peekable;
/// Iterator over a byte stream that tracks the current position's line and column. /// Iterator over a byte stream that tracks the current position's line and column.
pub struct LineColIterator<Iter: Iterator<Item=io::Result<u8>>> { pub struct LineColIterator<Iter: Iterator<Item = io::Result<u8>>> {
iter: Iter, iter: Iter,
line: usize, line: usize,
col: usize, col: usize,
} }
impl<Iter: Iterator<Item=io::Result<u8>>> LineColIterator<Iter> { impl<Iter: Iterator<Item = io::Result<u8>>> LineColIterator<Iter> {
/// Construct a new `LineColIterator<Iter>`. /// Construct a new `LineColIterator<Iter>`.
pub fn new(iter: Iter) -> LineColIterator<Iter> { pub fn new(iter: Iter) -> LineColIterator<Iter> {
LineColIterator { LineColIterator {
@@ -21,27 +21,39 @@ impl<Iter: Iterator<Item=io::Result<u8>>> LineColIterator<Iter> {
} }
/// Report the current line inside the iterator. /// Report the current line inside the iterator.
pub fn line(&self) -> usize { self.line } pub fn line(&self) -> usize {
self.line
}
/// Report the current column inside the iterator. /// Report the current column inside the iterator.
pub fn col(&self) -> usize { self.col } pub fn col(&self) -> usize {
self.col
}
/// Gets a reference to the underlying iterator. /// Gets a reference to the underlying iterator.
pub fn get_ref(&self) -> &Iter { &self.iter } pub fn get_ref(&self) -> &Iter {
&self.iter
}
/// Gets a mutable reference to the underlying iterator. /// Gets a mutable reference to the underlying iterator.
pub fn get_mut(&mut self) -> &mut Iter { &mut self.iter } pub fn get_mut(&mut self) -> &mut Iter {
&mut self.iter
}
/// Unwraps this `LineColIterator`, returning the underlying iterator. /// Unwraps this `LineColIterator`, returning the underlying iterator.
pub fn into_inner(self) -> Iter { self.iter } pub fn into_inner(self) -> Iter {
self.iter
}
} }
impl<Iter: Iterator<Item=io::Result<u8>>> LineColIterator<Peekable<Iter>> { impl<Iter: Iterator<Item = io::Result<u8>>> LineColIterator<Peekable<Iter>> {
/// peeks at the next value /// peeks at the next value
pub fn peek(&mut self) -> Option<&io::Result<u8>> { self.iter.peek() } pub fn peek(&mut self) -> Option<&io::Result<u8>> {
self.iter.peek()
}
} }
impl<Iter: Iterator<Item=io::Result<u8>>> Iterator for LineColIterator<Iter> { impl<Iter: Iterator<Item = io::Result<u8>>> Iterator for LineColIterator<Iter> {
type Item = io::Result<u8>; type Item = io::Result<u8>;
fn next(&mut self) -> Option<io::Result<u8>> { fn next(&mut self) -> Option<io::Result<u8>> {
match self.iter.next() { match self.iter.next() {
@@ -50,11 +62,11 @@ impl<Iter: Iterator<Item=io::Result<u8>>> Iterator for LineColIterator<Iter> {
self.line += 1; self.line += 1;
self.col = 0; self.col = 0;
Some(Ok(b'\n')) Some(Ok(b'\n'))
}, }
Some(Ok(c)) => { Some(Ok(c)) => {
self.col += 1; self.col += 1;
Some(Ok(c)) Some(Ok(c))
}, }
Some(Err(e)) => Some(Err(e)), Some(Err(e)) => Some(Err(e)),
} }
} }
+1 -1
View File
@@ -79,7 +79,7 @@ extern crate core as actual_core;
#[cfg(feature = "std")] #[cfg(feature = "std")]
mod core { mod core {
pub use std::{ops, hash, fmt, cmp, marker, mem, i8, i16, i32, i64, u8, u16, u32, u64, isize, pub use std::{ops, hash, fmt, cmp, marker, mem, i8, i16, i32, i64, u8, u16, u32, u64, isize,
usize, f32, f64, char, str, num, slice, iter, cell, default, result, option}; usize, f32, f64, char, str, num, slice, iter, cell, default, result, option};
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
pub use actual_core::nonzero; pub use actual_core::nonzero;
} }
+32
View File
@@ -188,3 +188,35 @@ macro_rules! forward_to_deserialize {
$(forward_to_deserialize_helper!{$func})* $(forward_to_deserialize_helper!{$func})*
}; };
} }
/// Seralize the `$value` that implements Display as a string,
/// when that string is statically known to never have more than
/// a constant `$MAX_LEN` bytes.
///
/// Panics if the Display impl tries to write more than `$MAX_LEN` bytes.
#[cfg(feature = "std")]
// Not exported
macro_rules! serialize_display_bounded_length {
($value: expr, $MAX_LEN: expr, $serializer: expr) => {
{
use std::io::Write;
let mut buffer: [u8; $MAX_LEN] = unsafe { ::std::mem::uninitialized() };
let remaining_len;
{
let mut remaining = &mut buffer[..];
write!(remaining, "{}", $value).unwrap();
remaining_len = remaining.len()
}
let written_len = buffer.len() - remaining_len;
let written = &buffer[..written_len];
// write! only provides std::fmt::Formatter to Display implementations,
// which has methods write_str and write_char but no method to write arbitrary bytes.
// Therefore, `written` is well-formed in UTF-8.
let written_str = unsafe {
::std::str::from_utf8_unchecked(written)
};
$serializer.serialize_str(written_str)
}
}
}
+635
View File
@@ -0,0 +1,635 @@
use core::marker::PhantomData;
#[cfg(all(not(feature = "std"), feature = "collections"))]
use collections::{String, Vec};
#[cfg(all(feature = "alloc", not(feature = "std")))]
use alloc::boxed::Box;
#[cfg(feature = "collections")]
use collections::borrow::ToOwned;
use ser::{self, Serialize, Serializer};
pub struct SerializeTupleVariantAsMapValue<M> {
map: M,
name: &'static str,
fields: Vec<Content>,
}
impl<M> SerializeTupleVariantAsMapValue<M> {
pub fn new(map: M, name: &'static str, len: usize) -> Self {
SerializeTupleVariantAsMapValue {
map: map,
name: name,
fields: Vec::with_capacity(len),
}
}
}
impl<M> ser::SerializeTupleVariant for SerializeTupleVariantAsMapValue<M>
where M: ser::SerializeMap
{
type Ok = M::Ok;
type Error = M::Error;
fn serialize_field<T: ?Sized + Serialize>(&mut self,
value: &T)
-> Result<(), M::Error>
{
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
self.fields.push(value);
Ok(())
}
fn end(mut self) -> Result<M::Ok, M::Error> {
try!(self.map.serialize_value(&Content::TupleStruct(self.name, self.fields)));
self.map.end()
}
}
pub struct SerializeStructVariantAsMapValue<M> {
map: M,
name: &'static str,
fields: Vec<(&'static str, Content)>,
}
impl<M> SerializeStructVariantAsMapValue<M> {
pub fn new(map: M, name: &'static str, len: usize) -> Self {
SerializeStructVariantAsMapValue {
map: map,
name: name,
fields: Vec::with_capacity(len),
}
}
}
impl<M> ser::SerializeStructVariant for SerializeStructVariantAsMapValue<M>
where M: ser::SerializeMap
{
type Ok = M::Ok;
type Error = M::Error;
fn serialize_field<T: ?Sized + Serialize>(&mut self,
key: &'static str,
value: &T)
-> Result<(), M::Error>
{
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
self.fields.push((key, value));
Ok(())
}
fn end(mut self) -> Result<M::Ok, M::Error> {
try!(self.map.serialize_value(&Content::Struct(self.name, self.fields)));
self.map.end()
}
}
#[derive(Debug)]
enum Content {
Bool(bool),
U8(u8),
U16(u16),
U32(u32),
U64(u64),
I8(i8),
I16(i16),
I32(i32),
I64(i64),
F32(f32),
F64(f64),
Char(char),
String(String),
Bytes(Vec<u8>),
None,
Some(Box<Content>),
Unit,
UnitStruct(&'static str),
UnitVariant(&'static str, usize, &'static str),
NewtypeStruct(&'static str, Box<Content>),
NewtypeVariant(&'static str, usize, &'static str, Box<Content>),
Seq(Vec<Content>),
SeqFixedSize(Vec<Content>),
Tuple(Vec<Content>),
TupleStruct(&'static str, Vec<Content>),
TupleVariant(&'static str, usize, &'static str, Vec<Content>),
Map(Vec<(Content, Content)>),
Struct(&'static str, Vec<(&'static str, Content)>),
StructVariant(&'static str, usize, &'static str, Vec<(&'static str, Content)>),
}
impl Serialize for Content {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer
{
match *self {
Content::Bool(b) => serializer.serialize_bool(b),
Content::U8(u) => serializer.serialize_u8(u),
Content::U16(u) => serializer.serialize_u16(u),
Content::U32(u) => serializer.serialize_u32(u),
Content::U64(u) => serializer.serialize_u64(u),
Content::I8(i) => serializer.serialize_i8(i),
Content::I16(i) => serializer.serialize_i16(i),
Content::I32(i) => serializer.serialize_i32(i),
Content::I64(i) => serializer.serialize_i64(i),
Content::F32(f) => serializer.serialize_f32(f),
Content::F64(f) => serializer.serialize_f64(f),
Content::Char(c) => serializer.serialize_char(c),
Content::String(ref s) => serializer.serialize_str(s),
Content::Bytes(ref b) => serializer.serialize_bytes(b),
Content::None => serializer.serialize_none(),
Content::Some(ref c) => serializer.serialize_some(&**c),
Content::Unit => serializer.serialize_unit(),
Content::UnitStruct(n) => serializer.serialize_unit_struct(n),
Content::UnitVariant(n, i, v) => serializer.serialize_unit_variant(n, i, v),
Content::NewtypeStruct(n, ref c) => serializer.serialize_newtype_struct(n, &**c),
Content::NewtypeVariant(n, i, v, ref c) => serializer.serialize_newtype_variant(n, i, v, &**c),
Content::Seq(ref elements) => elements.serialize(serializer),
Content::SeqFixedSize(ref elements) => {
use ser::SerializeSeq;
let mut seq = try!(serializer.serialize_seq_fixed_size(elements.len()));
for e in elements {
try!(seq.serialize_element(e));
}
seq.end()
}
Content::Tuple(ref elements) => {
use ser::SerializeTuple;
let mut tuple = try!(serializer.serialize_tuple(elements.len()));
for e in elements {
try!(tuple.serialize_element(e));
}
tuple.end()
}
Content::TupleStruct(n, ref fields) => {
use ser::SerializeTupleStruct;
let mut ts = try!(serializer.serialize_tuple_struct(n, fields.len()));
for f in fields {
try!(ts.serialize_field(f));
}
ts.end()
}
Content::TupleVariant(n, i, v, ref fields) => {
use ser::SerializeTupleVariant;
let mut tv = try!(serializer.serialize_tuple_variant(n, i, v, fields.len()));
for f in fields {
try!(tv.serialize_field(f));
}
tv.end()
}
Content::Map(ref entries) => {
use ser::SerializeMap;
let mut map = try!(serializer.serialize_map(Some(entries.len())));
for &(ref k, ref v) in entries {
try!(map.serialize_entry(k, v));
}
map.end()
}
Content::Struct(n, ref fields) => {
use ser::SerializeStruct;
let mut s = try!(serializer.serialize_struct(n, fields.len()));
for &(k, ref v) in fields {
try!(s.serialize_field(k, v));
}
s.end()
}
Content::StructVariant(n, i, v, ref fields) => {
use ser::SerializeStructVariant;
let mut sv = try!(serializer.serialize_struct_variant(n, i, v, fields.len()));
for &(k, ref v) in fields {
try!(sv.serialize_field(k, v));
}
sv.end()
}
}
}
}
struct ContentSerializer<E> {
error: PhantomData<E>,
}
impl<E> ContentSerializer<E> {
fn new() -> Self {
ContentSerializer {
error: PhantomData,
}
}
}
impl<E> Serializer for ContentSerializer<E>
where E: ser::Error
{
type Ok = Content;
type Error = E;
type SerializeSeq = SerializeSeq<E>;
type SerializeTuple = SerializeTuple<E>;
type SerializeTupleStruct = SerializeTupleStruct<E>;
type SerializeTupleVariant = SerializeTupleVariant<E>;
type SerializeMap = SerializeMap<E>;
type SerializeStruct = SerializeStruct<E>;
type SerializeStructVariant = SerializeStructVariant<E>;
fn serialize_bool(self, v: bool) -> Result<Content, E> {
Ok(Content::Bool(v))
}
fn serialize_i8(self, v: i8) -> Result<Content, E> {
Ok(Content::I8(v))
}
fn serialize_i16(self, v: i16) -> Result<Content, E> {
Ok(Content::I16(v))
}
fn serialize_i32(self, v: i32) -> Result<Content, E> {
Ok(Content::I32(v))
}
fn serialize_i64(self, v: i64) -> Result<Content, E> {
Ok(Content::I64(v))
}
fn serialize_u8(self, v: u8) -> Result<Content, E> {
Ok(Content::U8(v))
}
fn serialize_u16(self, v: u16) -> Result<Content, E> {
Ok(Content::U16(v))
}
fn serialize_u32(self, v: u32) -> Result<Content, E> {
Ok(Content::U32(v))
}
fn serialize_u64(self, v: u64) -> Result<Content, E> {
Ok(Content::U64(v))
}
fn serialize_f32(self, v: f32) -> Result<Content, E> {
Ok(Content::F32(v))
}
fn serialize_f64(self, v: f64) -> Result<Content, E> {
Ok(Content::F64(v))
}
fn serialize_char(self, v: char) -> Result<Content, E> {
Ok(Content::Char(v))
}
fn serialize_str(self, value: &str) -> Result<Content, E> {
Ok(Content::String(value.to_owned()))
}
fn serialize_bytes(self, value: &[u8]) -> Result<Content, E> {
Ok(Content::Bytes(value.to_owned()))
}
fn serialize_none(self) -> Result<Content, E> {
Ok(Content::None)
}
fn serialize_some<T: ?Sized + Serialize>(self,
value: &T)
-> Result<Content, E> {
Ok(Content::Some(Box::new(try!(value.serialize(self)))))
}
fn serialize_unit(self) -> Result<Content, E> {
Ok(Content::Unit)
}
fn serialize_unit_struct(self,
name: &'static str)
-> Result<Content, E> {
Ok(Content::UnitStruct(name))
}
fn serialize_unit_variant(self,
name: &'static str,
variant_index: usize,
variant: &'static str)
-> Result<Content, E> {
Ok(Content::UnitVariant(name, variant_index, variant))
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(self,
name: &'static str,
value: &T)
-> Result<Content, E> {
Ok(Content::NewtypeStruct(name, Box::new(try!(value.serialize(self)))))
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(self,
name: &'static str,
variant_index: usize,
variant: &'static str,
value: &T)
-> Result<Content, E> {
Ok(Content::NewtypeVariant(name, variant_index, variant, Box::new(try!(value.serialize(self)))))
}
fn serialize_seq(self,
len: Option<usize>)
-> Result<Self::SerializeSeq, E> {
Ok(SerializeSeq {
fixed_size: false,
elements: Vec::with_capacity(len.unwrap_or(0)),
error: PhantomData,
})
}
fn serialize_seq_fixed_size(self,
size: usize)
-> Result<Self::SerializeSeq, E> {
Ok(SerializeSeq {
fixed_size: true,
elements: Vec::with_capacity(size),
error: PhantomData,
})
}
fn serialize_tuple(self,
len: usize)
-> Result<Self::SerializeTuple, E> {
Ok(SerializeTuple {
elements: Vec::with_capacity(len),
error: PhantomData,
})
}
fn serialize_tuple_struct(self,
name: &'static str,
len: usize)
-> Result<Self::SerializeTupleStruct, E> {
Ok(SerializeTupleStruct {
name: name,
fields: Vec::with_capacity(len),
error: PhantomData,
})
}
fn serialize_tuple_variant(self,
name: &'static str,
variant_index: usize,
variant: &'static str,
len: usize)
-> Result<Self::SerializeTupleVariant, E> {
Ok(SerializeTupleVariant {
name: name,
variant_index: variant_index,
variant: variant,
fields: Vec::with_capacity(len),
error: PhantomData,
})
}
fn serialize_map(self,
len: Option<usize>)
-> Result<Self::SerializeMap, E> {
Ok(SerializeMap {
entries: Vec::with_capacity(len.unwrap_or(0)),
key: None,
error: PhantomData,
})
}
fn serialize_struct(self,
name: &'static str,
len: usize)
-> Result<Self::SerializeStruct, E> {
Ok(SerializeStruct {
name: name,
fields: Vec::with_capacity(len),
error: PhantomData,
})
}
fn serialize_struct_variant(self,
name: &'static str,
variant_index: usize,
variant: &'static str,
len: usize)
-> Result<Self::SerializeStructVariant, E> {
Ok(SerializeStructVariant {
name: name,
variant_index: variant_index,
variant: variant,
fields: Vec::with_capacity(len),
error: PhantomData,
})
}
}
struct SerializeSeq<E> {
fixed_size: bool,
elements: Vec<Content>,
error: PhantomData<E>,
}
impl<E> ser::SerializeSeq for SerializeSeq<E>
where E: ser::Error
{
type Ok = Content;
type Error = E;
fn serialize_element<T: ?Sized + Serialize>(&mut self,
value: &T)
-> Result<(), E> {
let value = try!(value.serialize(ContentSerializer::<E>::new()));
self.elements.push(value);
Ok(())
}
fn end(self) -> Result<Content, E> {
Ok(if self.fixed_size {
Content::SeqFixedSize(self.elements)
} else {
Content::Seq(self.elements)
})
}
}
struct SerializeTuple<E> {
elements: Vec<Content>,
error: PhantomData<E>,
}
impl<E> ser::SerializeTuple for SerializeTuple<E>
where E: ser::Error
{
type Ok = Content;
type Error = E;
fn serialize_element<T: ?Sized + Serialize>(&mut self,
value: &T)
-> Result<(), E> {
let value = try!(value.serialize(ContentSerializer::<E>::new()));
self.elements.push(value);
Ok(())
}
fn end(self) -> Result<Content, E> {
Ok(Content::Tuple(self.elements))
}
}
struct SerializeTupleStruct<E> {
name: &'static str,
fields: Vec<Content>,
error: PhantomData<E>,
}
impl<E> ser::SerializeTupleStruct for SerializeTupleStruct<E>
where E: ser::Error
{
type Ok = Content;
type Error = E;
fn serialize_field<T: ?Sized + Serialize>(&mut self,
value: &T)
-> Result<(), E> {
let value = try!(value.serialize(ContentSerializer::<E>::new()));
self.fields.push(value);
Ok(())
}
fn end(self) -> Result<Content, E> {
Ok(Content::TupleStruct(self.name, self.fields))
}
}
struct SerializeTupleVariant<E> {
name: &'static str,
variant_index: usize,
variant: &'static str,
fields: Vec<Content>,
error: PhantomData<E>,
}
impl<E> ser::SerializeTupleVariant for SerializeTupleVariant<E>
where E: ser::Error
{
type Ok = Content;
type Error = E;
fn serialize_field<T: ?Sized + Serialize>(&mut self,
value: &T)
-> Result<(), E> {
let value = try!(value.serialize(ContentSerializer::<E>::new()));
self.fields.push(value);
Ok(())
}
fn end(self) -> Result<Content, E> {
Ok(Content::TupleVariant(self.name, self.variant_index, self.variant, self.fields))
}
}
struct SerializeMap<E> {
entries: Vec<(Content, Content)>,
key: Option<Content>,
error: PhantomData<E>,
}
impl<E> ser::SerializeMap for SerializeMap<E>
where E: ser::Error
{
type Ok = Content;
type Error = E;
fn serialize_key<T: ?Sized + Serialize>(&mut self,
key: &T)
-> Result<(), E> {
let key = try!(key.serialize(ContentSerializer::<E>::new()));
self.key = Some(key);
Ok(())
}
fn serialize_value<T: ?Sized + Serialize>(&mut self,
value: &T)
-> Result<(), E> {
let key = self.key.take().expect("serialize_value called before serialize_key");
let value = try!(value.serialize(ContentSerializer::<E>::new()));
self.entries.push((key, value));
Ok(())
}
fn end(self) -> Result<Content, E> {
Ok(Content::Map(self.entries))
}
fn serialize_entry<K: ?Sized + Serialize, V: ?Sized + Serialize>(&mut self,
key: &K,
value: &V)
-> Result<(), E> {
let key = try!(key.serialize(ContentSerializer::<E>::new()));
let value = try!(value.serialize(ContentSerializer::<E>::new()));
self.entries.push((key, value));
Ok(())
}
}
struct SerializeStruct<E> {
name: &'static str,
fields: Vec<(&'static str, Content)>,
error: PhantomData<E>,
}
impl<E> ser::SerializeStruct for SerializeStruct<E>
where E: ser::Error
{
type Ok = Content;
type Error = E;
fn serialize_field<T: ?Sized + Serialize>(&mut self,
key: &'static str,
value: &T)
-> Result<(), E> {
let value = try!(value.serialize(ContentSerializer::<E>::new()));
self.fields.push((key, value));
Ok(())
}
fn end(self) -> Result<Content, E> {
Ok(Content::Struct(self.name, self.fields))
}
}
struct SerializeStructVariant<E> {
name: &'static str,
variant_index: usize,
variant: &'static str,
fields: Vec<(&'static str, Content)>,
error: PhantomData<E>,
}
impl<E> ser::SerializeStructVariant for SerializeStructVariant<E>
where E: ser::Error
{
type Ok = Content;
type Error = E;
fn serialize_field<T: ?Sized + Serialize>(&mut self,
key: &'static str,
value: &T)
-> Result<(), E> {
let value = try!(value.serialize(ContentSerializer::<E>::new()));
self.fields.push((key, value));
Ok(())
}
fn end(self) -> Result<Content, E> {
Ok(Content::StructVariant(self.name, self.variant_index, self.variant, self.fields))
}
}
+56 -64
View File
@@ -4,25 +4,9 @@ use std::borrow::Cow;
use collections::borrow::Cow; use collections::borrow::Cow;
#[cfg(feature = "std")] #[cfg(feature = "std")]
use std::collections::{ use std::collections::{BinaryHeap, BTreeMap, BTreeSet, LinkedList, HashMap, HashSet, VecDeque};
BinaryHeap,
BTreeMap,
BTreeSet,
LinkedList,
HashMap,
HashSet,
VecDeque,
};
#[cfg(all(feature = "collections", not(feature = "std")))] #[cfg(all(feature = "collections", not(feature = "std")))]
use collections::{ use collections::{BinaryHeap, BTreeMap, BTreeSet, LinkedList, VecDeque, String, Vec};
BinaryHeap,
BTreeMap,
BTreeSet,
LinkedList,
VecDeque,
String,
Vec,
};
#[cfg(feature = "collections")] #[cfg(feature = "collections")]
use collections::borrow::ToOwned; use collections::borrow::ToOwned;
@@ -57,12 +41,7 @@ use core::marker::PhantomData;
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
use core::nonzero::{NonZero, Zeroable}; use core::nonzero::{NonZero, Zeroable};
use super::{ use super::{Serialize, SerializeSeq, SerializeTuple, Serializer};
Serialize,
SerializeSeq,
SerializeTuple,
Serializer,
};
#[cfg(feature = "std")] #[cfg(feature = "std")]
use super::Error; use super::Error;
@@ -101,7 +80,7 @@ impl_visit!(char, serialize_char);
impl Serialize for str { impl Serialize for str {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
serializer.serialize_str(self) serializer.serialize_str(self)
} }
@@ -111,7 +90,7 @@ impl Serialize for str {
impl Serialize for String { impl Serialize for String {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
(&self[..]).serialize(serializer) (&self[..]).serialize(serializer)
} }
@@ -124,7 +103,7 @@ impl<T> Serialize for Option<T>
{ {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
match *self { match *self {
Some(ref value) => serializer.serialize_some(value), Some(ref value) => serializer.serialize_some(value),
@@ -138,7 +117,7 @@ impl<T> Serialize for Option<T>
impl<T> Serialize for PhantomData<T> { impl<T> Serialize for PhantomData<T> {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
serializer.serialize_unit_struct("PhantomData") serializer.serialize_unit_struct("PhantomData")
} }
@@ -211,7 +190,7 @@ macro_rules! serialize_seq {
} }
impl<T> Serialize for [T] impl<T> Serialize for [T]
where T: Serialize, where T: Serialize
{ {
serialize_seq!(); serialize_seq!();
} }
@@ -225,7 +204,7 @@ impl<T> Serialize for BinaryHeap<T>
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<T> Serialize for BTreeSet<T> impl<T> Serialize for BTreeSet<T>
where T: Serialize + Ord, where T: Serialize + Ord
{ {
serialize_seq!(); serialize_seq!();
} }
@@ -233,14 +212,14 @@ impl<T> Serialize for BTreeSet<T>
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl<T, H> Serialize for HashSet<T, H> impl<T, H> Serialize for HashSet<T, H>
where T: Serialize + Eq + Hash, where T: Serialize + Eq + Hash,
H: BuildHasher, H: BuildHasher
{ {
serialize_seq!(); serialize_seq!();
} }
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<T> Serialize for LinkedList<T> impl<T> Serialize for LinkedList<T>
where T: Serialize, where T: Serialize
{ {
serialize_seq!(); serialize_seq!();
} }
@@ -262,11 +241,11 @@ impl<T> Serialize for VecDeque<T>
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
impl<A> Serialize for ops::Range<A> impl<A> Serialize for ops::Range<A>
where ops::Range<A>: ExactSizeIterator + iter::Iterator<Item = A> + Clone, where ops::Range<A>: ExactSizeIterator + iter::Iterator<Item = A> + Clone,
A: Serialize, A: Serialize
{ {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
let mut seq = try!(serializer.serialize_seq(Some(self.len()))); let mut seq = try!(serializer.serialize_seq(Some(self.len())));
for e in self.clone() { for e in self.clone() {
@@ -279,11 +258,11 @@ impl<A> Serialize for ops::Range<A>
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
impl<A> Serialize for ops::RangeInclusive<A> impl<A> Serialize for ops::RangeInclusive<A>
where ops::RangeInclusive<A>: ExactSizeIterator + iter::Iterator<Item = A> + Clone, where ops::RangeInclusive<A>: ExactSizeIterator + iter::Iterator<Item = A> + Clone,
A: Serialize, A: Serialize
{ {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
let mut seq = try!(serializer.serialize_seq(Some(self.len()))); let mut seq = try!(serializer.serialize_seq(Some(self.len())));
for e in self.clone() { for e in self.clone() {
@@ -298,7 +277,7 @@ impl<A> Serialize for ops::RangeInclusive<A>
impl Serialize for () { impl Serialize for () {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
serializer.serialize_unit() serializer.serialize_unit()
} }
@@ -518,7 +497,7 @@ macro_rules! serialize_map {
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
impl<K, V> Serialize for BTreeMap<K, V> impl<K, V> Serialize for BTreeMap<K, V>
where K: Serialize + Ord, where K: Serialize + Ord,
V: Serialize, V: Serialize
{ {
serialize_map!(); serialize_map!();
} }
@@ -527,26 +506,30 @@ impl<K, V> Serialize for BTreeMap<K, V>
impl<K, V, H> Serialize for HashMap<K, V, H> impl<K, V, H> Serialize for HashMap<K, V, H>
where K: Serialize + Eq + Hash, where K: Serialize + Eq + Hash,
V: Serialize, V: Serialize,
H: BuildHasher, H: BuildHasher
{ {
serialize_map!(); serialize_map!();
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
impl<'a, T: ?Sized> Serialize for &'a T where T: Serialize { impl<'a, T: ?Sized> Serialize for &'a T
where T: Serialize
{
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
(**self).serialize(serializer) (**self).serialize(serializer)
} }
} }
impl<'a, T: ?Sized> Serialize for &'a mut T where T: Serialize { impl<'a, T: ?Sized> Serialize for &'a mut T
where T: Serialize
{
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
(**self).serialize(serializer) (**self).serialize(serializer)
} }
@@ -558,7 +541,7 @@ impl<T: ?Sized> Serialize for Box<T>
{ {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
(**self).serialize(serializer) (**self).serialize(serializer)
} }
@@ -570,7 +553,7 @@ impl<T> Serialize for Rc<T>
{ {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
(**self).serialize(serializer) (**self).serialize(serializer)
} }
@@ -582,7 +565,7 @@ impl<T> Serialize for Arc<T>
{ {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
(**self).serialize(serializer) (**self).serialize(serializer)
} }
@@ -594,7 +577,7 @@ impl<'a, T: ?Sized> Serialize for Cow<'a, T>
{ {
#[inline] #[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
(**self).serialize(serializer) (**self).serialize(serializer)
} }
@@ -610,9 +593,7 @@ impl<T, E> Serialize for Result<T, E>
where S: Serializer where S: Serializer
{ {
match *self { match *self {
Result::Ok(ref value) => { Result::Ok(ref value) => serializer.serialize_newtype_variant("Result", 0, "Ok", value),
serializer.serialize_newtype_variant("Result", 0, "Ok", value)
}
Result::Err(ref value) => { Result::Err(ref value) => {
serializer.serialize_newtype_variant("Result", 1, "Err", value) serializer.serialize_newtype_variant("Result", 1, "Err", value)
} }
@@ -625,7 +606,7 @@ impl<T, E> Serialize for Result<T, E>
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Serialize for Duration { impl Serialize for Duration {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
use super::SerializeStruct; use super::SerializeStruct;
let mut state = try!(serializer.serialize_struct("Duration", 2)); let mut state = try!(serializer.serialize_struct("Duration", 2));
@@ -640,27 +621,34 @@ impl Serialize for Duration {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Serialize for net::IpAddr { impl Serialize for net::IpAddr {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
self.to_string().serialize(serializer) match *self {
net::IpAddr::V4(ref a) => a.serialize(serializer),
net::IpAddr::V6(ref a) => a.serialize(serializer),
}
} }
} }
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Serialize for net::Ipv4Addr { impl Serialize for net::Ipv4Addr {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
self.to_string().serialize(serializer) /// "101.102.103.104".len()
const MAX_LEN: usize = 15;
serialize_display_bounded_length!(self, MAX_LEN, serializer)
} }
} }
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Serialize for net::Ipv6Addr { impl Serialize for net::Ipv6Addr {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
self.to_string().serialize(serializer) /// "1000:1002:1003:1004:1005:1006:1007:1008".len()
const MAX_LEN: usize = 39;
serialize_display_bounded_length!(self, MAX_LEN, serializer)
} }
} }
@@ -669,7 +657,7 @@ impl Serialize for net::Ipv6Addr {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Serialize for net::SocketAddr { impl Serialize for net::SocketAddr {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
match *self { match *self {
net::SocketAddr::V4(ref addr) => addr.serialize(serializer), net::SocketAddr::V4(ref addr) => addr.serialize(serializer),
@@ -681,18 +669,22 @@ impl Serialize for net::SocketAddr {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Serialize for net::SocketAddrV4 { impl Serialize for net::SocketAddrV4 {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
self.to_string().serialize(serializer) /// "101.102.103.104:65000".len()
const MAX_LEN: usize = 21;
serialize_display_bounded_length!(self, MAX_LEN, serializer)
} }
} }
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Serialize for net::SocketAddrV6 { impl Serialize for net::SocketAddrV6 {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
self.to_string().serialize(serializer) /// "[1000:1002:1003:1004:1005:1006:1007:1008]:65000".len()
const MAX_LEN: usize = 47;
serialize_display_bounded_length!(self, MAX_LEN, serializer)
} }
} }
@@ -701,7 +693,7 @@ impl Serialize for net::SocketAddrV6 {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Serialize for path::Path { impl Serialize for path::Path {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
match self.to_str() { match self.to_str() {
Some(s) => s.serialize(serializer), Some(s) => s.serialize(serializer),
@@ -713,7 +705,7 @@ impl Serialize for path::Path {
#[cfg(feature = "std")] #[cfg(feature = "std")]
impl Serialize for path::PathBuf { impl Serialize for path::PathBuf {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer
{ {
self.as_path().serialize(serializer) self.as_path().serialize(serializer)
} }
+17 -38
View File
@@ -2,17 +2,8 @@
use core::marker::PhantomData; use core::marker::PhantomData;
use ser::{ use ser::{self, Serialize, SerializeSeq, SerializeTuple, SerializeTupleStruct,
self, SerializeTupleVariant, SerializeMap, SerializeStruct, SerializeStructVariant};
Serialize,
SerializeSeq,
SerializeTuple,
SerializeTupleStruct,
SerializeTupleVariant,
SerializeMap,
SerializeStruct,
SerializeStructVariant,
};
/// Helper type for implementing a `Serializer` that does not support /// Helper type for implementing a `Serializer` that does not support
/// serializing one of the compound types. /// serializing one of the compound types.
@@ -50,14 +41,12 @@ pub struct Impossible<Ok, E> {
enum Void {} enum Void {}
impl<Ok, E> SerializeSeq for Impossible<Ok, E> impl<Ok, E> SerializeSeq for Impossible<Ok, E>
where E: ser::Error, where E: ser::Error
{ {
type Ok = Ok; type Ok = Ok;
type Error = E; type Error = E;
fn serialize_element<T: ?Sized + Serialize>(&mut self, fn serialize_element<T: ?Sized + Serialize>(&mut self, _value: &T) -> Result<(), E> {
_value: &T)
-> Result<(), E> {
match self.void {} match self.void {}
} }
@@ -67,14 +56,12 @@ impl<Ok, E> SerializeSeq for Impossible<Ok, E>
} }
impl<Ok, E> SerializeTuple for Impossible<Ok, E> impl<Ok, E> SerializeTuple for Impossible<Ok, E>
where E: ser::Error, where E: ser::Error
{ {
type Ok = Ok; type Ok = Ok;
type Error = E; type Error = E;
fn serialize_element<T: ?Sized + Serialize>(&mut self, fn serialize_element<T: ?Sized + Serialize>(&mut self, _value: &T) -> Result<(), E> {
_value: &T)
-> Result<(), E> {
match self.void {} match self.void {}
} }
@@ -84,14 +71,12 @@ impl<Ok, E> SerializeTuple for Impossible<Ok, E>
} }
impl<Ok, E> SerializeTupleStruct for Impossible<Ok, E> impl<Ok, E> SerializeTupleStruct for Impossible<Ok, E>
where E: ser::Error, where E: ser::Error
{ {
type Ok = Ok; type Ok = Ok;
type Error = E; type Error = E;
fn serialize_field<T: ?Sized + Serialize>(&mut self, fn serialize_field<T: ?Sized + Serialize>(&mut self, _value: &T) -> Result<(), E> {
_value: &T)
-> Result<(), E> {
match self.void {} match self.void {}
} }
@@ -101,14 +86,12 @@ impl<Ok, E> SerializeTupleStruct for Impossible<Ok, E>
} }
impl<Ok, E> SerializeTupleVariant for Impossible<Ok, E> impl<Ok, E> SerializeTupleVariant for Impossible<Ok, E>
where E: ser::Error, where E: ser::Error
{ {
type Ok = Ok; type Ok = Ok;
type Error = E; type Error = E;
fn serialize_field<T: ?Sized + Serialize>(&mut self, fn serialize_field<T: ?Sized + Serialize>(&mut self, _value: &T) -> Result<(), E> {
_value: &T)
-> Result<(), E> {
match self.void {} match self.void {}
} }
@@ -118,20 +101,16 @@ impl<Ok, E> SerializeTupleVariant for Impossible<Ok, E>
} }
impl<Ok, E> SerializeMap for Impossible<Ok, E> impl<Ok, E> SerializeMap for Impossible<Ok, E>
where E: ser::Error, where E: ser::Error
{ {
type Ok = Ok; type Ok = Ok;
type Error = E; type Error = E;
fn serialize_key<T: ?Sized + Serialize>(&mut self, fn serialize_key<T: ?Sized + Serialize>(&mut self, _key: &T) -> Result<(), E> {
_key: &T)
-> Result<(), E> {
match self.void {} match self.void {}
} }
fn serialize_value<T: ?Sized + Serialize>(&mut self, fn serialize_value<T: ?Sized + Serialize>(&mut self, _value: &T) -> Result<(), E> {
_value: &T)
-> Result<(), E> {
match self.void {} match self.void {}
} }
@@ -141,13 +120,13 @@ impl<Ok, E> SerializeMap for Impossible<Ok, E>
} }
impl<Ok, E> SerializeStruct for Impossible<Ok, E> impl<Ok, E> SerializeStruct for Impossible<Ok, E>
where E: ser::Error, where E: ser::Error
{ {
type Ok = Ok; type Ok = Ok;
type Error = E; type Error = E;
fn serialize_field<T: ?Sized + Serialize>(&mut self, fn serialize_field<T: ?Sized + Serialize>(&mut self,
_key: &'static str, _key: &'static str,
_value: &T) _value: &T)
-> Result<(), E> { -> Result<(), E> {
match self.void {} match self.void {}
@@ -159,13 +138,13 @@ impl<Ok, E> SerializeStruct for Impossible<Ok, E>
} }
impl<Ok, E> SerializeStructVariant for Impossible<Ok, E> impl<Ok, E> SerializeStructVariant for Impossible<Ok, E>
where E: ser::Error, where E: ser::Error
{ {
type Ok = Ok; type Ok = Ok;
type Error = E; type Error = E;
fn serialize_field<T: ?Sized + Serialize>(&mut self, fn serialize_field<T: ?Sized + Serialize>(&mut self,
_key: &'static str, _key: &'static str,
_value: &T) _value: &T)
-> Result<(), E> { -> Result<(), E> {
match self.void {} match self.void {}
+65 -84
View File
@@ -107,6 +107,8 @@ mod impossible;
// Helpers used by generated code. Not public API. // Helpers used by generated code. Not public API.
#[doc(hidden)] #[doc(hidden)]
pub mod private; pub mod private;
#[cfg(any(feature = "std", feature = "collections"))]
mod content;
pub use self::impossible::Impossible; pub use self::impossible::Impossible;
@@ -174,8 +176,7 @@ pub trait Serialize {
/// for more information about how to implement this method. /// for more information about how to implement this method.
/// ///
/// [impl-serialize]: https://serde.rs/impl-serialize.html /// [impl-serialize]: https://serde.rs/impl-serialize.html
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer;
where S: Serializer;
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@@ -254,31 +255,31 @@ pub trait Serializer: Sized {
/// Type returned from `serialize_seq` and `serialize_seq_fixed_size` for /// Type returned from `serialize_seq` and `serialize_seq_fixed_size` for
/// serializing the content of the sequence. /// serializing the content of the sequence.
type SerializeSeq: SerializeSeq<Ok=Self::Ok, Error=Self::Error>; type SerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
/// Type returned from `serialize_tuple` for serializing the content of the /// Type returned from `serialize_tuple` for serializing the content of the
/// tuple. /// tuple.
type SerializeTuple: SerializeTuple<Ok=Self::Ok, Error=Self::Error>; type SerializeTuple: SerializeTuple<Ok = Self::Ok, Error = Self::Error>;
/// Type returned from `serialize_tuple_struct` for serializing the content /// Type returned from `serialize_tuple_struct` for serializing the content
/// of the tuple struct. /// of the tuple struct.
type SerializeTupleStruct: SerializeTupleStruct<Ok=Self::Ok, Error=Self::Error>; type SerializeTupleStruct: SerializeTupleStruct<Ok = Self::Ok, Error = Self::Error>;
/// Type returned from `serialize_tuple_variant` for serializing the content /// Type returned from `serialize_tuple_variant` for serializing the content
/// of the tuple variant. /// of the tuple variant.
type SerializeTupleVariant: SerializeTupleVariant<Ok=Self::Ok, Error=Self::Error>; type SerializeTupleVariant: SerializeTupleVariant<Ok = Self::Ok, Error = Self::Error>;
/// Type returned from `serialize_map` for serializing the content of the /// Type returned from `serialize_map` for serializing the content of the
/// map. /// map.
type SerializeMap: SerializeMap<Ok=Self::Ok, Error=Self::Error>; type SerializeMap: SerializeMap<Ok = Self::Ok, Error = Self::Error>;
/// Type returned from `serialize_struct` for serializing the content of the /// Type returned from `serialize_struct` for serializing the content of the
/// struct. /// struct.
type SerializeStruct: SerializeStruct<Ok=Self::Ok, Error=Self::Error>; type SerializeStruct: SerializeStruct<Ok = Self::Ok, Error = Self::Error>;
/// Type returned from `serialize_struct_variant` for serializing the /// Type returned from `serialize_struct_variant` for serializing the
/// content of the struct variant. /// content of the struct variant.
type SerializeStructVariant: SerializeStructVariant<Ok=Self::Ok, Error=Self::Error>; type SerializeStructVariant: SerializeStructVariant<Ok = Self::Ok, Error = Self::Error>;
/// Serialize a `bool` value. /// Serialize a `bool` value.
fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>; fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>;
@@ -371,10 +372,7 @@ pub trait Serializer: Sized {
fn serialize_none(self) -> Result<Self::Ok, Self::Error>; fn serialize_none(self) -> Result<Self::Ok, Self::Error>;
/// Serialize a `Some(T)` value. /// Serialize a `Some(T)` value.
fn serialize_some<T: ?Sized + Serialize>( fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error>;
self,
value: &T,
) -> Result<Self::Ok, Self::Error>;
/// Serialize a `()` value. /// Serialize a `()` value.
fn serialize_unit(self) -> Result<Self::Ok, Self::Error>; fn serialize_unit(self) -> Result<Self::Ok, Self::Error>;
@@ -382,10 +380,7 @@ pub trait Serializer: Sized {
/// Serialize a unit struct like `struct Unit` or `PhantomData<T>`. /// Serialize a unit struct like `struct Unit` or `PhantomData<T>`.
/// ///
/// A reasonable implementation would be to forward to `serialize_unit`. /// A reasonable implementation would be to forward to `serialize_unit`.
fn serialize_unit_struct( fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error>;
self,
name: &'static str,
) -> Result<Self::Ok, Self::Error>;
/// Serialize a unit variant like `E::A` in `enum E { A, B }`. /// Serialize a unit variant like `E::A` in `enum E { A, B }`.
/// ///
@@ -401,12 +396,11 @@ pub trait Serializer: Sized {
/// E::B => serializer.serialize_unit_variant("E", 1, "B"), /// E::B => serializer.serialize_unit_variant("E", 1, "B"),
/// } /// }
/// ``` /// ```
fn serialize_unit_variant( fn serialize_unit_variant(self,
self, name: &'static str,
name: &'static str, variant_index: usize,
variant_index: usize, variant: &'static str)
variant: &'static str, -> Result<Self::Ok, Self::Error>;
) -> Result<Self::Ok, Self::Error>;
/// Serialize a newtype struct like `struct Millimeters(u8)`. /// Serialize a newtype struct like `struct Millimeters(u8)`.
/// ///
@@ -417,11 +411,10 @@ pub trait Serializer: Sized {
/// ```rust,ignore /// ```rust,ignore
/// serializer.serialize_newtype_struct("Millimeters", &self.0) /// serializer.serialize_newtype_struct("Millimeters", &self.0)
/// ``` /// ```
fn serialize_newtype_struct<T: ?Sized + Serialize>( fn serialize_newtype_struct<T: ?Sized + Serialize>(self,
self, name: &'static str,
name: &'static str, value: &T)
value: &T, -> Result<Self::Ok, Self::Error>;
) -> Result<Self::Ok, Self::Error>;
/// Serialize a newtype variant like `E::N` in `enum E { N(u8) }`. /// Serialize a newtype variant like `E::N` in `enum E { N(u8) }`.
/// ///
@@ -434,13 +427,12 @@ pub trait Serializer: Sized {
/// E::N(ref n) => serializer.serialize_newtype_variant("E", 0, "N", n), /// E::N(ref n) => serializer.serialize_newtype_variant("E", 0, "N", n),
/// } /// }
/// ``` /// ```
fn serialize_newtype_variant<T: ?Sized + Serialize>( fn serialize_newtype_variant<T: ?Sized + Serialize>(self,
self, name: &'static str,
name: &'static str, variant_index: usize,
variant_index: usize, variant: &'static str,
variant: &'static str, value: &T)
value: &T, -> Result<Self::Ok, Self::Error>;
) -> Result<Self::Ok, Self::Error>;
/// Begin to serialize a dynamically sized sequence. This call must be /// Begin to serialize a dynamically sized sequence. This call must be
/// followed by zero or more calls to `serialize_element`, then a call to /// followed by zero or more calls to `serialize_element`, then a call to
@@ -457,10 +449,7 @@ pub trait Serializer: Sized {
/// } /// }
/// seq.end() /// seq.end()
/// ``` /// ```
fn serialize_seq( fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>;
self,
len: Option<usize>,
) -> Result<Self::SerializeSeq, Self::Error>;
/// Begin to serialize a statically sized sequence whose length will be /// Begin to serialize a statically sized sequence whose length will be
/// known at deserialization time without looking at the serialized data. /// known at deserialization time without looking at the serialized data.
@@ -474,10 +463,7 @@ pub trait Serializer: Sized {
/// } /// }
/// seq.end() /// seq.end()
/// ``` /// ```
fn serialize_seq_fixed_size( fn serialize_seq_fixed_size(self, size: usize) -> Result<Self::SerializeSeq, Self::Error>;
self,
size: usize,
) -> Result<Self::SerializeSeq, Self::Error>;
/// Begin to serialize a tuple. This call must be followed by zero or more /// Begin to serialize a tuple. This call must be followed by zero or more
/// calls to `serialize_field`, then a call to `end`. /// calls to `serialize_field`, then a call to `end`.
@@ -489,10 +475,7 @@ pub trait Serializer: Sized {
/// tup.serialize_field(&self.2)?; /// tup.serialize_field(&self.2)?;
/// tup.end() /// tup.end()
/// ``` /// ```
fn serialize_tuple( fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error>;
self,
len: usize,
) -> Result<Self::SerializeTuple, Self::Error>;
/// Begin to serialize a tuple struct like `struct Rgb(u8, u8, u8)`. This /// Begin to serialize a tuple struct like `struct Rgb(u8, u8, u8)`. This
/// call must be followed by zero or more calls to `serialize_field`, then a /// call must be followed by zero or more calls to `serialize_field`, then a
@@ -508,11 +491,10 @@ pub trait Serializer: Sized {
/// ts.serialize_field(&self.2)?; /// ts.serialize_field(&self.2)?;
/// ts.end() /// ts.end()
/// ``` /// ```
fn serialize_tuple_struct( fn serialize_tuple_struct(self,
self, name: &'static str,
name: &'static str, len: usize)
len: usize, -> Result<Self::SerializeTupleStruct, Self::Error>;
) -> Result<Self::SerializeTupleStruct, Self::Error>;
/// Begin to serialize a tuple variant like `E::T` in `enum E { T(u8, u8) /// Begin to serialize a tuple variant like `E::T` in `enum E { T(u8, u8)
/// }`. This call must be followed by zero or more calls to /// }`. This call must be followed by zero or more calls to
@@ -532,13 +514,12 @@ pub trait Serializer: Sized {
/// } /// }
/// } /// }
/// ``` /// ```
fn serialize_tuple_variant( fn serialize_tuple_variant(self,
self, name: &'static str,
name: &'static str, variant_index: usize,
variant_index: usize, variant: &'static str,
variant: &'static str, len: usize)
len: usize, -> Result<Self::SerializeTupleVariant, Self::Error>;
) -> Result<Self::SerializeTupleVariant, Self::Error>;
/// Begin to serialize a map. This call must be followed by zero or more /// Begin to serialize a map. This call must be followed by zero or more
/// calls to `serialize_key` and `serialize_value`, then a call to `end`. /// calls to `serialize_key` and `serialize_value`, then a call to `end`.
@@ -554,10 +535,7 @@ pub trait Serializer: Sized {
/// } /// }
/// map.end() /// map.end()
/// ``` /// ```
fn serialize_map( fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>;
self,
len: Option<usize>,
) -> Result<Self::SerializeMap, Self::Error>;
/// Begin to serialize a struct like `struct Rgb { r: u8, g: u8, b: u8 }`. /// Begin to serialize a struct like `struct Rgb { r: u8, g: u8, b: u8 }`.
/// This call must be followed by zero or more calls to `serialize_field`, /// This call must be followed by zero or more calls to `serialize_field`,
@@ -573,11 +551,10 @@ pub trait Serializer: Sized {
/// struc.serialize_field("b", &self.b)?; /// struc.serialize_field("b", &self.b)?;
/// struc.end() /// struc.end()
/// ``` /// ```
fn serialize_struct( fn serialize_struct(self,
self, name: &'static str,
name: &'static str, len: usize)
len: usize, -> Result<Self::SerializeStruct, Self::Error>;
) -> Result<Self::SerializeStruct, Self::Error>;
/// Begin to serialize a struct variant like `E::S` in `enum E { S { r: u8, /// Begin to serialize a struct variant like `E::S` in `enum E { S { r: u8,
/// g: u8, b: u8 } }`. This call must be followed by zero or more calls to /// g: u8, b: u8 } }`. This call must be followed by zero or more calls to
@@ -598,13 +575,12 @@ pub trait Serializer: Sized {
/// } /// }
/// } /// }
/// ``` /// ```
fn serialize_struct_variant( fn serialize_struct_variant(self,
self, name: &'static str,
name: &'static str, variant_index: usize,
variant_index: usize, variant: &'static str,
variant: &'static str, len: usize)
len: usize, -> Result<Self::SerializeStructVariant, Self::Error>;
) -> Result<Self::SerializeStructVariant, Self::Error>;
/// Collect an iterator as a sequence. /// Collect an iterator as a sequence.
/// ///
@@ -613,7 +589,7 @@ pub trait Serializer: Sized {
/// this method. /// this method.
fn collect_seq<I>(self, iter: I) -> Result<Self::Ok, Self::Error> fn collect_seq<I>(self, iter: I) -> Result<Self::Ok, Self::Error>
where I: IntoIterator, where I: IntoIterator,
<I as IntoIterator>::Item: Serialize, <I as IntoIterator>::Item: Serialize
{ {
let iter = iter.into_iter(); let iter = iter.into_iter();
let mut serializer = try!(self.serialize_seq(iter.len_hint())); let mut serializer = try!(self.serialize_seq(iter.len_hint()));
@@ -631,7 +607,7 @@ pub trait Serializer: Sized {
fn collect_map<K, V, I>(self, iter: I) -> Result<Self::Ok, Self::Error> fn collect_map<K, V, I>(self, iter: I) -> Result<Self::Ok, Self::Error>
where K: Serialize, where K: Serialize,
V: Serialize, V: Serialize,
I: IntoIterator<Item = (K, V)>, I: IntoIterator<Item = (K, V)>
{ {
let iter = iter.into_iter(); let iter = iter.into_iter();
let mut serializer = try!(self.serialize_map(iter.len_hint())); let mut serializer = try!(self.serialize_map(iter.len_hint()));
@@ -773,11 +749,10 @@ pub trait SerializeMap {
/// `serialize_value`. This is appropriate for serializers that do not care /// `serialize_value`. This is appropriate for serializers that do not care
/// about performance or are not able to optimize `serialize_entry` any /// about performance or are not able to optimize `serialize_entry` any
/// better than this. /// better than this.
fn serialize_entry<K: ?Sized + Serialize, V: ?Sized + Serialize>( fn serialize_entry<K: ?Sized + Serialize, V: ?Sized + Serialize>(&mut self,
&mut self, key: &K,
key: &K, value: &V)
value: &V, -> Result<(), Self::Error> {
) -> Result<(), Self::Error> {
try!(self.serialize_key(key)); try!(self.serialize_key(key));
self.serialize_value(value) self.serialize_value(value)
} }
@@ -803,7 +778,10 @@ pub trait SerializeStruct {
type Error: Error; type Error: Error;
/// Serialize a struct field. /// Serialize a struct field.
fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>; fn serialize_field<T: ?Sized + Serialize>(&mut self,
key: &'static str,
value: &T)
-> Result<(), Self::Error>;
/// Finish serializing a struct. /// Finish serializing a struct.
fn end(self) -> Result<Self::Ok, Self::Error>; fn end(self) -> Result<Self::Ok, Self::Error>;
@@ -830,7 +808,10 @@ pub trait SerializeStructVariant {
type Error: Error; type Error: Error;
/// Serialize a struct variant field. /// Serialize a struct variant field.
fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>; fn serialize_field<T: ?Sized + Serialize>(&mut self,
key: &'static str,
value: &T)
-> Result<(), Self::Error>;
/// Finish serializing a struct variant. /// Finish serializing a struct variant.
fn end(self) -> Result<Self::Ok, Self::Error>; fn end(self) -> Result<Self::Ok, Self::Error>;
+101 -23
View File
@@ -1,16 +1,18 @@
use core::fmt::{self, Display}; use core::fmt::{self, Display};
use ser::{self, Serialize, Serializer, SerializeMap, SerializeStruct}; use ser::{self, Serialize, Serializer, SerializeMap, SerializeStruct, Impossible};
#[cfg(any(feature = "std", feature = "collections"))]
use ser::content::{SerializeTupleVariantAsMapValue, SerializeStructVariantAsMapValue};
/// Not public API. /// Not public API.
pub fn serialize_tagged_newtype<S, T>( pub fn serialize_tagged_newtype<S, T>(serializer: S,
serializer: S, type_ident: &'static str,
type_ident: &'static str, variant_ident: &'static str,
variant_ident: &'static str, tag: &'static str,
tag: &'static str, variant_name: &'static str,
variant_name: &'static str, value: T)
value: T, -> Result<S::Ok, S::Error>
) -> Result<S::Ok, S::Error>
where S: Serializer, where S: Serializer,
T: Serialize T: Serialize
{ {
@@ -44,6 +46,7 @@ enum Unsupported {
Sequence, Sequence,
Tuple, Tuple,
TupleStruct, TupleStruct,
#[cfg(not(any(feature = "std", feature = "collections")))]
Enum, Enum,
} }
@@ -62,6 +65,7 @@ impl Display for Unsupported {
Unsupported::Sequence => formatter.write_str("a sequence"), Unsupported::Sequence => formatter.write_str("a sequence"),
Unsupported::Tuple => formatter.write_str("a tuple"), Unsupported::Tuple => formatter.write_str("a tuple"),
Unsupported::TupleStruct => formatter.write_str("a tuple struct"), Unsupported::TupleStruct => formatter.write_str("a tuple struct"),
#[cfg(not(any(feature = "std", feature = "collections")))]
Unsupported::Enum => formatter.write_str("an enum"), Unsupported::Enum => formatter.write_str("an enum"),
} }
} }
@@ -99,13 +103,21 @@ impl<S> Serializer for TaggedSerializer<S>
type Ok = S::Ok; type Ok = S::Ok;
type Error = S::Error; type Error = S::Error;
type SerializeSeq = S::SerializeSeq; type SerializeSeq = Impossible<S::Ok, S::Error>;
type SerializeTuple = S::SerializeTuple; type SerializeTuple = Impossible<S::Ok, S::Error>;
type SerializeTupleStruct = S::SerializeTupleStruct; type SerializeTupleStruct = Impossible<S::Ok, S::Error>;
type SerializeTupleVariant = S::SerializeTupleVariant;
type SerializeMap = S::SerializeMap; type SerializeMap = S::SerializeMap;
type SerializeStruct = S::SerializeStruct; type SerializeStruct = S::SerializeStruct;
type SerializeStructVariant = S::SerializeStructVariant;
#[cfg(not(any(feature = "std", feature = "collections")))]
type SerializeTupleVariant = Impossible<S::Ok, S::Error>;
#[cfg(any(feature = "std", feature = "collections"))]
type SerializeTupleVariant = SerializeTupleVariantAsMapValue<S::SerializeMap>;
#[cfg(not(any(feature = "std", feature = "collections")))]
type SerializeStructVariant = Impossible<S::Ok, S::Error>;
#[cfg(any(feature = "std", feature = "collections"))]
type SerializeStructVariant = SerializeStructVariantAsMapValue<S::SerializeMap>;
fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> { fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
Err(self.bad_type(Unsupported::Boolean)) Err(self.bad_type(Unsupported::Boolean))
@@ -181,20 +193,38 @@ impl<S> Serializer for TaggedSerializer<S>
Err(self.bad_type(Unsupported::UnitStruct)) Err(self.bad_type(Unsupported::UnitStruct))
} }
fn serialize_unit_variant(self, _: &'static str, _: usize, _: &'static str) -> Result<Self::Ok, Self::Error> { fn serialize_unit_variant(self,
Err(self.bad_type(Unsupported::Enum)) _: &'static str,
_: usize,
inner_variant: &'static str)
-> Result<Self::Ok, Self::Error> {
let mut map = try!(self.delegate.serialize_map(Some(2)));
try!(map.serialize_entry(self.tag, self.variant_name));
try!(map.serialize_entry(inner_variant, &()));
map.end()
} }
fn serialize_newtype_struct<T: ?Sized>(self, _: &'static str, value: &T) -> Result<Self::Ok, Self::Error> fn serialize_newtype_struct<T: ?Sized>(self,
_: &'static str,
value: &T)
-> Result<Self::Ok, Self::Error>
where T: Serialize where T: Serialize
{ {
value.serialize(self) value.serialize(self)
} }
fn serialize_newtype_variant<T: ?Sized>(self, _: &'static str, _: usize, _: &'static str, _: &T) -> Result<Self::Ok, Self::Error> fn serialize_newtype_variant<T: ?Sized>(self,
_: &'static str,
_: usize,
inner_variant: &'static str,
inner_value: &T)
-> Result<Self::Ok, Self::Error>
where T: Serialize where T: Serialize
{ {
Err(self.bad_type(Unsupported::Enum)) let mut map = try!(self.delegate.serialize_map(Some(2)));
try!(map.serialize_entry(self.tag, self.variant_name));
try!(map.serialize_entry(inner_variant, inner_value));
map.end()
} }
fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
@@ -209,27 +239,75 @@ impl<S> Serializer for TaggedSerializer<S>
Err(self.bad_type(Unsupported::Tuple)) Err(self.bad_type(Unsupported::Tuple))
} }
fn serialize_tuple_struct(self, _: &'static str, _: usize) -> Result<Self::SerializeTupleStruct, Self::Error> { fn serialize_tuple_struct(self,
_: &'static str,
_: usize)
-> Result<Self::SerializeTupleStruct, Self::Error> {
Err(self.bad_type(Unsupported::TupleStruct)) Err(self.bad_type(Unsupported::TupleStruct))
} }
fn serialize_tuple_variant(self, _: &'static str, _: usize, _: &'static str, _: usize) -> Result<Self::SerializeTupleVariant, Self::Error> { #[cfg(not(any(feature = "std", feature = "collections")))]
fn serialize_tuple_variant(self,
_: &'static str,
_: usize,
_: &'static str,
_: usize)
-> Result<Self::SerializeTupleVariant, Self::Error> {
// Lack of push-based serialization means we need to buffer the content
// of the tuple variant, so it requires std.
Err(self.bad_type(Unsupported::Enum)) Err(self.bad_type(Unsupported::Enum))
} }
#[cfg(any(feature = "std", feature = "collections"))]
fn serialize_tuple_variant(self,
_: &'static str,
_: usize,
inner_variant: &'static str,
len: usize)
-> Result<Self::SerializeTupleVariant, Self::Error> {
let mut map = try!(self.delegate.serialize_map(Some(2)));
try!(map.serialize_entry(self.tag, self.variant_name));
try!(map.serialize_key(inner_variant));
Ok(SerializeTupleVariantAsMapValue::new(map, inner_variant, len))
}
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
let mut map = try!(self.delegate.serialize_map(len.map(|len| len + 1))); let mut map = try!(self.delegate.serialize_map(len.map(|len| len + 1)));
try!(map.serialize_entry(self.tag, self.variant_name)); try!(map.serialize_entry(self.tag, self.variant_name));
Ok(map) Ok(map)
} }
fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct, Self::Error> { fn serialize_struct(self,
name: &'static str,
len: usize)
-> Result<Self::SerializeStruct, Self::Error> {
let mut state = try!(self.delegate.serialize_struct(name, len + 1)); let mut state = try!(self.delegate.serialize_struct(name, len + 1));
try!(state.serialize_field(self.tag, self.variant_name)); try!(state.serialize_field(self.tag, self.variant_name));
Ok(state) Ok(state)
} }
fn serialize_struct_variant(self, _: &'static str, _: usize, _: &'static str, _: usize) -> Result<Self::SerializeStructVariant, Self::Error> { #[cfg(not(any(feature = "std", feature = "collections")))]
fn serialize_struct_variant(self,
_: &'static str,
_: usize,
_: &'static str,
_: usize)
-> Result<Self::SerializeStructVariant, Self::Error> {
// Lack of push-based serialization means we need to buffer the content
// of the struct variant, so it requires std.
Err(self.bad_type(Unsupported::Enum)) Err(self.bad_type(Unsupported::Enum))
} }
#[cfg(any(feature = "std", feature = "collections"))]
fn serialize_struct_variant(self,
_: &'static str,
_: usize,
inner_variant: &'static str,
len: usize)
-> Result<Self::SerializeStructVariant, Self::Error> {
let mut map = try!(self.delegate.serialize_map(Some(2)));
try!(map.serialize_entry(self.tag, self.variant_name));
try!(map.serialize_key(inner_variant));
Ok(SerializeStructVariantAsMapValue::new(map, inner_variant, len))
}
} }
+20 -18
View File
@@ -1,12 +1,12 @@
//! Private utility functions //! Private utility functions
const TAG_CONT: u8 = 0b1000_0000; const TAG_CONT: u8 = 0b1000_0000;
const TAG_TWO_B: u8 = 0b1100_0000; const TAG_TWO_B: u8 = 0b1100_0000;
const TAG_THREE_B: u8 = 0b1110_0000; const TAG_THREE_B: u8 = 0b1110_0000;
const TAG_FOUR_B: u8 = 0b1111_0000; const TAG_FOUR_B: u8 = 0b1111_0000;
const MAX_ONE_B: u32 = 0x80; const MAX_ONE_B: u32 = 0x80;
const MAX_TWO_B: u32 = 0x800; const MAX_TWO_B: u32 = 0x800;
const MAX_THREE_B: u32 = 0x10000; const MAX_THREE_B: u32 = 0x10000;
#[inline] #[inline]
pub fn encode_utf8(c: char) -> EncodeUtf8 { pub fn encode_utf8(c: char) -> EncodeUtf8 {
@@ -21,17 +21,20 @@ pub fn encode_utf8(c: char) -> EncodeUtf8 {
2 2
} else if code < MAX_THREE_B { } else if code < MAX_THREE_B {
buf[1] = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; buf[1] = (code >> 12 & 0x0F) as u8 | TAG_THREE_B;
buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT; buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
buf[3] = (code & 0x3F) as u8 | TAG_CONT; buf[3] = (code & 0x3F) as u8 | TAG_CONT;
1 1
} else { } else {
buf[0] = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; buf[0] = (code >> 18 & 0x07) as u8 | TAG_FOUR_B;
buf[1] = (code >> 12 & 0x3F) as u8 | TAG_CONT; buf[1] = (code >> 12 & 0x3F) as u8 | TAG_CONT;
buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT; buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
buf[3] = (code & 0x3F) as u8 | TAG_CONT; buf[3] = (code & 0x3F) as u8 | TAG_CONT;
0 0
}; };
EncodeUtf8 { buf: buf, pos: pos } EncodeUtf8 {
buf: buf,
pos: pos,
}
} }
pub struct EncodeUtf8 { pub struct EncodeUtf8 {
@@ -47,23 +50,22 @@ impl EncodeUtf8 {
} }
#[allow(non_upper_case_globals)] #[allow(non_upper_case_globals)]
const Pattern_White_Space_table: &'static [(char, char)] = &[ const Pattern_White_Space_table: &'static [(char, char)] = &[('\u{9}', '\u{d}'),
('\u{9}', '\u{d}'), ('\u{20}', '\u{20}'), ('\u{85}', '\u{85}'), ('\u{200e}', '\u{200f}'), ('\u{20}', '\u{20}'),
('\u{2028}', '\u{2029}') ('\u{85}', '\u{85}'),
]; ('\u{200e}', '\u{200f}'),
('\u{2028}', '\u{2029}')];
fn bsearch_range_table(c: char, r: &'static [(char, char)]) -> bool { fn bsearch_range_table(c: char, r: &'static [(char, char)]) -> bool {
use core::cmp::Ordering::{Equal, Less, Greater}; use core::cmp::Ordering::{Equal, Less, Greater};
r.binary_search_by(|&(lo, hi)| { r.binary_search_by(|&(lo, hi)| if c < lo {
if c < lo {
Greater Greater
} else if hi < c { } else if hi < c {
Less Less
} else { } else {
Equal Equal
} })
}) .is_ok()
.is_ok()
} }
#[allow(non_snake_case)] #[allow(non_snake_case)]
+4 -3
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_codegen_internals" name = "serde_codegen_internals"
version = "0.13.0" version = "0.14.0"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "AST representation used by Serde codegen. Unstable." description = "AST representation used by Serde codegen. Unstable."
@@ -8,10 +8,11 @@ homepage = "https://serde.rs"
repository = "https://github.com/serde-rs/serde" repository = "https://github.com/serde-rs/serde"
documentation = "https://docs.serde.rs/serde_codegen_internals/" documentation = "https://docs.serde.rs/serde_codegen_internals/"
keywords = ["serde", "serialization"] keywords = ["serde", "serialization"]
include = ["Cargo.toml", "src/**/*.rs"] readme = "../README.md"
include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
[dependencies] [dependencies]
syn = "0.11" syn = { version = "0.11", default-features = false, features = ["parsing"] }
[badges] [badges]
travis-ci = { repository = "serde-rs/serde" } travis-ci = { repository = "serde-rs/serde" }
+1
View File
@@ -0,0 +1 @@
../LICENSE-APACHE
+1
View File
@@ -0,0 +1 @@
../LICENSE-MIT
+1
View File
@@ -0,0 +1 @@
../README.md
+7 -17
View File
@@ -39,9 +39,7 @@ impl<'a> Item<'a> {
let attrs = attr::Item::from_ast(cx, item); let attrs = attr::Item::from_ast(cx, item);
let body = match item.body { let body = match item.body {
syn::Body::Enum(ref variants) => { syn::Body::Enum(ref variants) => Body::Enum(enum_from_ast(cx, variants)),
Body::Enum(enum_from_ast(cx, variants))
}
syn::Body::Struct(ref variant_data) => { syn::Body::Struct(ref variant_data) => {
let (style, fields) = struct_from_ast(cx, variant_data); let (style, fields) = struct_from_ast(cx, variant_data);
Body::Struct(style, fields) Body::Struct(style, fields)
@@ -58,15 +56,13 @@ impl<'a> Item<'a> {
} }
impl<'a> Body<'a> { impl<'a> Body<'a> {
pub fn all_fields(&'a self) -> Box<Iterator<Item=&'a Field<'a>> + 'a> { pub fn all_fields(&'a self) -> Box<Iterator<Item = &'a Field<'a>> + 'a> {
match *self { match *self {
Body::Enum(ref variants) => { Body::Enum(ref variants) => {
Box::new(variants.iter() Box::new(variants.iter()
.flat_map(|variant| variant.fields.iter())) .flat_map(|variant| variant.fields.iter()))
}
Body::Struct(_, ref fields) => {
Box::new(fields.iter())
} }
Body::Struct(_, ref fields) => Box::new(fields.iter()),
} }
} }
} }
@@ -87,18 +83,12 @@ fn enum_from_ast<'a>(cx: &Ctxt, variants: &'a [syn::Variant]) -> Vec<Variant<'a>
fn struct_from_ast<'a>(cx: &Ctxt, data: &'a syn::VariantData) -> (Style, Vec<Field<'a>>) { fn struct_from_ast<'a>(cx: &Ctxt, data: &'a syn::VariantData) -> (Style, Vec<Field<'a>>) {
match *data { match *data {
syn::VariantData::Struct(ref fields) => { syn::VariantData::Struct(ref fields) => (Style::Struct, fields_from_ast(cx, fields)),
(Style::Struct, fields_from_ast(cx, fields))
}
syn::VariantData::Tuple(ref fields) if fields.len() == 1 => { syn::VariantData::Tuple(ref fields) if fields.len() == 1 => {
(Style::Newtype, fields_from_ast(cx, fields)) (Style::Newtype, fields_from_ast(cx, fields))
} }
syn::VariantData::Tuple(ref fields) => { syn::VariantData::Tuple(ref fields) => (Style::Tuple, fields_from_ast(cx, fields)),
(Style::Tuple, fields_from_ast(cx, fields)) syn::VariantData::Unit => (Style::Unit, Vec::new()),
}
syn::VariantData::Unit => {
(Style::Unit, Vec::new())
}
} }
} }
+135 -48
View File
@@ -90,6 +90,7 @@ impl Name {
pub struct Item { pub struct Item {
name: Name, name: Name,
deny_unknown_fields: bool, deny_unknown_fields: bool,
default: Default,
ser_bound: Option<Vec<syn::WherePredicate>>, ser_bound: Option<Vec<syn::WherePredicate>>,
de_bound: Option<Vec<syn::WherePredicate>>, de_bound: Option<Vec<syn::WherePredicate>>,
tag: EnumTag, tag: EnumTag,
@@ -110,7 +111,14 @@ pub enum EnumTag {
/// ```json /// ```json
/// {"type": "variant1", "key1": "value1", "key2": "value2"} /// {"type": "variant1", "key1": "value1", "key2": "value2"}
/// ``` /// ```
Internal(String), Internal { tag: String },
/// `#[serde(tag = "t", content = "c")]`
///
/// ```json
/// {"t": "variant1", "c": {"key1": "value1", "key2": "value2"}}
/// ```
Adjacent { tag: String, content: String },
/// `#[serde(untagged)]` /// `#[serde(untagged)]`
/// ///
@@ -126,10 +134,12 @@ impl Item {
let mut ser_name = Attr::none(cx, "rename"); let mut ser_name = Attr::none(cx, "rename");
let mut de_name = Attr::none(cx, "rename"); let mut de_name = Attr::none(cx, "rename");
let mut deny_unknown_fields = BoolAttr::none(cx, "deny_unknown_fields"); let mut deny_unknown_fields = BoolAttr::none(cx, "deny_unknown_fields");
let mut default = Attr::none(cx, "default");
let mut ser_bound = Attr::none(cx, "bound"); let mut ser_bound = Attr::none(cx, "bound");
let mut de_bound = Attr::none(cx, "bound"); let mut de_bound = Attr::none(cx, "bound");
let mut untagged = BoolAttr::none(cx, "untagged"); let mut untagged = BoolAttr::none(cx, "untagged");
let mut internal_tag = Attr::none(cx, "tag"); let mut internal_tag = Attr::none(cx, "tag");
let mut content = Attr::none(cx, "content");
for meta_items in item.attrs.iter().filter_map(get_serde_meta_items) { for meta_items in item.attrs.iter().filter_map(get_serde_meta_items) {
for meta_item in meta_items { for meta_item in meta_items {
@@ -155,9 +165,38 @@ impl Item {
deny_unknown_fields.set_true(); deny_unknown_fields.set_true();
} }
// Parse `#[serde(default)]`
MetaItem(Word(ref name)) if name == "default" => {
match item.body {
syn::Body::Struct(syn::VariantData::Struct(_)) => {
default.set(Default::Default);
}
_ => {
cx.error("#[serde(default)] can only be used on structs \
with named fields")
}
}
}
// Parse `#[serde(default="...")]`
MetaItem(NameValue(ref name, ref lit)) if name == "default" => {
if let Ok(path) = parse_lit_into_path(cx, name.as_ref(), lit) {
match item.body {
syn::Body::Struct(syn::VariantData::Struct(_)) => {
default.set(Default::Path(path));
}
_ => {
cx.error("#[serde(default = \"...\")] can only be used \
on structs with named fields")
}
}
}
}
// Parse `#[serde(bound="D: Serialize")]` // Parse `#[serde(bound="D: Serialize")]`
MetaItem(NameValue(ref name, ref lit)) if name == "bound" => { MetaItem(NameValue(ref name, ref lit)) if name == "bound" => {
if let Ok(where_predicates) = parse_lit_into_where(cx, name.as_ref(), name.as_ref(), lit) { if let Ok(where_predicates) =
parse_lit_into_where(cx, name.as_ref(), name.as_ref(), lit) {
ser_bound.set(where_predicates.clone()); ser_bound.set(where_predicates.clone());
de_bound.set(where_predicates); de_bound.set(where_predicates);
} }
@@ -197,6 +236,20 @@ impl Item {
} }
} }
// Parse `#[serde(content = "c")]`
MetaItem(NameValue(ref name, ref lit)) if name == "content" => {
if let Ok(s) = get_string_from_lit(cx, name.as_ref(), name.as_ref(), lit) {
match item.body {
syn::Body::Enum(_) => {
content.set(s);
}
syn::Body::Struct(_) => {
cx.error("#[serde(content = \"...\")] can only be used on enums")
}
}
}
}
MetaItem(ref meta_item) => { MetaItem(ref meta_item) => {
cx.error(format!("unknown serde container attribute `{}`", cx.error(format!("unknown serde container attribute `{}`",
meta_item.name())); meta_item.name()));
@@ -209,30 +262,47 @@ impl Item {
} }
} }
let tag = match (untagged.get(), internal_tag.get()) { let tag = match (untagged.get(), internal_tag.get(), content.get()) {
(false, None) => EnumTag::External, (false, None, None) => EnumTag::External,
(true, None) => EnumTag::None, (true, None, None) => EnumTag::None,
(false, Some(tag)) => { (false, Some(tag), None) => {
// Check that there are no tuple variants. // Check that there are no tuple variants.
if let syn::Body::Enum(ref variants) = item.body { if let syn::Body::Enum(ref variants) = item.body {
for variant in variants { for variant in variants {
match variant.data { match variant.data {
syn::VariantData::Struct(_) | syn::VariantData::Unit => {} syn::VariantData::Struct(_) |
syn::VariantData::Unit => {}
syn::VariantData::Tuple(ref fields) => { syn::VariantData::Tuple(ref fields) => {
if fields.len() != 1 { if fields.len() != 1 {
cx.error("#[serde(tag = \"...\")] cannot be used with tuple variants"); cx.error("#[serde(tag = \"...\")] cannot be used with tuple \
variants");
break; break;
} }
} }
} }
} }
} }
EnumTag::Internal(tag) EnumTag::Internal { tag: tag }
} }
(true, Some(_)) => { (true, Some(_), None) => {
cx.error("enum cannot be both untagged and internally tagged"); cx.error("enum cannot be both untagged and internally tagged");
EnumTag::External // doesn't matter, will error EnumTag::External // doesn't matter, will error
} }
(false, None, Some(_)) => {
cx.error("#[serde(tag = \"...\", content = \"...\")] must be used together");
EnumTag::External
}
(true, None, Some(_)) => {
cx.error("untagged enum cannot have #[serde(content = \"...\")]");
EnumTag::External
}
(false, Some(tag), Some(content)) => {
EnumTag::Adjacent { tag: tag, content: content }
}
(true, Some(_), Some(_)) => {
cx.error("untagged enum cannot have #[serde(tag = \"...\", content = \"...\")]");
EnumTag::External
}
}; };
Item { Item {
@@ -241,6 +311,7 @@ impl Item {
deserialize: de_name.get().unwrap_or_else(|| item.ident.to_string()), deserialize: de_name.get().unwrap_or_else(|| item.ident.to_string()),
}, },
deny_unknown_fields: deny_unknown_fields.get(), deny_unknown_fields: deny_unknown_fields.get(),
default: default.get().unwrap_or(Default::None),
ser_bound: ser_bound.get(), ser_bound: ser_bound.get(),
de_bound: de_bound.get(), de_bound: de_bound.get(),
tag: tag, tag: tag,
@@ -255,6 +326,10 @@ impl Item {
self.deny_unknown_fields self.deny_unknown_fields
} }
pub fn default(&self) -> &Default {
&self.default
}
pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> { pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> {
self.ser_bound.as_ref().map(|vec| &vec[..]) self.ser_bound.as_ref().map(|vec| &vec[..])
} }
@@ -311,8 +386,7 @@ impl Variant {
} }
MetaItem(ref meta_item) => { MetaItem(ref meta_item) => {
cx.error(format!("unknown serde variant attribute `{}`", cx.error(format!("unknown serde variant attribute `{}`", meta_item.name()));
meta_item.name()));
} }
Literal(_) => { Literal(_) => {
@@ -352,7 +426,7 @@ pub struct Field {
skip_serializing: bool, skip_serializing: bool,
skip_deserializing: bool, skip_deserializing: bool,
skip_serializing_if: Option<syn::Path>, skip_serializing_if: Option<syn::Path>,
default: FieldDefault, default: Default,
serialize_with: Option<syn::Path>, serialize_with: Option<syn::Path>,
deserialize_with: Option<syn::Path>, deserialize_with: Option<syn::Path>,
ser_bound: Option<Vec<syn::WherePredicate>>, ser_bound: Option<Vec<syn::WherePredicate>>,
@@ -361,7 +435,7 @@ pub struct Field {
/// Represents the default to use for a field when deserializing. /// Represents the default to use for a field when deserializing.
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub enum FieldDefault { pub enum Default {
/// Field must always be specified because it does not have a default. /// Field must always be specified because it does not have a default.
None, None,
/// The default is given by `std::default::Default::default()`. /// The default is given by `std::default::Default::default()`.
@@ -372,9 +446,7 @@ pub enum FieldDefault {
impl Field { impl Field {
/// Extract out the `#[serde(...)]` attributes from a struct field. /// Extract out the `#[serde(...)]` attributes from a struct field.
pub fn from_ast(cx: &Ctxt, pub fn from_ast(cx: &Ctxt, index: usize, field: &syn::Field) -> Self {
index: usize,
field: &syn::Field) -> Self {
let mut ser_name = Attr::none(cx, "rename"); let mut ser_name = Attr::none(cx, "rename");
let mut de_name = Attr::none(cx, "rename"); let mut de_name = Attr::none(cx, "rename");
let mut skip_serializing = BoolAttr::none(cx, "skip_serializing"); let mut skip_serializing = BoolAttr::none(cx, "skip_serializing");
@@ -412,13 +484,13 @@ impl Field {
// Parse `#[serde(default)]` // Parse `#[serde(default)]`
MetaItem(Word(ref name)) if name == "default" => { MetaItem(Word(ref name)) if name == "default" => {
default.set(FieldDefault::Default); default.set(Default::Default);
} }
// Parse `#[serde(default="...")]` // Parse `#[serde(default="...")]`
MetaItem(NameValue(ref name, ref lit)) if name == "default" => { MetaItem(NameValue(ref name, ref lit)) if name == "default" => {
if let Ok(path) = parse_lit_into_path(cx, name.as_ref(), lit) { if let Ok(path) = parse_lit_into_path(cx, name.as_ref(), lit) {
default.set(FieldDefault::Path(path)); default.set(Default::Path(path));
} }
} }
@@ -453,9 +525,22 @@ impl Field {
} }
} }
// Parse `#[serde(with="...")]`
MetaItem(NameValue(ref name, ref lit)) if name == "with" => {
if let Ok(path) = parse_lit_into_path(cx, name.as_ref(), lit) {
let mut ser_path = path.clone();
ser_path.segments.push("serialize".into());
serialize_with.set(ser_path);
let mut de_path = path;
de_path.segments.push("deserialize".into());
deserialize_with.set(de_path);
}
}
// Parse `#[serde(bound="D: Serialize")]` // Parse `#[serde(bound="D: Serialize")]`
MetaItem(NameValue(ref name, ref lit)) if name == "bound" => { MetaItem(NameValue(ref name, ref lit)) if name == "bound" => {
if let Ok(where_predicates) = parse_lit_into_where(cx, name.as_ref(), name.as_ref(), lit) { if let Ok(where_predicates) =
parse_lit_into_where(cx, name.as_ref(), name.as_ref(), lit) {
ser_bound.set(where_predicates.clone()); ser_bound.set(where_predicates.clone());
de_bound.set(where_predicates); de_bound.set(where_predicates);
} }
@@ -470,8 +555,7 @@ impl Field {
} }
MetaItem(ref meta_item) => { MetaItem(ref meta_item) => {
cx.error(format!("unknown serde field attribute `{}`", cx.error(format!("unknown serde field attribute `{}`", meta_item.name()));
meta_item.name()));
} }
Literal(_) => { Literal(_) => {
@@ -484,7 +568,7 @@ impl Field {
// Is skip_deserializing, initialize the field to Default::default() // Is skip_deserializing, initialize the field to Default::default()
// unless a different default is specified by `#[serde(default="...")]` // unless a different default is specified by `#[serde(default="...")]`
if skip_deserializing.0.value.is_some() { if skip_deserializing.0.value.is_some() {
default.set_if_none(FieldDefault::Default); default.set_if_none(Default::Default);
} }
Field { Field {
@@ -495,7 +579,7 @@ impl Field {
skip_serializing: skip_serializing.get(), skip_serializing: skip_serializing.get(),
skip_deserializing: skip_deserializing.get(), skip_deserializing: skip_deserializing.get(),
skip_serializing_if: skip_serializing_if.get(), skip_serializing_if: skip_serializing_if.get(),
default: default.get().unwrap_or(FieldDefault::None), default: default.get().unwrap_or(Default::None),
serialize_with: serialize_with.get(), serialize_with: serialize_with.get(),
deserialize_with: deserialize_with.get(), deserialize_with: deserialize_with.get(),
ser_bound: ser_bound.get(), ser_bound: ser_bound.get(),
@@ -519,7 +603,7 @@ impl Field {
self.skip_serializing_if.as_ref() self.skip_serializing_if.as_ref()
} }
pub fn default(&self) -> &FieldDefault { pub fn default(&self) -> &Default {
&self.default &self.default
} }
@@ -542,13 +626,12 @@ impl Field {
type SerAndDe<T> = (Option<T>, Option<T>); type SerAndDe<T> = (Option<T>, Option<T>);
fn get_ser_and_de<T, F>( fn get_ser_and_de<T, F>(cx: &Ctxt,
cx: &Ctxt, attr_name: &'static str,
attr_name: &'static str, items: &[syn::NestedMetaItem],
items: &[syn::NestedMetaItem], f: F)
f: F -> Result<SerAndDe<T>, ()>
) -> Result<SerAndDe<T>, ()> where F: Fn(&Ctxt, &str, &str, &syn::Lit) -> Result<T, ()>
where F: Fn(&Ctxt, &str, &str, &syn::Lit) -> Result<T, ()>,
{ {
let mut ser_item = Attr::none(cx, attr_name); let mut ser_item = Attr::none(cx, attr_name);
let mut de_item = Attr::none(cx, attr_name); let mut de_item = Attr::none(cx, attr_name);
@@ -568,7 +651,8 @@ fn get_ser_and_de<T, F>(
} }
_ => { _ => {
cx.error(format!("malformed {0} attribute, expected `{0}(serialize = ..., deserialize = ...)`", cx.error(format!("malformed {0} attribute, expected `{0}(serialize = ..., \
deserialize = ...)`",
attr_name)); attr_name));
return Err(()); return Err(());
} }
@@ -578,35 +662,34 @@ fn get_ser_and_de<T, F>(
Ok((ser_item.get(), de_item.get())) Ok((ser_item.get(), de_item.get()))
} }
fn get_renames( fn get_renames(cx: &Ctxt, items: &[syn::NestedMetaItem]) -> Result<SerAndDe<String>, ()> {
cx: &Ctxt,
items: &[syn::NestedMetaItem],
) -> Result<SerAndDe<String>, ()> {
get_ser_and_de(cx, "rename", items, get_string_from_lit) get_ser_and_de(cx, "rename", items, get_string_from_lit)
} }
fn get_where_predicates( fn get_where_predicates(cx: &Ctxt,
cx: &Ctxt, items: &[syn::NestedMetaItem])
items: &[syn::NestedMetaItem], -> Result<SerAndDe<Vec<syn::WherePredicate>>, ()> {
) -> Result<SerAndDe<Vec<syn::WherePredicate>>, ()> {
get_ser_and_de(cx, "bound", items, parse_lit_into_where) get_ser_and_de(cx, "bound", items, parse_lit_into_where)
} }
pub fn get_serde_meta_items(attr: &syn::Attribute) -> Option<Vec<syn::NestedMetaItem>> { pub fn get_serde_meta_items(attr: &syn::Attribute) -> Option<Vec<syn::NestedMetaItem>> {
match attr.value { match attr.value {
List(ref name, ref items) if name == "serde" => { List(ref name, ref items) if name == "serde" => Some(items.iter().cloned().collect()),
Some(items.iter().cloned().collect()) _ => None,
}
_ => None
} }
} }
fn get_string_from_lit(cx: &Ctxt, attr_name: &str, meta_item_name: &str, lit: &syn::Lit) -> Result<String, ()> { fn get_string_from_lit(cx: &Ctxt,
attr_name: &str,
meta_item_name: &str,
lit: &syn::Lit)
-> Result<String, ()> {
if let syn::Lit::Str(ref s, _) = *lit { if let syn::Lit::Str(ref s, _) = *lit {
Ok(s.clone()) Ok(s.clone())
} else { } else {
cx.error(format!("expected serde {} attribute to be a string: `{} = \"...\"`", cx.error(format!("expected serde {} attribute to be a string: `{} = \"...\"`",
attr_name, meta_item_name)); attr_name,
meta_item_name));
Err(()) Err(())
} }
} }
@@ -616,7 +699,11 @@ fn parse_lit_into_path(cx: &Ctxt, attr_name: &str, lit: &syn::Lit) -> Result<syn
syn::parse_path(&string).map_err(|err| cx.error(err)) syn::parse_path(&string).map_err(|err| cx.error(err))
} }
fn parse_lit_into_where(cx: &Ctxt, attr_name: &str, meta_item_name: &str, lit: &syn::Lit) -> Result<Vec<syn::WherePredicate>, ()> { fn parse_lit_into_where(cx: &Ctxt,
attr_name: &str,
meta_item_name: &str,
lit: &syn::Lit)
-> Result<Vec<syn::WherePredicate>, ()> {
let string = try!(get_string_from_lit(cx, attr_name, meta_item_name, lit)); let string = try!(get_string_from_lit(cx, attr_name, meta_item_name, lit));
if string.is_empty() { if string.is_empty() {
return Ok(Vec::new()); return Ok(Vec::new());
+1 -3
View File
@@ -8,9 +8,7 @@ pub struct Ctxt {
impl Ctxt { impl Ctxt {
pub fn new() -> Self { pub fn new() -> Self {
Ctxt { Ctxt { errors: RefCell::new(Some(Vec::new())) }
errors: RefCell::new(Some(Vec::new())),
}
} }
pub fn error<T: Display>(&self, msg: T) { pub fn error<T: Display>(&self, msg: T) {
+5 -4
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_derive" name = "serde_derive"
version = "0.9.7" version = "0.9.9"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
@@ -8,7 +8,8 @@ homepage = "https://serde.rs"
repository = "https://github.com/serde-rs/serde" repository = "https://github.com/serde-rs/serde"
documentation = "https://serde.rs/codegen.html" documentation = "https://serde.rs/codegen.html"
keywords = ["serde", "serialization", "no_std"] keywords = ["serde", "serialization", "no_std"]
include = ["Cargo.toml", "src/**/*.rs"] readme = "../README.md"
include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
[features] [features]
unstable = [] unstable = []
@@ -22,5 +23,5 @@ proc-macro = true
[dependencies] [dependencies]
quote = "0.3.8" quote = "0.3.8"
serde_codegen_internals = { version = "=0.13.0", default-features = false, path = "../serde_codegen_internals" } serde_codegen_internals = { version = "=0.14.0", default-features = false, path = "../serde_codegen_internals" }
syn = { version = "0.11", features = ["aster", "visit"] } syn = { version = "0.11", features = ["visit"] }
+1
View File
@@ -0,0 +1 @@
../LICENSE-APACHE
+1
View File
@@ -0,0 +1 @@
../LICENSE-MIT
+1
View File
@@ -0,0 +1 @@
../README.md
+154 -47
View File
@@ -1,46 +1,71 @@
use std::collections::HashSet; use std::collections::HashSet;
use syn::{self, aster, visit}; use syn::{self, visit};
use internals::ast::Item; use internals::ast::Item;
use internals::attr; use internals::attr;
macro_rules! path {
($first:ident $(:: $rest:ident)*) => {
syn::Path {
global: false,
segments: vec![
stringify!($first).into(),
$(
stringify!($rest).into(),
)*
],
}
};
(::$first:ident $(:: $rest:ident)*) => {
syn::Path {
global: true,
segments: vec![
stringify!($first).into(),
$(
stringify!($rest).into(),
)*
],
}
};
}
// Remove the default from every type parameter because in the generated impls // Remove the default from every type parameter because in the generated impls
// they look like associated types: "error: associated type bindings are not // they look like associated types: "error: associated type bindings are not
// allowed here". // allowed here".
pub fn without_defaults(generics: &syn::Generics) -> syn::Generics { pub fn without_defaults(generics: &syn::Generics) -> syn::Generics {
syn::Generics { syn::Generics {
ty_params: generics.ty_params.iter().map(|ty_param| { ty_params: generics.ty_params
syn::TyParam { .iter()
default: None, .map(|ty_param| syn::TyParam { default: None, ..ty_param.clone() })
.. ty_param.clone() .collect(),
}}).collect(), ..generics.clone()
.. generics.clone()
} }
} }
pub fn with_where_predicates( pub fn with_where_predicates(generics: &syn::Generics,
generics: &syn::Generics, predicates: &[syn::WherePredicate])
predicates: &[syn::WherePredicate], -> syn::Generics {
) -> syn::Generics { let mut generics = generics.clone();
aster::from_generics(generics.clone()) generics.where_clause.predicates.extend_from_slice(predicates);
.with_predicates(predicates.to_vec()) generics
.build()
} }
pub fn with_where_predicates_from_fields<F>( pub fn with_where_predicates_from_fields<F>(item: &Item,
item: &Item, generics: &syn::Generics,
generics: &syn::Generics, from_field: F)
from_field: F, -> syn::Generics
) -> syn::Generics where F: Fn(&attr::Field) -> Option<&[syn::WherePredicate]>
where F: Fn(&attr::Field) -> Option<&[syn::WherePredicate]>,
{ {
aster::from_generics(generics.clone()) let predicates = item.body
.with_predicates( .all_fields()
item.body.all_fields() .flat_map(|field| from_field(&field.attrs))
.flat_map(|field| from_field(&field.attrs)) .flat_map(|predicates| predicates.to_vec());
.flat_map(|predicates| predicates.to_vec()))
.build() let mut generics = generics.clone();
generics.where_clause.predicates.extend(predicates);
generics
} }
// Puts the given bound on any generic type parameters that are used in fields // Puts the given bound on any generic type parameters that are used in fields
@@ -54,13 +79,12 @@ pub fn with_where_predicates_from_fields<F>(
// #[serde(skip_serializing)] // #[serde(skip_serializing)]
// c: C, // c: C,
// } // }
pub fn with_bound<F>( pub fn with_bound<F>(item: &Item,
item: &Item, generics: &syn::Generics,
generics: &syn::Generics, filter: F,
filter: F, bound: &syn::Path)
bound: &syn::Path, -> syn::Generics
) -> syn::Generics where F: Fn(&attr::Field) -> bool
where F: Fn(&attr::Field) -> bool,
{ {
struct FindTyParams { struct FindTyParams {
// Set of all generic type parameters on the current struct (A, B, C in // Set of all generic type parameters on the current struct (A, B, C in
@@ -90,11 +114,13 @@ pub fn with_bound<F>(
} }
} }
let all_ty_params: HashSet<_> = generics.ty_params.iter() let all_ty_params: HashSet<_> = generics.ty_params
.iter()
.map(|ty_param| ty_param.ident.clone()) .map(|ty_param| ty_param.ident.clone())
.collect(); .collect();
let relevant_tys = item.body.all_fields() let relevant_tys = item.body
.all_fields()
.filter(|&field| filter(&field.attrs)) .filter(|&field| filter(&field.attrs))
.map(|field| &field.ty); .map(|field| &field.ty);
@@ -106,16 +132,97 @@ pub fn with_bound<F>(
visit::walk_ty(&mut visitor, ty); visit::walk_ty(&mut visitor, ty);
} }
aster::from_generics(generics.clone()) let new_predicates = generics.ty_params
.with_predicates( .iter()
generics.ty_params.iter() .map(|ty_param| ty_param.ident.clone())
.map(|ty_param| ty_param.ident.clone()) .filter(|id| visitor.relevant_ty_params.contains(id))
.filter(|id| visitor.relevant_ty_params.contains(id)) .map(|id| {
.map(|id| aster::where_predicate() syn::WherePredicate::BoundPredicate(syn::WhereBoundPredicate {
// the type parameter that is being bounded e.g. T bound_lifetimes: Vec::new(),
.bound().build(aster::ty().id(id)) // the type parameter that is being bounded e.g. T
// the bound e.g. Serialize bounded_ty: syn::Ty::Path(None, id.into()),
.bound().trait_(bound.clone()).build() // the bound e.g. Serialize
.build())) bounds: vec![syn::TyParamBound::Trait(
.build() syn::PolyTraitRef {
bound_lifetimes: Vec::new(),
trait_ref: bound.clone(),
},
syn::TraitBoundModifier::None
)],
})
});
let mut generics = generics.clone();
generics.where_clause.predicates.extend(new_predicates);
generics
}
pub fn with_self_bound(item: &Item,
generics: &syn::Generics,
bound: &syn::Path)
-> syn::Generics
{
let mut generics = generics.clone();
generics.where_clause.predicates.push(
syn::WherePredicate::BoundPredicate(syn::WhereBoundPredicate {
bound_lifetimes: Vec::new(),
// the type that is being bounded e.g. MyStruct<'a, T>
bounded_ty: type_of_item(item),
// the bound e.g. Default
bounds: vec![syn::TyParamBound::Trait(
syn::PolyTraitRef {
bound_lifetimes: Vec::new(),
trait_ref: bound.clone(),
},
syn::TraitBoundModifier::None
)],
})
);
generics
}
pub fn with_lifetime_bound(generics: &syn::Generics,
lifetime: &str)
-> syn::Generics {
let mut generics = generics.clone();
for lifetime_def in &mut generics.lifetimes {
lifetime_def.bounds.push(syn::Lifetime::new(lifetime));
}
for ty_param in &mut generics.ty_params {
ty_param.bounds.push(syn::TyParamBound::Region(syn::Lifetime::new(lifetime)));
}
generics.lifetimes.push(syn::LifetimeDef {
attrs: Vec::new(),
lifetime: syn::Lifetime::new(lifetime),
bounds: Vec::new(),
});
generics
}
fn type_of_item(item: &Item) -> syn::Ty {
syn::Ty::Path(None, syn::Path {
global: false,
segments: vec![
syn::PathSegment {
ident: item.ident.clone(),
parameters: syn::PathParameters::AngleBracketed(syn::AngleBracketedParameterData {
lifetimes: item.generics
.lifetimes
.iter()
.map(|def| def.lifetime.clone())
.collect(),
types: item.generics
.ty_params
.iter()
.map(|param| syn::Ty::Path(None, param.ident.clone().into()))
.collect(),
bindings: Vec::new(),
}),
}
]
})
} }
+617 -553
View File
File diff suppressed because it is too large Load Diff
+67
View File
@@ -0,0 +1,67 @@
use quote::{Tokens, ToTokens};
pub enum Fragment {
/// Tokens that can be used as an expression.
Expr(Tokens),
/// Tokens that can be used inside a block. The surrounding curly braces are
/// not part of these tokens.
Block(Tokens),
}
macro_rules! quote_expr {
($($tt:tt)*) => {
$crate::fragment::Fragment::Expr(quote!($($tt)*))
}
}
macro_rules! quote_block {
($($tt:tt)*) => {
$crate::fragment::Fragment::Block(quote!($($tt)*))
}
}
/// Interpolate a fragment in place of an expression. This involves surrounding
/// Block fragments in curly braces.
pub struct Expr(pub Fragment);
impl ToTokens for Expr {
fn to_tokens(&self, out: &mut Tokens) {
match self.0 {
Fragment::Expr(ref expr) => expr.to_tokens(out),
Fragment::Block(ref block) => {
out.append("{");
block.to_tokens(out);
out.append("}");
}
}
}
}
/// Interpolate a fragment as the statements of a block.
pub struct Stmts(pub Fragment);
impl ToTokens for Stmts {
fn to_tokens(&self, out: &mut Tokens) {
match self.0 {
Fragment::Expr(ref expr) => expr.to_tokens(out),
Fragment::Block(ref block) => block.to_tokens(out),
}
}
}
/// Interpolate a fragment as the value part of a `match` expression. This
/// involves putting a comma after expressions and curly braces around blocks.
pub struct Match(pub Fragment);
impl ToTokens for Match {
fn to_tokens(&self, out: &mut Tokens) {
match self.0 {
Fragment::Expr(ref expr) => {
expr.to_tokens(out);
out.append(",");
}
Fragment::Block(ref block) => {
out.append("{");
block.to_tokens(out);
out.append("}");
}
}
}
}
+5 -1
View File
@@ -13,9 +13,13 @@ extern crate serde_codegen_internals as internals;
extern crate proc_macro; extern crate proc_macro;
use proc_macro::TokenStream; use proc_macro::TokenStream;
#[macro_use]
mod bound; mod bound;
mod de; #[macro_use]
mod fragment;
mod ser; mod ser;
mod de;
#[proc_macro_derive(Serialize, attributes(serde))] #[proc_macro_derive(Serialize, attributes(serde))]
pub fn derive_serialize(input: TokenStream) -> TokenStream { pub fn derive_serialize(input: TokenStream) -> TokenStream {
+347 -376
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -1,15 +1,15 @@
[package] [package]
name = "serde_test" name = "serde_test"
version = "0.9.7" version = "0.9.9"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "Token De/Serializer for testing De/Serialize implementations" description = "Token De/Serializer for testing De/Serialize implementations"
homepage = "https://serde.rs" homepage = "https://serde.rs"
repository = "https://github.com/serde-rs/serde" repository = "https://github.com/serde-rs/serde"
documentation = "https://docs.serde.rs/serde_test/" documentation = "https://docs.serde.rs/serde_test/"
readme = "../README.md"
keywords = ["serde", "serialization"] keywords = ["serde", "serialization"]
include = ["Cargo.toml", "src/**/*.rs"] readme = "../README.md"
include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
[dependencies] [dependencies]
serde = { version = "0.9", path = "../serde" } serde = { version = "0.9", path = "../serde" }
+1
View File
@@ -0,0 +1 @@
../LICENSE-APACHE
+1
View File
@@ -0,0 +1 @@
../LICENSE-MIT
+1
View File
@@ -0,0 +1 @@
../README.md
+5 -5
View File
@@ -8,14 +8,14 @@ use token::Token;
use std::fmt::Debug; use std::fmt::Debug;
pub fn assert_tokens<T>(value: &T, tokens: &[Token<'static>]) pub fn assert_tokens<T>(value: &T, tokens: &[Token<'static>])
where T: Serialize + Deserialize + PartialEq + Debug, where T: Serialize + Deserialize + PartialEq + Debug
{ {
assert_ser_tokens(value, tokens); assert_ser_tokens(value, tokens);
assert_de_tokens(value, tokens); assert_de_tokens(value, tokens);
} }
pub fn assert_ser_tokens<T>(value: &T, tokens: &[Token]) pub fn assert_ser_tokens<T>(value: &T, tokens: &[Token])
where T: Serialize, where T: Serialize
{ {
let mut ser = Serializer::new(tokens.iter()); let mut ser = Serializer::new(tokens.iter());
assert_eq!(Serialize::serialize(value, &mut ser), Ok(())); assert_eq!(Serialize::serialize(value, &mut ser), Ok(()));
@@ -24,7 +24,7 @@ pub fn assert_ser_tokens<T>(value: &T, tokens: &[Token])
/// Expect an error serializing `T`. /// Expect an error serializing `T`.
pub fn assert_ser_tokens_error<T>(value: &T, tokens: &[Token], error: Error) pub fn assert_ser_tokens_error<T>(value: &T, tokens: &[Token], error: Error)
where T: Serialize + PartialEq + Debug, where T: Serialize + PartialEq + Debug
{ {
let mut ser = Serializer::new(tokens.iter()); let mut ser = Serializer::new(tokens.iter());
let v: Result<(), Error> = Serialize::serialize(value, &mut ser); let v: Result<(), Error> = Serialize::serialize(value, &mut ser);
@@ -33,7 +33,7 @@ pub fn assert_ser_tokens_error<T>(value: &T, tokens: &[Token], error: Error)
} }
pub fn assert_de_tokens<T>(value: &T, tokens: &[Token<'static>]) pub fn assert_de_tokens<T>(value: &T, tokens: &[Token<'static>])
where T: Deserialize + PartialEq + Debug, where T: Deserialize + PartialEq + Debug
{ {
let mut de = Deserializer::new(tokens.to_vec().into_iter()); let mut de = Deserializer::new(tokens.to_vec().into_iter());
let v: Result<T, Error> = Deserialize::deserialize(&mut de); let v: Result<T, Error> = Deserialize::deserialize(&mut de);
@@ -43,7 +43,7 @@ pub fn assert_de_tokens<T>(value: &T, tokens: &[Token<'static>])
/// Expect an error deserializing tokens into a `T`. /// Expect an error deserializing tokens into a `T`.
pub fn assert_de_tokens_error<T>(tokens: &[Token<'static>], error: Error) pub fn assert_de_tokens_error<T>(tokens: &[Token<'static>], error: Error)
where T: Deserialize + PartialEq + Debug, where T: Deserialize + PartialEq + Debug
{ {
let mut de = Deserializer::new(tokens.to_vec().into_iter()); let mut de = Deserializer::new(tokens.to_vec().into_iter());
let v: Result<T, Error> = Deserialize::deserialize(&mut de); let v: Result<T, Error> = Deserialize::deserialize(&mut de);
+177 -97
View File
@@ -1,33 +1,23 @@
use std::iter; use std::iter;
use serde::de::{ use serde::de::{self, Deserialize, DeserializeSeed, EnumVisitor, MapVisitor, SeqVisitor,
self, VariantVisitor, Visitor};
Deserialize, use serde::de::value::{ValueDeserializer, MapVisitorDeserializer, SeqVisitorDeserializer};
DeserializeSeed,
EnumVisitor,
MapVisitor,
SeqVisitor,
VariantVisitor,
Visitor,
};
use serde::de::value::ValueDeserializer;
use error::Error; use error::Error;
use token::Token; use token::Token;
pub struct Deserializer<I> pub struct Deserializer<I>
where I: Iterator<Item=Token<'static>>, where I: Iterator<Item = Token<'static>>
{ {
tokens: iter::Peekable<I>, tokens: iter::Peekable<I>,
} }
impl<I> Deserializer<I> impl<I> Deserializer<I>
where I: Iterator<Item=Token<'static>>, where I: Iterator<Item = Token<'static>>
{ {
pub fn new(tokens: I) -> Deserializer<I> { pub fn new(tokens: I) -> Deserializer<I> {
Deserializer { Deserializer { tokens: tokens.peekable() }
tokens: tokens.peekable(),
}
} }
pub fn next_token(&mut self) -> Option<Token<'static>> { pub fn next_token(&mut self) -> Option<Token<'static>> {
@@ -47,8 +37,13 @@ impl<I> Deserializer<I>
} }
} }
fn visit_seq<V>(&mut self, len: Option<usize>, sep: Token<'static>, end: Token<'static>, visitor: V) -> Result<V::Value, Error> fn visit_seq<V>(&mut self,
where V: Visitor, len: Option<usize>,
sep: Token<'static>,
end: Token<'static>,
visitor: V)
-> Result<V::Value, Error>
where V: Visitor
{ {
let value = try!(visitor.visit_seq(DeserializerSeqVisitor { let value = try!(visitor.visit_seq(DeserializerSeqVisitor {
de: self, de: self,
@@ -60,8 +55,13 @@ impl<I> Deserializer<I>
Ok(value) Ok(value)
} }
fn visit_map<V>(&mut self, len: Option<usize>, sep: Token<'static>, end: Token<'static>, visitor: V) -> Result<V::Value, Error> fn visit_map<V>(&mut self,
where V: Visitor, len: Option<usize>,
sep: Token<'static>,
end: Token<'static>,
visitor: V)
-> Result<V::Value, Error>
where V: Visitor
{ {
let value = try!(visitor.visit_map(DeserializerMapVisitor { let value = try!(visitor.visit_map(DeserializerMapVisitor {
de: self, de: self,
@@ -75,7 +75,7 @@ impl<I> Deserializer<I>
} }
impl<'a, I> de::Deserializer for &'a mut Deserializer<I> impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
where I: Iterator<Item=Token<'static>>, where I: Iterator<Item = Token<'static>>
{ {
type Error = Error; type Error = Error;
@@ -85,7 +85,7 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
} }
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Error>
where V: Visitor, where V: Visitor
{ {
match self.tokens.next() { match self.tokens.next() {
Some(Token::Bool(v)) => visitor.visit_bool(v), Some(Token::Bool(v)) => visitor.visit_bool(v),
@@ -118,7 +118,10 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
self.visit_seq(Some(len), Token::TupleSep, Token::TupleEnd, visitor) self.visit_seq(Some(len), Token::TupleSep, Token::TupleEnd, visitor)
} }
Some(Token::TupleStructStart(_, len)) => { Some(Token::TupleStructStart(_, len)) => {
self.visit_seq(Some(len), Token::TupleStructSep, Token::TupleStructEnd, visitor) self.visit_seq(Some(len),
Token::TupleStructSep,
Token::TupleStructEnd,
visitor)
} }
Some(Token::MapStart(len)) => { Some(Token::MapStart(len)) => {
self.visit_map(len, Token::MapSep, Token::MapEnd, visitor) self.visit_map(len, Token::MapSep, Token::MapEnd, visitor)
@@ -126,6 +129,13 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
Some(Token::StructStart(_, len)) => { Some(Token::StructStart(_, len)) => {
self.visit_map(Some(len), Token::StructSep, Token::StructEnd, visitor) self.visit_map(Some(len), Token::StructSep, Token::StructEnd, visitor)
} }
Some(Token::EnumUnit(_, variant)) => visitor.visit_str(variant),
Some(Token::EnumStart(variant)) |
Some(Token::EnumNewType(_, variant)) |
Some(Token::EnumSeqStart(_, variant, _)) |
Some(Token::EnumMapStart(_, variant, _)) => {
visitor.visit_map(EnumMapVisitor::new(self, variant))
}
Some(token) => Err(Error::UnexpectedToken(token)), Some(token) => Err(Error::UnexpectedToken(token)),
None => Err(Error::EndOfTokens), None => Err(Error::EndOfTokens),
} }
@@ -134,10 +144,11 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
/// Hook into `Option` deserializing so we can treat `Unit` as a /// Hook into `Option` deserializing so we can treat `Unit` as a
/// `None`, or a regular value as `Some(value)`. /// `None`, or a regular value as `Some(value)`.
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
where V: Visitor, where V: Visitor
{ {
match self.tokens.peek() { match self.tokens.peek() {
Some(&Token::Unit) | Some(&Token::Option(false)) => { Some(&Token::Unit) |
Some(&Token::Option(false)) => {
self.tokens.next(); self.tokens.next();
visitor.visit_none() visitor.visit_none()
} }
@@ -151,26 +162,23 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
} }
fn deserialize_enum<V>(self, fn deserialize_enum<V>(self,
name: &str, name: &str,
_variants: &'static [&'static str], _variants: &'static [&'static str],
visitor: V) -> Result<V::Value, Error> visitor: V)
where V: Visitor, -> Result<V::Value, Error>
where V: Visitor
{ {
match self.tokens.peek() { match self.tokens.peek() {
Some(&Token::EnumStart(n)) if name == n => { Some(&Token::EnumStart(n)) if name == n => {
self.tokens.next(); self.tokens.next();
visitor.visit_enum(DeserializerEnumVisitor { visitor.visit_enum(DeserializerEnumVisitor { de: self })
de: self,
})
} }
Some(&Token::EnumUnit(n, _)) Some(&Token::EnumUnit(n, _)) |
| Some(&Token::EnumNewType(n, _)) Some(&Token::EnumNewType(n, _)) |
| Some(&Token::EnumSeqStart(n, _, _)) Some(&Token::EnumSeqStart(n, _, _)) |
| Some(&Token::EnumMapStart(n, _, _)) if name == n => { Some(&Token::EnumMapStart(n, _, _)) if name == n => {
visitor.visit_enum(DeserializerEnumVisitor { visitor.visit_enum(DeserializerEnumVisitor { de: self })
de: self,
})
} }
Some(_) => { Some(_) => {
let token = self.tokens.next().unwrap(); let token = self.tokens.next().unwrap();
@@ -181,7 +189,7 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
} }
fn deserialize_unit_struct<V>(self, name: &str, visitor: V) -> Result<V::Value, Error> fn deserialize_unit_struct<V>(self, name: &str, visitor: V) -> Result<V::Value, Error>
where V: Visitor, where V: Visitor
{ {
match self.tokens.peek() { match self.tokens.peek() {
Some(&Token::UnitStruct(n)) => { Some(&Token::UnitStruct(n)) => {
@@ -197,10 +205,8 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
} }
} }
fn deserialize_newtype_struct<V>(self, fn deserialize_newtype_struct<V>(self, name: &str, visitor: V) -> Result<V::Value, Error>
name: &str, where V: Visitor
visitor: V) -> Result<V::Value, Error>
where V: Visitor,
{ {
match self.tokens.peek() { match self.tokens.peek() {
Some(&Token::StructNewType(n)) => { Some(&Token::StructNewType(n)) => {
@@ -216,10 +222,8 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
} }
} }
fn deserialize_seq_fixed_size<V>(self, fn deserialize_seq_fixed_size<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
len: usize, where V: Visitor
visitor: V) -> Result<V::Value, Error>
where V: Visitor,
{ {
match self.tokens.peek() { match self.tokens.peek() {
Some(&Token::SeqArrayStart(_)) => { Some(&Token::SeqArrayStart(_)) => {
@@ -231,13 +235,12 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
} }
} }
fn deserialize_tuple<V>(self, fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
len: usize, where V: Visitor
visitor: V) -> Result<V::Value, Error>
where V: Visitor,
{ {
match self.tokens.peek() { match self.tokens.peek() {
Some(&Token::Unit) | Some(&Token::UnitStruct(_)) => { Some(&Token::Unit) |
Some(&Token::UnitStruct(_)) => {
self.tokens.next(); self.tokens.next();
visitor.visit_unit() visitor.visit_unit()
} }
@@ -255,7 +258,10 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
} }
Some(&Token::TupleStructStart(_, _)) => { Some(&Token::TupleStructStart(_, _)) => {
self.tokens.next(); self.tokens.next();
self.visit_seq(Some(len), Token::TupleStructSep, Token::TupleStructEnd, visitor) self.visit_seq(Some(len),
Token::TupleStructSep,
Token::TupleStructEnd,
visitor)
} }
Some(_) => self.deserialize(visitor), Some(_) => self.deserialize(visitor),
None => Err(Error::EndOfTokens), None => Err(Error::EndOfTokens),
@@ -265,8 +271,9 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
fn deserialize_tuple_struct<V>(self, fn deserialize_tuple_struct<V>(self,
name: &str, name: &str,
len: usize, len: usize,
visitor: V) -> Result<V::Value, Error> visitor: V)
where V: Visitor, -> Result<V::Value, Error>
where V: Visitor
{ {
match self.tokens.peek() { match self.tokens.peek() {
Some(&Token::Unit) => { Some(&Token::Unit) => {
@@ -296,7 +303,10 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
Some(&Token::TupleStructStart(n, _)) => { Some(&Token::TupleStructStart(n, _)) => {
self.tokens.next(); self.tokens.next();
if name == n { if name == n {
self.visit_seq(Some(len), Token::TupleStructSep, Token::TupleStructEnd, visitor) self.visit_seq(Some(len),
Token::TupleStructSep,
Token::TupleStructEnd,
visitor)
} else { } else {
Err(Error::InvalidName(n)) Err(Error::InvalidName(n))
} }
@@ -309,14 +319,18 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
fn deserialize_struct<V>(self, fn deserialize_struct<V>(self,
name: &str, name: &str,
fields: &'static [&'static str], fields: &'static [&'static str],
visitor: V) -> Result<V::Value, Error> visitor: V)
where V: Visitor, -> Result<V::Value, Error>
where V: Visitor
{ {
match self.tokens.peek() { match self.tokens.peek() {
Some(&Token::StructStart(n, _)) => { Some(&Token::StructStart(n, _)) => {
self.tokens.next(); self.tokens.next();
if name == n { if name == n {
self.visit_map(Some(fields.len()), Token::StructSep, Token::StructEnd, visitor) self.visit_map(Some(fields.len()),
Token::StructSep,
Token::StructEnd,
visitor)
} else { } else {
Err(Error::InvalidName(n)) Err(Error::InvalidName(n))
} }
@@ -333,7 +347,9 @@ impl<'a, I> de::Deserializer for &'a mut Deserializer<I>
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
struct DeserializerSeqVisitor<'a, I: 'a> where I: Iterator<Item=Token<'static>> { struct DeserializerSeqVisitor<'a, I: 'a>
where I: Iterator<Item = Token<'static>>
{
de: &'a mut Deserializer<I>, de: &'a mut Deserializer<I>,
len: Option<usize>, len: Option<usize>,
sep: Token<'static>, sep: Token<'static>,
@@ -341,12 +357,12 @@ struct DeserializerSeqVisitor<'a, I: 'a> where I: Iterator<Item=Token<'static>>
} }
impl<'a, I> SeqVisitor for DeserializerSeqVisitor<'a, I> impl<'a, I> SeqVisitor for DeserializerSeqVisitor<'a, I>
where I: Iterator<Item=Token<'static>>, where I: Iterator<Item = Token<'static>>
{ {
type Error = Error; type Error = Error;
fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
where T: DeserializeSeed, where T: DeserializeSeed
{ {
if self.de.tokens.peek() == Some(&self.end) { if self.de.tokens.peek() == Some(&self.end) {
return Ok(None); return Ok(None);
@@ -369,7 +385,9 @@ impl<'a, I> SeqVisitor for DeserializerSeqVisitor<'a, I>
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
struct DeserializerMapVisitor<'a, I: 'a> where I: Iterator<Item=Token<'static>> { struct DeserializerMapVisitor<'a, I: 'a>
where I: Iterator<Item = Token<'static>>
{
de: &'a mut Deserializer<I>, de: &'a mut Deserializer<I>,
len: Option<usize>, len: Option<usize>,
sep: Token<'static>, sep: Token<'static>,
@@ -377,12 +395,12 @@ struct DeserializerMapVisitor<'a, I: 'a> where I: Iterator<Item=Token<'static>>
} }
impl<'a, I> MapVisitor for DeserializerMapVisitor<'a, I> impl<'a, I> MapVisitor for DeserializerMapVisitor<'a, I>
where I: Iterator<Item=Token<'static>>, where I: Iterator<Item = Token<'static>>
{ {
type Error = Error; type Error = Error;
fn visit_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> fn visit_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
where K: DeserializeSeed, where K: DeserializeSeed
{ {
if self.de.tokens.peek() == Some(&self.end) { if self.de.tokens.peek() == Some(&self.end) {
return Ok(None); return Ok(None);
@@ -398,7 +416,7 @@ impl<'a, I> MapVisitor for DeserializerMapVisitor<'a, I>
} }
fn visit_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> fn visit_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
where V: DeserializeSeed, where V: DeserializeSeed
{ {
seed.deserialize(&mut *self.de) seed.deserialize(&mut *self.de)
} }
@@ -411,24 +429,26 @@ impl<'a, I> MapVisitor for DeserializerMapVisitor<'a, I>
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
struct DeserializerEnumVisitor<'a, I: 'a> where I: Iterator<Item=Token<'static>> { struct DeserializerEnumVisitor<'a, I: 'a>
where I: Iterator<Item = Token<'static>>
{
de: &'a mut Deserializer<I>, de: &'a mut Deserializer<I>,
} }
impl<'a, I> EnumVisitor for DeserializerEnumVisitor<'a, I> impl<'a, I> EnumVisitor for DeserializerEnumVisitor<'a, I>
where I: Iterator<Item=Token<'static>>, where I: Iterator<Item = Token<'static>>
{ {
type Error = Error; type Error = Error;
type Variant = Self; type Variant = Self;
fn visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, Self), Error> fn visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, Self), Error>
where V: DeserializeSeed, where V: DeserializeSeed
{ {
match self.de.tokens.peek() { match self.de.tokens.peek() {
Some(&Token::EnumUnit(_, v)) Some(&Token::EnumUnit(_, v)) |
| Some(&Token::EnumNewType(_, v)) Some(&Token::EnumNewType(_, v)) |
| Some(&Token::EnumSeqStart(_, v, _)) Some(&Token::EnumSeqStart(_, v, _)) |
| Some(&Token::EnumMapStart(_, v, _)) => { Some(&Token::EnumMapStart(_, v, _)) => {
let de = v.into_deserializer(); let de = v.into_deserializer();
let value = try!(seed.deserialize(de)); let value = try!(seed.deserialize(de));
Ok((value, self)) Ok((value, self))
@@ -443,7 +463,7 @@ impl<'a, I> EnumVisitor for DeserializerEnumVisitor<'a, I>
} }
impl<'a, I> VariantVisitor for DeserializerEnumVisitor<'a, I> impl<'a, I> VariantVisitor for DeserializerEnumVisitor<'a, I>
where I: Iterator<Item=Token<'static>> where I: Iterator<Item = Token<'static>>
{ {
type Error = Error; type Error = Error;
@@ -453,32 +473,26 @@ impl<'a, I> VariantVisitor for DeserializerEnumVisitor<'a, I>
self.de.tokens.next(); self.de.tokens.next();
Ok(()) Ok(())
} }
Some(_) => { Some(_) => Deserialize::deserialize(self.de),
Deserialize::deserialize(self.de)
}
None => Err(Error::EndOfTokens), None => Err(Error::EndOfTokens),
} }
} }
fn visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, Self::Error> fn visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
where T: DeserializeSeed, where T: DeserializeSeed
{ {
match self.de.tokens.peek() { match self.de.tokens.peek() {
Some(&Token::EnumNewType(_, _)) => { Some(&Token::EnumNewType(_, _)) => {
self.de.tokens.next(); self.de.tokens.next();
seed.deserialize(self.de) seed.deserialize(self.de)
} }
Some(_) => { Some(_) => seed.deserialize(self.de),
seed.deserialize(self.de)
}
None => Err(Error::EndOfTokens), None => Err(Error::EndOfTokens),
} }
} }
fn visit_tuple<V>(self, fn visit_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
len: usize, where V: Visitor
visitor: V) -> Result<V::Value, Error>
where V: Visitor,
{ {
match self.de.tokens.peek() { match self.de.tokens.peek() {
Some(&Token::EnumSeqStart(_, _, enum_len)) => { Some(&Token::EnumSeqStart(_, _, enum_len)) => {
@@ -499,24 +513,23 @@ impl<'a, I> VariantVisitor for DeserializerEnumVisitor<'a, I>
Err(Error::UnexpectedToken(token)) Err(Error::UnexpectedToken(token))
} }
} }
Some(_) => { Some(_) => de::Deserializer::deserialize(self.de, visitor),
de::Deserializer::deserialize(self.de, visitor)
}
None => Err(Error::EndOfTokens), None => Err(Error::EndOfTokens),
} }
} }
fn visit_struct<V>(self, fn visit_struct<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
fields: &'static [&'static str], where V: Visitor
visitor: V) -> Result<V::Value, Error>
where V: Visitor,
{ {
match self.de.tokens.peek() { match self.de.tokens.peek() {
Some(&Token::EnumMapStart(_, _, enum_len)) => { Some(&Token::EnumMapStart(_, _, enum_len)) => {
let token = self.de.tokens.next().unwrap(); let token = self.de.tokens.next().unwrap();
if fields.len() == enum_len { if fields.len() == enum_len {
self.de.visit_map(Some(fields.len()), Token::EnumMapSep, Token::EnumMapEnd, visitor) self.de.visit_map(Some(fields.len()),
Token::EnumMapSep,
Token::EnumMapEnd,
visitor)
} else { } else {
Err(Error::UnexpectedToken(token)) Err(Error::UnexpectedToken(token))
} }
@@ -530,10 +543,77 @@ impl<'a, I> VariantVisitor for DeserializerEnumVisitor<'a, I>
Err(Error::UnexpectedToken(token)) Err(Error::UnexpectedToken(token))
} }
} }
Some(_) => { Some(_) => de::Deserializer::deserialize(self.de, visitor),
de::Deserializer::deserialize(self.de, visitor)
}
None => Err(Error::EndOfTokens), None => Err(Error::EndOfTokens),
} }
} }
} }
//////////////////////////////////////////////////////////////////////////
struct EnumMapVisitor<'a, I: 'a>
where I: Iterator<Item = Token<'static>>
{
de: &'a mut Deserializer<I>,
variant: Option<&'a str>,
}
impl<'a, I: 'a> EnumMapVisitor<'a, I>
where I: Iterator<Item = Token<'static>>
{
fn new(de: &'a mut Deserializer<I>, variant: &'a str) -> Self {
EnumMapVisitor {
de: de,
variant: Some(variant),
}
}
}
impl<'a, I: 'a> MapVisitor for EnumMapVisitor<'a, I>
where I: Iterator<Item = Token<'static>>
{
type Error = Error;
fn visit_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
where K: DeserializeSeed
{
match self.variant.take() {
Some(variant) => seed.deserialize(variant.into_deserializer()).map(Some),
None => Ok(None),
}
}
fn visit_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
where V: DeserializeSeed
{
match self.de.tokens.peek() {
Some(&Token::EnumSeqSep) => {
let value = {
let visitor = DeserializerSeqVisitor {
de: self.de,
len: None,
sep: Token::EnumSeqSep,
end: Token::EnumSeqEnd,
};
try!(seed.deserialize(SeqVisitorDeserializer::new(visitor)))
};
try!(self.de.expect_token(Token::EnumSeqEnd));
Ok(value)
}
Some(&Token::EnumMapSep) => {
let value = {
let visitor = DeserializerMapVisitor {
de: self.de,
len: None,
sep: Token::EnumMapSep,
end: Token::EnumMapEnd,
};
try!(seed.deserialize(MapVisitorDeserializer::new(visitor)))
};
try!(self.de.expect_token(Token::EnumMapEnd));
Ok(value)
}
_ => seed.deserialize(&mut *self.de),
}
}
}
+2 -7
View File
@@ -2,13 +2,8 @@
extern crate serde; extern crate serde;
mod assert; mod assert;
pub use assert::{ pub use assert::{assert_tokens, assert_ser_tokens, assert_ser_tokens_error, assert_de_tokens,
assert_tokens, assert_de_tokens_error};
assert_ser_tokens,
assert_ser_tokens_error,
assert_de_tokens,
assert_de_tokens_error,
};
mod ser; mod ser;
pub use ser::Serializer; pub use ser::Serializer;
+46 -29
View File
@@ -6,14 +6,14 @@ use error::Error;
use token::Token; use token::Token;
pub struct Serializer<'a, I> pub struct Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
tokens: I, tokens: I,
phantom: PhantomData<&'a Token<'a>>, phantom: PhantomData<&'a Token<'a>>,
} }
impl<'a, I> Serializer<'a, I> impl<'a, I> Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
pub fn new(tokens: I) -> Serializer<'a, I> { pub fn new(tokens: I) -> Serializer<'a, I> {
Serializer { Serializer {
@@ -28,7 +28,7 @@ impl<'a, I> Serializer<'a, I>
} }
impl<'s, 'a, I> ser::Serializer for &'s mut Serializer<'a, I> impl<'s, 'a, I> ser::Serializer for &'s mut Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
type Ok = (); type Ok = ();
type Error = Error; type Error = Error;
@@ -124,15 +124,14 @@ impl<'s, 'a, I> ser::Serializer for &'s mut Serializer<'a, I>
fn serialize_unit_variant(self, fn serialize_unit_variant(self,
name: &str, name: &str,
_variant_index: usize, _variant_index: usize,
variant: &str) -> Result<(), Error> { variant: &str)
-> Result<(), Error> {
assert_eq!(self.tokens.next(), Some(&Token::EnumUnit(name, variant))); assert_eq!(self.tokens.next(), Some(&Token::EnumUnit(name, variant)));
Ok(()) Ok(())
} }
fn serialize_newtype_struct<T: ?Sized>(self, fn serialize_newtype_struct<T: ?Sized>(self, name: &'static str, value: &T) -> Result<(), Error>
name: &'static str, where T: Serialize
value: &T) -> Result<(), Error>
where T: Serialize,
{ {
assert_eq!(self.tokens.next(), Some(&Token::StructNewType(name))); assert_eq!(self.tokens.next(), Some(&Token::StructNewType(name)));
value.serialize(self) value.serialize(self)
@@ -142,8 +141,9 @@ impl<'s, 'a, I> ser::Serializer for &'s mut Serializer<'a, I>
name: &str, name: &str,
_variant_index: usize, _variant_index: usize,
variant: &str, variant: &str,
value: &T) -> Result<(), Error> value: &T)
where T: Serialize, -> Result<(), Error>
where T: Serialize
{ {
assert_eq!(self.tokens.next(), Some(&Token::EnumNewType(name, variant))); assert_eq!(self.tokens.next(), Some(&Token::EnumNewType(name, variant)));
value.serialize(self) value.serialize(self)
@@ -155,7 +155,7 @@ impl<'s, 'a, I> ser::Serializer for &'s mut Serializer<'a, I>
} }
fn serialize_some<T: ?Sized>(self, value: &T) -> Result<(), Error> fn serialize_some<T: ?Sized>(self, value: &T) -> Result<(), Error>
where T: Serialize, where T: Serialize
{ {
assert_eq!(self.tokens.next(), Some(&Token::Option(true))); assert_eq!(self.tokens.next(), Some(&Token::Option(true)));
value.serialize(self) value.serialize(self)
@@ -177,7 +177,8 @@ impl<'s, 'a, I> ser::Serializer for &'s mut Serializer<'a, I>
} }
fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self, Error> { fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self, Error> {
assert_eq!(self.tokens.next(), Some(&Token::TupleStructStart(name, len))); assert_eq!(self.tokens.next(),
Some(&Token::TupleStructStart(name, len)));
Ok(self) Ok(self)
} }
@@ -185,9 +186,10 @@ impl<'s, 'a, I> ser::Serializer for &'s mut Serializer<'a, I>
name: &str, name: &str,
_variant_index: usize, _variant_index: usize,
variant: &str, variant: &str,
len: usize) -> Result<Self, Error> len: usize)
{ -> Result<Self, Error> {
assert_eq!(self.tokens.next(), Some(&Token::EnumSeqStart(name, variant, len))); assert_eq!(self.tokens.next(),
Some(&Token::EnumSeqStart(name, variant, len)));
Ok(self) Ok(self)
} }
@@ -205,15 +207,16 @@ impl<'s, 'a, I> ser::Serializer for &'s mut Serializer<'a, I>
name: &str, name: &str,
_variant_index: usize, _variant_index: usize,
variant: &str, variant: &str,
len: usize) -> Result<Self, Error> len: usize)
{ -> Result<Self, Error> {
assert_eq!(self.tokens.next(), Some(&Token::EnumMapStart(name, variant, len))); assert_eq!(self.tokens.next(),
Some(&Token::EnumMapStart(name, variant, len)));
Ok(self) Ok(self)
} }
} }
impl<'s, 'a, I> ser::SerializeSeq for &'s mut Serializer<'a, I> impl<'s, 'a, I> ser::SerializeSeq for &'s mut Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
type Ok = (); type Ok = ();
type Error = Error; type Error = Error;
@@ -232,7 +235,7 @@ impl<'s, 'a, I> ser::SerializeSeq for &'s mut Serializer<'a, I>
} }
impl<'s, 'a, I> ser::SerializeTuple for &'s mut Serializer<'a, I> impl<'s, 'a, I> ser::SerializeTuple for &'s mut Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
type Ok = (); type Ok = ();
type Error = Error; type Error = Error;
@@ -251,7 +254,7 @@ impl<'s, 'a, I> ser::SerializeTuple for &'s mut Serializer<'a, I>
} }
impl<'s, 'a, I> ser::SerializeTupleStruct for &'s mut Serializer<'a, I> impl<'s, 'a, I> ser::SerializeTupleStruct for &'s mut Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
type Ok = (); type Ok = ();
type Error = Error; type Error = Error;
@@ -270,7 +273,7 @@ impl<'s, 'a, I> ser::SerializeTupleStruct for &'s mut Serializer<'a, I>
} }
impl<'s, 'a, I> ser::SerializeTupleVariant for &'s mut Serializer<'a, I> impl<'s, 'a, I> ser::SerializeTupleVariant for &'s mut Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
type Ok = (); type Ok = ();
type Error = Error; type Error = Error;
@@ -289,17 +292,21 @@ impl<'s, 'a, I> ser::SerializeTupleVariant for &'s mut Serializer<'a, I>
} }
impl<'s, 'a, I> ser::SerializeMap for &'s mut Serializer<'a, I> impl<'s, 'a, I> ser::SerializeMap for &'s mut Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
type Ok = (); type Ok = ();
type Error = Error; type Error = Error;
fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error> where T: Serialize { fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
where T: Serialize
{
assert_eq!(self.tokens.next(), Some(&Token::MapSep)); assert_eq!(self.tokens.next(), Some(&Token::MapSep));
key.serialize(&mut **self) key.serialize(&mut **self)
} }
fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize { fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
where T: Serialize
{
value.serialize(&mut **self) value.serialize(&mut **self)
} }
@@ -310,12 +317,17 @@ impl<'s, 'a, I> ser::SerializeMap for &'s mut Serializer<'a, I>
} }
impl<'s, 'a, I> ser::SerializeStruct for &'s mut Serializer<'a, I> impl<'s, 'a, I> ser::SerializeStruct for &'s mut Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
type Ok = (); type Ok = ();
type Error = Error; type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> where T: Serialize { fn serialize_field<T: ?Sized>(&mut self,
key: &'static str,
value: &T)
-> Result<(), Self::Error>
where T: Serialize
{
assert_eq!(self.tokens.next(), Some(&Token::StructSep)); assert_eq!(self.tokens.next(), Some(&Token::StructSep));
try!(key.serialize(&mut **self)); try!(key.serialize(&mut **self));
value.serialize(&mut **self) value.serialize(&mut **self)
@@ -328,12 +340,17 @@ impl<'s, 'a, I> ser::SerializeStruct for &'s mut Serializer<'a, I>
} }
impl<'s, 'a, I> ser::SerializeStructVariant for &'s mut Serializer<'a, I> impl<'s, 'a, I> ser::SerializeStructVariant for &'s mut Serializer<'a, I>
where I: Iterator<Item=&'a Token<'a>>, where I: Iterator<Item = &'a Token<'a>>
{ {
type Ok = (); type Ok = ();
type Error = Error; type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> where T: Serialize { fn serialize_field<T: ?Sized>(&mut self,
key: &'static str,
value: &T)
-> Result<(), Self::Error>
where T: Serialize
{
assert_eq!(self.tokens.next(), Some(&Token::EnumMapSep)); assert_eq!(self.tokens.next(), Some(&Token::EnumMapSep));
try!(key.serialize(&mut **self)); try!(key.serialize(&mut **self));
value.serialize(&mut **self) value.serialize(&mut **self)
-7
View File
@@ -2,13 +2,6 @@
name = "serde_test_suite" name = "serde_test_suite"
version = "0.0.0" version = "0.0.0"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
license = "MIT/Apache-2.0"
description = "A generic serialization/deserialization framework"
homepage = "https://serde.rs"
repository = "https://github.com/serde-rs/serde"
documentation = "https://docs.serde.rs/serde/"
readme = "README.md"
keywords = ["serialization"]
publish = false publish = false
[features] [features]
@@ -0,0 +1,8 @@
#[macro_use]
extern crate serde_derive;
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[serde(default)] //~^ HELP: #[serde(default)] can only be used on structs
enum E {
S { f: u8 },
}
@@ -0,0 +1,8 @@
#[macro_use]
extern crate serde_derive;
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[serde(default)] //~^ HELP: #[serde(default)] can only be used on structs
struct T(u8, u8);
fn main() { }
@@ -0,0 +1,10 @@
#[macro_use]
extern crate serde_derive;
#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
struct S {
#[serde(with = "w", serialize_with = "s")] //~^^ HELP: duplicate serde attribute `serialize_with`
x: (),
}
fn main() {}
+34
View File
@@ -2,6 +2,7 @@ use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
use std::net; use std::net;
use std::path::PathBuf; use std::path::PathBuf;
use std::time::Duration; use std::time::Duration;
use std::default::Default;
use serde::Deserialize; use serde::Deserialize;
@@ -40,6 +41,22 @@ struct StructDenyUnknown {
b: i32, b: i32,
} }
#[derive(PartialEq, Debug, Deserialize)]
#[serde(default)]
struct StructDefault<T> {
a: i32,
b: T,
}
impl Default for StructDefault<String> {
fn default() -> Self {
StructDefault {
a: 100,
b: "default".to_string(),
}
}
}
#[derive(PartialEq, Debug, Deserialize)] #[derive(PartialEq, Debug, Deserialize)]
struct StructSkipAll { struct StructSkipAll {
#[serde(skip_deserializing)] #[serde(skip_deserializing)]
@@ -728,6 +745,23 @@ declare_tests! {
Token::StructEnd, Token::StructEnd,
], ],
} }
test_struct_default {
StructDefault { a: 50, b: "overwritten".to_string() } => &[
Token::StructStart("StructDefault", 1),
Token::StructSep,
Token::Str("a"),
Token::I32(50),
Token::StructSep,
Token::Str("b"),
Token::String("overwritten".to_string()),
Token::StructEnd,
],
StructDefault { a: 100, b: "default".to_string() } => &[
Token::StructStart("StructDefault", 0),
Token::StructEnd,
],
}
test_enum_unit { test_enum_unit {
Enum::Unit => &[ Enum::Unit => &[
Token::EnumUnit("Enum", "Unit"), Token::EnumUnit("Enum", "Unit"),
+15 -3
View File
@@ -30,6 +30,14 @@ fn test_gen() {
} }
assert::<With<i32>>(); assert::<With<i32>>();
#[derive(Serialize, Deserialize)]
struct WithTogether<T> {
t: T,
#[serde(with="both_x")]
x: X,
}
assert::<WithTogether<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct WithRef<'a, T: 'a> { struct WithRef<'a, T: 'a> {
#[serde(skip_deserializing)] #[serde(skip_deserializing)]
@@ -307,16 +315,20 @@ trait DeserializeWith: Sized {
} }
// Implements neither Serialize nor Deserialize // Implements neither Serialize nor Deserialize
struct X; pub struct X;
fn ser_x<S: Serializer>(_: &X, _: S) -> StdResult<S::Ok, S::Error> { pub fn ser_x<S: Serializer>(_: &X, _: S) -> StdResult<S::Ok, S::Error> {
unimplemented!() unimplemented!()
} }
fn de_x<D: Deserializer>(_: D) -> StdResult<X, D::Error> { pub fn de_x<D: Deserializer>(_: D) -> StdResult<X, D::Error> {
unimplemented!() unimplemented!()
} }
mod both_x {
pub use super::{ser_x as serialize, de_x as deserialize};
}
impl SerializeWith for X { impl SerializeWith for X {
fn serialize_with<S: Serializer>(_: &Self, _: S) -> StdResult<S::Ok, S::Error> { fn serialize_with<S: Serializer>(_: &Self, _: S) -> StdResult<S::Ok, S::Error> {
unimplemented!() unimplemented!()
+341
View File
@@ -881,3 +881,344 @@ fn test_internally_tagged_enum() {
Error::Message("unknown variant `Z`, expected one of `A`, `B`, `C`, `D`, `E`, `F`".to_owned()), Error::Message("unknown variant `Z`, expected one of `A`, `B`, `C`, `D`, `E`, `F`".to_owned()),
); );
} }
#[test]
fn test_adjacently_tagged_enum() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "t", content = "c")]
enum AdjacentlyTagged<T> {
Unit,
Newtype(T),
Tuple(u8, u8),
Struct { f: u8 },
}
// unit with no content
assert_tokens(
&AdjacentlyTagged::Unit::<u8>,
&[
Token::StructStart("AdjacentlyTagged", 1),
Token::StructSep,
Token::Str("t"),
Token::Str("Unit"),
Token::StructEnd,
]
);
// unit with tag first
assert_de_tokens(
&AdjacentlyTagged::Unit::<u8>,
&[
Token::StructStart("AdjacentlyTagged", 1),
Token::StructSep,
Token::Str("t"),
Token::Str("Unit"),
Token::StructSep,
Token::Str("c"),
Token::Unit,
Token::StructEnd,
]
);
// unit with content first
assert_de_tokens(
&AdjacentlyTagged::Unit::<u8>,
&[
Token::StructStart("AdjacentlyTagged", 1),
Token::StructSep,
Token::Str("c"),
Token::Unit,
Token::StructSep,
Token::Str("t"),
Token::Str("Unit"),
Token::StructEnd,
]
);
// newtype with tag first
assert_tokens(
&AdjacentlyTagged::Newtype::<u8>(1),
&[
Token::StructStart("AdjacentlyTagged", 2),
Token::StructSep,
Token::Str("t"),
Token::Str("Newtype"),
Token::StructSep,
Token::Str("c"),
Token::U8(1),
Token::StructEnd,
]
);
// newtype with content first
assert_de_tokens(
&AdjacentlyTagged::Newtype::<u8>(1),
&[
Token::StructStart("AdjacentlyTagged", 2),
Token::StructSep,
Token::Str("c"),
Token::U8(1),
Token::StructSep,
Token::Str("t"),
Token::Str("Newtype"),
Token::StructEnd,
]
);
// tuple with tag first
assert_tokens(
&AdjacentlyTagged::Tuple::<u8>(1, 1),
&[
Token::StructStart("AdjacentlyTagged", 2),
Token::StructSep,
Token::Str("t"),
Token::Str("Tuple"),
Token::StructSep,
Token::Str("c"),
Token::TupleStart(2),
Token::TupleSep,
Token::U8(1),
Token::TupleSep,
Token::U8(1),
Token::TupleEnd,
Token::StructEnd,
]
);
// tuple with content first
assert_de_tokens(
&AdjacentlyTagged::Tuple::<u8>(1, 1),
&[
Token::StructStart("AdjacentlyTagged", 2),
Token::StructSep,
Token::Str("c"),
Token::TupleStart(2),
Token::TupleSep,
Token::U8(1),
Token::TupleSep,
Token::U8(1),
Token::TupleEnd,
Token::StructSep,
Token::Str("t"),
Token::Str("Tuple"),
Token::StructEnd,
]
);
// struct with tag first
assert_tokens(
&AdjacentlyTagged::Struct::<u8> { f: 1 },
&[
Token::StructStart("AdjacentlyTagged", 2),
Token::StructSep,
Token::Str("t"),
Token::Str("Struct"),
Token::StructSep,
Token::Str("c"),
Token::StructStart("Struct", 1),
Token::StructSep,
Token::Str("f"),
Token::U8(1),
Token::StructEnd,
Token::StructEnd,
]
);
// struct with content first
assert_de_tokens(
&AdjacentlyTagged::Struct::<u8> { f: 1 },
&[
Token::StructStart("AdjacentlyTagged", 2),
Token::StructSep,
Token::Str("c"),
Token::StructStart("Struct", 1),
Token::StructSep,
Token::Str("f"),
Token::U8(1),
Token::StructEnd,
Token::StructSep,
Token::Str("t"),
Token::Str("Struct"),
Token::StructEnd,
]
);
}
#[test]
fn test_enum_in_internally_tagged_enum() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
enum Outer {
Inner(Inner),
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
enum Inner {
Unit,
Newtype(u8),
Tuple(u8, u8),
Struct { f: u8 },
}
assert_tokens(
&Outer::Inner(Inner::Unit),
&[
Token::MapStart(Some(2)),
Token::MapSep,
Token::Str("type"),
Token::Str("Inner"),
Token::MapSep,
Token::Str("Unit"),
Token::Unit,
Token::MapEnd,
]
);
assert_tokens(
&Outer::Inner(Inner::Newtype(1)),
&[
Token::MapStart(Some(2)),
Token::MapSep,
Token::Str("type"),
Token::Str("Inner"),
Token::MapSep,
Token::Str("Newtype"),
Token::U8(1),
Token::MapEnd,
]
);
assert_tokens(
&Outer::Inner(Inner::Tuple(1, 1)),
&[
Token::MapStart(Some(2)),
Token::MapSep,
Token::Str("type"),
Token::Str("Inner"),
Token::MapSep,
Token::Str("Tuple"),
Token::TupleStructStart("Tuple", 2),
Token::TupleStructSep,
Token::U8(1),
Token::TupleStructSep,
Token::U8(1),
Token::TupleStructEnd,
Token::MapEnd,
]
);
assert_tokens(
&Outer::Inner(Inner::Struct { f: 1 }),
&[
Token::MapStart(Some(2)),
Token::MapSep,
Token::Str("type"),
Token::Str("Inner"),
Token::MapSep,
Token::Str("Struct"),
Token::StructStart("Struct", 1),
Token::StructSep,
Token::Str("f"),
Token::U8(1),
Token::StructEnd,
Token::MapEnd,
]
);
}
#[test]
fn test_enum_in_untagged_enum() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
enum Outer {
Inner(Inner),
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
enum Inner {
Unit,
Newtype(u8),
Tuple(u8, u8),
Struct { f: u8 },
}
assert_tokens(
&Outer::Inner(Inner::Unit),
&[
Token::EnumUnit("Inner", "Unit"),
]
);
assert_tokens(
&Outer::Inner(Inner::Newtype(1)),
&[
Token::EnumNewType("Inner", "Newtype"),
Token::U8(1),
]
);
assert_tokens(
&Outer::Inner(Inner::Tuple(1, 1)),
&[
Token::EnumSeqStart("Inner", "Tuple", 2),
Token::EnumSeqSep,
Token::U8(1),
Token::EnumSeqSep,
Token::U8(1),
Token::EnumSeqEnd,
]
);
assert_tokens(
&Outer::Inner(Inner::Struct { f: 1 }),
&[
Token::EnumMapStart("Inner", "Struct", 1),
Token::EnumMapSep,
Token::Str("f"),
Token::U8(1),
Token::EnumMapEnd,
]
);
}