]> git.proxmox.com Git - rustc.git/blame - src/vendor/serde_derive/src/de.rs
New upstream version 1.23.0+dfsg1
[rustc.git] / src / vendor / serde_derive / src / de.rs
CommitLineData
3b2f2976
XL
1// Copyright 2017 Serde Developers
2//
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.
8
9use syn::{self, Ident};
10use quote::{self, Tokens, ToTokens};
11
12use bound;
13use fragment::{Fragment, Expr, Stmts, Match};
14use internals::ast::{Body, Container, Field, Style, Variant};
15use internals::{self, attr};
16
17use std::collections::BTreeSet;
18
19pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<Tokens, String> {
20 let ctxt = internals::Ctxt::new();
21 let cont = Container::from_ast(&ctxt, input);
22 try!(ctxt.check());
23
24 let ident = &cont.ident;
25 let params = Parameters::new(&cont);
26 let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(&params);
27 let dummy_const = Ident::new(format!("_IMPL_DESERIALIZE_FOR_{}", ident));
28 let body = Stmts(deserialize_body(&cont, &params));
ea8adc8c 29 let delife = params.borrowed.de_lifetime();
3b2f2976
XL
30
31 let impl_block = if let Some(remote) = cont.attrs.remote() {
32 let vis = &input.vis;
33 quote! {
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>
ea8adc8c 36 where __D: _serde::Deserializer<#delife>
3b2f2976
XL
37 {
38 #body
39 }
40 }
41 }
42 } else {
43 quote! {
44 #[automatically_derived]
ea8adc8c 45 impl #de_impl_generics _serde::Deserialize<#delife> for #ident #ty_generics #where_clause {
3b2f2976 46 fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
ea8adc8c 47 where __D: _serde::Deserializer<#delife>
3b2f2976
XL
48 {
49 #body
50 }
51 }
52 }
53 };
54
55 let generated = quote! {
56 #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
57 const #dummy_const: () = {
58 extern crate serde as _serde;
59 #impl_block
60 };
61 };
62 Ok(generated)
63}
64
65struct Parameters {
66 /// Name of the type the `derive` is on.
67 local: syn::Ident,
68
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.
72 this: syn::Path,
73
74 /// Generics including any explicit and inferred bounds for the impl.
75 generics: syn::Generics,
76
77 /// Lifetimes borrowed from the deserializer. These will become bounds on
78 /// the `'de` lifetime of the deserializer.
ea8adc8c 79 borrowed: BorrowedLifetimes,
3b2f2976
XL
80
81 /// At least one field has a serde(getter) attribute, implying that the
82 /// remote type has a private field.
83 has_getter: bool,
84}
85
86impl Parameters {
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(),
92 };
3b2f2976 93 let borrowed = borrowed_lifetimes(cont);
ea8adc8c 94 let generics = build_generics(cont, &borrowed);
3b2f2976
XL
95 let has_getter = cont.body.has_getter();
96
97 Parameters {
98 local: local,
99 this: this,
100 generics: generics,
101 borrowed: borrowed,
102 has_getter: has_getter,
103 }
104 }
105
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()
110 }
3b2f2976
XL
111}
112
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.
ea8adc8c 116fn build_generics(cont: &Container, borrowed: &BorrowedLifetimes) -> syn::Generics {
3b2f2976
XL
117 let generics = bound::without_defaults(cont.generics);
118
119 let generics = bound::with_where_predicates_from_fields(cont, &generics, attr::Field::de_bound);
120
121 match cont.attrs.de_bound() {
122 Some(predicates) => bound::with_where_predicates(&generics, predicates),
123 None => {
124 let generics = match *cont.attrs.default() {
125 attr::Default::Default => {
126 bound::with_self_bound(cont, &generics, &path!(_serde::export::Default))
127 }
128 attr::Default::None |
129 attr::Default::Path(_) => generics,
130 };
131
ea8adc8c 132 let delife = borrowed.de_lifetime();
3b2f2976
XL
133 let generics = bound::with_bound(
134 cont,
135 &generics,
136 needs_deserialize_bound,
ea8adc8c 137 &path!(_serde::Deserialize<#delife>),
3b2f2976
XL
138 );
139
140 bound::with_bound(
141 cont,
142 &generics,
143 requires_default,
144 &path!(_serde::export::Default),
145 )
146 }
147 }
148}
149
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.
ea8adc8c
XL
154fn 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())
3b2f2976
XL
159}
160
161// Fields with a `default` attribute (not `default=...`), and fields with a
162// `skip_deserializing` attribute that do not also have `default=...`.
ea8adc8c
XL
163fn requires_default(field: &attr::Field, _variant: Option<&attr::Variant>) -> bool {
164 field.default() == &attr::Default::Default
165}
166
167enum BorrowedLifetimes {
168 Borrowed(BTreeSet<syn::Lifetime>),
169 Static,
170}
171
172impl BorrowedLifetimes {
173 fn de_lifetime(&self) -> syn::Lifetime {
174 match *self {
175 BorrowedLifetimes::Borrowed(_) => syn::Lifetime::new("'de"),
176 BorrowedLifetimes::Static => syn::Lifetime::new("'static"),
177 }
178 }
179
180 fn de_lifetime_def(&self) -> Option<syn::LifetimeDef> {
181 match *self {
182 BorrowedLifetimes::Borrowed(ref bounds) => {
183 Some(syn::LifetimeDef {
184 attrs: Vec::new(),
185 lifetime: syn::Lifetime::new("'de"),
186 bounds: bounds.iter().cloned().collect(),
187 })
188 }
189 BorrowedLifetimes::Static => None,
190 }
191 }
3b2f2976
XL
192}
193
194// The union of lifetimes borrowed by each field of the container.
195//
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:
198//
199// impl<'de: 'a + 'b, 'a, 'b, 'c> Deserialize<'de> for S<'a, 'b, 'c>
ea8adc8c
XL
200//
201// If any borrowed lifetime is `'static`, then `'de: 'static` would be redundant
202// and we use plain `'static` instead of `'de`.
203fn borrowed_lifetimes(cont: &Container) -> BorrowedLifetimes {
3b2f2976
XL
204 let mut lifetimes = BTreeSet::new();
205 for field in cont.body.all_fields() {
abe05a73
XL
206 if !field.attrs.skip_deserializing() {
207 lifetimes.extend(field.attrs.borrowed_lifetimes().iter().cloned());
208 }
3b2f2976 209 }
ea8adc8c
XL
210 if lifetimes.iter().any(|b| b.ident == "'static") {
211 BorrowedLifetimes::Static
212 } else {
213 BorrowedLifetimes::Borrowed(lifetimes)
214 }
3b2f2976
XL
215}
216
217fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {
218 if let Some(from_type) = cont.attrs.from_type() {
219 deserialize_from(from_type)
220 } else if let attr::Identifier::No = cont.attrs.identifier() {
221 match cont.body {
222 Body::Enum(ref variants) => deserialize_enum(params, variants, &cont.attrs),
223 Body::Struct(Style::Struct, ref fields) => {
224 if fields.iter().any(|field| field.ident.is_none()) {
225 panic!("struct has unnamed fields");
226 }
ea8adc8c 227 deserialize_struct(None, params, fields, &cont.attrs, None, Untagged::No)
3b2f2976
XL
228 }
229 Body::Struct(Style::Tuple, ref fields) |
230 Body::Struct(Style::Newtype, ref fields) => {
231 if fields.iter().any(|field| field.ident.is_some()) {
232 panic!("tuple struct has named fields");
233 }
234 deserialize_tuple(None, params, fields, &cont.attrs, None)
235 }
236 Body::Struct(Style::Unit, _) => deserialize_unit_struct(params, &cont.attrs),
237 }
238 } else {
239 match cont.body {
240 Body::Enum(ref variants) => {
241 deserialize_custom_identifier(params, variants, &cont.attrs)
242 }
243 Body::Struct(_, _) => unreachable!("checked in serde_derive_internals"),
244 }
245 }
246}
247
248fn deserialize_from(from_type: &syn::Ty) -> Fragment {
249 quote_block! {
250 _serde::export::Result::map(
251 <#from_type as _serde::Deserialize>::deserialize(__deserializer),
252 _serde::export::From::from)
253 }
254}
255
256fn deserialize_unit_struct(params: &Parameters, cattrs: &attr::Container) -> Fragment {
257 let this = &params.this;
258 let type_name = cattrs.name().deserialize_name();
259
260 let expecting = format!("unit struct {}", params.type_name());
261
262 quote_block! {
263 struct __Visitor;
264
265 impl<'de> _serde::de::Visitor<'de> for __Visitor {
266 type Value = #this;
267
268 fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
269 _serde::export::Formatter::write_str(formatter, #expecting)
270 }
271
272 #[inline]
273 fn visit_unit<__E>(self) -> _serde::export::Result<Self::Value, __E>
274 where __E: _serde::de::Error
275 {
276 _serde::export::Ok(#this)
277 }
278 }
279
280 _serde::Deserializer::deserialize_unit_struct(__deserializer, #type_name, __Visitor)
281 }
282}
283
284fn deserialize_tuple(
285 variant_ident: Option<&syn::Ident>,
286 params: &Parameters,
287 fields: &[Field],
288 cattrs: &attr::Container,
289 deserializer: Option<Tokens>,
290) -> Fragment {
291 let this = &params.this;
292 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
ea8adc8c 293 let delife = params.borrowed.de_lifetime();
3b2f2976
XL
294
295 // If there are getters (implying private fields), construct the local type
296 // and use an `Into` conversion to get the remote type. If there are no
297 // getters then construct the target type directly.
298 let construct = if params.has_getter {
299 let local = &params.local;
300 quote!(#local)
301 } else {
302 quote!(#this)
303 };
304
305 let is_enum = variant_ident.is_some();
306 let type_path = match variant_ident {
307 Some(variant_ident) => quote!(#construct::#variant_ident),
308 None => construct,
309 };
310 let expecting = match variant_ident {
311 Some(variant_ident) => format!("tuple variant {}::{}", params.type_name(), variant_ident),
312 None => format!("tuple struct {}", params.type_name()),
313 };
314
315 let nfields = fields.len();
316
317 let visit_newtype_struct = if !is_enum && nfields == 1 {
318 Some(deserialize_newtype_struct(&type_path, params, &fields[0]))
319 } else {
320 None
321 };
322
323 let visit_seq = Stmts(deserialize_seq(&type_path, params, fields, false, cattrs));
324
325 let visitor_expr = quote! {
326 __Visitor {
327 marker: _serde::export::PhantomData::<#this #ty_generics>,
328 lifetime: _serde::export::PhantomData,
329 }
330 };
331 let dispatch = if let Some(deserializer) = deserializer {
332 quote!(_serde::Deserializer::deserialize_tuple(#deserializer, #nfields, #visitor_expr))
333 } else if is_enum {
334 quote!(_serde::de::VariantAccess::tuple_variant(__variant, #nfields, #visitor_expr))
335 } else if nfields == 1 {
336 let type_name = cattrs.name().deserialize_name();
337 quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))
338 } else {
339 let type_name = cattrs.name().deserialize_name();
340 quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #nfields, #visitor_expr))
341 };
342
343 let all_skipped = fields
344 .iter()
345 .all(|field| field.attrs.skip_deserializing());
346 let visitor_var = if all_skipped {
347 quote!(_)
348 } else {
349 quote!(mut __seq)
350 };
351
352 quote_block! {
353 struct __Visitor #de_impl_generics #where_clause {
354 marker: _serde::export::PhantomData<#this #ty_generics>,
ea8adc8c 355 lifetime: _serde::export::PhantomData<&#delife ()>,
3b2f2976
XL
356 }
357
ea8adc8c 358 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
3b2f2976
XL
359 type Value = #this #ty_generics;
360
361 fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
362 _serde::export::Formatter::write_str(formatter, #expecting)
363 }
364
365 #visit_newtype_struct
366
367 #[inline]
368 fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
ea8adc8c 369 where __A: _serde::de::SeqAccess<#delife>
3b2f2976
XL
370 {
371 #visit_seq
372 }
373 }
374
375 #dispatch
376 }
377}
378
379fn deserialize_seq(
380 type_path: &Tokens,
381 params: &Parameters,
382 fields: &[Field],
383 is_struct: bool,
384 cattrs: &attr::Container,
385) -> Fragment {
386 let vars = (0..fields.len()).map(field_i as fn(_) -> _);
387
388 let deserialized_count = fields
389 .iter()
390 .filter(|field| !field.attrs.skip_deserializing())
391 .count();
392 let expecting = format!("tuple of {} elements", deserialized_count);
393
394 let mut index_in_seq = 0usize;
395 let let_values = vars.clone().zip(fields)
396 .map(|(var, field)| {
397 if field.attrs.skip_deserializing() {
398 let default = Expr(expr_is_missing(&field, cattrs));
399 quote! {
400 let #var = #default;
401 }
402 } else {
403 let visit = match field.attrs.deserialize_with() {
404 None => {
405 let field_ty = &field.ty;
406 quote!(try!(_serde::de::SeqAccess::next_element::<#field_ty>(&mut __seq)))
407 }
408 Some(path) => {
ea8adc8c 409 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(
3b2f2976
XL
410 params, field.ty, path);
411 quote!({
412 #wrapper
413 _serde::export::Option::map(
414 try!(_serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)),
415 |__wrap| __wrap.value)
416 })
417 }
418 };
419 let assign = quote! {
420 let #var = match #visit {
421 Some(__value) => __value,
422 None => {
423 return _serde::export::Err(_serde::de::Error::invalid_length(#index_in_seq, &#expecting));
424 }
425 };
426 };
427 index_in_seq += 1;
428 assign
429 }
430 });
431
432 let mut result = if is_struct {
433 let names = fields.iter().map(|f| &f.ident);
434 quote! {
435 #type_path { #( #names: #vars ),* }
436 }
437 } else {
438 quote! {
439 #type_path ( #(#vars),* )
440 }
441 };
442
443 if params.has_getter {
444 let this = &params.this;
445 result = quote! {
446 _serde::export::Into::<#this>::into(#result)
447 };
448 }
449
450 quote_block! {
451 #(#let_values)*
452 _serde::export::Ok(#result)
453 }
454}
455
456fn deserialize_newtype_struct(type_path: &Tokens, params: &Parameters, field: &Field) -> Tokens {
ea8adc8c
XL
457 let delife = params.borrowed.de_lifetime();
458
3b2f2976
XL
459 let value = match field.attrs.deserialize_with() {
460 None => {
461 let field_ty = &field.ty;
462 quote! {
463 try!(<#field_ty as _serde::Deserialize>::deserialize(__e))
464 }
465 }
466 Some(path) => {
ea8adc8c 467 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
3b2f2976
XL
468 quote!({
469 #wrapper
470 try!(<#wrapper_ty as _serde::Deserialize>::deserialize(__e)).value
471 })
472 }
473 };
474
475 let mut result = quote!(#type_path(#value));
476 if params.has_getter {
477 let this = &params.this;
478 result = quote! {
479 _serde::export::Into::<#this>::into(#result)
480 };
481 }
482
483 quote! {
484 #[inline]
485 fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::export::Result<Self::Value, __E::Error>
ea8adc8c 486 where __E: _serde::Deserializer<#delife>
3b2f2976
XL
487 {
488 _serde::export::Ok(#result)
489 }
490 }
491}
492
ea8adc8c
XL
493enum Untagged {
494 Yes,
495 No,
496}
497
3b2f2976
XL
498fn deserialize_struct(
499 variant_ident: Option<&syn::Ident>,
500 params: &Parameters,
501 fields: &[Field],
502 cattrs: &attr::Container,
503 deserializer: Option<Tokens>,
ea8adc8c 504 untagged: Untagged,
3b2f2976
XL
505) -> Fragment {
506 let is_enum = variant_ident.is_some();
3b2f2976
XL
507
508 let this = &params.this;
509 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
ea8adc8c 510 let delife = params.borrowed.de_lifetime();
3b2f2976
XL
511
512 // If there are getters (implying private fields), construct the local type
513 // and use an `Into` conversion to get the remote type. If there are no
514 // getters then construct the target type directly.
515 let construct = if params.has_getter {
516 let local = &params.local;
517 quote!(#local)
518 } else {
519 quote!(#this)
520 };
521
522 let type_path = match variant_ident {
523 Some(variant_ident) => quote!(#construct::#variant_ident),
524 None => construct,
525 };
526 let expecting = match variant_ident {
527 Some(variant_ident) => format!("struct variant {}::{}", params.type_name(), variant_ident),
528 None => format!("struct {}", params.type_name()),
529 };
530
531 let visit_seq = Stmts(deserialize_seq(&type_path, params, fields, true, cattrs));
532
533 let (field_visitor, fields_stmt, visit_map) =
534 deserialize_struct_visitor(type_path, params, fields, cattrs);
535 let field_visitor = Stmts(field_visitor);
536 let fields_stmt = Stmts(fields_stmt);
537 let visit_map = Stmts(visit_map);
538
539 let visitor_expr = quote! {
540 __Visitor {
541 marker: _serde::export::PhantomData::<#this #ty_generics>,
542 lifetime: _serde::export::PhantomData,
543 }
544 };
545 let dispatch = if let Some(deserializer) = deserializer {
546 quote! {
547 _serde::Deserializer::deserialize_any(#deserializer, #visitor_expr)
548 }
549 } else if is_enum {
550 quote! {
551 _serde::de::VariantAccess::struct_variant(__variant, FIELDS, #visitor_expr)
552 }
553 } else {
554 let type_name = cattrs.name().deserialize_name();
555 quote! {
556 _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS, #visitor_expr)
557 }
558 };
559
560 let all_skipped = fields
561 .iter()
562 .all(|field| field.attrs.skip_deserializing());
563 let visitor_var = if all_skipped {
564 quote!(_)
565 } else {
566 quote!(mut __seq)
567 };
568
ea8adc8c
XL
569 // untagged struct variants do not get a visit_seq method
570 let visit_seq = match untagged {
571 Untagged::Yes => None,
572 Untagged::No => {
573 Some(quote! {
574 #[inline]
575 fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::export::Result<Self::Value, __A::Error>
576 where __A: _serde::de::SeqAccess<#delife>
577 {
578 #visit_seq
579 }
580 })
581 }
3b2f2976
XL
582 };
583
584 quote_block! {
585 #field_visitor
586
587 struct __Visitor #de_impl_generics #where_clause {
588 marker: _serde::export::PhantomData<#this #ty_generics>,
ea8adc8c 589 lifetime: _serde::export::PhantomData<&#delife ()>,
3b2f2976
XL
590 }
591
ea8adc8c 592 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
3b2f2976
XL
593 type Value = #this #ty_generics;
594
595 fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
596 _serde::export::Formatter::write_str(formatter, #expecting)
597 }
598
599 #visit_seq
600
601 #[inline]
602 fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
ea8adc8c 603 where __A: _serde::de::MapAccess<#delife>
3b2f2976
XL
604 {
605 #visit_map
606 }
607 }
608
609 #fields_stmt
610
611 #dispatch
612 }
613}
614
615fn deserialize_enum(
616 params: &Parameters,
617 variants: &[Variant],
618 cattrs: &attr::Container,
619) -> Fragment {
620 match *cattrs.tag() {
621 attr::EnumTag::External => deserialize_externally_tagged_enum(params, variants, cattrs),
622 attr::EnumTag::Internal { ref tag } => {
623 deserialize_internally_tagged_enum(params, variants, cattrs, tag)
624 }
625 attr::EnumTag::Adjacent {
626 ref tag,
627 ref content,
628 } => deserialize_adjacently_tagged_enum(params, variants, cattrs, tag, content),
629 attr::EnumTag::None => deserialize_untagged_enum(params, variants, cattrs),
630 }
631}
632
633fn deserialize_externally_tagged_enum(
634 params: &Parameters,
635 variants: &[Variant],
636 cattrs: &attr::Container,
637) -> Fragment {
638 let this = &params.this;
639 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
ea8adc8c 640 let delife = params.borrowed.de_lifetime();
3b2f2976
XL
641
642 let type_name = cattrs.name().deserialize_name();
643
644 let expecting = format!("enum {}", params.type_name());
645
646 let variant_names_idents: Vec<_> = variants
647 .iter()
648 .enumerate()
649 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
650 .map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i)),)
651 .collect();
652
653 let variants_stmt = {
654 let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name);
655 quote! {
656 const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
657 }
658 };
659
660 let variant_visitor = Stmts(deserialize_generated_identifier(variant_names_idents, cattrs, true),);
661
662 // Match arms to extract a variant from a string
663 let variant_arms = variants
664 .iter()
665 .enumerate()
666 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
667 .map(
668 |(i, variant)| {
669 let variant_name = field_i(i);
670
671 let block = Match(deserialize_externally_tagged_variant(params, variant, cattrs),);
672
673 quote! {
674 (__Field::#variant_name, __variant) => #block
675 }
676 },
677 );
678
679 let all_skipped = variants
680 .iter()
681 .all(|variant| variant.attrs.skip_deserializing());
682 let match_variant = if all_skipped {
683 // This is an empty enum like `enum Impossible {}` or an enum in which
684 // all variants have `#[serde(skip_deserializing)]`.
685 quote! {
686 // FIXME: Once we drop support for Rust 1.15:
687 // let _serde::export::Err(__err) = _serde::de::EnumAccess::variant::<__Field>(__data);
688 // _serde::export::Err(__err)
689 _serde::export::Result::map(
690 _serde::de::EnumAccess::variant::<__Field>(__data),
691 |(__impossible, _)| match __impossible {})
692 }
693 } else {
694 quote! {
695 match try!(_serde::de::EnumAccess::variant(__data)) {
696 #(#variant_arms)*
697 }
698 }
699 };
700
701 quote_block! {
702 #variant_visitor
703
704 struct __Visitor #de_impl_generics #where_clause {
705 marker: _serde::export::PhantomData<#this #ty_generics>,
ea8adc8c 706 lifetime: _serde::export::PhantomData<&#delife ()>,
3b2f2976
XL
707 }
708
ea8adc8c 709 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
3b2f2976
XL
710 type Value = #this #ty_generics;
711
712 fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
713 _serde::export::Formatter::write_str(formatter, #expecting)
714 }
715
716 fn visit_enum<__A>(self, __data: __A) -> _serde::export::Result<Self::Value, __A::Error>
ea8adc8c 717 where __A: _serde::de::EnumAccess<#delife>
3b2f2976
XL
718 {
719 #match_variant
720 }
721 }
722
723 #variants_stmt
724
725 _serde::Deserializer::deserialize_enum(__deserializer, #type_name, VARIANTS,
726 __Visitor {
727 marker: _serde::export::PhantomData::<#this #ty_generics>,
728 lifetime: _serde::export::PhantomData,
729 })
730 }
731}
732
733fn deserialize_internally_tagged_enum(
734 params: &Parameters,
735 variants: &[Variant],
736 cattrs: &attr::Container,
737 tag: &str,
738) -> Fragment {
739 let variant_names_idents: Vec<_> = variants
740 .iter()
741 .enumerate()
742 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
743 .map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i)),)
744 .collect();
745
746 let variants_stmt = {
747 let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name);
748 quote! {
749 const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
750 }
751 };
752
753 let variant_visitor = Stmts(deserialize_generated_identifier(variant_names_idents, cattrs, true),);
754
755 // Match arms to extract a variant from a string
756 let variant_arms = variants.iter()
757 .enumerate()
758 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
759 .map(|(i, variant)| {
760 let variant_name = field_i(i);
761
762 let block = Match(deserialize_internally_tagged_variant(
763 params,
764 variant,
765 cattrs,
766 quote!(_serde::private::de::ContentDeserializer::<__D::Error>::new(__tagged.content)),
767 ));
768
769 quote! {
770 __Field::#variant_name => #block
771 }
772 });
773
774 quote_block! {
775 #variant_visitor
776
777 #variants_stmt
778
779 let __tagged = try!(_serde::Deserializer::deserialize_any(
780 __deserializer,
781 _serde::private::de::TaggedContentVisitor::<__Field>::new(#tag)));
782
783 match __tagged.tag {
784 #(#variant_arms)*
785 }
786 }
787}
788
789fn deserialize_adjacently_tagged_enum(
790 params: &Parameters,
791 variants: &[Variant],
792 cattrs: &attr::Container,
793 tag: &str,
794 content: &str,
795) -> Fragment {
796 let this = &params.this;
797 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
ea8adc8c 798 let delife = params.borrowed.de_lifetime();
3b2f2976
XL
799
800 let variant_names_idents: Vec<_> = variants
801 .iter()
802 .enumerate()
803 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
804 .map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i)),)
805 .collect();
806
807 let variants_stmt = {
808 let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name);
809 quote! {
810 const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
811 }
812 };
813
814 let variant_visitor = Stmts(deserialize_generated_identifier(variant_names_idents, cattrs, true),);
815
816 let ref variant_arms: Vec<_> = variants
817 .iter()
818 .enumerate()
819 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
820 .map(
821 |(i, variant)| {
822 let variant_index = field_i(i);
823
824 let block = Match(
825 deserialize_untagged_variant(
826 params,
827 variant,
828 cattrs,
829 quote!(__deserializer),
830 ),
831 );
832
833 quote! {
834 __Field::#variant_index => #block
835 }
836 },
837 )
838 .collect();
839
840 let expecting = format!("adjacently tagged enum {}", params.type_name());
841 let type_name = cattrs.name().deserialize_name();
842 let deny_unknown_fields = cattrs.deny_unknown_fields();
843
ea8adc8c
XL
844 // If unknown fields are allowed, we pick the visitor that can step over
845 // those. Otherwise we pick the visitor that fails on unknown keys.
3b2f2976
XL
846 let field_visitor_ty = if deny_unknown_fields {
847 quote! { _serde::private::de::TagOrContentFieldVisitor }
848 } else {
849 quote! { _serde::private::de::TagContentOtherFieldVisitor }
850 };
851
852 let tag_or_content = quote! {
853 #field_visitor_ty {
854 tag: #tag,
855 content: #content,
856 }
857 };
858
859 fn is_unit(variant: &Variant) -> bool {
860 match variant.style {
861 Style::Unit => true,
862 Style::Struct | Style::Tuple | Style::Newtype => false,
863 }
864 }
865
866 let mut missing_content = quote! {
867 _serde::export::Err(<__A::Error as _serde::de::Error>::missing_field(#content))
868 };
869 if variants.iter().any(is_unit) {
870 let fallthrough = if variants.iter().all(is_unit) {
871 None
872 } else {
873 Some(
874 quote! {
875 _ => #missing_content
876 },
877 )
878 };
879 let arms = variants
880 .iter()
881 .enumerate()
882 .filter(|&(_, variant)| !variant.attrs.skip_deserializing() && is_unit(variant),)
883 .map(
884 |(i, variant)| {
885 let variant_index = field_i(i);
886 let variant_ident = &variant.ident;
887 quote! {
888 __Field::#variant_index => _serde::export::Ok(#this::#variant_ident),
889 }
890 },
891 );
892 missing_content = quote! {
893 match __field {
894 #(#arms)*
895 #fallthrough
896 }
897 };
898 }
899
ea8adc8c 900 // Advance the map by one key, returning early in case of error.
3b2f2976
XL
901 let next_key = quote! {
902 try!(_serde::de::MapAccess::next_key_seed(&mut __map, #tag_or_content))
903 };
904
ea8adc8c
XL
905 // When allowing unknown fields, we want to transparently step through keys
906 // we don't care about until we find `tag`, `content`, or run out of keys.
3b2f2976
XL
907 let next_relevant_key = if deny_unknown_fields {
908 next_key
909 } else {
910 quote! {
911 {
912 let mut __rk : _serde::export::Option<_serde::private::de::TagOrContentField> = _serde::export::None;
913 while let _serde::export::Some(__k) = #next_key {
914 match __k {
915 _serde::private::de::TagContentOtherField::Other => {
916 try!(_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map));
917 continue;
918 },
919 _serde::private::de::TagContentOtherField::Tag => {
920 __rk = _serde::export::Some(_serde::private::de::TagOrContentField::Tag);
921 break;
922 }
923 _serde::private::de::TagContentOtherField::Content => {
924 __rk = _serde::export::Some(_serde::private::de::TagOrContentField::Content);
925 break;
926 }
927 }
928 }
929
930 __rk
931 }
932 }
933 };
934
ea8adc8c
XL
935 // Step through remaining keys, looking for duplicates of previously-seen
936 // keys. When unknown fields are denied, any key that isn't a duplicate will
937 // at this point immediately produce an error.
3b2f2976
XL
938 let visit_remaining_keys = quote! {
939 match #next_relevant_key {
940 _serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
941 _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#tag))
942 }
943 _serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
944 _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#content))
945 }
946 _serde::export::None => _serde::export::Ok(__ret),
947 }
948 };
949
950 quote_block! {
951 #variant_visitor
952
953 #variants_stmt
954
955 struct __Seed #de_impl_generics #where_clause {
956 field: __Field,
957 marker: _serde::export::PhantomData<#this #ty_generics>,
ea8adc8c 958 lifetime: _serde::export::PhantomData<&#delife ()>,
3b2f2976
XL
959 }
960
ea8adc8c 961 impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Seed #de_ty_generics #where_clause {
3b2f2976
XL
962 type Value = #this #ty_generics;
963
964 fn deserialize<__D>(self, __deserializer: __D) -> _serde::export::Result<Self::Value, __D::Error>
ea8adc8c 965 where __D: _serde::Deserializer<#delife>
3b2f2976
XL
966 {
967 match self.field {
968 #(#variant_arms)*
969 }
970 }
971 }
972
973 struct __Visitor #de_impl_generics #where_clause {
974 marker: _serde::export::PhantomData<#this #ty_generics>,
ea8adc8c 975 lifetime: _serde::export::PhantomData<&#delife ()>,
3b2f2976
XL
976 }
977
ea8adc8c 978 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
3b2f2976
XL
979 type Value = #this #ty_generics;
980
981 fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
982 _serde::export::Formatter::write_str(formatter, #expecting)
983 }
984
985 fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
ea8adc8c 986 where __A: _serde::de::MapAccess<#delife>
3b2f2976
XL
987 {
988 // Visit the first relevant key.
989 match #next_relevant_key {
990 // First key is the tag.
991 _serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
992 // Parse the tag.
993 let __field = try!(_serde::de::MapAccess::next_value(&mut __map));
994 // Visit the second key.
995 match #next_relevant_key {
996 // Second key is a duplicate of the tag.
997 _serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
998 _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#tag))
999 }
1000 // Second key is the content.
1001 _serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
1002 let __ret = try!(_serde::de::MapAccess::next_value_seed(&mut __map,
1003 __Seed {
1004 field: __field,
1005 marker: _serde::export::PhantomData,
1006 lifetime: _serde::export::PhantomData,
1007 }));
1008 // Visit remaining keys, looking for duplicates.
1009 #visit_remaining_keys
1010 }
1011 // There is no second key; might be okay if the we have a unit variant.
1012 _serde::export::None => #missing_content
1013 }
1014 }
1015 // First key is the content.
1016 _serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
1017 // Buffer up the content.
1018 let __content = try!(_serde::de::MapAccess::next_value::<_serde::private::de::Content>(&mut __map));
1019 // Visit the second key.
1020 match #next_relevant_key {
1021 // Second key is the tag.
1022 _serde::export::Some(_serde::private::de::TagOrContentField::Tag) => {
1023 let __deserializer = _serde::private::de::ContentDeserializer::<__A::Error>::new(__content);
1024 // Parse the tag.
1025 let __ret = try!(match try!(_serde::de::MapAccess::next_value(&mut __map)) {
1026 // Deserialize the buffered content now that we know the variant.
1027 #(#variant_arms)*
1028 });
1029 // Visit remaining keys, looking for duplicates.
1030 #visit_remaining_keys
1031 }
1032 // Second key is a duplicate of the content.
1033 _serde::export::Some(_serde::private::de::TagOrContentField::Content) => {
1034 _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#content))
1035 }
1036 // There is no second key.
1037 _serde::export::None => {
1038 _serde::export::Err(<__A::Error as _serde::de::Error>::missing_field(#tag))
1039 }
1040 }
1041 }
1042 // There is no first key.
1043 _serde::export::None => {
1044 _serde::export::Err(<__A::Error as _serde::de::Error>::missing_field(#tag))
1045 }
1046 }
1047 }
1048
1049 fn visit_seq<__A>(self, mut __seq: __A) -> _serde::export::Result<Self::Value, __A::Error>
ea8adc8c 1050 where __A: _serde::de::SeqAccess<#delife>
3b2f2976
XL
1051 {
1052 // Visit the first element - the tag.
1053 match try!(_serde::de::SeqAccess::next_element(&mut __seq)) {
1054 _serde::export::Some(__field) => {
1055 // Visit the second element - the content.
1056 match try!(_serde::de::SeqAccess::next_element_seed(&mut __seq,
1057 __Seed {
1058 field: __field,
1059 marker: _serde::export::PhantomData,
1060 lifetime: _serde::export::PhantomData,
1061 })) {
1062 _serde::export::Some(__ret) => _serde::export::Ok(__ret),
1063 // There is no second element.
1064 _serde::export::None => {
1065 _serde::export::Err(_serde::de::Error::invalid_length(1, &self))
1066 }
1067 }
1068 }
1069 // There is no first element.
1070 _serde::export::None => {
1071 _serde::export::Err(_serde::de::Error::invalid_length(0, &self))
1072 }
1073 }
1074 }
1075 }
1076
1077 const FIELDS: &'static [&'static str] = &[#tag, #content];
1078 _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS,
1079 __Visitor {
1080 marker: _serde::export::PhantomData::<#this #ty_generics>,
1081 lifetime: _serde::export::PhantomData,
1082 })
1083 }
1084}
1085
1086fn deserialize_untagged_enum(
1087 params: &Parameters,
1088 variants: &[Variant],
1089 cattrs: &attr::Container,
1090) -> Fragment {
1091 let attempts = variants
1092 .iter()
1093 .filter(|variant| !variant.attrs.skip_deserializing())
1094 .map(
1095 |variant| {
1096 Expr(deserialize_untagged_variant(
1097 params,
1098 variant,
1099 cattrs,
1100 quote!(_serde::private::de::ContentRefDeserializer::<__D::Error>::new(&__content)),
1101 ))
1102 },
1103 );
1104
1105 // TODO this message could be better by saving the errors from the failed
1106 // attempts. The heuristic used by TOML was to count the number of fields
1107 // processed before an error, and use the error that happened after the
1108 // largest number of fields. I'm not sure I like that. Maybe it would be
1109 // better to save all the errors and combine them into one message that
1110 // explains why none of the variants matched.
1111 let fallthrough_msg =
1112 format!("data did not match any variant of untagged enum {}", params.type_name());
1113
1114 quote_block! {
1115 let __content = try!(<_serde::private::de::Content as _serde::Deserialize>::deserialize(__deserializer));
1116
1117 #(
1118 if let _serde::export::Ok(__ok) = #attempts {
1119 return _serde::export::Ok(__ok);
1120 }
1121 )*
1122
1123 _serde::export::Err(_serde::de::Error::custom(#fallthrough_msg))
1124 }
1125}
1126
1127fn deserialize_externally_tagged_variant(
1128 params: &Parameters,
1129 variant: &Variant,
1130 cattrs: &attr::Container,
1131) -> Fragment {
ea8adc8c
XL
1132 if let Some(path) = variant.attrs.deserialize_with() {
1133 let (wrapper, wrapper_ty, unwrap_fn) =
1134 wrap_deserialize_variant_with(params, &variant, path);
1135 return quote_block! {
1136 #wrapper
1137 _serde::export::Result::map(
1138 _serde::de::VariantAccess::newtype_variant::<#wrapper_ty>(__variant), #unwrap_fn)
1139 };
1140 }
1141
3b2f2976
XL
1142 let variant_ident = &variant.ident;
1143
1144 match variant.style {
1145 Style::Unit => {
1146 let this = &params.this;
1147 quote_block! {
1148 try!(_serde::de::VariantAccess::unit_variant(__variant));
1149 _serde::export::Ok(#this::#variant_ident)
1150 }
1151 }
1152 Style::Newtype => {
1153 deserialize_externally_tagged_newtype_variant(variant_ident, params, &variant.fields[0])
1154 }
1155 Style::Tuple => {
1156 deserialize_tuple(Some(variant_ident), params, &variant.fields, cattrs, None)
1157 }
1158 Style::Struct => {
ea8adc8c 1159 deserialize_struct(Some(variant_ident), params, &variant.fields, cattrs, None, Untagged::No)
3b2f2976
XL
1160 }
1161 }
1162}
1163
1164fn deserialize_internally_tagged_variant(
1165 params: &Parameters,
1166 variant: &Variant,
1167 cattrs: &attr::Container,
1168 deserializer: Tokens,
1169) -> Fragment {
ea8adc8c
XL
1170 if variant.attrs.deserialize_with().is_some() {
1171 return deserialize_untagged_variant(params, variant, cattrs, deserializer);
1172 }
1173
3b2f2976
XL
1174 let variant_ident = &variant.ident;
1175
1176 match variant.style {
1177 Style::Unit => {
1178 let this = &params.this;
1179 let type_name = params.type_name();
1180 let variant_name = variant.ident.as_ref();
1181 quote_block! {
1182 try!(_serde::Deserializer::deserialize_any(#deserializer, _serde::private::de::InternallyTaggedUnitVisitor::new(#type_name, #variant_name)));
1183 _serde::export::Ok(#this::#variant_ident)
1184 }
1185 }
ea8adc8c
XL
1186 Style::Newtype => {
1187 deserialize_untagged_newtype_variant(
1188 variant_ident,
1189 params,
1190 &variant.fields[0],
1191 deserializer,
1192 )
1193 }
1194 Style::Struct => {
1195 deserialize_struct(
1196 Some(variant_ident),
1197 params,
1198 &variant.fields,
1199 cattrs,
1200 Some(deserializer),
1201 Untagged::No,
1202 )
3b2f2976
XL
1203 }
1204 Style::Tuple => unreachable!("checked in serde_derive_internals"),
1205 }
1206}
1207
1208fn deserialize_untagged_variant(
1209 params: &Parameters,
1210 variant: &Variant,
1211 cattrs: &attr::Container,
1212 deserializer: Tokens,
1213) -> Fragment {
ea8adc8c
XL
1214 if let Some(path) = variant.attrs.deserialize_with() {
1215 let (wrapper, wrapper_ty, unwrap_fn) =
1216 wrap_deserialize_variant_with(params, &variant, path);
1217 return quote_block! {
1218 #wrapper
1219 _serde::export::Result::map(
1220 <#wrapper_ty as _serde::Deserialize>::deserialize(#deserializer), #unwrap_fn)
1221 };
1222 }
1223
3b2f2976
XL
1224 let variant_ident = &variant.ident;
1225
1226 match variant.style {
1227 Style::Unit => {
1228 let this = &params.this;
1229 let type_name = params.type_name();
1230 let variant_name = variant.ident.as_ref();
1231 quote_expr! {
1232 _serde::export::Result::map(
1233 _serde::Deserializer::deserialize_any(
1234 #deserializer,
1235 _serde::private::de::UntaggedUnitVisitor::new(#type_name, #variant_name)
1236 ),
1237 |()| #this::#variant_ident)
1238 }
1239 }
1240 Style::Newtype => {
1241 deserialize_untagged_newtype_variant(
1242 variant_ident,
1243 params,
1244 &variant.fields[0],
1245 deserializer,
1246 )
1247 }
1248 Style::Tuple => {
1249 deserialize_tuple(
1250 Some(variant_ident),
1251 params,
1252 &variant.fields,
1253 cattrs,
1254 Some(deserializer),
1255 )
1256 }
1257 Style::Struct => {
1258 deserialize_struct(
1259 Some(variant_ident),
1260 params,
1261 &variant.fields,
1262 cattrs,
1263 Some(deserializer),
ea8adc8c 1264 Untagged::Yes,
3b2f2976
XL
1265 )
1266 }
1267 }
1268}
1269
1270fn deserialize_externally_tagged_newtype_variant(
1271 variant_ident: &syn::Ident,
1272 params: &Parameters,
1273 field: &Field,
1274) -> Fragment {
1275 let this = &params.this;
1276 match field.attrs.deserialize_with() {
1277 None => {
1278 let field_ty = &field.ty;
1279 quote_expr! {
1280 _serde::export::Result::map(
1281 _serde::de::VariantAccess::newtype_variant::<#field_ty>(__variant),
1282 #this::#variant_ident)
1283 }
1284 }
1285 Some(path) => {
ea8adc8c 1286 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
3b2f2976
XL
1287 quote_block! {
1288 #wrapper
1289 _serde::export::Result::map(
1290 _serde::de::VariantAccess::newtype_variant::<#wrapper_ty>(__variant),
1291 |__wrapper| #this::#variant_ident(__wrapper.value))
1292 }
1293 }
1294 }
1295}
1296
1297fn deserialize_untagged_newtype_variant(
1298 variant_ident: &syn::Ident,
1299 params: &Parameters,
1300 field: &Field,
1301 deserializer: Tokens,
1302) -> Fragment {
1303 let this = &params.this;
1304 match field.attrs.deserialize_with() {
1305 None => {
1306 let field_ty = &field.ty;
1307 quote_expr! {
1308 _serde::export::Result::map(
1309 <#field_ty as _serde::Deserialize>::deserialize(#deserializer),
1310 #this::#variant_ident)
1311 }
1312 }
1313 Some(path) => {
ea8adc8c 1314 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
3b2f2976
XL
1315 quote_block! {
1316 #wrapper
1317 _serde::export::Result::map(
1318 <#wrapper_ty as _serde::Deserialize>::deserialize(#deserializer),
1319 |__wrapper| #this::#variant_ident(__wrapper.value))
1320 }
1321 }
1322 }
1323}
1324
1325fn deserialize_generated_identifier(
1326 fields: Vec<(String, Ident)>,
1327 cattrs: &attr::Container,
1328 is_variant: bool,
1329) -> Fragment {
1330 let this = quote!(__Field);
1331 let field_idents: &Vec<_> = &fields.iter().map(|&(_, ref ident)| ident).collect();
1332
1333 let (ignore_variant, fallthrough) = if is_variant || cattrs.deny_unknown_fields() {
1334 (None, None)
1335 } else {
1336 let ignore_variant = quote!(__ignore,);
1337 let fallthrough = quote!(_serde::export::Ok(__Field::__ignore));
1338 (Some(ignore_variant), Some(fallthrough))
1339 };
1340
1341 let visitor_impl = Stmts(deserialize_identifier(this, &fields, is_variant, fallthrough),);
1342
1343 quote_block! {
1344 #[allow(non_camel_case_types)]
1345 enum __Field {
1346 #(#field_idents,)*
1347 #ignore_variant
1348 }
1349
1350 struct __FieldVisitor;
1351
1352 impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
1353 type Value = __Field;
1354
1355 #visitor_impl
1356 }
1357
1358 impl<'de> _serde::Deserialize<'de> for __Field {
1359 #[inline]
1360 fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
1361 where __D: _serde::Deserializer<'de>
1362 {
1363 _serde::Deserializer::deserialize_identifier(__deserializer, __FieldVisitor)
1364 }
1365 }
1366 }
1367}
1368
1369fn deserialize_custom_identifier(
1370 params: &Parameters,
1371 variants: &[Variant],
1372 cattrs: &attr::Container,
1373) -> Fragment {
1374 let is_variant = match cattrs.identifier() {
1375 attr::Identifier::Variant => true,
1376 attr::Identifier::Field => false,
1377 attr::Identifier::No => unreachable!(),
1378 };
1379
1380 let this = &params.this;
1381 let this = quote!(#this);
1382
1383 let (ordinary, fallthrough) = if let Some(last) = variants.last() {
1384 let last_ident = &last.ident;
1385 if last.attrs.other() {
1386 let ordinary = &variants[..variants.len() - 1];
1387 let fallthrough = quote!(_serde::export::Ok(#this::#last_ident));
1388 (ordinary, Some(fallthrough))
1389 } else if let Style::Newtype = last.style {
1390 let ordinary = &variants[..variants.len() - 1];
1391 let deserializer = quote!(_serde::private::de::IdentifierDeserializer::from(__value));
1392 let fallthrough = quote! {
1393 _serde::export::Result::map(
1394 _serde::Deserialize::deserialize(#deserializer),
1395 #this::#last_ident)
1396 };
1397 (ordinary, Some(fallthrough))
1398 } else {
1399 (variants, None)
1400 }
1401 } else {
1402 (variants, None)
1403 };
1404
1405 let names_idents: Vec<_> = ordinary
1406 .iter()
1407 .map(|variant| (variant.attrs.name().deserialize_name(), variant.ident.clone()),)
1408 .collect();
1409
1410 let names = names_idents.iter().map(|&(ref name, _)| name);
1411
1412 let names_const = if fallthrough.is_some() {
1413 None
1414 } else if is_variant {
1415 let variants = quote! {
1416 const VARIANTS: &'static [&'static str] = &[ #(#names),* ];
1417 };
1418 Some(variants)
1419 } else {
1420 let fields = quote! {
1421 const FIELDS: &'static [&'static str] = &[ #(#names),* ];
1422 };
1423 Some(fields)
1424 };
1425
1426 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
ea8adc8c 1427 let delife = params.borrowed.de_lifetime();
3b2f2976
XL
1428 let visitor_impl =
1429 Stmts(deserialize_identifier(this.clone(), &names_idents, is_variant, fallthrough),);
1430
1431 quote_block! {
1432 #names_const
1433
1434 struct __FieldVisitor #de_impl_generics #where_clause {
1435 marker: _serde::export::PhantomData<#this #ty_generics>,
ea8adc8c 1436 lifetime: _serde::export::PhantomData<&#delife ()>,
3b2f2976
XL
1437 }
1438
ea8adc8c 1439 impl #de_impl_generics _serde::de::Visitor<#delife> for __FieldVisitor #de_ty_generics #where_clause {
3b2f2976
XL
1440 type Value = #this #ty_generics;
1441
1442 #visitor_impl
1443 }
1444
1445 let __visitor = __FieldVisitor {
1446 marker: _serde::export::PhantomData::<#this #ty_generics>,
1447 lifetime: _serde::export::PhantomData,
1448 };
1449 _serde::Deserializer::deserialize_identifier(__deserializer, __visitor)
1450 }
1451}
1452
1453fn deserialize_identifier(
1454 this: Tokens,
1455 fields: &[(String, Ident)],
1456 is_variant: bool,
1457 fallthrough: Option<Tokens>,
1458) -> Fragment {
1459 let field_strs = fields.iter().map(|&(ref name, _)| name);
1460 let field_bytes = fields.iter().map(|&(ref name, _)| quote::ByteStr(name));
1461
1462 let constructors: &Vec<_> = &fields
1463 .iter()
1464 .map(|&(_, ref ident)| quote!(#this::#ident))
1465 .collect();
1466
1467 let expecting = if is_variant {
1468 "variant identifier"
1469 } else {
1470 "field identifier"
1471 };
1472
ea8adc8c
XL
1473 let index_expecting = if is_variant {
1474 "variant"
3b2f2976 1475 } else {
ea8adc8c
XL
1476 "field"
1477 };
1478
1479 let variant_indices = 0u64..;
1480 let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, fields.len());
1481 let visit_index = quote! {
1482 fn visit_u64<__E>(self, __value: u64) -> _serde::export::Result<Self::Value, __E>
1483 where __E: _serde::de::Error
1484 {
1485 match __value {
1486 #(
1487 #variant_indices => _serde::export::Ok(#constructors),
1488 )*
1489 _ => _serde::export::Err(_serde::de::Error::invalid_value(
1490 _serde::de::Unexpected::Unsigned(__value),
1491 &#fallthrough_msg))
1492 }
1493 }
3b2f2976
XL
1494 };
1495
1496 let bytes_to_str = if fallthrough.is_some() {
1497 None
1498 } else {
1499 let conversion = quote! {
1500 let __value = &_serde::export::from_utf8_lossy(__value);
1501 };
1502 Some(conversion)
1503 };
1504
1505 let fallthrough_arm = if let Some(fallthrough) = fallthrough {
1506 fallthrough
1507 } else if is_variant {
1508 quote! {
1509 _serde::export::Err(_serde::de::Error::unknown_variant(__value, VARIANTS))
1510 }
1511 } else {
1512 quote! {
1513 _serde::export::Err(_serde::de::Error::unknown_field(__value, FIELDS))
1514 }
1515 };
1516
1517 quote_block! {
1518 fn expecting(&self, formatter: &mut _serde::export::Formatter) -> _serde::export::fmt::Result {
1519 _serde::export::Formatter::write_str(formatter, #expecting)
1520 }
1521
1522 #visit_index
1523
1524 fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E>
1525 where __E: _serde::de::Error
1526 {
1527 match __value {
1528 #(
1529 #field_strs => _serde::export::Ok(#constructors),
1530 )*
1531 _ => #fallthrough_arm
1532 }
1533 }
1534
1535 fn visit_bytes<__E>(self, __value: &[u8]) -> _serde::export::Result<Self::Value, __E>
1536 where __E: _serde::de::Error
1537 {
1538 match __value {
1539 #(
1540 #field_bytes => _serde::export::Ok(#constructors),
1541 )*
1542 _ => {
1543 #bytes_to_str
1544 #fallthrough_arm
1545 }
1546 }
1547 }
1548 }
1549}
1550
1551fn deserialize_struct_visitor(
1552 struct_path: Tokens,
1553 params: &Parameters,
1554 fields: &[Field],
1555 cattrs: &attr::Container,
1556) -> (Fragment, Fragment, Fragment) {
1557 let field_names_idents: Vec<_> = fields
1558 .iter()
1559 .enumerate()
1560 .filter(|&(_, field)| !field.attrs.skip_deserializing())
1561 .map(|(i, field)| (field.attrs.name().deserialize_name(), field_i(i)),)
1562 .collect();
1563
1564 let fields_stmt = {
1565 let field_names = field_names_idents.iter().map(|&(ref name, _)| name);
1566 quote_block! {
1567 const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
1568 }
1569 };
1570
1571 let field_visitor = deserialize_generated_identifier(field_names_idents, cattrs, false);
1572
1573 let visit_map = deserialize_map(struct_path, params, fields, cattrs);
1574
1575 (field_visitor, fields_stmt, visit_map)
1576}
1577
1578fn deserialize_map(
1579 struct_path: Tokens,
1580 params: &Parameters,
1581 fields: &[Field],
1582 cattrs: &attr::Container,
1583) -> Fragment {
1584 // Create the field names for the fields.
1585 let fields_names: Vec<_> = fields
1586 .iter()
1587 .enumerate()
1588 .map(|(i, field)| (field, field_i(i)))
1589 .collect();
1590
1591 // Declare each field that will be deserialized.
1592 let let_values = fields_names
1593 .iter()
1594 .filter(|&&(field, _)| !field.attrs.skip_deserializing())
1595 .map(
1596 |&(field, ref name)| {
1597 let field_ty = &field.ty;
1598 quote! {
1599 let mut #name: _serde::export::Option<#field_ty> = _serde::export::None;
1600 }
1601 },
1602 );
1603
1604 // Match arms to extract a value for a field.
1605 let value_arms = fields_names.iter()
1606 .filter(|&&(field, _)| !field.attrs.skip_deserializing())
1607 .map(|&(field, ref name)| {
1608 let deser_name = field.attrs.name().deserialize_name();
1609
1610 let visit = match field.attrs.deserialize_with() {
1611 None => {
1612 let field_ty = &field.ty;
1613 quote! {
1614 try!(_serde::de::MapAccess::next_value::<#field_ty>(&mut __map))
1615 }
1616 }
1617 Some(path) => {
ea8adc8c 1618 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(
3b2f2976
XL
1619 params, field.ty, path);
1620 quote!({
1621 #wrapper
1622 try!(_serde::de::MapAccess::next_value::<#wrapper_ty>(&mut __map)).value
1623 })
1624 }
1625 };
1626 quote! {
1627 __Field::#name => {
1628 if _serde::export::Option::is_some(&#name) {
1629 return _serde::export::Err(<__A::Error as _serde::de::Error>::duplicate_field(#deser_name));
1630 }
1631 #name = _serde::export::Some(#visit);
1632 }
1633 }
1634 });
1635
1636 // Visit ignored values to consume them
1637 let ignored_arm = if cattrs.deny_unknown_fields() {
1638 None
1639 } else {
1640 Some(quote! {
1641 _ => { let _ = try!(_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)); }
1642 })
1643 };
1644
1645 let all_skipped = fields
1646 .iter()
1647 .all(|field| field.attrs.skip_deserializing());
1648 let match_keys = if cattrs.deny_unknown_fields() && all_skipped {
1649 quote! {
1650 // FIXME: Once we drop support for Rust 1.15:
1651 // let _serde::export::None::<__Field> = try!(_serde::de::MapAccess::next_key(&mut __map));
1652 _serde::export::Option::map(
1653 try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)),
1654 |__impossible| match __impossible {});
1655 }
1656 } else {
1657 quote! {
1658 while let _serde::export::Some(__key) = try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map)) {
1659 match __key {
1660 #(#value_arms)*
1661 #ignored_arm
1662 }
1663 }
1664 }
1665 };
1666
1667 let extract_values = fields_names
1668 .iter()
1669 .filter(|&&(field, _)| !field.attrs.skip_deserializing())
1670 .map(
1671 |&(field, ref name)| {
1672 let missing_expr = Match(expr_is_missing(&field, cattrs));
1673
1674 quote! {
1675 let #name = match #name {
1676 _serde::export::Some(#name) => #name,
1677 _serde::export::None => #missing_expr
1678 };
1679 }
1680 },
1681 );
1682
1683 let result = fields_names
1684 .iter()
1685 .map(
1686 |&(field, ref name)| {
1687 let ident = field
1688 .ident
1689 .clone()
1690 .expect("struct contains unnamed fields");
1691 if field.attrs.skip_deserializing() {
1692 let value = Expr(expr_is_missing(&field, cattrs));
1693 quote!(#ident: #value)
1694 } else {
1695 quote!(#ident: #name)
1696 }
1697 },
1698 );
1699
1700 let let_default = match *cattrs.default() {
1701 attr::Default::Default => {
1702 Some(
1703 quote!(
1704 let __default: Self::Value = _serde::export::Default::default();
1705 ),
1706 )
1707 }
1708 attr::Default::Path(ref path) => {
1709 Some(
1710 quote!(
1711 let __default: Self::Value = #path();
1712 ),
1713 )
1714 }
1715 attr::Default::None => {
1716 // We don't need the default value, to prevent an unused variable warning
1717 // we'll leave the line empty.
1718 None
1719 }
1720 };
1721
1722 let mut result = quote!(#struct_path { #(#result),* });
1723 if params.has_getter {
1724 let this = &params.this;
1725 result = quote! {
1726 _serde::export::Into::<#this>::into(#result)
1727 };
1728 }
1729
1730 quote_block! {
1731 #(#let_values)*
1732
1733 #match_keys
1734
1735 #let_default
1736
1737 #(#extract_values)*
1738
1739 _serde::export::Ok(#result)
1740 }
1741}
1742
1743fn field_i(i: usize) -> Ident {
1744 Ident::new(format!("__field{}", i))
1745}
1746
1747/// This function wraps the expression in `#[serde(deserialize_with = "...")]`
1748/// in a trait to prevent it from accessing the internal `Deserialize` state.
1749fn wrap_deserialize_with(
1750 params: &Parameters,
ea8adc8c 1751 value_ty: Tokens,
3b2f2976
XL
1752 deserialize_with: &syn::Path,
1753) -> (Tokens, Tokens) {
1754 let this = &params.this;
1755 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = split_with_de_lifetime(params,);
ea8adc8c 1756 let delife = params.borrowed.de_lifetime();
3b2f2976
XL
1757
1758 let wrapper = quote! {
1759 struct __DeserializeWith #de_impl_generics #where_clause {
ea8adc8c 1760 value: #value_ty,
3b2f2976 1761 phantom: _serde::export::PhantomData<#this #ty_generics>,
ea8adc8c 1762 lifetime: _serde::export::PhantomData<&#delife ()>,
3b2f2976
XL
1763 }
1764
ea8adc8c 1765 impl #de_impl_generics _serde::Deserialize<#delife> for __DeserializeWith #de_ty_generics #where_clause {
3b2f2976 1766 fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
ea8adc8c 1767 where __D: _serde::Deserializer<#delife>
3b2f2976
XL
1768 {
1769 _serde::export::Ok(__DeserializeWith {
1770 value: try!(#deserialize_with(__deserializer)),
1771 phantom: _serde::export::PhantomData,
1772 lifetime: _serde::export::PhantomData,
1773 })
1774 }
1775 }
1776 };
1777
1778 let wrapper_ty = quote!(__DeserializeWith #de_ty_generics);
1779
1780 (wrapper, wrapper_ty)
1781}
1782
ea8adc8c
XL
1783fn wrap_deserialize_field_with(
1784 params: &Parameters,
1785 field_ty: &syn::Ty,
1786 deserialize_with: &syn::Path,
1787) -> (Tokens, Tokens) {
1788 wrap_deserialize_with(params, quote!(#field_ty), deserialize_with)
1789}
1790
1791fn wrap_deserialize_variant_with(
1792 params: &Parameters,
1793 variant: &Variant,
1794 deserialize_with: &syn::Path,
1795) -> (Tokens, Tokens, Tokens) {
1796 let this = &params.this;
1797 let variant_ident = &variant.ident;
1798
1799 let field_tys = variant.fields.iter().map(|field| field.ty);
1800 let (wrapper, wrapper_ty) =
1801 wrap_deserialize_with(params, quote!((#(#field_tys),*)), deserialize_with);
1802
1803 let field_access = (0..variant.fields.len()).map(|n| Ident::new(format!("{}", n)));
1804 let unwrap_fn = match variant.style {
1805 Style::Struct => {
1806 let field_idents = variant.fields.iter().map(|field| field.ident.as_ref().unwrap());
1807 quote! {
1808 {
1809 |__wrap| {
1810 #this::#variant_ident { #(#field_idents: __wrap.value.#field_access),* }
1811 }
1812 }
1813 }
1814 }
1815 Style::Tuple => {
1816 quote! {
1817 {
1818 |__wrap| {
1819 #this::#variant_ident(#(__wrap.value.#field_access),*)
1820 }
1821 }
1822 }
1823 }
1824 Style::Newtype => {
1825 quote! {
1826 {
1827 |__wrap| {
1828 #this::#variant_ident(__wrap.value)
1829 }
1830 }
1831 }
1832 }
1833 Style::Unit => {
1834 quote! {
1835 {
1836 |__wrap| { #this::#variant_ident }
1837 }
1838 }
1839 }
1840 };
1841
1842 (wrapper, wrapper_ty, unwrap_fn)
1843}
1844
3b2f2976
XL
1845fn expr_is_missing(field: &Field, cattrs: &attr::Container) -> Fragment {
1846 match *field.attrs.default() {
1847 attr::Default::Default => {
1848 return quote_expr!(_serde::export::Default::default());
1849 }
1850 attr::Default::Path(ref path) => {
1851 return quote_expr!(#path());
1852 }
1853 attr::Default::None => { /* below */ }
1854 }
1855
1856 match *cattrs.default() {
1857 attr::Default::Default |
1858 attr::Default::Path(_) => {
1859 let ident = &field.ident;
1860 return quote_expr!(__default.#ident);
1861 }
1862 attr::Default::None => { /* below */ }
1863 }
1864
1865 let name = field.attrs.name().deserialize_name();
1866 match field.attrs.deserialize_with() {
1867 None => {
1868 quote_expr! {
1869 try!(_serde::private::de::missing_field(#name))
1870 }
1871 }
1872 Some(_) => {
1873 quote_expr! {
1874 return _serde::export::Err(<__A::Error as _serde::de::Error>::missing_field(#name))
1875 }
1876 }
1877 }
1878}
1879
1880struct DeImplGenerics<'a>(&'a Parameters);
1881
1882impl<'a> ToTokens for DeImplGenerics<'a> {
1883 fn to_tokens(&self, tokens: &mut Tokens) {
1884 let mut generics = self.0.generics.clone();
ea8adc8c
XL
1885 if let Some(de_lifetime) = self.0.borrowed.de_lifetime_def() {
1886 generics.lifetimes.insert(0, de_lifetime);
1887 }
3b2f2976
XL
1888 let (impl_generics, _, _) = generics.split_for_impl();
1889 impl_generics.to_tokens(tokens);
1890 }
1891}
1892
ea8adc8c 1893struct DeTyGenerics<'a>(&'a Parameters);
3b2f2976
XL
1894
1895impl<'a> ToTokens for DeTyGenerics<'a> {
1896 fn to_tokens(&self, tokens: &mut Tokens) {
ea8adc8c
XL
1897 let mut generics = self.0.generics.clone();
1898 if self.0.borrowed.de_lifetime_def().is_some() {
1899 generics
1900 .lifetimes
1901 .insert(0, syn::LifetimeDef::new("'de"));
1902 }
3b2f2976
XL
1903 let (_, ty_generics, _) = generics.split_for_impl();
1904 ty_generics.to_tokens(tokens);
1905 }
1906}
1907
1908fn split_with_de_lifetime(params: &Parameters,)
1909 -> (DeImplGenerics, DeTyGenerics, syn::TyGenerics, &syn::WhereClause) {
1910 let de_impl_generics = DeImplGenerics(&params);
ea8adc8c 1911 let de_ty_generics = DeTyGenerics(&params);
3b2f2976
XL
1912 let (_, ty_generics, where_clause) = params.generics.split_for_impl();
1913 (de_impl_generics, de_ty_generics, ty_generics, where_clause)
1914}