mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-28 10:17:58 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ea1a729088 | |||
| 857dcea774 | |||
| b98a9a8f9b | |||
| 4b00de0e22 | |||
| 8403fa018e | |||
| 0e9f1b42de | |||
| 0085d05e55 | |||
| 2eed855bff |
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.13" # remember to update html_root_url
|
version = "1.0.15" # remember to update html_root_url
|
||||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
description = "A generic serialization/deserialization framework"
|
description = "A generic serialization/deserialization framework"
|
||||||
|
|||||||
+1
-1
@@ -79,7 +79,7 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Serde types in rustdoc of other crates get linked to here.
|
// Serde types in rustdoc of other crates get linked to here.
|
||||||
#![doc(html_root_url = "https://docs.rs/serde/1.0.13")]
|
#![doc(html_root_url = "https://docs.rs/serde/1.0.15")]
|
||||||
|
|
||||||
// Support using Serde without the standard library!
|
// Support using Serde without the standard library!
|
||||||
#![cfg_attr(not(feature = "std"), no_std)]
|
#![cfg_attr(not(feature = "std"), no_std)]
|
||||||
|
|||||||
+33
-9
@@ -834,26 +834,43 @@ mod content {
|
|||||||
type Value = TaggedContent<'de, T>;
|
type Value = TaggedContent<'de, T>;
|
||||||
|
|
||||||
fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
||||||
fmt.write_str("any value")
|
fmt.write_str("internally tagged enum")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
|
fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
|
||||||
where
|
where
|
||||||
V: MapAccess<'de>,
|
S: SeqAccess<'de>,
|
||||||
|
{
|
||||||
|
let tag = match try!(seq.next_element()) {
|
||||||
|
Some(tag) => tag,
|
||||||
|
None => {
|
||||||
|
return Err(de::Error::missing_field(self.tag_name));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let rest = de::value::SeqAccessDeserializer::new(seq);
|
||||||
|
Ok(TaggedContent {
|
||||||
|
tag: tag,
|
||||||
|
content: try!(Content::deserialize(rest)),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
|
||||||
|
where
|
||||||
|
M: MapAccess<'de>,
|
||||||
{
|
{
|
||||||
let mut tag = None;
|
let mut tag = None;
|
||||||
let mut vec = Vec::with_capacity(size_hint::cautious(visitor.size_hint()));
|
let mut vec = Vec::with_capacity(size_hint::cautious(map.size_hint()));
|
||||||
while let Some(k) =
|
while let Some(k) =
|
||||||
try!(visitor.next_key_seed(TagOrContentVisitor::new(self.tag_name))) {
|
try!(map.next_key_seed(TagOrContentVisitor::new(self.tag_name))) {
|
||||||
match k {
|
match k {
|
||||||
TagOrContent::Tag => {
|
TagOrContent::Tag => {
|
||||||
if tag.is_some() {
|
if tag.is_some() {
|
||||||
return Err(de::Error::duplicate_field(self.tag_name));
|
return Err(de::Error::duplicate_field(self.tag_name));
|
||||||
}
|
}
|
||||||
tag = Some(try!(visitor.next_value()));
|
tag = Some(try!(map.next_value()));
|
||||||
}
|
}
|
||||||
TagOrContent::Content(k) => {
|
TagOrContent::Content(k) => {
|
||||||
let v = try!(visitor.next_value());
|
let v = try!(map.next_value());
|
||||||
vec.push((k, v));
|
vec.push((k, v));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1802,9 +1819,16 @@ mod content {
|
|||||||
write!(formatter, "unit variant {}::{}", self.type_name, self.variant_name)
|
write!(formatter, "unit variant {}::{}", self.type_name, self.variant_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_map<V>(self, _: V) -> Result<(), V::Error>
|
fn visit_seq<S>(self, _: S) -> Result<(), S::Error>
|
||||||
where
|
where
|
||||||
V: MapAccess<'de>,
|
S: SeqAccess<'de>,
|
||||||
|
{
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_map<M>(self, _: M) -> Result<(), M::Error>
|
||||||
|
where
|
||||||
|
M: MapAccess<'de>,
|
||||||
{
|
{
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.13" # remember to update html_root_url
|
version = "1.0.15" # remember to update html_root_url
|
||||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@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 @@ use internals::attr;
|
|||||||
|
|
||||||
macro_rules! path {
|
macro_rules! path {
|
||||||
($($path:tt)+) => {
|
($($path:tt)+) => {
|
||||||
syn::parse_path(stringify!($($path)+)).unwrap()
|
syn::parse_path(quote!($($path)+).as_str()).unwrap()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+126
-64
@@ -26,13 +26,14 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<Tokens, Str
|
|||||||
let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(¶ms);
|
let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(¶ms);
|
||||||
let dummy_const = Ident::new(format!("_IMPL_DESERIALIZE_FOR_{}", ident));
|
let dummy_const = Ident::new(format!("_IMPL_DESERIALIZE_FOR_{}", ident));
|
||||||
let body = Stmts(deserialize_body(&cont, ¶ms));
|
let body = Stmts(deserialize_body(&cont, ¶ms));
|
||||||
|
let delife = params.borrowed.de_lifetime();
|
||||||
|
|
||||||
let impl_block = if let Some(remote) = cont.attrs.remote() {
|
let impl_block = if let Some(remote) = cont.attrs.remote() {
|
||||||
let vis = &input.vis;
|
let vis = &input.vis;
|
||||||
quote! {
|
quote! {
|
||||||
impl #de_impl_generics #ident #ty_generics #where_clause {
|
impl #de_impl_generics #ident #ty_generics #where_clause {
|
||||||
#vis fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<#remote #ty_generics, __D::Error>
|
#vis fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<#remote #ty_generics, __D::Error>
|
||||||
where __D: _serde::Deserializer<'de>
|
where __D: _serde::Deserializer<#delife>
|
||||||
{
|
{
|
||||||
#body
|
#body
|
||||||
}
|
}
|
||||||
@@ -41,9 +42,9 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<Tokens, Str
|
|||||||
} else {
|
} else {
|
||||||
quote! {
|
quote! {
|
||||||
#[automatically_derived]
|
#[automatically_derived]
|
||||||
impl #de_impl_generics _serde::Deserialize<'de> for #ident #ty_generics #where_clause {
|
impl #de_impl_generics _serde::Deserialize<#delife> for #ident #ty_generics #where_clause {
|
||||||
fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
|
fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
|
||||||
where __D: _serde::Deserializer<'de>
|
where __D: _serde::Deserializer<#delife>
|
||||||
{
|
{
|
||||||
#body
|
#body
|
||||||
}
|
}
|
||||||
@@ -75,7 +76,7 @@ struct Parameters {
|
|||||||
|
|
||||||
/// Lifetimes borrowed from the deserializer. These will become bounds on
|
/// Lifetimes borrowed from the deserializer. These will become bounds on
|
||||||
/// the `'de` lifetime of the deserializer.
|
/// the `'de` lifetime of the deserializer.
|
||||||
borrowed: BTreeSet<syn::Lifetime>,
|
borrowed: BorrowedLifetimes,
|
||||||
|
|
||||||
/// At least one field has a serde(getter) attribute, implying that the
|
/// At least one field has a serde(getter) attribute, implying that the
|
||||||
/// remote type has a private field.
|
/// remote type has a private field.
|
||||||
@@ -89,8 +90,8 @@ impl Parameters {
|
|||||||
Some(remote) => remote.clone(),
|
Some(remote) => remote.clone(),
|
||||||
None => cont.ident.clone().into(),
|
None => cont.ident.clone().into(),
|
||||||
};
|
};
|
||||||
let generics = build_generics(cont);
|
|
||||||
let borrowed = borrowed_lifetimes(cont);
|
let borrowed = borrowed_lifetimes(cont);
|
||||||
|
let generics = build_generics(cont, &borrowed);
|
||||||
let has_getter = cont.body.has_getter();
|
let has_getter = cont.body.has_getter();
|
||||||
|
|
||||||
Parameters {
|
Parameters {
|
||||||
@@ -107,20 +108,12 @@ impl Parameters {
|
|||||||
fn type_name(&self) -> &str {
|
fn type_name(&self) -> &str {
|
||||||
self.this.segments.last().unwrap().ident.as_ref()
|
self.this.segments.last().unwrap().ident.as_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn de_lifetime_def(&self) -> syn::LifetimeDef {
|
|
||||||
syn::LifetimeDef {
|
|
||||||
attrs: Vec::new(),
|
|
||||||
lifetime: syn::Lifetime::new("'de"),
|
|
||||||
bounds: self.borrowed.iter().cloned().collect(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// All the generics in the input, plus a bound `T: Deserialize` for each generic
|
// All the generics in the input, plus a bound `T: Deserialize` for each generic
|
||||||
// field type that will be deserialized by us, plus a bound `T: Default` for
|
// field type that will be deserialized by us, plus a bound `T: Default` for
|
||||||
// each generic field type that will be set to a default value.
|
// each generic field type that will be set to a default value.
|
||||||
fn build_generics(cont: &Container) -> syn::Generics {
|
fn build_generics(cont: &Container, borrowed: &BorrowedLifetimes) -> syn::Generics {
|
||||||
let generics = bound::without_defaults(cont.generics);
|
let generics = bound::without_defaults(cont.generics);
|
||||||
|
|
||||||
let generics = bound::with_where_predicates_from_fields(cont, &generics, attr::Field::de_bound);
|
let generics = bound::with_where_predicates_from_fields(cont, &generics, attr::Field::de_bound);
|
||||||
@@ -136,11 +129,12 @@ fn build_generics(cont: &Container) -> syn::Generics {
|
|||||||
attr::Default::Path(_) => generics,
|
attr::Default::Path(_) => generics,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let delife = borrowed.de_lifetime();
|
||||||
let generics = bound::with_bound(
|
let generics = bound::with_bound(
|
||||||
cont,
|
cont,
|
||||||
&generics,
|
&generics,
|
||||||
needs_deserialize_bound,
|
needs_deserialize_bound,
|
||||||
&path!(_serde::Deserialize<'de>),
|
&path!(_serde::Deserialize<#delife>),
|
||||||
);
|
);
|
||||||
|
|
||||||
bound::with_bound(
|
bound::with_bound(
|
||||||
@@ -170,18 +164,52 @@ fn requires_default(field: &attr::Field, _variant: Option<&attr::Variant>) -> bo
|
|||||||
field.default() == &attr::Default::Default
|
field.default() == &attr::Default::Default
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum BorrowedLifetimes {
|
||||||
|
Borrowed(BTreeSet<syn::Lifetime>),
|
||||||
|
Static,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BorrowedLifetimes {
|
||||||
|
fn de_lifetime(&self) -> syn::Lifetime {
|
||||||
|
match *self {
|
||||||
|
BorrowedLifetimes::Borrowed(_) => syn::Lifetime::new("'de"),
|
||||||
|
BorrowedLifetimes::Static => syn::Lifetime::new("'static"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn de_lifetime_def(&self) -> Option<syn::LifetimeDef> {
|
||||||
|
match *self {
|
||||||
|
BorrowedLifetimes::Borrowed(ref bounds) => {
|
||||||
|
Some(syn::LifetimeDef {
|
||||||
|
attrs: Vec::new(),
|
||||||
|
lifetime: syn::Lifetime::new("'de"),
|
||||||
|
bounds: bounds.iter().cloned().collect(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
BorrowedLifetimes::Static => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// The union of lifetimes borrowed by each field of the container.
|
// The union of lifetimes borrowed by each field of the container.
|
||||||
//
|
//
|
||||||
// These turn into bounds on the `'de` lifetime of the Deserialize impl. If
|
// These turn into bounds on the `'de` lifetime of the Deserialize impl. If
|
||||||
// lifetimes `'a` and `'b` are borrowed but `'c` is not, the impl is:
|
// lifetimes `'a` and `'b` are borrowed but `'c` is not, the impl is:
|
||||||
//
|
//
|
||||||
// impl<'de: 'a + 'b, 'a, 'b, 'c> Deserialize<'de> for S<'a, 'b, 'c>
|
// impl<'de: 'a + 'b, 'a, 'b, 'c> Deserialize<'de> for S<'a, 'b, 'c>
|
||||||
fn borrowed_lifetimes(cont: &Container) -> BTreeSet<syn::Lifetime> {
|
//
|
||||||
|
// If any borrowed lifetime is `'static`, then `'de: 'static` would be redundant
|
||||||
|
// and we use plain `'static` instead of `'de`.
|
||||||
|
fn borrowed_lifetimes(cont: &Container) -> BorrowedLifetimes {
|
||||||
let mut lifetimes = BTreeSet::new();
|
let mut lifetimes = BTreeSet::new();
|
||||||
for field in cont.body.all_fields() {
|
for field in cont.body.all_fields() {
|
||||||
lifetimes.extend(field.attrs.borrowed_lifetimes().iter().cloned());
|
lifetimes.extend(field.attrs.borrowed_lifetimes().iter().cloned());
|
||||||
}
|
}
|
||||||
lifetimes
|
if lifetimes.iter().any(|b| b.ident == "'static") {
|
||||||
|
BorrowedLifetimes::Static
|
||||||
|
} else {
|
||||||
|
BorrowedLifetimes::Borrowed(lifetimes)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {
|
fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {
|
||||||
@@ -194,7 +222,7 @@ fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {
|
|||||||
if fields.iter().any(|field| field.ident.is_none()) {
|
if fields.iter().any(|field| field.ident.is_none()) {
|
||||||
panic!("struct has unnamed fields");
|
panic!("struct has unnamed fields");
|
||||||
}
|
}
|
||||||
deserialize_struct(None, params, fields, &cont.attrs, None)
|
deserialize_struct(None, params, fields, &cont.attrs, None, Untagged::No)
|
||||||
}
|
}
|
||||||
Body::Struct(Style::Tuple, ref fields) |
|
Body::Struct(Style::Tuple, ref fields) |
|
||||||
Body::Struct(Style::Newtype, ref fields) => {
|
Body::Struct(Style::Newtype, ref fields) => {
|
||||||
@@ -260,6 +288,7 @@ fn deserialize_tuple(
|
|||||||
) -> Fragment {
|
) -> Fragment {
|
||||||
let this = ¶ms.this;
|
let this = ¶ms.this;
|
||||||
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
||||||
|
let delife = params.borrowed.de_lifetime();
|
||||||
|
|
||||||
// If there are getters (implying private fields), construct the local type
|
// If there are getters (implying private fields), construct the local type
|
||||||
// and use an `Into` conversion to get the remote type. If there are no
|
// and use an `Into` conversion to get the remote type. If there are no
|
||||||
@@ -321,10 +350,10 @@ fn deserialize_tuple(
|
|||||||
quote_block! {
|
quote_block! {
|
||||||
struct __Visitor #de_impl_generics #where_clause {
|
struct __Visitor #de_impl_generics #where_clause {
|
||||||
marker: _serde::export::PhantomData<#this #ty_generics>,
|
marker: _serde::export::PhantomData<#this #ty_generics>,
|
||||||
lifetime: _serde::export::PhantomData<&'de ()>,
|
lifetime: _serde::export::PhantomData<&#delife ()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl #de_impl_generics _serde::de::Visitor<'de> for __Visitor #de_ty_generics #where_clause {
|
impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
|
||||||
type Value = #this #ty_generics;
|
type Value = #this #ty_generics;
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
|
fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
|
||||||
@@ -335,7 +364,7 @@ fn deserialize_tuple(
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
||||||
where __A: _serde::de::SeqAccess<'de>
|
where __A: _serde::de::SeqAccess<#delife>
|
||||||
{
|
{
|
||||||
#visit_seq
|
#visit_seq
|
||||||
}
|
}
|
||||||
@@ -423,6 +452,8 @@ fn deserialize_seq(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_newtype_struct(type_path: &Tokens, params: &Parameters, field: &Field) -> Tokens {
|
fn deserialize_newtype_struct(type_path: &Tokens, params: &Parameters, field: &Field) -> Tokens {
|
||||||
|
let delife = params.borrowed.de_lifetime();
|
||||||
|
|
||||||
let value = match field.attrs.deserialize_with() {
|
let value = match field.attrs.deserialize_with() {
|
||||||
None => {
|
None => {
|
||||||
let field_ty = &field.ty;
|
let field_ty = &field.ty;
|
||||||
@@ -450,25 +481,31 @@ fn deserialize_newtype_struct(type_path: &Tokens, params: &Parameters, field: &F
|
|||||||
quote! {
|
quote! {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::export::Result<Self::Value, __E::Error>
|
fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::export::Result<Self::Value, __E::Error>
|
||||||
where __E: _serde::Deserializer<'de>
|
where __E: _serde::Deserializer<#delife>
|
||||||
{
|
{
|
||||||
_serde::export::Ok(#result)
|
_serde::export::Ok(#result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Untagged {
|
||||||
|
Yes,
|
||||||
|
No,
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize_struct(
|
fn deserialize_struct(
|
||||||
variant_ident: Option<&syn::Ident>,
|
variant_ident: Option<&syn::Ident>,
|
||||||
params: &Parameters,
|
params: &Parameters,
|
||||||
fields: &[Field],
|
fields: &[Field],
|
||||||
cattrs: &attr::Container,
|
cattrs: &attr::Container,
|
||||||
deserializer: Option<Tokens>,
|
deserializer: Option<Tokens>,
|
||||||
|
untagged: Untagged,
|
||||||
) -> Fragment {
|
) -> Fragment {
|
||||||
let is_enum = variant_ident.is_some();
|
let is_enum = variant_ident.is_some();
|
||||||
let is_untagged = deserializer.is_some();
|
|
||||||
|
|
||||||
let this = ¶ms.this;
|
let this = ¶ms.this;
|
||||||
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
||||||
|
let delife = params.borrowed.de_lifetime();
|
||||||
|
|
||||||
// If there are getters (implying private fields), construct the local type
|
// If there are getters (implying private fields), construct the local type
|
||||||
// and use an `Into` conversion to get the remote type. If there are no
|
// and use an `Into` conversion to get the remote type. If there are no
|
||||||
@@ -527,18 +564,19 @@ fn deserialize_struct(
|
|||||||
quote!(mut __seq)
|
quote!(mut __seq)
|
||||||
};
|
};
|
||||||
|
|
||||||
let visit_seq = if is_untagged {
|
// untagged struct variants do not get a visit_seq method
|
||||||
// untagged struct variants do not get a visit_seq method
|
let visit_seq = match untagged {
|
||||||
None
|
Untagged::Yes => None,
|
||||||
} else {
|
Untagged::No => {
|
||||||
Some(quote! {
|
Some(quote! {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
||||||
where __A: _serde::de::SeqAccess<'de>
|
where __A: _serde::de::SeqAccess<#delife>
|
||||||
{
|
{
|
||||||
#visit_seq
|
#visit_seq
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
quote_block! {
|
quote_block! {
|
||||||
@@ -546,10 +584,10 @@ fn deserialize_struct(
|
|||||||
|
|
||||||
struct __Visitor #de_impl_generics #where_clause {
|
struct __Visitor #de_impl_generics #where_clause {
|
||||||
marker: _serde::export::PhantomData<#this #ty_generics>,
|
marker: _serde::export::PhantomData<#this #ty_generics>,
|
||||||
lifetime: _serde::export::PhantomData<&'de ()>,
|
lifetime: _serde::export::PhantomData<&#delife ()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl #de_impl_generics _serde::de::Visitor<'de> for __Visitor #de_ty_generics #where_clause {
|
impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
|
||||||
type Value = #this #ty_generics;
|
type Value = #this #ty_generics;
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
|
fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
|
||||||
@@ -560,7 +598,7 @@ fn deserialize_struct(
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
||||||
where __A: _serde::de::MapAccess<'de>
|
where __A: _serde::de::MapAccess<#delife>
|
||||||
{
|
{
|
||||||
#visit_map
|
#visit_map
|
||||||
}
|
}
|
||||||
@@ -597,6 +635,7 @@ fn deserialize_externally_tagged_enum(
|
|||||||
) -> Fragment {
|
) -> Fragment {
|
||||||
let this = ¶ms.this;
|
let this = ¶ms.this;
|
||||||
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
||||||
|
let delife = params.borrowed.de_lifetime();
|
||||||
|
|
||||||
let type_name = cattrs.name().deserialize_name();
|
let type_name = cattrs.name().deserialize_name();
|
||||||
|
|
||||||
@@ -662,10 +701,10 @@ fn deserialize_externally_tagged_enum(
|
|||||||
|
|
||||||
struct __Visitor #de_impl_generics #where_clause {
|
struct __Visitor #de_impl_generics #where_clause {
|
||||||
marker: _serde::export::PhantomData<#this #ty_generics>,
|
marker: _serde::export::PhantomData<#this #ty_generics>,
|
||||||
lifetime: _serde::export::PhantomData<&'de ()>,
|
lifetime: _serde::export::PhantomData<&#delife ()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl #de_impl_generics _serde::de::Visitor<'de> for __Visitor #de_ty_generics #where_clause {
|
impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
|
||||||
type Value = #this #ty_generics;
|
type Value = #this #ty_generics;
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
|
fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
|
||||||
@@ -673,7 +712,7 @@ fn deserialize_externally_tagged_enum(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_enum<__A>(self, __data: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
fn visit_enum<__A>(self, __data: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
||||||
where __A: _serde::de::EnumAccess<'de>
|
where __A: _serde::de::EnumAccess<#delife>
|
||||||
{
|
{
|
||||||
#match_variant
|
#match_variant
|
||||||
}
|
}
|
||||||
@@ -754,6 +793,7 @@ fn deserialize_adjacently_tagged_enum(
|
|||||||
) -> Fragment {
|
) -> Fragment {
|
||||||
let this = ¶ms.this;
|
let this = ¶ms.this;
|
||||||
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
||||||
|
let delife = params.borrowed.de_lifetime();
|
||||||
|
|
||||||
let variant_names_idents: Vec<_> = variants
|
let variant_names_idents: Vec<_> = variants
|
||||||
.iter()
|
.iter()
|
||||||
@@ -913,14 +953,14 @@ fn deserialize_adjacently_tagged_enum(
|
|||||||
struct __Seed #de_impl_generics #where_clause {
|
struct __Seed #de_impl_generics #where_clause {
|
||||||
field: __Field,
|
field: __Field,
|
||||||
marker: _serde::export::PhantomData<#this #ty_generics>,
|
marker: _serde::export::PhantomData<#this #ty_generics>,
|
||||||
lifetime: _serde::export::PhantomData<&'de ()>,
|
lifetime: _serde::export::PhantomData<&#delife ()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl #de_impl_generics _serde::de::DeserializeSeed<'de> for __Seed #de_ty_generics #where_clause {
|
impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Seed #de_ty_generics #where_clause {
|
||||||
type Value = #this #ty_generics;
|
type Value = #this #ty_generics;
|
||||||
|
|
||||||
fn deserialize<__D>(self, __deserializer: __D) -> _serde::export::Result<Self::Value, __D::Error>
|
fn deserialize<__D>(self, __deserializer: __D) -> _serde::export::Result<Self::Value, __D::Error>
|
||||||
where __D: _serde::Deserializer<'de>
|
where __D: _serde::Deserializer<#delife>
|
||||||
{
|
{
|
||||||
match self.field {
|
match self.field {
|
||||||
#(#variant_arms)*
|
#(#variant_arms)*
|
||||||
@@ -930,10 +970,10 @@ fn deserialize_adjacently_tagged_enum(
|
|||||||
|
|
||||||
struct __Visitor #de_impl_generics #where_clause {
|
struct __Visitor #de_impl_generics #where_clause {
|
||||||
marker: _serde::export::PhantomData<#this #ty_generics>,
|
marker: _serde::export::PhantomData<#this #ty_generics>,
|
||||||
lifetime: _serde::export::PhantomData<&'de ()>,
|
lifetime: _serde::export::PhantomData<&#delife ()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl #de_impl_generics _serde::de::Visitor<'de> for __Visitor #de_ty_generics #where_clause {
|
impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
|
||||||
type Value = #this #ty_generics;
|
type Value = #this #ty_generics;
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
|
fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
|
||||||
@@ -941,7 +981,7 @@ fn deserialize_adjacently_tagged_enum(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
||||||
where __A: _serde::de::MapAccess<'de>
|
where __A: _serde::de::MapAccess<#delife>
|
||||||
{
|
{
|
||||||
// Visit the first relevant key.
|
// Visit the first relevant key.
|
||||||
match #next_relevant_key {
|
match #next_relevant_key {
|
||||||
@@ -1005,7 +1045,7 @@ fn deserialize_adjacently_tagged_enum(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_seq<__A>(self, mut __seq: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
fn visit_seq<__A>(self, mut __seq: __A) -> _serde::export::Result<Self::Value, __A::Error>
|
||||||
where __A: _serde::de::SeqAccess<'de>
|
where __A: _serde::de::SeqAccess<#delife>
|
||||||
{
|
{
|
||||||
// Visit the first element - the tag.
|
// Visit the first element - the tag.
|
||||||
match try!(_serde::de::SeqAccess::next_element(&mut __seq)) {
|
match try!(_serde::de::SeqAccess::next_element(&mut __seq)) {
|
||||||
@@ -1114,7 +1154,7 @@ fn deserialize_externally_tagged_variant(
|
|||||||
deserialize_tuple(Some(variant_ident), params, &variant.fields, cattrs, None)
|
deserialize_tuple(Some(variant_ident), params, &variant.fields, cattrs, None)
|
||||||
}
|
}
|
||||||
Style::Struct => {
|
Style::Struct => {
|
||||||
deserialize_struct(Some(variant_ident), params, &variant.fields, cattrs, None)
|
deserialize_struct(Some(variant_ident), params, &variant.fields, cattrs, None, Untagged::No)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1141,8 +1181,23 @@ fn deserialize_internally_tagged_variant(
|
|||||||
_serde::export::Ok(#this::#variant_ident)
|
_serde::export::Ok(#this::#variant_ident)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Style::Newtype | Style::Struct => {
|
Style::Newtype => {
|
||||||
deserialize_untagged_variant(params, variant, cattrs, deserializer)
|
deserialize_untagged_newtype_variant(
|
||||||
|
variant_ident,
|
||||||
|
params,
|
||||||
|
&variant.fields[0],
|
||||||
|
deserializer,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Style::Struct => {
|
||||||
|
deserialize_struct(
|
||||||
|
Some(variant_ident),
|
||||||
|
params,
|
||||||
|
&variant.fields,
|
||||||
|
cattrs,
|
||||||
|
Some(deserializer),
|
||||||
|
Untagged::No,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
Style::Tuple => unreachable!("checked in serde_derive_internals"),
|
Style::Tuple => unreachable!("checked in serde_derive_internals"),
|
||||||
}
|
}
|
||||||
@@ -1204,6 +1259,7 @@ fn deserialize_untagged_variant(
|
|||||||
&variant.fields,
|
&variant.fields,
|
||||||
cattrs,
|
cattrs,
|
||||||
Some(deserializer),
|
Some(deserializer),
|
||||||
|
Untagged::Yes,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1366,6 +1422,7 @@ fn deserialize_custom_identifier(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
||||||
|
let delife = params.borrowed.de_lifetime();
|
||||||
let visitor_impl =
|
let visitor_impl =
|
||||||
Stmts(deserialize_identifier(this.clone(), &names_idents, is_variant, fallthrough),);
|
Stmts(deserialize_identifier(this.clone(), &names_idents, is_variant, fallthrough),);
|
||||||
|
|
||||||
@@ -1374,10 +1431,10 @@ fn deserialize_custom_identifier(
|
|||||||
|
|
||||||
struct __FieldVisitor #de_impl_generics #where_clause {
|
struct __FieldVisitor #de_impl_generics #where_clause {
|
||||||
marker: _serde::export::PhantomData<#this #ty_generics>,
|
marker: _serde::export::PhantomData<#this #ty_generics>,
|
||||||
lifetime: _serde::export::PhantomData<&'de ()>,
|
lifetime: _serde::export::PhantomData<&#delife ()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl #de_impl_generics _serde::de::Visitor<'de> for __FieldVisitor #de_ty_generics #where_clause {
|
impl #de_impl_generics _serde::de::Visitor<#delife> for __FieldVisitor #de_ty_generics #where_clause {
|
||||||
type Value = #this #ty_generics;
|
type Value = #this #ty_generics;
|
||||||
|
|
||||||
#visitor_impl
|
#visitor_impl
|
||||||
@@ -1428,7 +1485,7 @@ fn deserialize_identifier(
|
|||||||
#variant_indices => _serde::export::Ok(#constructors),
|
#variant_indices => _serde::export::Ok(#constructors),
|
||||||
)*
|
)*
|
||||||
_ => _serde::export::Err(_serde::de::Error::invalid_value(
|
_ => _serde::export::Err(_serde::de::Error::invalid_value(
|
||||||
_serde::de::Unexpected::Unsigned(__value as u64),
|
_serde::de::Unexpected::Unsigned(__value),
|
||||||
&#fallthrough_msg))
|
&#fallthrough_msg))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1694,17 +1751,18 @@ fn wrap_deserialize_with(
|
|||||||
) -> (Tokens, Tokens) {
|
) -> (Tokens, Tokens) {
|
||||||
let this = ¶ms.this;
|
let this = ¶ms.this;
|
||||||
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
|
||||||
|
let delife = params.borrowed.de_lifetime();
|
||||||
|
|
||||||
let wrapper = quote! {
|
let wrapper = quote! {
|
||||||
struct __DeserializeWith #de_impl_generics #where_clause {
|
struct __DeserializeWith #de_impl_generics #where_clause {
|
||||||
value: #value_ty,
|
value: #value_ty,
|
||||||
phantom: _serde::export::PhantomData<#this #ty_generics>,
|
phantom: _serde::export::PhantomData<#this #ty_generics>,
|
||||||
lifetime: _serde::export::PhantomData<&'de ()>,
|
lifetime: _serde::export::PhantomData<&#delife ()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl #de_impl_generics _serde::Deserialize<'de> for __DeserializeWith #de_ty_generics #where_clause {
|
impl #de_impl_generics _serde::Deserialize<#delife> for __DeserializeWith #de_ty_generics #where_clause {
|
||||||
fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
|
fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
|
||||||
where __D: _serde::Deserializer<'de>
|
where __D: _serde::Deserializer<#delife>
|
||||||
{
|
{
|
||||||
_serde::export::Ok(__DeserializeWith {
|
_serde::export::Ok(__DeserializeWith {
|
||||||
value: try!(#deserialize_with(__deserializer)),
|
value: try!(#deserialize_with(__deserializer)),
|
||||||
@@ -1822,20 +1880,24 @@ struct DeImplGenerics<'a>(&'a Parameters);
|
|||||||
impl<'a> ToTokens for DeImplGenerics<'a> {
|
impl<'a> ToTokens for DeImplGenerics<'a> {
|
||||||
fn to_tokens(&self, tokens: &mut Tokens) {
|
fn to_tokens(&self, tokens: &mut Tokens) {
|
||||||
let mut generics = self.0.generics.clone();
|
let mut generics = self.0.generics.clone();
|
||||||
generics.lifetimes.insert(0, self.0.de_lifetime_def());
|
if let Some(de_lifetime) = self.0.borrowed.de_lifetime_def() {
|
||||||
|
generics.lifetimes.insert(0, de_lifetime);
|
||||||
|
}
|
||||||
let (impl_generics, _, _) = generics.split_for_impl();
|
let (impl_generics, _, _) = generics.split_for_impl();
|
||||||
impl_generics.to_tokens(tokens);
|
impl_generics.to_tokens(tokens);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct DeTyGenerics<'a>(&'a syn::Generics);
|
struct DeTyGenerics<'a>(&'a Parameters);
|
||||||
|
|
||||||
impl<'a> ToTokens for DeTyGenerics<'a> {
|
impl<'a> ToTokens for DeTyGenerics<'a> {
|
||||||
fn to_tokens(&self, tokens: &mut Tokens) {
|
fn to_tokens(&self, tokens: &mut Tokens) {
|
||||||
let mut generics = self.0.clone();
|
let mut generics = self.0.generics.clone();
|
||||||
generics
|
if self.0.borrowed.de_lifetime_def().is_some() {
|
||||||
.lifetimes
|
generics
|
||||||
.insert(0, syn::LifetimeDef::new("'de"));
|
.lifetimes
|
||||||
|
.insert(0, syn::LifetimeDef::new("'de"));
|
||||||
|
}
|
||||||
let (_, ty_generics, _) = generics.split_for_impl();
|
let (_, ty_generics, _) = generics.split_for_impl();
|
||||||
ty_generics.to_tokens(tokens);
|
ty_generics.to_tokens(tokens);
|
||||||
}
|
}
|
||||||
@@ -1844,7 +1906,7 @@ impl<'a> ToTokens for DeTyGenerics<'a> {
|
|||||||
fn split_with_de_lifetime(params: &Parameters,)
|
fn split_with_de_lifetime(params: &Parameters,)
|
||||||
-> (DeImplGenerics, DeTyGenerics, syn::TyGenerics, &syn::WhereClause) {
|
-> (DeImplGenerics, DeTyGenerics, syn::TyGenerics, &syn::WhereClause) {
|
||||||
let de_impl_generics = DeImplGenerics(¶ms);
|
let de_impl_generics = DeImplGenerics(¶ms);
|
||||||
let de_ty_generics = DeTyGenerics(¶ms.generics);
|
let de_ty_generics = DeTyGenerics(¶ms);
|
||||||
let (_, ty_generics, where_clause) = params.generics.split_for_impl();
|
let (_, ty_generics, where_clause) = params.generics.split_for_impl();
|
||||||
(de_impl_generics, de_ty_generics, ty_generics, where_clause)
|
(de_impl_generics, de_ty_generics, ty_generics, where_clause)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
//!
|
//!
|
||||||
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html
|
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html
|
||||||
|
|
||||||
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.13")]
|
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.15")]
|
||||||
|
|
||||||
#![cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))]
|
#![cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))]
|
||||||
#![cfg_attr(feature = "cargo-clippy", allow(used_underscore_binding))]
|
#![cfg_attr(feature = "cargo-clippy", allow(used_underscore_binding))]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde_test"
|
name = "serde_test"
|
||||||
version = "1.0.13" # remember to update html_root_url
|
version = "1.0.15" # remember to update html_root_url
|
||||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
|
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@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"
|
||||||
|
|||||||
@@ -155,7 +155,7 @@
|
|||||||
//! # }
|
//! # }
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
#![doc(html_root_url = "https://docs.rs/serde_test/1.0.13")]
|
#![doc(html_root_url = "https://docs.rs/serde_test/1.0.15")]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde;
|
extern crate serde;
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
// successfully when there are a variety of generics and non-(de)serializable
|
// successfully when there are a variety of generics and non-(de)serializable
|
||||||
// types involved.
|
// types involved.
|
||||||
|
|
||||||
|
#![deny(warnings)]
|
||||||
|
|
||||||
#![cfg_attr(feature = "unstable", feature(non_ascii_idents))]
|
#![cfg_attr(feature = "unstable", feature(non_ascii_idents))]
|
||||||
|
|
||||||
// Clippy false positive
|
// Clippy false positive
|
||||||
@@ -491,6 +493,28 @@ fn test_gen() {
|
|||||||
Unit,
|
Unit,
|
||||||
}
|
}
|
||||||
assert_ser::<UntaggedVariantWith>();
|
assert_ser::<UntaggedVariantWith>();
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct StaticStrStruct<'a> {
|
||||||
|
a: &'a str,
|
||||||
|
b: &'static str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct StaticStrTupleStruct<'a>(&'a str, &'static str);
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct StaticStrNewtypeStruct(&'static str);
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
enum StaticStrEnum<'a> {
|
||||||
|
Struct {
|
||||||
|
a: &'a str,
|
||||||
|
b: &'static str,
|
||||||
|
},
|
||||||
|
Tuple(&'a str, &'static str),
|
||||||
|
Newtype(&'static str),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![deny(trivial_numeric_casts)]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
@@ -589,11 +591,10 @@ fn test_internally_tagged_enum() {
|
|||||||
#[serde(tag = "type")]
|
#[serde(tag = "type")]
|
||||||
enum InternallyTagged {
|
enum InternallyTagged {
|
||||||
A { a: u8 },
|
A { a: u8 },
|
||||||
B { b: u8 },
|
B,
|
||||||
C,
|
C(BTreeMap<String, String>),
|
||||||
D(BTreeMap<String, String>),
|
D(Newtype),
|
||||||
E(Newtype),
|
E(Struct),
|
||||||
F(Struct),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_tokens(
|
assert_tokens(
|
||||||
@@ -611,35 +612,62 @@ fn test_internally_tagged_enum() {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_tokens(
|
assert_de_tokens(
|
||||||
&InternallyTagged::B { b: 2 },
|
&InternallyTagged::A { a: 1 },
|
||||||
&[
|
&[
|
||||||
Token::Struct { name: "InternallyTagged", len: 2 },
|
Token::Seq { len: Some(2) },
|
||||||
|
Token::Str("A"),
|
||||||
Token::Str("type"),
|
Token::U8(1),
|
||||||
Token::Str("B"),
|
Token::SeqEnd,
|
||||||
|
|
||||||
Token::Str("b"),
|
|
||||||
Token::U8(2),
|
|
||||||
|
|
||||||
Token::StructEnd,
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_tokens(
|
assert_tokens(
|
||||||
&InternallyTagged::C,
|
&InternallyTagged::B,
|
||||||
&[
|
&[
|
||||||
Token::Struct { name: "InternallyTagged", len: 1 },
|
Token::Struct { name: "InternallyTagged", len: 1 },
|
||||||
|
|
||||||
Token::Str("type"),
|
Token::Str("type"),
|
||||||
Token::Str("C"),
|
Token::Str("B"),
|
||||||
|
|
||||||
Token::StructEnd,
|
Token::StructEnd,
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert_de_tokens(
|
||||||
|
&InternallyTagged::B,
|
||||||
|
&[
|
||||||
|
Token::Seq { len: Some(1) },
|
||||||
|
Token::Str("B"),
|
||||||
|
Token::SeqEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
assert_tokens(
|
assert_tokens(
|
||||||
&InternallyTagged::D(BTreeMap::new()),
|
&InternallyTagged::C(BTreeMap::new()),
|
||||||
|
&[
|
||||||
|
Token::Map { len: Some(1) },
|
||||||
|
|
||||||
|
Token::Str("type"),
|
||||||
|
Token::Str("C"),
|
||||||
|
|
||||||
|
Token::MapEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_de_tokens_error::<InternallyTagged>(
|
||||||
|
&[
|
||||||
|
Token::Seq { len: Some(2) },
|
||||||
|
Token::Str("C"),
|
||||||
|
Token::Map { len: Some(0) },
|
||||||
|
Token::MapEnd,
|
||||||
|
Token::SeqEnd,
|
||||||
|
],
|
||||||
|
"invalid type: sequence, expected a map",
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_tokens(
|
||||||
|
&InternallyTagged::D(Newtype(BTreeMap::new())),
|
||||||
&[
|
&[
|
||||||
Token::Map { len: Some(1) },
|
Token::Map { len: Some(1) },
|
||||||
|
|
||||||
@@ -651,24 +679,12 @@ fn test_internally_tagged_enum() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
assert_tokens(
|
assert_tokens(
|
||||||
&InternallyTagged::E(Newtype(BTreeMap::new())),
|
&InternallyTagged::E(Struct { f: 6 }),
|
||||||
&[
|
|
||||||
Token::Map { len: Some(1) },
|
|
||||||
|
|
||||||
Token::Str("type"),
|
|
||||||
Token::Str("E"),
|
|
||||||
|
|
||||||
Token::MapEnd,
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
assert_tokens(
|
|
||||||
&InternallyTagged::F(Struct { f: 6 }),
|
|
||||||
&[
|
&[
|
||||||
Token::Struct { name: "Struct", len: 2 },
|
Token::Struct { name: "Struct", len: 2 },
|
||||||
|
|
||||||
Token::Str("type"),
|
Token::Str("type"),
|
||||||
Token::Str("F"),
|
Token::Str("E"),
|
||||||
|
|
||||||
Token::Str("f"),
|
Token::Str("f"),
|
||||||
Token::U8(6),
|
Token::U8(6),
|
||||||
@@ -677,6 +693,16 @@ fn test_internally_tagged_enum() {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert_de_tokens(
|
||||||
|
&InternallyTagged::E(Struct { f: 6 }),
|
||||||
|
&[
|
||||||
|
Token::Seq { len: Some(2) },
|
||||||
|
Token::Str("E"),
|
||||||
|
Token::U8(6),
|
||||||
|
Token::SeqEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
assert_de_tokens_error::<InternallyTagged>(
|
assert_de_tokens_error::<InternallyTagged>(
|
||||||
&[Token::Map { len: Some(0) }, Token::MapEnd],
|
&[Token::Map { len: Some(0) }, Token::MapEnd],
|
||||||
"missing field `type`",
|
"missing field `type`",
|
||||||
@@ -691,7 +717,7 @@ fn test_internally_tagged_enum() {
|
|||||||
|
|
||||||
Token::MapEnd,
|
Token::MapEnd,
|
||||||
],
|
],
|
||||||
"unknown variant `Z`, expected one of `A`, `B`, `C`, `D`, `E`, `F`",
|
"unknown variant `Z`, expected one of `A`, `B`, `C`, `D`, `E`",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user