Compare commits

...

21 Commits

Author SHA1 Message Date
David Tolnay 1f65ce75ec Release 0.8.23 2017-01-20 15:25:57 -08:00
Jake Goulding 9536e52aa6 Add categories to Cargo.toml 2017-01-20 15:09:11 -08:00
David Tolnay 9e45bd8c87 Release 0.8.22 2017-01-10 17:10:26 -08:00
David Tolnay e461a23798 Not intended to be published 2017-01-08 00:18:37 -08:00
David Tolnay 894a21bc1f Remove the proc_macro feature gate 2017-01-08 00:11:11 -08:00
David Tolnay 1ecf3730ee Update to syntex 0.54 2017-01-06 01:26:51 -08:00
Erick Tryzelaar b6e8b58cb2 Stop testing on 1.11 2017-01-02 14:59:00 -08:00
Oliver Schneider a3f556959f Merge pull request #652 from serde-rs/bbstr
Support deserializing ByteBuf from string
2016-12-25 01:09:15 +01:00
David Tolnay 9338c4f1b9 Release 0.8.21 2016-12-24 13:10:24 -05:00
David Tolnay 28d67f4172 Format variant-skip message only if variant is skipped 2016-12-24 13:10:06 -05:00
David Tolnay 2401ae61a8 Update to syntex 0.52 2016-12-24 12:42:23 -05:00
David Tolnay 57d3fce0c6 Further simplify variant serialization patterns 2016-12-24 12:28:46 -05:00
David Tolnay a020cceed8 Simplify variant serialize patterns 2016-12-24 12:22:45 -05:00
David Tolnay 49e985eb90 Update message for skipped enum variant 2016-12-24 12:16:28 -05:00
David Tolnay 63def96c66 Merge pull request #653 from shinglyu/skip_se
Implement skip_serializing for enum variant
2016-12-24 11:40:21 -05:00
Shing Lyu 2fea8c9c28 Implement skip_serializing for enum variant 2016-12-24 22:34:22 +08:00
David Tolnay b7ea213926 Support nostd for ByteBuf from String 2016-12-23 23:30:27 -05:00
David Tolnay 871fb5adee Support deserializing ByteBuf from string 2016-12-23 23:17:42 -05:00
David Tolnay 2c984980a0 Link to release notes from readme 2016-12-22 21:52:37 -05:00
David Tolnay 36f07912b8 Remove no-longer-necessary cfg
This was fixed in Rust, allowing proc macro crates to be tested.
2016-12-17 17:32:11 -08:00
David Tolnay 7222cf7514 Ignore warning from unused enum variant 2016-12-17 17:31:11 -08:00
30 changed files with 193 additions and 274 deletions
+1 -1
View File
@@ -1,8 +1,8 @@
sudo: false sudo: false
language: rust language: rust
rust: rust:
- 1.11.0
- 1.12.0 - 1.12.0
- 1.13.0
- stable - stable
- beta - beta
- nightly - nightly
+1 -2
View File
@@ -11,12 +11,11 @@ You may be looking for:
- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html) - [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html)
- [Examples](https://serde.rs/examples.html) - [Examples](https://serde.rs/examples.html)
- [API documentation](https://docs.serde.rs/serde/) - [API documentation](https://docs.serde.rs/serde/)
- [Release notes](https://github.com/serde-rs/serde/releases)
## Serde in action ## Serde in action
```rust ```rust
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
+1
View File
@@ -3,6 +3,7 @@ name = "serde-syntex-example"
version = "0.1.0" version = "0.1.0"
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
build = "build.rs" build = "build.rs"
publish = false
[features] [features]
default = ["serde_codegen"] default = ["serde_codegen"]
+2 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde" name = "serde"
version = "0.8.20" version = "0.8.23"
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"
@@ -9,6 +9,7 @@ repository = "https://github.com/serde-rs/serde"
documentation = "https://docs.serde.rs/serde/" documentation = "https://docs.serde.rs/serde/"
readme = "../README.md" readme = "../README.md"
keywords = ["serde", "serialization"] keywords = ["serde", "serialization"]
categories = ["encoding"]
include = ["Cargo.toml", "src/**/*.rs"] include = ["Cargo.toml", "src/**/*.rs"]
[features] [features]
+14 -2
View File
@@ -84,7 +84,7 @@ mod bytebuf {
use de; use de;
#[cfg(feature = "collections")] #[cfg(feature = "collections")]
use collections::Vec; use collections::{String, Vec};
/// `ByteBuf` wraps a `Vec<u8>` and serializes as a byte array. /// `ByteBuf` wraps a `Vec<u8>` and serializes as a byte array.
#[derive(Clone, Default, Eq, Hash, PartialEq, PartialOrd, Ord)] #[derive(Clone, Default, Eq, Hash, PartialEq, PartialOrd, Ord)]
@@ -208,7 +208,7 @@ mod bytebuf {
fn visit_bytes<E>(&mut self, v: &[u8]) -> Result<ByteBuf, E> fn visit_bytes<E>(&mut self, v: &[u8]) -> Result<ByteBuf, E>
where E: de::Error, where E: de::Error,
{ {
self.visit_byte_buf(v.to_vec()) Ok(ByteBuf::from(v))
} }
#[inline] #[inline]
@@ -217,6 +217,18 @@ mod bytebuf {
{ {
Ok(ByteBuf::from(v)) Ok(ByteBuf::from(v))
} }
fn visit_str<E>(&mut self, v: &str) -> Result<ByteBuf, E>
where E: de::Error,
{
Ok(ByteBuf::from(v))
}
fn visit_string<E>(&mut self, v: String) -> Result<ByteBuf, E>
where E: de::Error,
{
Ok(ByteBuf::from(v))
}
} }
impl de::Deserialize for ByteBuf { impl de::Deserialize for ByteBuf {
+4 -4
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_codegen" name = "serde_codegen"
version = "0.8.20" version = "0.8.23"
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 to auto-generate implementations for the serde framework" description = "Macros to auto-generate implementations for the serde framework"
@@ -23,7 +23,7 @@ with-syn = []
[dependencies] [dependencies]
clippy = { version = "^0.*", optional = true } clippy = { version = "^0.*", optional = true }
quote = "0.3.8" quote = "0.3.8"
serde_codegen_internals = { version = "=0.11.2", default-features = false, path = "../serde_codegen_internals" } serde_codegen_internals = { version = "=0.11.3", default-features = false, path = "../serde_codegen_internals" }
syn = { version = "0.10", features = ["aster", "visit"] } syn = { version = "0.10", features = ["aster", "visit"] }
syntex = { version = "^0.50.0", optional = true } syntex = { version = "^0.54.0", optional = true }
syntex_syntax = { version = "^0.50.0", optional = true } syntex_syntax = { version = "^0.54.0", optional = true }
+7 -8
View File
@@ -38,11 +38,11 @@ fn syntex_registry() -> syntex::Registry {
impl fold::Folder for StripAttributeFolder { impl fold::Folder for StripAttributeFolder {
fn fold_attribute(&mut self, attr: ast::Attribute) -> Option<ast::Attribute> { fn fold_attribute(&mut self, attr: ast::Attribute) -> Option<ast::Attribute> {
match attr.node.value.node { if attr.value.name == "serde" {
ast::MetaItemKind::List(ref n, _) if n == &"serde" => { return None; } if let ast::MetaItemKind::List(..) = attr.value.node {
_ => {} return None;
}
} }
Some(attr) Some(attr)
} }
@@ -116,13 +116,12 @@ macro_rules! shim {
use syntax::{attr, ast, visit}; use syntax::{attr, ast, visit};
struct MarkSerdeAttributesUsed; struct MarkSerdeAttributesUsed;
impl visit::Visitor for MarkSerdeAttributesUsed { impl<'a> visit::Visitor<'a> for MarkSerdeAttributesUsed {
fn visit_attribute(&mut self, attr: &ast::Attribute) { fn visit_attribute(&mut self, attr: &ast::Attribute) {
match attr.node.value.node { if attr.value.name == "serde" {
ast::MetaItemKind::List(ref name, _) if name == "serde" => { if let ast::MetaItemKind::List(..) = attr.value.node {
attr::mark_used(attr); attr::mark_used(attr);
} }
_ => {}
} }
} }
} }
+71 -67
View File
@@ -256,76 +256,80 @@ fn serialize_variant(
let variant_ident = variant.ident.clone(); let variant_ident = variant.ident.clone();
let variant_name = variant.attrs.name().serialize_name(); let variant_name = variant.attrs.name().serialize_name();
match variant.style { if variant.attrs.skip_serializing() {
Style::Unit => { let skipped_msg = format!("The enum variant {}::{} cannot be serialized",
quote! { type_ident, variant_ident);
#type_ident::#variant_ident => let skipped_err = quote! {
_serde::ser::Serializer::serialize_unit_variant( Err(_serde::ser::Error::invalid_value(#skipped_msg))
_serializer, };
#type_name, let fields_pat = match variant.style {
#variant_index, Style::Unit => quote!(),
#variant_name, Style::Newtype | Style::Tuple => quote!( (..) ),
), Style::Struct => quote!( {..} ),
} };
}, quote! {
Style::Newtype => { #type_ident::#variant_ident #fields_pat => #skipped_err,
let block = serialize_newtype_variant(
type_name,
variant_index,
variant_name,
ty,
generics,
&variant.fields[0],
);
quote! {
#type_ident::#variant_ident(ref __simple_value) => #block,
}
},
Style::Tuple => {
let field_names: Vec<Tokens> = (0 .. variant.fields.len())
.map(|i| {
let id = aster::id(format!("__field{}", i));
quote!(ref #id)
})
.collect();
let pat = quote!(#type_ident::#variant_ident(#(#field_names),*));
let block = serialize_tuple_variant(
type_name,
variant_index,
variant_name,
generics,
ty,
&variant.fields,
);
quote! {
#pat => { #block }
}
} }
Style::Struct => { } else { // variant wasn't skipped
let fields = variant.fields.iter().map(|field| { match variant.style {
let id = match field.ident { Style::Unit => {
Some(ref name) => name.clone(), quote! {
None => panic!("struct variant has unnamed fields"), #type_ident::#variant_ident =>
}; _serde::ser::Serializer::serialize_unit_variant(
quote!(ref #id) _serializer,
}); #type_name,
let pat = quote!(#type_ident::#variant_ident { #(#fields),* }); #variant_index,
#variant_name,
),
}
},
Style::Newtype => {
let block = serialize_newtype_variant(
type_name,
variant_index,
variant_name,
ty,
generics,
&variant.fields[0],
);
let block = serialize_struct_variant( quote! {
variant_index, #type_ident::#variant_ident(ref __simple_value) => #block,
variant_name, }
generics, },
ty, Style::Tuple => {
&variant.fields, let field_names = (0 .. variant.fields.len())
item_attrs, .map(|i| aster::id(format!("__field{}", i)));
);
quote! { let block = serialize_tuple_variant(
#pat => { #block } type_name,
variant_index,
variant_name,
generics,
ty,
&variant.fields,
);
quote! {
#type_ident::#variant_ident(#(ref #field_names),*) => { #block }
}
}
Style::Struct => {
let fields = variant.fields.iter()
.map(|f| f.ident.clone().expect("struct variant has unnamed fields"));
let block = serialize_struct_variant(
variant_index,
variant_name,
generics,
ty,
&variant.fields,
item_attrs,
);
quote! {
#type_ident::#variant_ident { #(ref #fields),* } => { #block }
}
} }
} }
} }
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_codegen_internals" name = "serde_codegen_internals"
version = "0.11.2" version = "0.11.3"
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."
+11
View File
@@ -188,6 +188,7 @@ impl Item {
pub struct Variant { pub struct Variant {
name: Name, name: Name,
skip_deserializing: bool, skip_deserializing: bool,
skip_serializing: bool,
} }
impl Variant { impl Variant {
@@ -195,6 +196,7 @@ impl Variant {
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_deserializing = BoolAttr::none(cx, "skip_deserializing"); let mut skip_deserializing = BoolAttr::none(cx, "skip_deserializing");
let mut skip_serializing = BoolAttr::none(cx, "skip_serializing");
for meta_items in variant.attrs.iter().filter_map(get_serde_meta_items) { for meta_items in variant.attrs.iter().filter_map(get_serde_meta_items) {
for meta_item in meta_items { for meta_item in meta_items {
@@ -218,6 +220,10 @@ impl Variant {
MetaItem(Word(ref name)) if name == "skip_deserializing" => { MetaItem(Word(ref name)) if name == "skip_deserializing" => {
skip_deserializing.set_true(); skip_deserializing.set_true();
} }
// Parse `#[serde(skip_serializing)]`
MetaItem(Word(ref name)) if name == "skip_serializing" => {
skip_serializing.set_true();
}
MetaItem(ref meta_item) => { MetaItem(ref meta_item) => {
cx.error(format!("unknown serde variant attribute `{}`", cx.error(format!("unknown serde variant attribute `{}`",
@@ -237,6 +243,7 @@ impl Variant {
deserialize: de_name.get().unwrap_or_else(|| variant.ident.to_string()), deserialize: de_name.get().unwrap_or_else(|| variant.ident.to_string()),
}, },
skip_deserializing: skip_deserializing.get(), skip_deserializing: skip_deserializing.get(),
skip_serializing: skip_serializing.get(),
} }
} }
@@ -247,6 +254,10 @@ impl Variant {
pub fn skip_deserializing(&self) -> bool { pub fn skip_deserializing(&self) -> bool {
self.skip_deserializing self.skip_deserializing
} }
pub fn skip_serializing(&self) -> bool {
self.skip_serializing
}
} }
/// Represents field attribute information /// Represents field attribute information
+4 -4
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_derive" name = "serde_derive"
version = "0.8.20" version = "0.8.23"
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)]"
@@ -15,7 +15,7 @@ name = "serde_derive"
proc-macro = true proc-macro = true
[dependencies.serde_codegen] [dependencies.serde_codegen]
version = "=0.8.20" version = "=0.8.23"
path = "../serde_codegen" path = "../serde_codegen"
default-features = false default-features = false
features = ["with-syn"] features = ["with-syn"]
@@ -23,5 +23,5 @@ features = ["with-syn"]
[dev-dependencies] [dev-dependencies]
compiletest_rs = "^0.2.0" compiletest_rs = "^0.2.0"
fnv = "1.0" fnv = "1.0"
serde = { version = "0.8.20", path = "../serde" } serde = { version = "0.8.23", path = "../serde" }
serde_test = { version = "0.8.20", path = "../serde_test" } serde_test = { version = "0.8.23", path = "../serde_test" }
-3
View File
@@ -1,6 +1,3 @@
#![feature(proc_macro, proc_macro_lib)]
#![cfg(not(test))]
extern crate proc_macro; extern crate proc_macro;
extern crate serde_codegen; extern crate serde_codegen;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,5 +1,3 @@
#![feature(proc_macro)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
@@ -1,4 +1,3 @@
#![feature(proc_macro)]
#![deny(identity_op)] #![deny(identity_op)]
#[macro_use] #[macro_use]
+1 -1
View File
@@ -1,4 +1,4 @@
#![feature(test, proc_macro)] #![feature(test)]
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
+2 -2
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_test" name = "serde_test"
version = "0.8.20" version = "0.8.23"
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"
@@ -12,4 +12,4 @@ keywords = ["serde", "serialization"]
include = ["Cargo.toml", "src/**/*.rs"] include = ["Cargo.toml", "src/**/*.rs"]
[dependencies] [dependencies]
serde = { version = "0.8.20", path = "../serde" } serde = { version = "0.8.23", path = "../serde" }
+2 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_testing" name = "serde_testing"
version = "0.8.20" version = "0.8.23"
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"
@@ -10,6 +10,7 @@ documentation = "https://docs.serde.rs/serde/"
readme = "README.md" readme = "README.md"
keywords = ["serialization"] keywords = ["serialization"]
build = "build.rs" build = "build.rs"
publish = false
[features] [features]
unstable-testing = ["clippy", "serde/unstable-testing", "serde_codegen/unstable-testing"] unstable-testing = ["clippy", "serde/unstable-testing", "serde_codegen/unstable-testing"]
+1
View File
@@ -1,4 +1,5 @@
extern crate serde; extern crate serde;
extern crate serde_test;
#[macro_use] #[macro_use]
mod macros; mod macros;
+40 -155
View File
@@ -1,11 +1,13 @@
use std::fmt; use std::fmt;
use std::error; use std::error;
use serde::{Serialize, Serializer, Deserialize, Deserializer}; use serde::{Serialize, Serializer};
use serde::bytes::{ByteBuf, Bytes}; use serde::bytes::{ByteBuf, Bytes};
use serde::ser; use serde::ser;
use serde::de; use serde::de;
use serde_test::{assert_de_tokens, Token};
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
@@ -286,153 +288,6 @@ impl Serializer for BytesSerializer {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
struct BytesDeserializer {
bytes: Option<Vec<u8>>,
}
impl BytesDeserializer {
fn new(bytes: Vec<u8>) -> Self {
BytesDeserializer {
bytes: Some(bytes),
}
}
}
impl Deserializer for BytesDeserializer {
type Error = Error;
fn deserialize<V>(&mut self, _visitor: V) -> Result<V::Value, Error>
where V: de::Visitor,
{
Err(Error)
}
fn deserialize_bytes<V>(&mut self, mut visitor: V) -> Result<V::Value, Error>
where V: de::Visitor,
{
visitor.visit_byte_buf(self.bytes.take().unwrap())
}
fn deserialize_seq<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_struct_field<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_map<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_unit<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_ignored_any<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_string<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_str<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_char<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_i64<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_i32<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_i16<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_i8<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_u64<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_u32<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_u16<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_u8<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_f32<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_f64<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_bool<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_usize<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_isize<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error>
where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_option<__V>(&mut self, visitor: __V)
-> Result<__V::Value, Self::Error> where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_seq_fixed_size<__V>(&mut self, _: usize, visitor: __V)
-> Result<__V::Value, Self::Error> where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_unit_struct<__V>(&mut self, _: &str, visitor: __V)
-> Result<__V::Value, Self::Error> where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_newtype_struct<__V>(&mut self, _: &str, visitor: __V)
-> Result<__V::Value, Self::Error> where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_tuple_struct<__V>(&mut self, _: &str, _: usize, visitor: __V)
-> Result<__V::Value, Self::Error> where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_struct<__V>(&mut self, _: &str, _: &[&str], visitor: __V)
-> Result<__V::Value, Self::Error> where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_tuple<__V>(&mut self, _: usize, visitor: __V)
-> Result<__V::Value, Self::Error> where __V: de::Visitor {
self.deserialize(visitor)
}
fn deserialize_enum<__V>(&mut self, _: &str, _: &[&str], _visitor: __V)
-> Result<__V::Value, Self::Error> where __V: de::EnumVisitor {
Err(Error)
}
}
///////////////////////////////////////////////////////////////////////////////
#[test] #[test]
fn test_bytes_ser_bytes() { fn test_bytes_ser_bytes() {
let buf = vec![]; let buf = vec![];
@@ -449,12 +304,42 @@ fn test_bytes_ser_bytes() {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#[test] #[test]
fn test_byte_buf_de_bytes() { fn test_byte_buf_de() {
let mut de = BytesDeserializer::new(vec![]); let empty = ByteBuf::new();
let bytes = Deserialize::deserialize(&mut de); assert_de_tokens(&empty, &[Token::Bytes(b""),]);
assert_eq!(bytes, Ok(ByteBuf::new())); assert_de_tokens(&empty, &[Token::Str("")]);
assert_de_tokens(&empty, &[Token::String(String::new())]);
assert_de_tokens(&empty, &[
Token::SeqStart(None),
Token::SeqEnd,
]);
assert_de_tokens(&empty, &[
Token::SeqStart(Some(0)),
Token::SeqEnd,
]);
let mut de = BytesDeserializer::new(vec![1, 2, 3]); let buf = ByteBuf::from(vec![65, 66, 67]);
let bytes = Deserialize::deserialize(&mut de); assert_de_tokens(&buf, &[Token::Bytes(b"ABC")]);
assert_eq!(bytes, Ok(ByteBuf::from(vec![1, 2, 3]))); assert_de_tokens(&buf, &[Token::Str("ABC")]);
assert_de_tokens(&buf, &[Token::String("ABC".to_owned())]);
assert_de_tokens(&buf, &[
Token::SeqStart(None),
Token::SeqSep,
Token::U8(65),
Token::SeqSep,
Token::U8(66),
Token::SeqSep,
Token::U8(67),
Token::SeqEnd,
]);
assert_de_tokens(&buf, &[
Token::SeqStart(Some(3)),
Token::SeqSep,
Token::U8(65),
Token::SeqSep,
Token::U8(66),
Token::SeqSep,
Token::U8(67),
Token::SeqEnd,
]);
} }
+1
View File
@@ -38,6 +38,7 @@ enum Enum {
Simple(i32), Simple(i32),
Seq(i32, i32, i32), Seq(i32, i32, i32),
Map { a: i32, b: i32, c: i32 }, Map { a: i32, b: i32, c: i32 },
#[allow(dead_code)]
#[serde(skip_deserializing)] #[serde(skip_deserializing)]
Skipped, Skipped,
} }
+29 -1
View File
@@ -30,12 +30,20 @@ struct Struct {
c: i32, c: i32,
} }
#[derive(Serialize)] #[derive(Serialize, PartialEq, Debug)]
enum Enum { enum Enum {
Unit, Unit,
One(i32), One(i32),
Seq(i32, i32), Seq(i32, i32),
Map { a: i32, b: i32 }, Map { a: i32, b: i32 },
#[serde(skip_serializing)]
SkippedUnit,
#[serde(skip_serializing)]
SkippedOne(i32),
#[serde(skip_serializing)]
SkippedSeq(i32, i32),
#[serde(skip_serializing)]
SkippedMap { _a: i32, _b: i32 },
} }
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@@ -388,3 +396,23 @@ fn test_cannot_serialize_paths() {
&[], &[],
Error::InvalidValue("Path contains invalid UTF-8 characters".to_owned())); Error::InvalidValue("Path contains invalid UTF-8 characters".to_owned()));
} }
#[test]
fn test_enum_skipped() {
assert_ser_tokens_error(
&Enum::SkippedUnit,
&[],
Error::InvalidValue("The enum variant Enum::SkippedUnit cannot be serialized".to_owned()));
assert_ser_tokens_error(
&Enum::SkippedOne(42),
&[],
Error::InvalidValue("The enum variant Enum::SkippedOne cannot be serialized".to_owned()));
assert_ser_tokens_error(
&Enum::SkippedSeq(1, 2),
&[],
Error::InvalidValue("The enum variant Enum::SkippedSeq cannot be serialized".to_owned()));
assert_ser_tokens_error(
&Enum::SkippedMap { _a: 1, _b: 2 },
&[],
Error::InvalidValue("The enum variant Enum::SkippedMap cannot be serialized".to_owned()));
}