1 // Copyright 2017 Serde Developers
3 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6 // option. This file may not be copied, modified, or distributed
7 // except according to those terms.
9 use syn
::{self, Ident}
;
10 use quote
::{self, Tokens, ToTokens}
;
13 use fragment
::{Fragment, Expr, Stmts, Match}
;
14 use internals
::ast
::{Body, Container, Field, Style, Variant}
;
15 use internals
::{self, attr}
;
17 use std
::collections
::BTreeSet
;
19 pub fn expand_derive_deserialize(input
: &syn
::DeriveInput
) -> Result
<Tokens
, String
> {
20 let ctxt
= internals
::Ctxt
::new();
21 let cont
= Container
::from_ast(&ctxt
, input
);
24 let ident
= &cont
.ident
;
25 let params
= Parameters
::new(&cont
);
26 let (de_impl_generics
, _
, ty_generics
, where_clause
) = split_with_de_lifetime(¶ms
);
27 let dummy_const
= Ident
::new(format
!("_IMPL_DESERIALIZE_FOR_{}", ident
));
28 let body
= Stmts(deserialize_body(&cont
, ¶ms
));
29 let delife
= params
.borrowed
.de_lifetime();
31 let impl_block
= if let Some(remote
) = cont
.attrs
.remote() {
34 impl #de_impl_generics #ident #ty_generics #where_clause {
35 #vis fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<#remote #ty_generics, __D::Error>
36 where __D
: _serde
::Deserializer
<#delife>
44 #[automatically_derived]
45 impl #de_impl_generics _serde::Deserialize<#delife> for #ident #ty_generics #where_clause {
46 fn deserialize
<__D
>(__deserializer
: __D
) -> _serde
::export
::Result
<Self, __D
::Error
>
47 where __D
: _serde
::Deserializer
<#delife>
55 let generated
= quote
! {
56 #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
57 const #dummy_const: () = {
58 extern crate serde
as _serde
;
66 /// Name of the type the `derive` is on.
69 /// Path to the type the impl is for. Either a single `Ident` for local
70 /// types or `some::remote::Ident` for remote types. Does not include
71 /// generic parameters.
74 /// Generics including any explicit and inferred bounds for the impl.
75 generics
: syn
::Generics
,
77 /// Lifetimes borrowed from the deserializer. These will become bounds on
78 /// the `'de` lifetime of the deserializer.
79 borrowed
: BorrowedLifetimes
,
81 /// At least one field has a serde(getter) attribute, implying that the
82 /// remote type has a private field.
87 fn new(cont
: &Container
) -> Self {
88 let local
= cont
.ident
.clone();
89 let this
= match cont
.attrs
.remote() {
90 Some(remote
) => remote
.clone(),
91 None
=> cont
.ident
.clone().into(),
93 let borrowed
= borrowed_lifetimes(cont
);
94 let generics
= build_generics(cont
, &borrowed
);
95 let has_getter
= cont
.body
.has_getter();
102 has_getter
: has_getter
,
106 /// Type name to use in error messages and `&'static str` arguments to
107 /// various Deserializer methods.
108 fn type_name(&self) -> &str {
109 self.this
.segments
.last().unwrap().ident
.as_ref()
113 // All the generics in the input, plus a bound `T: Deserialize` for each generic
114 // field type that will be deserialized by us, plus a bound `T: Default` for
115 // each generic field type that will be set to a default value.
116 fn build_generics(cont
: &Container
, borrowed
: &BorrowedLifetimes
) -> syn
::Generics
{
117 let generics
= bound
::without_defaults(cont
.generics
);
119 let generics
= bound
::with_where_predicates_from_fields(cont
, &generics
, attr
::Field
::de_bound
);
121 match cont
.attrs
.de_bound() {
122 Some(predicates
) => bound
::with_where_predicates(&generics
, predicates
),
124 let generics
= match *cont
.attrs
.default() {
125 attr
::Default
::Default
=> {
126 bound
::with_self_bound(cont
, &generics
, &path
!(_serde
::export
::Default
))
128 attr
::Default
::None
|
129 attr
::Default
::Path(_
) => generics
,
132 let delife
= borrowed
.de_lifetime();
133 let generics
= bound
::with_bound(
136 needs_deserialize_bound
,
137 &path
!(_serde
::Deserialize
<#delife>),
144 &path
!(_serde
::export
::Default
),
150 // Fields with a `skip_deserializing` or `deserialize_with` attribute are not
151 // deserialized by us so we do not generate a bound. Fields with a `bound`
152 // attribute specify their own bound so we do not generate one. All other fields
153 // may need a `T: Deserialize` bound where T is the type of the field.
154 fn needs_deserialize_bound(field
: &attr
::Field
, variant
: Option
<&attr
::Variant
>) -> bool
{
155 !field
.skip_deserializing() &&
156 field
.deserialize_with().is_none() &&
157 field
.de_bound().is_none() &&
158 variant
.map_or(true, |variant
| variant
.deserialize_with().is_none())
161 // Fields with a `default` attribute (not `default=...`), and fields with a
162 // `skip_deserializing` attribute that do not also have `default=...`.
163 fn requires_default(field
: &attr
::Field
, _variant
: Option
<&attr
::Variant
>) -> bool
{
164 field
.default() == &attr
::Default
::Default
167 enum BorrowedLifetimes
{
168 Borrowed(BTreeSet
<syn
::Lifetime
>),
172 impl BorrowedLifetimes
{
173 fn de_lifetime(&self) -> syn
::Lifetime
{
175 BorrowedLifetimes
::Borrowed(_
) => syn
::Lifetime
::new("'de"),
176 BorrowedLifetimes
::Static
=> syn
::Lifetime
::new("'static"),
180 fn de_lifetime_def(&self) -> Option
<syn
::LifetimeDef
> {
182 BorrowedLifetimes
::Borrowed(ref bounds
) => {
183 Some(syn
::LifetimeDef
{
185 lifetime
: syn
::Lifetime
::new("'de"),
186 bounds
: bounds
.iter().cloned().collect(),
189 BorrowedLifetimes
::Static
=> None
,
194 // The union of lifetimes borrowed by each field of the container.
196 // These turn into bounds on the `'de` lifetime of the Deserialize impl. If
197 // lifetimes `'a` and `'b` are borrowed but `'c` is not, the impl is:
199 // impl<'de: 'a + 'b, 'a, 'b, 'c> Deserialize<'de> for S<'a, 'b, 'c>
201 // If any borrowed lifetime is `'static`, then `'de: 'static` would be redundant
202 // and we use plain `'static` instead of `'de`.
203 fn borrowed_lifetimes(cont
: &Container
) -> BorrowedLifetimes
{
204 let mut lifetimes
= BTreeSet
::new();
205 for field
in cont
.body
.all_fields() {
206 lifetimes
.extend(field
.attrs
.borrowed_lifetimes().iter().cloned());
208 if lifetimes
.iter().any(|b
| b
.ident
== "'static") {
209 BorrowedLifetimes
::Static
211 BorrowedLifetimes
::Borrowed(lifetimes
)
215 fn deserialize_body(cont
: &Container
, params
: &Parameters
) -> Fragment
{
216 if let Some(from_type
) = cont
.attrs
.from_type() {
217 deserialize_from(from_type
)
218 } else if let attr
::Identifier
::No
= cont
.attrs
.identifier() {
220 Body
::Enum(ref variants
) => deserialize_enum(params
, variants
, &cont
.attrs
),
221 Body
::Struct(Style
::Struct
, ref fields
) => {
222 if fields
.iter().any(|field
| field
.ident
.is_none()) {
223 panic
!("struct has unnamed fields");
225 deserialize_struct(None
, params
, fields
, &cont
.attrs
, None
, Untagged
::No
)
227 Body
::Struct(Style
::Tuple
, ref fields
) |
228 Body
::Struct(Style
::Newtype
, ref fields
) => {
229 if fields
.iter().any(|field
| field
.ident
.is_some()) {
230 panic
!("tuple struct has named fields");
232 deserialize_tuple(None
, params
, fields
, &cont
.attrs
, None
)
234 Body
::Struct(Style
::Unit
, _
) => deserialize_unit_struct(params
, &cont
.attrs
),
238 Body
::Enum(ref variants
) => {
239 deserialize_custom_identifier(params
, variants
, &cont
.attrs
)
241 Body
::Struct(_
, _
) => unreachable
!("checked in serde_derive_internals"),
246 fn deserialize_from(from_type
: &syn
::Ty
) -> Fragment
{
248 _serde
::export
::Result
::map(
249 <#from_type as _serde::Deserialize>::deserialize(__deserializer),
250 _serde
::export
::From
::from
)
254 fn deserialize_unit_struct(params
: &Parameters
, cattrs
: &attr
::Container
) -> Fragment
{
255 let this
= ¶ms
.this
;
256 let type_name
= cattrs
.name().deserialize_name();
258 let expecting
= format
!("unit struct {}", params
.type_name());
263 impl<'de
> _serde
::de
::Visitor
<'de
> for __Visitor
{
266 fn expecting(&self, formatter
: &mut _serde
::export
::Formatter
) -> _serde
::export
::fmt
::Result
{
267 _serde
::export
::Formatter
::write_str(formatter
, #expecting)
271 fn visit_unit
<__E
>(self) -> _serde
::export
::Result
<Self::Value
, __E
>
272 where __E
: _serde
::de
::Error
274 _serde
::export
::Ok(#this)
278 _serde
::Deserializer
::deserialize_unit_struct(__deserializer
, #type_name, __Visitor)
282 fn deserialize_tuple(
283 variant_ident
: Option
<&syn
::Ident
>,
286 cattrs
: &attr
::Container
,
287 deserializer
: Option
<Tokens
>,
289 let this
= ¶ms
.this
;
290 let (de_impl_generics
, de_ty_generics
, ty_generics
, where_clause
) = split_with_de_lifetime(params
,);
291 let delife
= params
.borrowed
.de_lifetime();
293 // If there are getters (implying private fields), construct the local type
294 // and use an `Into` conversion to get the remote type. If there are no
295 // getters then construct the target type directly.
296 let construct
= if params
.has_getter
{
297 let local
= ¶ms
.local
;
303 let is_enum
= variant_ident
.is_some();
304 let type_path
= match variant_ident
{
305 Some(variant_ident
) => quote
!(#construct::#variant_ident),
308 let expecting
= match variant_ident
{
309 Some(variant_ident
) => format
!("tuple variant {}::{}", params
.type_name(), variant_ident
),
310 None
=> format
!("tuple struct {}", params
.type_name()),
313 let nfields
= fields
.len();
315 let visit_newtype_struct
= if !is_enum
&& nfields
== 1 {
316 Some(deserialize_newtype_struct(&type_path
, params
, &fields
[0]))
321 let visit_seq
= Stmts(deserialize_seq(&type_path
, params
, fields
, false, cattrs
));
323 let visitor_expr
= quote
! {
325 marker
: _serde
::export
::PhantomData
::<#this #ty_generics>,
326 lifetime
: _serde
::export
::PhantomData
,
329 let dispatch
= if let Some(deserializer
) = deserializer
{
330 quote
!(_serde
::Deserializer
::deserialize_tuple(#deserializer, #nfields, #visitor_expr))
332 quote
!(_serde
::de
::VariantAccess
::tuple_variant(__variant
, #nfields, #visitor_expr))
333 } else if nfields
== 1 {
334 let type_name
= cattrs
.name().deserialize_name();
335 quote
!(_serde
::Deserializer
::deserialize_newtype_struct(__deserializer
, #type_name, #visitor_expr))
337 let type_name
= cattrs
.name().deserialize_name();
338 quote
!(_serde
::Deserializer
::deserialize_tuple_struct(__deserializer
, #type_name, #nfields, #visitor_expr))
341 let all_skipped
= fields
343 .all(|field
| field
.attrs
.skip_deserializing());
344 let visitor_var
= if all_skipped
{
351 struct __Visitor
#de_impl_generics #where_clause {
352 marker
: _serde
::export
::PhantomData
<#this #ty_generics>,
353 lifetime
: _serde
::export
::PhantomData
<&#delife ()>,
356 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
357 type Value
= #this #ty_generics;
359 fn expecting(&self, formatter
: &mut _serde
::export
::Formatter
) -> _serde
::export
::fmt
::Result
{
360 _serde
::export
::Formatter
::write_str(formatter
, #expecting)
363 #visit_newtype_struct
366 fn visit_seq
<__A
>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
367 where __A
: _serde
::de
::SeqAccess
<#delife>
382 cattrs
: &attr
::Container
,
384 let vars
= (0..fields
.len()).map(field_i
as fn(_
) -> _
);
386 let deserialized_count
= fields
388 .filter(|field
| !field
.attrs
.skip_deserializing())
390 let expecting
= format
!("tuple of {} elements", deserialized_count
);
392 let mut index_in_seq
= 0usize
;
393 let let_values
= vars
.clone().zip(fields
)
394 .map(|(var
, field
)| {
395 if field
.attrs
.skip_deserializing() {
396 let default = Expr(expr_is_missing(&field
, cattrs
));
401 let visit
= match field
.attrs
.deserialize_with() {
403 let field_ty
= &field
.ty
;
404 quote
!(try
!(_serde
::de
::SeqAccess
::next_element
::<#field_ty>(&mut __seq)))
407 let (wrapper
, wrapper_ty
) = wrap_deserialize_field_with(
408 params
, field
.ty
, path
);
411 _serde
::export
::Option
::map(
412 try
!(_serde
::de
::SeqAccess
::next_element
::<#wrapper_ty>(&mut __seq)),
413 |__wrap
| __wrap
.value
)
417 let assign
= quote
! {
418 let #var = match #visit {
419 Some(__value
) => __value
,
421 return _serde
::export
::Err(_serde
::de
::Error
::invalid_length(#index_in_seq, &#expecting));
430 let mut result
= if is_struct
{
431 let names
= fields
.iter().map(|f
| &f
.ident
);
433 #type_path { #( #names: #vars ),* }
437 #type_path ( #(#vars),* )
441 if params
.has_getter
{
442 let this
= ¶ms
.this
;
444 _serde
::export
::Into
::<#this>::into(#result)
450 _serde
::export
::Ok(#result)
454 fn deserialize_newtype_struct(type_path
: &Tokens
, params
: &Parameters
, field
: &Field
) -> Tokens
{
455 let delife
= params
.borrowed
.de_lifetime();
457 let value
= match field
.attrs
.deserialize_with() {
459 let field_ty
= &field
.ty
;
461 try
!(<#field_ty as _serde::Deserialize>::deserialize(__e))
465 let (wrapper
, wrapper_ty
) = wrap_deserialize_field_with(params
, field
.ty
, path
);
468 try
!(<#wrapper_ty as _serde::Deserialize>::deserialize(__e)).value
473 let mut result
= quote
!(#type_path(#value));
474 if params
.has_getter
{
475 let this
= ¶ms
.this
;
477 _serde
::export
::Into
::<#this>::into(#result)
483 fn visit_newtype_struct
<__E
>(self, __e
: __E
) -> _serde
::export
::Result
<Self::Value
, __E
::Error
>
484 where __E
: _serde
::Deserializer
<#delife>
486 _serde
::export
::Ok(#result)
496 fn deserialize_struct(
497 variant_ident
: Option
<&syn
::Ident
>,
500 cattrs
: &attr
::Container
,
501 deserializer
: Option
<Tokens
>,
504 let is_enum
= variant_ident
.is_some();
506 let this
= ¶ms
.this
;
507 let (de_impl_generics
, de_ty_generics
, ty_generics
, where_clause
) = split_with_de_lifetime(params
,);
508 let delife
= params
.borrowed
.de_lifetime();
510 // If there are getters (implying private fields), construct the local type
511 // and use an `Into` conversion to get the remote type. If there are no
512 // getters then construct the target type directly.
513 let construct
= if params
.has_getter
{
514 let local
= ¶ms
.local
;
520 let type_path
= match variant_ident
{
521 Some(variant_ident
) => quote
!(#construct::#variant_ident),
524 let expecting
= match variant_ident
{
525 Some(variant_ident
) => format
!("struct variant {}::{}", params
.type_name(), variant_ident
),
526 None
=> format
!("struct {}", params
.type_name()),
529 let visit_seq
= Stmts(deserialize_seq(&type_path
, params
, fields
, true, cattrs
));
531 let (field_visitor
, fields_stmt
, visit_map
) =
532 deserialize_struct_visitor(type_path
, params
, fields
, cattrs
);
533 let field_visitor
= Stmts(field_visitor
);
534 let fields_stmt
= Stmts(fields_stmt
);
535 let visit_map
= Stmts(visit_map
);
537 let visitor_expr
= quote
! {
539 marker
: _serde
::export
::PhantomData
::<#this #ty_generics>,
540 lifetime
: _serde
::export
::PhantomData
,
543 let dispatch
= if let Some(deserializer
) = deserializer
{
545 _serde
::Deserializer
::deserialize_any(#deserializer, #visitor_expr)
549 _serde
::de
::VariantAccess
::struct_variant(__variant
, FIELDS
, #visitor_expr)
552 let type_name
= cattrs
.name().deserialize_name();
554 _serde
::Deserializer
::deserialize_struct(__deserializer
, #type_name, FIELDS, #visitor_expr)
558 let all_skipped
= fields
560 .all(|field
| field
.attrs
.skip_deserializing());
561 let visitor_var
= if all_skipped
{
567 // untagged struct variants do not get a visit_seq method
568 let visit_seq
= match untagged
{
569 Untagged
::Yes
=> None
,
573 fn visit_seq
<__A
>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
574 where __A
: _serde
::de
::SeqAccess
<#delife>
585 struct __Visitor
#de_impl_generics #where_clause {
586 marker
: _serde
::export
::PhantomData
<#this #ty_generics>,
587 lifetime
: _serde
::export
::PhantomData
<&#delife ()>,
590 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
591 type Value
= #this #ty_generics;
593 fn expecting(&self, formatter
: &mut _serde
::export
::Formatter
) -> _serde
::export
::fmt
::Result
{
594 _serde
::export
::Formatter
::write_str(formatter
, #expecting)
600 fn visit_map
<__A
>(self, mut __map
: __A
) -> _serde
::export
::Result
<Self::Value
, __A
::Error
>
601 where __A
: _serde
::de
::MapAccess
<#delife>
615 variants
: &[Variant
],
616 cattrs
: &attr
::Container
,
618 match *cattrs
.tag() {
619 attr
::EnumTag
::External
=> deserialize_externally_tagged_enum(params
, variants
, cattrs
),
620 attr
::EnumTag
::Internal { ref tag }
=> {
621 deserialize_internally_tagged_enum(params
, variants
, cattrs
, tag
)
623 attr
::EnumTag
::Adjacent
{
626 } => deserialize_adjacently_tagged_enum(params
, variants
, cattrs
, tag
, content
),
627 attr
::EnumTag
::None
=> deserialize_untagged_enum(params
, variants
, cattrs
),
631 fn deserialize_externally_tagged_enum(
633 variants
: &[Variant
],
634 cattrs
: &attr
::Container
,
636 let this
= ¶ms
.this
;
637 let (de_impl_generics
, de_ty_generics
, ty_generics
, where_clause
) = split_with_de_lifetime(params
,);
638 let delife
= params
.borrowed
.de_lifetime();
640 let type_name
= cattrs
.name().deserialize_name();
642 let expecting
= format
!("enum {}", params
.type_name());
644 let variant_names_idents
: Vec
<_
> = variants
647 .filter(|&(_
, variant
)| !variant
.attrs
.skip_deserializing())
648 .map(|(i
, variant
)| (variant
.attrs
.name().deserialize_name(), field_i(i
)),)
651 let variants_stmt
= {
652 let variant_names
= variant_names_idents
.iter().map(|&(ref name
, _
)| name
);
654 const VARIANTS
: &'
static [&'
static str] = &[ #(#variant_names),* ];
658 let variant_visitor
= Stmts(deserialize_generated_identifier(variant_names_idents
, cattrs
, true),);
660 // Match arms to extract a variant from a string
661 let variant_arms
= variants
664 .filter(|&(_
, variant
)| !variant
.attrs
.skip_deserializing())
667 let variant_name
= field_i(i
);
669 let block
= Match(deserialize_externally_tagged_variant(params
, variant
, cattrs
),);
672 (__Field
::#variant_name, __variant) => #block
677 let all_skipped
= variants
679 .all(|variant
| variant
.attrs
.skip_deserializing());
680 let match_variant
= if all_skipped
{
681 // This is an empty enum like `enum Impossible {}` or an enum in which
682 // all variants have `#[serde(skip_deserializing)]`.
684 // FIXME: Once we drop support for Rust 1.15:
685 // let _serde::export::Err(__err) = _serde::de::EnumAccess::variant::<__Field>(__data);
686 // _serde::export::Err(__err)
687 _serde
::export
::Result
::map(
688 _serde
::de
::EnumAccess
::variant
::<__Field
>(__data
),
689 |(__impossible
, _
)| match __impossible {}
)
693 match try
!(_serde
::de
::EnumAccess
::variant(__data
)) {
702 struct __Visitor
#de_impl_generics #where_clause {
703 marker
: _serde
::export
::PhantomData
<#this #ty_generics>,
704 lifetime
: _serde
::export
::PhantomData
<&#delife ()>,
707 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
708 type Value
= #this #ty_generics;
710 fn expecting(&self, formatter
: &mut _serde
::export
::Formatter
) -> _serde
::export
::fmt
::Result
{
711 _serde
::export
::Formatter
::write_str(formatter
, #expecting)
714 fn visit_enum
<__A
>(self, __data
: __A
) -> _serde
::export
::Result
<Self::Value
, __A
::Error
>
715 where __A
: _serde
::de
::EnumAccess
<#delife>
723 _serde
::Deserializer
::deserialize_enum(__deserializer
, #type_name, VARIANTS,
725 marker
: _serde
::export
::PhantomData
::<#this #ty_generics>,
726 lifetime
: _serde
::export
::PhantomData
,
731 fn deserialize_internally_tagged_enum(
733 variants
: &[Variant
],
734 cattrs
: &attr
::Container
,
737 let variant_names_idents
: Vec
<_
> = variants
740 .filter(|&(_
, variant
)| !variant
.attrs
.skip_deserializing())
741 .map(|(i
, variant
)| (variant
.attrs
.name().deserialize_name(), field_i(i
)),)
744 let variants_stmt
= {
745 let variant_names
= variant_names_idents
.iter().map(|&(ref name
, _
)| name
);
747 const VARIANTS
: &'
static [&'
static str] = &[ #(#variant_names),* ];
751 let variant_visitor
= Stmts(deserialize_generated_identifier(variant_names_idents
, cattrs
, true),);
753 // Match arms to extract a variant from a string
754 let variant_arms
= variants
.iter()
756 .filter(|&(_
, variant
)| !variant
.attrs
.skip_deserializing())
757 .map(|(i
, variant
)| {
758 let variant_name
= field_i(i
);
760 let block
= Match(deserialize_internally_tagged_variant(
764 quote
!(_serde
::private
::de
::ContentDeserializer
::<__D
::Error
>::new(__tagged
.content
)),
768 __Field
::#variant_name => #block
777 let __tagged
= try
!(_serde
::Deserializer
::deserialize_any(
779 _serde
::private
::de
::TaggedContentVisitor
::<__Field
>::new(#tag)));
787 fn deserialize_adjacently_tagged_enum(
789 variants
: &[Variant
],
790 cattrs
: &attr
::Container
,
794 let this
= ¶ms
.this
;
795 let (de_impl_generics
, de_ty_generics
, ty_generics
, where_clause
) = split_with_de_lifetime(params
,);
796 let delife
= params
.borrowed
.de_lifetime();
798 let variant_names_idents
: Vec
<_
> = variants
801 .filter(|&(_
, variant
)| !variant
.attrs
.skip_deserializing())
802 .map(|(i
, variant
)| (variant
.attrs
.name().deserialize_name(), field_i(i
)),)
805 let variants_stmt
= {
806 let variant_names
= variant_names_idents
.iter().map(|&(ref name
, _
)| name
);
808 const VARIANTS
: &'
static [&'
static str] = &[ #(#variant_names),* ];
812 let variant_visitor
= Stmts(deserialize_generated_identifier(variant_names_idents
, cattrs
, true),);
814 let ref variant_arms
: Vec
<_
> = variants
817 .filter(|&(_
, variant
)| !variant
.attrs
.skip_deserializing())
820 let variant_index
= field_i(i
);
823 deserialize_untagged_variant(
827 quote
!(__deserializer
),
832 __Field
::#variant_index => #block
838 let expecting
= format
!("adjacently tagged enum {}", params
.type_name());
839 let type_name
= cattrs
.name().deserialize_name();
840 let deny_unknown_fields
= cattrs
.deny_unknown_fields();
842 // If unknown fields are allowed, we pick the visitor that can step over
843 // those. Otherwise we pick the visitor that fails on unknown keys.
844 let field_visitor_ty
= if deny_unknown_fields
{
845 quote
! { _serde::private::de::TagOrContentFieldVisitor }
847 quote
! { _serde::private::de::TagContentOtherFieldVisitor }
850 let tag_or_content
= quote
! {
857 fn is_unit(variant
: &Variant
) -> bool
{
858 match variant
.style
{
860 Style
::Struct
| Style
::Tuple
| Style
::Newtype
=> false,
864 let mut missing_content
= quote
! {
865 _serde
::export
::Err(<__A
::Error
as _serde
::de
::Error
>::missing_field(#content))
867 if variants
.iter().any(is_unit
) {
868 let fallthrough
= if variants
.iter().all(is_unit
) {
873 _
=> #missing_content
880 .filter(|&(_
, variant
)| !variant
.attrs
.skip_deserializing() && is_unit(variant
),)
883 let variant_index
= field_i(i
);
884 let variant_ident
= &variant
.ident
;
886 __Field
::#variant_index => _serde::export::Ok(#this::#variant_ident),
890 missing_content
= quote
! {
898 // Advance the map by one key, returning early in case of error.
899 let next_key
= quote
! {
900 try
!(_serde
::de
::MapAccess
::next_key_seed(&mut __map
, #tag_or_content))
903 // When allowing unknown fields, we want to transparently step through keys
904 // we don't care about until we find `tag`, `content`, or run out of keys.
905 let next_relevant_key
= if deny_unknown_fields
{
910 let mut __rk
: _serde
::export
::Option
<_serde
::private
::de
::TagOrContentField
> = _serde
::export
::None
;
911 while let _serde
::export
::Some(__k
) = #next_key {
913 _serde
::private
::de
::TagContentOtherField
::Other
=> {
914 try
!(_serde
::de
::MapAccess
::next_value
::<_serde
::de
::IgnoredAny
>(&mut __map
));
917 _serde
::private
::de
::TagContentOtherField
::Tag
=> {
918 __rk
= _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Tag
);
921 _serde
::private
::de
::TagContentOtherField
::Content
=> {
922 __rk
= _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Content
);
933 // Step through remaining keys, looking for duplicates of previously-seen
934 // keys. When unknown fields are denied, any key that isn't a duplicate will
935 // at this point immediately produce an error.
936 let visit_remaining_keys
= quote
! {
937 match #next_relevant_key {
938 _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Tag
) => {
939 _serde
::export
::Err(<__A
::Error
as _serde
::de
::Error
>::duplicate_field(#tag))
941 _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Content
) => {
942 _serde
::export
::Err(<__A
::Error
as _serde
::de
::Error
>::duplicate_field(#content))
944 _serde
::export
::None
=> _serde
::export
::Ok(__ret
),
953 struct __Seed
#de_impl_generics #where_clause {
955 marker
: _serde
::export
::PhantomData
<#this #ty_generics>,
956 lifetime
: _serde
::export
::PhantomData
<&#delife ()>,
959 impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Seed #de_ty_generics #where_clause {
960 type Value
= #this #ty_generics;
962 fn deserialize
<__D
>(self, __deserializer
: __D
) -> _serde
::export
::Result
<Self::Value
, __D
::Error
>
963 where __D
: _serde
::Deserializer
<#delife>
971 struct __Visitor
#de_impl_generics #where_clause {
972 marker
: _serde
::export
::PhantomData
<#this #ty_generics>,
973 lifetime
: _serde
::export
::PhantomData
<&#delife ()>,
976 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
977 type Value
= #this #ty_generics;
979 fn expecting(&self, formatter
: &mut _serde
::export
::Formatter
) -> _serde
::export
::fmt
::Result
{
980 _serde
::export
::Formatter
::write_str(formatter
, #expecting)
983 fn visit_map
<__A
>(self, mut __map
: __A
) -> _serde
::export
::Result
<Self::Value
, __A
::Error
>
984 where __A
: _serde
::de
::MapAccess
<#delife>
986 // Visit the first relevant key.
987 match #next_relevant_key {
988 // First key is the tag.
989 _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Tag
) => {
991 let __field
= try
!(_serde
::de
::MapAccess
::next_value(&mut __map
));
992 // Visit the second key.
993 match #next_relevant_key {
994 // Second key is a duplicate of the tag.
995 _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Tag
) => {
996 _serde
::export
::Err(<__A
::Error
as _serde
::de
::Error
>::duplicate_field(#tag))
998 // Second key is the content.
999 _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Content
) => {
1000 let __ret
= try
!(_serde
::de
::MapAccess
::next_value_seed(&mut __map
,
1003 marker
: _serde
::export
::PhantomData
,
1004 lifetime
: _serde
::export
::PhantomData
,
1006 // Visit remaining keys, looking for duplicates.
1007 #visit_remaining_keys
1009 // There is no second key; might be okay if the we have a unit variant.
1010 _serde
::export
::None
=> #missing_content
1013 // First key is the content.
1014 _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Content
) => {
1015 // Buffer up the content.
1016 let __content
= try
!(_serde
::de
::MapAccess
::next_value
::<_serde
::private
::de
::Content
>(&mut __map
));
1017 // Visit the second key.
1018 match #next_relevant_key {
1019 // Second key is the tag.
1020 _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Tag
) => {
1021 let __deserializer
= _serde
::private
::de
::ContentDeserializer
::<__A
::Error
>::new(__content
);
1023 let __ret
= try
!(match try
!(_serde
::de
::MapAccess
::next_value(&mut __map
)) {
1024 // Deserialize the buffered content now that we know the variant.
1027 // Visit remaining keys, looking for duplicates.
1028 #visit_remaining_keys
1030 // Second key is a duplicate of the content.
1031 _serde
::export
::Some(_serde
::private
::de
::TagOrContentField
::Content
) => {
1032 _serde
::export
::Err(<__A
::Error
as _serde
::de
::Error
>::duplicate_field(#content))
1034 // There is no second key.
1035 _serde
::export
::None
=> {
1036 _serde
::export
::Err(<__A
::Error
as _serde
::de
::Error
>::missing_field(#tag))
1040 // There is no first key.
1041 _serde
::export
::None
=> {
1042 _serde
::export
::Err(<__A
::Error
as _serde
::de
::Error
>::missing_field(#tag))
1047 fn visit_seq
<__A
>(self, mut __seq
: __A
) -> _serde
::export
::Result
<Self::Value
, __A
::Error
>
1048 where __A
: _serde
::de
::SeqAccess
<#delife>
1050 // Visit the first element - the tag.
1051 match try
!(_serde
::de
::SeqAccess
::next_element(&mut __seq
)) {
1052 _serde
::export
::Some(__field
) => {
1053 // Visit the second element - the content.
1054 match try
!(_serde
::de
::SeqAccess
::next_element_seed(&mut __seq
,
1057 marker
: _serde
::export
::PhantomData
,
1058 lifetime
: _serde
::export
::PhantomData
,
1060 _serde
::export
::Some(__ret
) => _serde
::export
::Ok(__ret
),
1061 // There is no second element.
1062 _serde
::export
::None
=> {
1063 _serde
::export
::Err(_serde
::de
::Error
::invalid_length(1, &self))
1067 // There is no first element.
1068 _serde
::export
::None
=> {
1069 _serde
::export
::Err(_serde
::de
::Error
::invalid_length(0, &self))
1075 const FIELDS
: &'
static [&'
static str] = &[#tag, #content];
1076 _serde
::Deserializer
::deserialize_struct(__deserializer
, #type_name, FIELDS,
1078 marker
: _serde
::export
::PhantomData
::<#this #ty_generics>,
1079 lifetime
: _serde
::export
::PhantomData
,
1084 fn deserialize_untagged_enum(
1085 params
: &Parameters
,
1086 variants
: &[Variant
],
1087 cattrs
: &attr
::Container
,
1089 let attempts
= variants
1091 .filter(|variant
| !variant
.attrs
.skip_deserializing())
1094 Expr(deserialize_untagged_variant(
1098 quote
!(_serde
::private
::de
::ContentRefDeserializer
::<__D
::Error
>::new(&__content
)),
1103 // TODO this message could be better by saving the errors from the failed
1104 // attempts. The heuristic used by TOML was to count the number of fields
1105 // processed before an error, and use the error that happened after the
1106 // largest number of fields. I'm not sure I like that. Maybe it would be
1107 // better to save all the errors and combine them into one message that
1108 // explains why none of the variants matched.
1109 let fallthrough_msg
=
1110 format
!("data did not match any variant of untagged enum {}", params
.type_name());
1113 let __content
= try
!(<_serde
::private
::de
::Content
as _serde
::Deserialize
>::deserialize(__deserializer
));
1116 if let _serde
::export
::Ok(__ok
) = #attempts {
1117 return _serde
::export
::Ok(__ok
);
1121 _serde
::export
::Err(_serde
::de
::Error
::custom(#fallthrough_msg))
1125 fn deserialize_externally_tagged_variant(
1126 params
: &Parameters
,
1128 cattrs
: &attr
::Container
,
1130 if let Some(path
) = variant
.attrs
.deserialize_with() {
1131 let (wrapper
, wrapper_ty
, unwrap_fn
) =
1132 wrap_deserialize_variant_with(params
, &variant
, path
);
1133 return quote_block
! {
1135 _serde
::export
::Result
::map(
1136 _serde
::de
::VariantAccess
::newtype_variant
::<#wrapper_ty>(__variant), #unwrap_fn)
1140 let variant_ident
= &variant
.ident
;
1142 match variant
.style
{
1144 let this
= ¶ms
.this
;
1146 try
!(_serde
::de
::VariantAccess
::unit_variant(__variant
));
1147 _serde
::export
::Ok(#this::#variant_ident)
1151 deserialize_externally_tagged_newtype_variant(variant_ident
, params
, &variant
.fields
[0])
1154 deserialize_tuple(Some(variant_ident
), params
, &variant
.fields
, cattrs
, None
)
1157 deserialize_struct(Some(variant_ident
), params
, &variant
.fields
, cattrs
, None
, Untagged
::No
)
1162 fn deserialize_internally_tagged_variant(
1163 params
: &Parameters
,
1165 cattrs
: &attr
::Container
,
1166 deserializer
: Tokens
,
1168 if variant
.attrs
.deserialize_with().is_some() {
1169 return deserialize_untagged_variant(params
, variant
, cattrs
, deserializer
);
1172 let variant_ident
= &variant
.ident
;
1174 match variant
.style
{
1176 let this
= ¶ms
.this
;
1177 let type_name
= params
.type_name();
1178 let variant_name
= variant
.ident
.as_ref();
1180 try
!(_serde
::Deserializer
::deserialize_any(#deserializer, _serde::private::de::InternallyTaggedUnitVisitor::new(#type_name, #variant_name)));
1181 _serde
::export
::Ok(#this::#variant_ident)
1185 deserialize_untagged_newtype_variant(
1194 Some(variant_ident
),
1202 Style
::Tuple
=> unreachable
!("checked in serde_derive_internals"),
1206 fn deserialize_untagged_variant(
1207 params
: &Parameters
,
1209 cattrs
: &attr
::Container
,
1210 deserializer
: Tokens
,
1212 if let Some(path
) = variant
.attrs
.deserialize_with() {
1213 let (wrapper
, wrapper_ty
, unwrap_fn
) =
1214 wrap_deserialize_variant_with(params
, &variant
, path
);
1215 return quote_block
! {
1217 _serde
::export
::Result
::map(
1218 <#wrapper_ty as _serde::Deserialize>::deserialize(#deserializer), #unwrap_fn)
1222 let variant_ident
= &variant
.ident
;
1224 match variant
.style
{
1226 let this
= ¶ms
.this
;
1227 let type_name
= params
.type_name();
1228 let variant_name
= variant
.ident
.as_ref();
1230 _serde
::export
::Result
::map(
1231 _serde
::Deserializer
::deserialize_any(
1233 _serde
::private
::de
::UntaggedUnitVisitor
::new(#type_name, #variant_name)
1235 |()| #this::#variant_ident)
1239 deserialize_untagged_newtype_variant(
1248 Some(variant_ident
),
1257 Some(variant_ident
),
1268 fn deserialize_externally_tagged_newtype_variant(
1269 variant_ident
: &syn
::Ident
,
1270 params
: &Parameters
,
1273 let this
= ¶ms
.this
;
1274 match field
.attrs
.deserialize_with() {
1276 let field_ty
= &field
.ty
;
1278 _serde
::export
::Result
::map(
1279 _serde
::de
::VariantAccess
::newtype_variant
::<#field_ty>(__variant),
1280 #this::#variant_ident)
1284 let (wrapper
, wrapper_ty
) = wrap_deserialize_field_with(params
, field
.ty
, path
);
1287 _serde
::export
::Result
::map(
1288 _serde
::de
::VariantAccess
::newtype_variant
::<#wrapper_ty>(__variant),
1289 |__wrapper
| #this::#variant_ident(__wrapper.value))
1295 fn deserialize_untagged_newtype_variant(
1296 variant_ident
: &syn
::Ident
,
1297 params
: &Parameters
,
1299 deserializer
: Tokens
,
1301 let this
= ¶ms
.this
;
1302 match field
.attrs
.deserialize_with() {
1304 let field_ty
= &field
.ty
;
1306 _serde
::export
::Result
::map(
1307 <#field_ty as _serde::Deserialize>::deserialize(#deserializer),
1308 #this::#variant_ident)
1312 let (wrapper
, wrapper_ty
) = wrap_deserialize_field_with(params
, field
.ty
, path
);
1315 _serde
::export
::Result
::map(
1316 <#wrapper_ty as _serde::Deserialize>::deserialize(#deserializer),
1317 |__wrapper
| #this::#variant_ident(__wrapper.value))
1323 fn deserialize_generated_identifier(
1324 fields
: Vec
<(String
, Ident
)>,
1325 cattrs
: &attr
::Container
,
1328 let this
= quote
!(__Field
);
1329 let field_idents
: &Vec
<_
> = &fields
.iter().map(|&(_
, ref ident
)| ident
).collect();
1331 let (ignore_variant
, fallthrough
) = if is_variant
|| cattrs
.deny_unknown_fields() {
1334 let ignore_variant
= quote
!(__ignore
,);
1335 let fallthrough
= quote
!(_serde
::export
::Ok(__Field
::__ignore
));
1336 (Some(ignore_variant
), Some(fallthrough
))
1339 let visitor_impl
= Stmts(deserialize_identifier(this
, &fields
, is_variant
, fallthrough
),);
1342 #[allow(non_camel_case_types)]
1348 struct __FieldVisitor
;
1350 impl<'de
> _serde
::de
::Visitor
<'de
> for __FieldVisitor
{
1351 type Value
= __Field
;
1356 impl<'de
> _serde
::Deserialize
<'de
> for __Field
{
1358 fn deserialize
<__D
>(__deserializer
: __D
) -> _serde
::export
::Result
<Self, __D
::Error
>
1359 where __D
: _serde
::Deserializer
<'de
>
1361 _serde
::Deserializer
::deserialize_identifier(__deserializer
, __FieldVisitor
)
1367 fn deserialize_custom_identifier(
1368 params
: &Parameters
,
1369 variants
: &[Variant
],
1370 cattrs
: &attr
::Container
,
1372 let is_variant
= match cattrs
.identifier() {
1373 attr
::Identifier
::Variant
=> true,
1374 attr
::Identifier
::Field
=> false,
1375 attr
::Identifier
::No
=> unreachable
!(),
1378 let this
= ¶ms
.this
;
1379 let this
= quote
!(#this);
1381 let (ordinary
, fallthrough
) = if let Some(last
) = variants
.last() {
1382 let last_ident
= &last
.ident
;
1383 if last
.attrs
.other() {
1384 let ordinary
= &variants
[..variants
.len() - 1];
1385 let fallthrough
= quote
!(_serde
::export
::Ok(#this::#last_ident));
1386 (ordinary
, Some(fallthrough
))
1387 } else if let Style
::Newtype
= last
.style
{
1388 let ordinary
= &variants
[..variants
.len() - 1];
1389 let deserializer
= quote
!(_serde
::private
::de
::IdentifierDeserializer
::from(__value
));
1390 let fallthrough
= quote
! {
1391 _serde
::export
::Result
::map(
1392 _serde
::Deserialize
::deserialize(#deserializer),
1395 (ordinary
, Some(fallthrough
))
1403 let names_idents
: Vec
<_
> = ordinary
1405 .map(|variant
| (variant
.attrs
.name().deserialize_name(), variant
.ident
.clone()),)
1408 let names
= names_idents
.iter().map(|&(ref name
, _
)| name
);
1410 let names_const
= if fallthrough
.is_some() {
1412 } else if is_variant
{
1413 let variants
= quote
! {
1414 const VARIANTS
: &'
static [&'
static str] = &[ #(#names),* ];
1418 let fields
= quote
! {
1419 const FIELDS
: &'
static [&'
static str] = &[ #(#names),* ];
1424 let (de_impl_generics
, de_ty_generics
, ty_generics
, where_clause
) = split_with_de_lifetime(params
,);
1425 let delife
= params
.borrowed
.de_lifetime();
1427 Stmts(deserialize_identifier(this
.clone(), &names_idents
, is_variant
, fallthrough
),);
1432 struct __FieldVisitor
#de_impl_generics #where_clause {
1433 marker
: _serde
::export
::PhantomData
<#this #ty_generics>,
1434 lifetime
: _serde
::export
::PhantomData
<&#delife ()>,
1437 impl #de_impl_generics _serde::de::Visitor<#delife> for __FieldVisitor #de_ty_generics #where_clause {
1438 type Value
= #this #ty_generics;
1443 let __visitor
= __FieldVisitor
{
1444 marker
: _serde
::export
::PhantomData
::<#this #ty_generics>,
1445 lifetime
: _serde
::export
::PhantomData
,
1447 _serde
::Deserializer
::deserialize_identifier(__deserializer
, __visitor
)
1451 fn deserialize_identifier(
1453 fields
: &[(String
, Ident
)],
1455 fallthrough
: Option
<Tokens
>,
1457 let field_strs
= fields
.iter().map(|&(ref name
, _
)| name
);
1458 let field_bytes
= fields
.iter().map(|&(ref name
, _
)| quote
::ByteStr(name
));
1460 let constructors
: &Vec
<_
> = &fields
1462 .map(|&(_
, ref ident
)| quote
!(#this::#ident))
1465 let expecting
= if is_variant
{
1466 "variant identifier"
1471 let index_expecting
= if is_variant
{
1477 let variant_indices
= 0u64..;
1478 let fallthrough_msg
= format
!("{} index 0 <= i < {}", index_expecting
, fields
.len());
1479 let visit_index
= quote
! {
1480 fn visit_u64
<__E
>(self, __value
: u64) -> _serde
::export
::Result
<Self::Value
, __E
>
1481 where __E
: _serde
::de
::Error
1485 #variant_indices => _serde::export::Ok(#constructors),
1487 _
=> _serde
::export
::Err(_serde
::de
::Error
::invalid_value(
1488 _serde
::de
::Unexpected
::Unsigned(__value
),
1494 let bytes_to_str
= if fallthrough
.is_some() {
1497 let conversion
= quote
! {
1498 let __value
= &_serde
::export
::from_utf8_lossy(__value
);
1503 let fallthrough_arm
= if let Some(fallthrough
) = fallthrough
{
1505 } else if is_variant
{
1507 _serde
::export
::Err(_serde
::de
::Error
::unknown_variant(__value
, VARIANTS
))
1511 _serde
::export
::Err(_serde
::de
::Error
::unknown_field(__value
, FIELDS
))
1516 fn expecting(&self, formatter
: &mut _serde
::export
::Formatter
) -> _serde
::export
::fmt
::Result
{
1517 _serde
::export
::Formatter
::write_str(formatter
, #expecting)
1522 fn visit_str
<__E
>(self, __value
: &str) -> _serde
::export
::Result
<Self::Value
, __E
>
1523 where __E
: _serde
::de
::Error
1527 #field_strs => _serde::export::Ok(#constructors),
1529 _
=> #fallthrough_arm
1533 fn visit_bytes
<__E
>(self, __value
: &[u8]) -> _serde
::export
::Result
<Self::Value
, __E
>
1534 where __E
: _serde
::de
::Error
1538 #field_bytes => _serde::export::Ok(#constructors),
1549 fn deserialize_struct_visitor(
1550 struct_path
: Tokens
,
1551 params
: &Parameters
,
1553 cattrs
: &attr
::Container
,
1554 ) -> (Fragment
, Fragment
, Fragment
) {
1555 let field_names_idents
: Vec
<_
> = fields
1558 .filter(|&(_
, field
)| !field
.attrs
.skip_deserializing())
1559 .map(|(i
, field
)| (field
.attrs
.name().deserialize_name(), field_i(i
)),)
1563 let field_names
= field_names_idents
.iter().map(|&(ref name
, _
)| name
);
1565 const FIELDS
: &'
static [&'
static str] = &[ #(#field_names),* ];
1569 let field_visitor
= deserialize_generated_identifier(field_names_idents
, cattrs
, false);
1571 let visit_map
= deserialize_map(struct_path
, params
, fields
, cattrs
);
1573 (field_visitor
, fields_stmt
, visit_map
)
1577 struct_path
: Tokens
,
1578 params
: &Parameters
,
1580 cattrs
: &attr
::Container
,
1582 // Create the field names for the fields.
1583 let fields_names
: Vec
<_
> = fields
1586 .map(|(i
, field
)| (field
, field_i(i
)))
1589 // Declare each field that will be deserialized.
1590 let let_values
= fields_names
1592 .filter(|&&(field
, _
)| !field
.attrs
.skip_deserializing())
1594 |&(field
, ref name
)| {
1595 let field_ty
= &field
.ty
;
1597 let mut #name: _serde::export::Option<#field_ty> = _serde::export::None;
1602 // Match arms to extract a value for a field.
1603 let value_arms
= fields_names
.iter()
1604 .filter(|&&(field
, _
)| !field
.attrs
.skip_deserializing())
1605 .map(|&(field
, ref name
)| {
1606 let deser_name
= field
.attrs
.name().deserialize_name();
1608 let visit
= match field
.attrs
.deserialize_with() {
1610 let field_ty
= &field
.ty
;
1612 try
!(_serde
::de
::MapAccess
::next_value
::<#field_ty>(&mut __map))
1616 let (wrapper
, wrapper_ty
) = wrap_deserialize_field_with(
1617 params
, field
.ty
, path
);
1620 try
!(_serde
::de
::MapAccess
::next_value
::<#wrapper_ty>(&mut __map)).value
1626 if _serde
::export
::Option
::is_some(&#name) {
1627 return _serde
::export
::Err(<__A
::Error
as _serde
::de
::Error
>::duplicate_field(#deser_name));
1629 #name = _serde::export::Some(#visit);
1634 // Visit ignored values to consume them
1635 let ignored_arm
= if cattrs
.deny_unknown_fields() {
1639 _
=> { let _ = try!(_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)); }
1643 let all_skipped
= fields
1645 .all(|field
| field
.attrs
.skip_deserializing());
1646 let match_keys
= if cattrs
.deny_unknown_fields() && all_skipped
{
1648 // FIXME: Once we drop support for Rust 1.15:
1649 // let _serde::export::None::<__Field> = try!(_serde::de::MapAccess::next_key(&mut __map));
1650 _serde
::export
::Option
::map(
1651 try
!(_serde
::de
::MapAccess
::next_key
::<__Field
>(&mut __map
)),
1652 |__impossible
| match __impossible {}
);
1656 while let _serde
::export
::Some(__key
) = try
!(_serde
::de
::MapAccess
::next_key
::<__Field
>(&mut __map
)) {
1665 let extract_values
= fields_names
1667 .filter(|&&(field
, _
)| !field
.attrs
.skip_deserializing())
1669 |&(field
, ref name
)| {
1670 let missing_expr
= Match(expr_is_missing(&field
, cattrs
));
1673 let #name = match #name {
1674 _serde
::export
::Some(#name) => #name,
1675 _serde
::export
::None
=> #missing_expr
1681 let result
= fields_names
1684 |&(field
, ref name
)| {
1688 .expect("struct contains unnamed fields");
1689 if field
.attrs
.skip_deserializing() {
1690 let value
= Expr(expr_is_missing(&field
, cattrs
));
1691 quote
!(#ident: #value)
1693 quote
!(#ident: #name)
1698 let let_default
= match *cattrs
.default() {
1699 attr
::Default
::Default
=> {
1702 let __default
: Self::Value
= _serde
::export
::Default
::default();
1706 attr
::Default
::Path(ref path
) => {
1709 let __default
: Self::Value
= #path();
1713 attr
::Default
::None
=> {
1714 // We don't need the default value, to prevent an unused variable warning
1715 // we'll leave the line empty.
1720 let mut result
= quote
!(#struct_path { #(#result),* });
1721 if params
.has_getter
{
1722 let this
= ¶ms
.this
;
1724 _serde
::export
::Into
::<#this>::into(#result)
1737 _serde
::export
::Ok(#result)
1741 fn field_i(i
: usize) -> Ident
{
1742 Ident
::new(format
!("__field{}", i
))
1745 /// This function wraps the expression in `#[serde(deserialize_with = "...")]`
1746 /// in a trait to prevent it from accessing the internal `Deserialize` state.
1747 fn wrap_deserialize_with(
1748 params
: &Parameters
,
1750 deserialize_with
: &syn
::Path
,
1751 ) -> (Tokens
, Tokens
) {
1752 let this
= ¶ms
.this
;
1753 let (de_impl_generics
, de_ty_generics
, ty_generics
, where_clause
) = split_with_de_lifetime(params
,);
1754 let delife
= params
.borrowed
.de_lifetime();
1756 let wrapper
= quote
! {
1757 struct __DeserializeWith
#de_impl_generics #where_clause {
1759 phantom
: _serde
::export
::PhantomData
<#this #ty_generics>,
1760 lifetime
: _serde
::export
::PhantomData
<&#delife ()>,
1763 impl #de_impl_generics _serde::Deserialize<#delife> for __DeserializeWith #de_ty_generics #where_clause {
1764 fn deserialize
<__D
>(__deserializer
: __D
) -> _serde
::export
::Result
<Self, __D
::Error
>
1765 where __D
: _serde
::Deserializer
<#delife>
1767 _serde
::export
::Ok(__DeserializeWith
{
1768 value
: try
!(#deserialize_with(__deserializer)),
1769 phantom
: _serde
::export
::PhantomData
,
1770 lifetime
: _serde
::export
::PhantomData
,
1776 let wrapper_ty
= quote
!(__DeserializeWith
#de_ty_generics);
1778 (wrapper
, wrapper_ty
)
1781 fn wrap_deserialize_field_with(
1782 params
: &Parameters
,
1784 deserialize_with
: &syn
::Path
,
1785 ) -> (Tokens
, Tokens
) {
1786 wrap_deserialize_with(params
, quote
!(#field_ty), deserialize_with)
1789 fn wrap_deserialize_variant_with(
1790 params
: &Parameters
,
1792 deserialize_with
: &syn
::Path
,
1793 ) -> (Tokens
, Tokens
, Tokens
) {
1794 let this
= ¶ms
.this
;
1795 let variant_ident
= &variant
.ident
;
1797 let field_tys
= variant
.fields
.iter().map(|field
| field
.ty
);
1798 let (wrapper
, wrapper_ty
) =
1799 wrap_deserialize_with(params
, quote
!((#(#field_tys),*)), deserialize_with);
1801 let field_access
= (0..variant
.fields
.len()).map(|n
| Ident
::new(format
!("{}", n
)));
1802 let unwrap_fn
= match variant
.style
{
1804 let field_idents
= variant
.fields
.iter().map(|field
| field
.ident
.as_ref().unwrap());
1808 #this::#variant_ident { #(#field_idents: __wrap.value.#field_access),* }
1817 #this::#variant_ident(#(__wrap.value.#field_access),*)
1826 #this::#variant_ident(__wrap.value)
1834 |__wrap
| { #this::#variant_ident }
1840 (wrapper
, wrapper_ty
, unwrap_fn
)
1843 fn expr_is_missing(field
: &Field
, cattrs
: &attr
::Container
) -> Fragment
{
1844 match *field
.attrs
.default() {
1845 attr
::Default
::Default
=> {
1846 return quote_expr
!(_serde
::export
::Default
::default());
1848 attr
::Default
::Path(ref path
) => {
1849 return quote_expr
!(#path());
1851 attr
::Default
::None
=> { /* below */ }
1854 match *cattrs
.default() {
1855 attr
::Default
::Default
|
1856 attr
::Default
::Path(_
) => {
1857 let ident
= &field
.ident
;
1858 return quote_expr
!(__default
.#ident);
1860 attr
::Default
::None
=> { /* below */ }
1863 let name
= field
.attrs
.name().deserialize_name();
1864 match field
.attrs
.deserialize_with() {
1867 try
!(_serde
::private
::de
::missing_field(#name))
1872 return _serde
::export
::Err(<__A
::Error
as _serde
::de
::Error
>::missing_field(#name))
1878 struct DeImplGenerics
<'a
>(&'a Parameters
);
1880 impl<'a
> ToTokens
for DeImplGenerics
<'a
> {
1881 fn to_tokens(&self, tokens
: &mut Tokens
) {
1882 let mut generics
= self.0.generics
.clone();
1883 if let Some(de_lifetime
) = self.0.borrowed
.de_lifetime_def() {
1884 generics
.lifetimes
.insert(0, de_lifetime
);
1886 let (impl_generics
, _
, _
) = generics
.split_for_impl();
1887 impl_generics
.to_tokens(tokens
);
1891 struct DeTyGenerics
<'a
>(&'a Parameters
);
1893 impl<'a
> ToTokens
for DeTyGenerics
<'a
> {
1894 fn to_tokens(&self, tokens
: &mut Tokens
) {
1895 let mut generics
= self.0.generics
.clone();
1896 if self.0.borrowed
.de_lifetime_def().is_some() {
1899 .insert(0, syn
::LifetimeDef
::new("'de"));
1901 let (_
, ty_generics
, _
) = generics
.split_for_impl();
1902 ty_generics
.to_tokens(tokens
);
1906 fn split_with_de_lifetime(params
: &Parameters
,)
1907 -> (DeImplGenerics
, DeTyGenerics
, syn
::TyGenerics
, &syn
::WhereClause
) {
1908 let de_impl_generics
= DeImplGenerics(¶ms
);
1909 let de_ty_generics
= DeTyGenerics(¶ms
);
1910 let (_
, ty_generics
, where_clause
) = params
.generics
.split_for_impl();
1911 (de_impl_generics
, de_ty_generics
, ty_generics
, where_clause
)