1use crate::deprecated::allow_deprecated;
2use crate::fragment::{Expr, Fragment, Match, Stmts};
3use crate::internals::ast::{Container, Data, Field, Style, Variant};
4use crate::internals::name::Name;
5use crate::internals::{attr, replace_receiver, ungroup, Ctxt, Derive};
6use crate::{bound, dummy, pretend, private, this};
7use proc_macro2::{Literal, Span, TokenStream};
8use quote::{quote, quote_spanned, ToTokens};
9use std::collections::BTreeSet;
10use std::ptr;
11use syn::punctuated::Punctuated;
12use syn::spanned::Spanned;
13use syn::{parse_quote, Ident, Index, Member};
14
15pub fn expand_derive_deserialize(input: &mut syn::DeriveInput) -> syn::Result<TokenStream> {
16 replace_receiver(input);
17
18 let ctxt = Ctxt::new();
19 let cont = match Container::from_ast(&ctxt, input, Derive::Deserialize, &private.ident()) {
20 Some(cont) => cont,
21 None => return Err(ctxt.check().unwrap_err()),
22 };
23 precondition(&ctxt, &cont);
24 ctxt.check()?;
25
26 let ident = &cont.ident;
27 let params = Parameters::new(&cont);
28 let (de_impl_generics, _, ty_generics, where_clause) = split_with_de_lifetime(¶ms);
29 let body = Stmts(deserialize_body(&cont, ¶ms));
30 let delife = params.borrowed.de_lifetime();
31 let allow_deprecated = allow_deprecated(input);
32
33 let impl_block = if let Some(remote) = cont.attrs.remote() {
34 let vis = &input.vis;
35 let used = pretend::pretend_used(&cont, params.is_packed);
36 quote! {
37 #[automatically_derived]
38 #allow_deprecated
39 impl #de_impl_generics #ident #ty_generics #where_clause {
40 #vis fn deserialize<__D>(__deserializer: __D) -> _serde::#private::Result<#remote #ty_generics, __D::Error>
41 where
42 __D: _serde::Deserializer<#delife>,
43 {
44 #used
45 #body
46 }
47 }
48 }
49 } else {
50 let fn_deserialize_in_place = deserialize_in_place_body(&cont, ¶ms);
51
52 quote! {
53 #[automatically_derived]
54 #allow_deprecated
55 impl #de_impl_generics _serde::Deserialize<#delife> for #ident #ty_generics #where_clause {
56 fn deserialize<__D>(__deserializer: __D) -> _serde::#private::Result<Self, __D::Error>
57 where
58 __D: _serde::Deserializer<#delife>,
59 {
60 #body
61 }
62
63 #fn_deserialize_in_place
64 }
65 }
66 };
67
68 Ok(dummy::wrap_in_const(
69 cont.attrs.custom_serde_path(),
70 impl_block,
71 ))
72}
73
74fn precondition(cx: &Ctxt, cont: &Container) {
75 precondition_sized(cx, cont);
76 precondition_no_de_lifetime(cx, cont);
77}
78
79fn precondition_sized(cx: &Ctxt, cont: &Container) {
80 if let Data::Struct(_, fields) = &cont.data {
81 if let Some(last) = fields.last() {
82 if let syn::Type::Slice(_) = ungroup(last.ty) {
83 cx.error_spanned_by(
84 cont.original,
85 "cannot deserialize a dynamically sized struct",
86 );
87 }
88 }
89 }
90}
91
92fn precondition_no_de_lifetime(cx: &Ctxt, cont: &Container) {
93 if let BorrowedLifetimes::Borrowed(_) = borrowed_lifetimes(cont) {
94 for param in cont.generics.lifetimes() {
95 if param.lifetime.to_string() == "'de" {
96 cx.error_spanned_by(
97 ¶m.lifetime,
98 "cannot deserialize when there is a lifetime parameter called 'de",
99 );
100 return;
101 }
102 }
103 }
104}
105
106struct Parameters {
107 local: syn::Ident,
109
110 this_type: syn::Path,
114
115 this_value: syn::Path,
118
119 generics: syn::Generics,
121
122 borrowed: BorrowedLifetimes,
125
126 has_getter: bool,
129
130 is_packed: bool,
132}
133
134impl Parameters {
135 fn new(cont: &Container) -> Self {
136 let local = cont.ident.clone();
137 let this_type = this::this_type(cont);
138 let this_value = this::this_value(cont);
139 let borrowed = borrowed_lifetimes(cont);
140 let generics = build_generics(cont, &borrowed);
141 let has_getter = cont.data.has_getter();
142 let is_packed = cont.attrs.is_packed();
143
144 Parameters {
145 local,
146 this_type,
147 this_value,
148 generics,
149 borrowed,
150 has_getter,
151 is_packed,
152 }
153 }
154
155 fn type_name(&self) -> String {
158 self.this_type.segments.last().unwrap().ident.to_string()
159 }
160}
161
162fn build_generics(cont: &Container, borrowed: &BorrowedLifetimes) -> syn::Generics {
166 let generics = bound::without_defaults(cont.generics);
167
168 let generics = bound::with_where_predicates_from_fields(cont, &generics, attr::Field::de_bound);
169
170 let generics =
171 bound::with_where_predicates_from_variants(cont, &generics, attr::Variant::de_bound);
172
173 match cont.attrs.de_bound() {
174 Some(predicates) => bound::with_where_predicates(&generics, predicates),
175 None => {
176 let generics = match *cont.attrs.default() {
177 attr::Default::Default => bound::with_self_bound(
178 cont,
179 &generics,
180 &parse_quote!(_serde::#private::Default),
181 ),
182 attr::Default::None | attr::Default::Path(_) => generics,
183 };
184
185 let delife = borrowed.de_lifetime();
186 let generics = bound::with_bound(
187 cont,
188 &generics,
189 needs_deserialize_bound,
190 &parse_quote!(_serde::Deserialize<#delife>),
191 );
192
193 bound::with_bound(
194 cont,
195 &generics,
196 requires_default,
197 &parse_quote!(_serde::#private::Default),
198 )
199 }
200 }
201}
202
203fn needs_deserialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {
210 !field.skip_deserializing()
211 && field.deserialize_with().is_none()
212 && field.de_bound().is_none()
213 && variant.map_or(true, |variant| {
214 !variant.skip_deserializing()
215 && variant.deserialize_with().is_none()
216 && variant.de_bound().is_none()
217 })
218}
219
220fn requires_default(field: &attr::Field, _variant: Option<&attr::Variant>) -> bool {
223 if let attr::Default::Default = *field.default() {
224 true
225 } else {
226 false
227 }
228}
229
230enum BorrowedLifetimes {
231 Borrowed(BTreeSet<syn::Lifetime>),
232 Static,
233}
234
235impl BorrowedLifetimes {
236 fn de_lifetime(&self) -> syn::Lifetime {
237 match *self {
238 BorrowedLifetimes::Borrowed(_) => syn::Lifetime::new("'de", Span::call_site()),
239 BorrowedLifetimes::Static => syn::Lifetime::new("'static", Span::call_site()),
240 }
241 }
242
243 fn de_lifetime_param(&self) -> Option<syn::LifetimeParam> {
244 match self {
245 BorrowedLifetimes::Borrowed(bounds) => Some(syn::LifetimeParam {
246 attrs: Vec::new(),
247 lifetime: syn::Lifetime::new("'de", Span::call_site()),
248 colon_token: None,
249 bounds: bounds.iter().cloned().collect(),
250 }),
251 BorrowedLifetimes::Static => None,
252 }
253 }
254}
255
256fn borrowed_lifetimes(cont: &Container) -> BorrowedLifetimes {
266 let mut lifetimes = BTreeSet::new();
267 for field in cont.data.all_fields() {
268 if !field.attrs.skip_deserializing() {
269 lifetimes.extend(field.attrs.borrowed_lifetimes().iter().cloned());
270 }
271 }
272 if lifetimes.iter().any(|b| b.to_string() == "'static") {
273 BorrowedLifetimes::Static
274 } else {
275 BorrowedLifetimes::Borrowed(lifetimes)
276 }
277}
278
279fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {
280 if cont.attrs.transparent() {
281 deserialize_transparent(cont, params)
282 } else if let Some(type_from) = cont.attrs.type_from() {
283 deserialize_from(type_from)
284 } else if let Some(type_try_from) = cont.attrs.type_try_from() {
285 deserialize_try_from(type_try_from)
286 } else if let attr::Identifier::No = cont.attrs.identifier() {
287 match &cont.data {
288 Data::Enum(variants) => deserialize_enum(params, variants, &cont.attrs),
289 Data::Struct(Style::Struct, fields) => {
290 deserialize_struct(params, fields, &cont.attrs, StructForm::Struct)
291 }
292 Data::Struct(Style::Tuple, fields) | Data::Struct(Style::Newtype, fields) => {
293 deserialize_tuple(params, fields, &cont.attrs, TupleForm::Tuple)
294 }
295 Data::Struct(Style::Unit, _) => deserialize_unit_struct(params, &cont.attrs),
296 }
297 } else {
298 match &cont.data {
299 Data::Enum(variants) => deserialize_custom_identifier(params, variants, &cont.attrs),
300 Data::Struct(_, _) => unreachable!("checked in serde_derive_internals"),
301 }
302 }
303}
304
305#[cfg(feature = "deserialize_in_place")]
306fn deserialize_in_place_body(cont: &Container, params: &Parameters) -> Option<Stmts> {
307 assert!(!params.has_getter);
310
311 if cont.attrs.transparent()
312 || cont.attrs.type_from().is_some()
313 || cont.attrs.type_try_from().is_some()
314 || cont.attrs.identifier().is_some()
315 || cont
316 .data
317 .all_fields()
318 .all(|f| f.attrs.deserialize_with().is_some())
319 {
320 return None;
321 }
322
323 let code = match &cont.data {
324 Data::Struct(Style::Struct, fields) => {
325 deserialize_struct_in_place(params, fields, &cont.attrs)?
326 }
327 Data::Struct(Style::Tuple, fields) | Data::Struct(Style::Newtype, fields) => {
328 deserialize_tuple_in_place(params, fields, &cont.attrs)
329 }
330 Data::Enum(_) | Data::Struct(Style::Unit, _) => {
331 return None;
332 }
333 };
334
335 let delife = params.borrowed.de_lifetime();
336 let stmts = Stmts(code);
337
338 let fn_deserialize_in_place = quote_block! {
339 fn deserialize_in_place<__D>(__deserializer: __D, __place: &mut Self) -> _serde::#private::Result<(), __D::Error>
340 where
341 __D: _serde::Deserializer<#delife>,
342 {
343 #stmts
344 }
345 };
346
347 Some(Stmts(fn_deserialize_in_place))
348}
349
350#[cfg(not(feature = "deserialize_in_place"))]
351fn deserialize_in_place_body(_cont: &Container, _params: &Parameters) -> Option<Stmts> {
352 None
353}
354
355fn deserialize_transparent(cont: &Container, params: &Parameters) -> Fragment {
357 let fields = match &cont.data {
358 Data::Struct(_, fields) => fields,
359 Data::Enum(_) => unreachable!(),
360 };
361
362 let this_value = ¶ms.this_value;
363 let transparent_field = fields.iter().find(|f| f.attrs.transparent()).unwrap();
364
365 let path = match transparent_field.attrs.deserialize_with() {
366 Some(path) => quote!(#path),
367 None => {
368 let span = transparent_field.original.span();
369 quote_spanned!(span=> _serde::Deserialize::deserialize)
370 }
371 };
372
373 let assign = fields.iter().map(|field| {
374 let member = &field.member;
375 if ptr::eq(field, transparent_field) {
376 quote!(#member: __transparent)
377 } else {
378 let value = match field.attrs.default() {
379 attr::Default::Default => quote!(_serde::#private::Default::default()),
380 attr::Default::Path(path) => quote_spanned!(path.span()=> #path()),
385 attr::Default::None => quote!(_serde::#private::PhantomData),
386 };
387 quote!(#member: #value)
388 }
389 });
390
391 quote_block! {
392 _serde::#private::Result::map(
393 #path(__deserializer),
394 |__transparent| #this_value { #(#assign),* })
395 }
396}
397
398fn deserialize_from(type_from: &syn::Type) -> Fragment {
400 quote_block! {
401 _serde::#private::Result::map(
402 <#type_from as _serde::Deserialize>::deserialize(__deserializer),
403 _serde::#private::From::from)
404 }
405}
406
407fn deserialize_try_from(type_try_from: &syn::Type) -> Fragment {
409 quote_block! {
410 _serde::#private::Result::and_then(
411 <#type_try_from as _serde::Deserialize>::deserialize(__deserializer),
412 |v| _serde::#private::TryFrom::try_from(v).map_err(_serde::de::Error::custom))
413 }
414}
415
416fn deserialize_unit_struct(params: &Parameters, cattrs: &attr::Container) -> Fragment {
418 let this_type = ¶ms.this_type;
419 let this_value = ¶ms.this_value;
420 let type_name = cattrs.name().deserialize_name();
421 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
422 split_with_de_lifetime(params);
423 let delife = params.borrowed.de_lifetime();
424
425 let expecting = format!("unit struct {}", params.type_name());
426 let expecting = cattrs.expecting().unwrap_or(&expecting);
427
428 quote_block! {
429 #[doc(hidden)]
430 struct __Visitor #de_impl_generics #where_clause {
431 marker: _serde::#private::PhantomData<#this_type #ty_generics>,
432 lifetime: _serde::#private::PhantomData<&#delife ()>,
433 }
434
435 #[automatically_derived]
436 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
437 type Value = #this_type #ty_generics;
438
439 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
440 _serde::#private::Formatter::write_str(__formatter, #expecting)
441 }
442
443 #[inline]
444 fn visit_unit<__E>(self) -> _serde::#private::Result<Self::Value, __E>
445 where
446 __E: _serde::de::Error,
447 {
448 _serde::#private::Ok(#this_value)
449 }
450 }
451
452 _serde::Deserializer::deserialize_unit_struct(
453 __deserializer,
454 #type_name,
455 __Visitor {
456 marker: _serde::#private::PhantomData::<#this_type #ty_generics>,
457 lifetime: _serde::#private::PhantomData,
458 },
459 )
460 }
461}
462
463enum TupleForm<'a> {
464 Tuple,
465 ExternallyTagged(&'a syn::Ident),
467 Untagged(&'a syn::Ident, TokenStream),
470}
471
472fn deserialize_tuple(
474 params: &Parameters,
475 fields: &[Field],
476 cattrs: &attr::Container,
477 form: TupleForm,
478) -> Fragment {
479 assert!(
480 !has_flatten(fields),
481 "tuples and tuple variants cannot have flatten fields"
482 );
483
484 let field_count = fields
485 .iter()
486 .filter(|field| !field.attrs.skip_deserializing())
487 .count();
488
489 let this_type = ¶ms.this_type;
490 let this_value = ¶ms.this_value;
491 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
492 split_with_de_lifetime(params);
493 let delife = params.borrowed.de_lifetime();
494
495 let construct = if params.has_getter {
499 let local = ¶ms.local;
500 quote!(#local)
501 } else {
502 quote!(#this_value)
503 };
504
505 let type_path = match form {
506 TupleForm::Tuple => construct,
507 TupleForm::ExternallyTagged(variant_ident) | TupleForm::Untagged(variant_ident, _) => {
508 quote!(#construct::#variant_ident)
509 }
510 };
511 let expecting = match form {
512 TupleForm::Tuple => format!("tuple struct {}", params.type_name()),
513 TupleForm::ExternallyTagged(variant_ident) | TupleForm::Untagged(variant_ident, _) => {
514 format!("tuple variant {}::{}", params.type_name(), variant_ident)
515 }
516 };
517 let expecting = cattrs.expecting().unwrap_or(&expecting);
518
519 let nfields = fields.len();
520
521 let visit_newtype_struct = match form {
522 TupleForm::Tuple if nfields == 1 => {
523 Some(deserialize_newtype_struct(&type_path, params, &fields[0]))
524 }
525 _ => None,
526 };
527
528 let visit_seq = Stmts(deserialize_seq(
529 &type_path, params, fields, false, cattrs, expecting,
530 ));
531
532 let visitor_expr = quote! {
533 __Visitor {
534 marker: _serde::#private::PhantomData::<#this_type #ty_generics>,
535 lifetime: _serde::#private::PhantomData,
536 }
537 };
538 let dispatch = match form {
539 TupleForm::Tuple if nfields == 1 => {
540 let type_name = cattrs.name().deserialize_name();
541 quote! {
542 _serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr)
543 }
544 }
545 TupleForm::Tuple => {
546 let type_name = cattrs.name().deserialize_name();
547 quote! {
548 _serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #field_count, #visitor_expr)
549 }
550 }
551 TupleForm::ExternallyTagged(_) => quote! {
552 _serde::de::VariantAccess::tuple_variant(__variant, #field_count, #visitor_expr)
553 },
554 TupleForm::Untagged(_, deserializer) => quote! {
555 _serde::Deserializer::deserialize_tuple(#deserializer, #field_count, #visitor_expr)
556 },
557 };
558
559 let visitor_var = if field_count == 0 {
560 quote!(_)
561 } else {
562 quote!(mut __seq)
563 };
564
565 quote_block! {
566 #[doc(hidden)]
567 struct __Visitor #de_impl_generics #where_clause {
568 marker: _serde::#private::PhantomData<#this_type #ty_generics>,
569 lifetime: _serde::#private::PhantomData<&#delife ()>,
570 }
571
572 #[automatically_derived]
573 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
574 type Value = #this_type #ty_generics;
575
576 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
577 _serde::#private::Formatter::write_str(__formatter, #expecting)
578 }
579
580 #visit_newtype_struct
581
582 #[inline]
583 fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::#private::Result<Self::Value, __A::Error>
584 where
585 __A: _serde::de::SeqAccess<#delife>,
586 {
587 #visit_seq
588 }
589 }
590
591 #dispatch
592 }
593}
594
595#[cfg(feature = "deserialize_in_place")]
597fn deserialize_tuple_in_place(
598 params: &Parameters,
599 fields: &[Field],
600 cattrs: &attr::Container,
601) -> Fragment {
602 assert!(
603 !has_flatten(fields),
604 "tuples and tuple variants cannot have flatten fields"
605 );
606
607 let field_count = fields
608 .iter()
609 .filter(|field| !field.attrs.skip_deserializing())
610 .count();
611
612 let this_type = ¶ms.this_type;
613 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
614 split_with_de_lifetime(params);
615 let delife = params.borrowed.de_lifetime();
616
617 let expecting = format!("tuple struct {}", params.type_name());
618 let expecting = cattrs.expecting().unwrap_or(&expecting);
619
620 let nfields = fields.len();
621
622 let visit_newtype_struct = if nfields == 1 {
623 assert!(fields[0].attrs.deserialize_with().is_none());
626
627 Some(quote! {
628 #[inline]
629 fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::#private::Result<Self::Value, __E::Error>
630 where
631 __E: _serde::Deserializer<#delife>,
632 {
633 _serde::Deserialize::deserialize_in_place(__e, &mut self.place.0)
634 }
635 })
636 } else {
637 None
638 };
639
640 let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, expecting));
641
642 let visitor_expr = quote! {
643 __Visitor {
644 place: __place,
645 lifetime: _serde::#private::PhantomData,
646 }
647 };
648
649 let type_name = cattrs.name().deserialize_name();
650 let dispatch = if nfields == 1 {
651 quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))
652 } else {
653 quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #field_count, #visitor_expr))
654 };
655
656 let visitor_var = if field_count == 0 {
657 quote!(_)
658 } else {
659 quote!(mut __seq)
660 };
661
662 let in_place_impl_generics = de_impl_generics.in_place();
663 let in_place_ty_generics = de_ty_generics.in_place();
664 let place_life = place_lifetime();
665
666 quote_block! {
667 #[doc(hidden)]
668 struct __Visitor #in_place_impl_generics #where_clause {
669 place: &#place_life mut #this_type #ty_generics,
670 lifetime: _serde::#private::PhantomData<&#delife ()>,
671 }
672
673 #[automatically_derived]
674 impl #in_place_impl_generics _serde::de::Visitor<#delife> for __Visitor #in_place_ty_generics #where_clause {
675 type Value = ();
676
677 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
678 _serde::#private::Formatter::write_str(__formatter, #expecting)
679 }
680
681 #visit_newtype_struct
682
683 #[inline]
684 fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::#private::Result<Self::Value, __A::Error>
685 where
686 __A: _serde::de::SeqAccess<#delife>,
687 {
688 #visit_seq
689 }
690 }
691
692 #dispatch
693 }
694}
695
696fn deserialize_seq(
697 type_path: &TokenStream,
698 params: &Parameters,
699 fields: &[Field],
700 is_struct: bool,
701 cattrs: &attr::Container,
702 expecting: &str,
703) -> Fragment {
704 let vars = (0..fields.len()).map(field_i as fn(_) -> _);
705
706 let deserialized_count = fields
707 .iter()
708 .filter(|field| !field.attrs.skip_deserializing())
709 .count();
710 let expecting = if deserialized_count == 1 {
711 format!("{} with 1 element", expecting)
712 } else {
713 format!("{} with {} elements", expecting, deserialized_count)
714 };
715 let expecting = cattrs.expecting().unwrap_or(&expecting);
716
717 let mut index_in_seq = 0_usize;
718 let let_values = vars.clone().zip(fields).map(|(var, field)| {
719 if field.attrs.skip_deserializing() {
720 let default = Expr(expr_is_missing(field, cattrs));
721 quote! {
722 let #var = #default;
723 }
724 } else {
725 let visit = match field.attrs.deserialize_with() {
726 None => {
727 let field_ty = field.ty;
728 let span = field.original.span();
729 let func =
730 quote_spanned!(span=> _serde::de::SeqAccess::next_element::<#field_ty>);
731 quote!(#func(&mut __seq)?)
732 }
733 Some(path) => {
734 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
735 quote!({
736 #wrapper
737 _serde::#private::Option::map(
738 _serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)?,
739 |__wrap| __wrap.value)
740 })
741 }
742 };
743 let value_if_none = expr_is_missing_seq(None, index_in_seq, field, cattrs, expecting);
744 let assign = quote! {
745 let #var = match #visit {
746 _serde::#private::Some(__value) => __value,
747 _serde::#private::None => #value_if_none,
748 };
749 };
750 index_in_seq += 1;
751 assign
752 }
753 });
754
755 let mut result = if is_struct {
756 let names = fields.iter().map(|f| &f.member);
757 quote! {
758 #type_path { #( #names: #vars ),* }
759 }
760 } else {
761 quote! {
762 #type_path ( #(#vars),* )
763 }
764 };
765
766 if params.has_getter {
767 let this_type = ¶ms.this_type;
768 let (_, ty_generics, _) = params.generics.split_for_impl();
769 result = quote! {
770 _serde::#private::Into::<#this_type #ty_generics>::into(#result)
771 };
772 }
773
774 let let_default = match cattrs.default() {
775 attr::Default::Default => Some(quote!(
776 let __default: Self::Value = _serde::#private::Default::default();
777 )),
778 attr::Default::Path(path) => Some(quote_spanned!(path.span()=>
783 let __default: Self::Value = #path();
784 )),
785 attr::Default::None => {
786 None
789 }
790 };
791
792 quote_block! {
793 #let_default
794 #(#let_values)*
795 _serde::#private::Ok(#result)
796 }
797}
798
799#[cfg(feature = "deserialize_in_place")]
800fn deserialize_seq_in_place(
801 params: &Parameters,
802 fields: &[Field],
803 cattrs: &attr::Container,
804 expecting: &str,
805) -> Fragment {
806 let deserialized_count = fields
807 .iter()
808 .filter(|field| !field.attrs.skip_deserializing())
809 .count();
810 let expecting = if deserialized_count == 1 {
811 format!("{} with 1 element", expecting)
812 } else {
813 format!("{} with {} elements", expecting, deserialized_count)
814 };
815 let expecting = cattrs.expecting().unwrap_or(&expecting);
816
817 let mut index_in_seq = 0usize;
818 let write_values = fields.iter().map(|field| {
819 let member = &field.member;
820
821 if field.attrs.skip_deserializing() {
822 let default = Expr(expr_is_missing(field, cattrs));
823 quote! {
824 self.place.#member = #default;
825 }
826 } else {
827 let value_if_none = expr_is_missing_seq(Some(quote!(self.place.#member = )), index_in_seq, field, cattrs, expecting);
828 let write = match field.attrs.deserialize_with() {
829 None => {
830 quote! {
831 if let _serde::#private::None = _serde::de::SeqAccess::next_element_seed(&mut __seq,
832 _serde::#private::de::InPlaceSeed(&mut self.place.#member))?
833 {
834 #value_if_none;
835 }
836 }
837 }
838 Some(path) => {
839 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
840 quote!({
841 #wrapper
842 match _serde::de::SeqAccess::next_element::<#wrapper_ty>(&mut __seq)? {
843 _serde::#private::Some(__wrap) => {
844 self.place.#member = __wrap.value;
845 }
846 _serde::#private::None => {
847 #value_if_none;
848 }
849 }
850 })
851 }
852 };
853 index_in_seq += 1;
854 write
855 }
856 });
857
858 let this_type = ¶ms.this_type;
859 let (_, ty_generics, _) = params.generics.split_for_impl();
860 let let_default = match cattrs.default() {
861 attr::Default::Default => Some(quote!(
862 let __default: #this_type #ty_generics = _serde::#private::Default::default();
863 )),
864 attr::Default::Path(path) => Some(quote_spanned!(path.span()=>
869 let __default: #this_type #ty_generics = #path();
870 )),
871 attr::Default::None => {
872 None
875 }
876 };
877
878 quote_block! {
879 #let_default
880 #(#write_values)*
881 _serde::#private::Ok(())
882 }
883}
884
885fn deserialize_newtype_struct(
886 type_path: &TokenStream,
887 params: &Parameters,
888 field: &Field,
889) -> TokenStream {
890 let delife = params.borrowed.de_lifetime();
891 let field_ty = field.ty;
892 let deserializer_var = quote!(__e);
893
894 let value = match field.attrs.deserialize_with() {
895 None => {
896 let span = field.original.span();
897 let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);
898 quote! {
899 #func(#deserializer_var)?
900 }
901 }
902 Some(path) => {
903 quote_spanned! {path.span()=>
908 #path(#deserializer_var)?
909 }
910 }
911 };
912
913 let mut result = quote!(#type_path(__field0));
914 if params.has_getter {
915 let this_type = ¶ms.this_type;
916 let (_, ty_generics, _) = params.generics.split_for_impl();
917 result = quote! {
918 _serde::#private::Into::<#this_type #ty_generics>::into(#result)
919 };
920 }
921
922 quote! {
923 #[inline]
924 fn visit_newtype_struct<__E>(self, #deserializer_var: __E) -> _serde::#private::Result<Self::Value, __E::Error>
925 where
926 __E: _serde::Deserializer<#delife>,
927 {
928 let __field0: #field_ty = #value;
929 _serde::#private::Ok(#result)
930 }
931 }
932}
933
934enum StructForm<'a> {
935 Struct,
936 ExternallyTagged(&'a syn::Ident),
938 InternallyTagged(&'a syn::Ident, TokenStream),
941 Untagged(&'a syn::Ident, TokenStream),
944}
945
946fn deserialize_struct(
948 params: &Parameters,
949 fields: &[Field],
950 cattrs: &attr::Container,
951 form: StructForm,
952) -> Fragment {
953 let this_type = ¶ms.this_type;
954 let this_value = ¶ms.this_value;
955 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
956 split_with_de_lifetime(params);
957 let delife = params.borrowed.de_lifetime();
958
959 let construct = if params.has_getter {
963 let local = ¶ms.local;
964 quote!(#local)
965 } else {
966 quote!(#this_value)
967 };
968
969 let type_path = match form {
970 StructForm::Struct => construct,
971 StructForm::ExternallyTagged(variant_ident)
972 | StructForm::InternallyTagged(variant_ident, _)
973 | StructForm::Untagged(variant_ident, _) => quote!(#construct::#variant_ident),
974 };
975 let expecting = match form {
976 StructForm::Struct => format!("struct {}", params.type_name()),
977 StructForm::ExternallyTagged(variant_ident)
978 | StructForm::InternallyTagged(variant_ident, _)
979 | StructForm::Untagged(variant_ident, _) => {
980 format!("struct variant {}::{}", params.type_name(), variant_ident)
981 }
982 };
983 let expecting = cattrs.expecting().unwrap_or(&expecting);
984
985 let deserialized_fields: Vec<_> = fields
986 .iter()
987 .enumerate()
988 .filter(|&(_, field)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
991 .map(|(i, field)| FieldWithAliases {
992 ident: field_i(i),
993 aliases: field.attrs.aliases(),
994 })
995 .collect();
996
997 let has_flatten = has_flatten(fields);
998 let field_visitor = deserialize_field_identifier(&deserialized_fields, cattrs, has_flatten);
999
1000 let visit_seq = match form {
1003 StructForm::Untagged(..) => None,
1004 _ if has_flatten => None,
1005 _ => {
1006 let mut_seq = if deserialized_fields.is_empty() {
1007 quote!(_)
1008 } else {
1009 quote!(mut __seq)
1010 };
1011
1012 let visit_seq = Stmts(deserialize_seq(
1013 &type_path, params, fields, true, cattrs, expecting,
1014 ));
1015
1016 Some(quote! {
1017 #[inline]
1018 fn visit_seq<__A>(self, #mut_seq: __A) -> _serde::#private::Result<Self::Value, __A::Error>
1019 where
1020 __A: _serde::de::SeqAccess<#delife>,
1021 {
1022 #visit_seq
1023 }
1024 })
1025 }
1026 };
1027 let visit_map = Stmts(deserialize_map(
1028 &type_path,
1029 params,
1030 fields,
1031 cattrs,
1032 has_flatten,
1033 ));
1034
1035 let visitor_seed = match form {
1036 StructForm::ExternallyTagged(..) if has_flatten => Some(quote! {
1037 #[automatically_derived]
1038 impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Visitor #de_ty_generics #where_clause {
1039 type Value = #this_type #ty_generics;
1040
1041 fn deserialize<__D>(self, __deserializer: __D) -> _serde::#private::Result<Self::Value, __D::Error>
1042 where
1043 __D: _serde::Deserializer<#delife>,
1044 {
1045 _serde::Deserializer::deserialize_map(__deserializer, self)
1046 }
1047 }
1048 }),
1049 _ => None,
1050 };
1051
1052 let fields_stmt = if has_flatten {
1053 None
1054 } else {
1055 let field_names = deserialized_fields.iter().flat_map(|field| field.aliases);
1056
1057 Some(quote! {
1058 #[doc(hidden)]
1059 const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
1060 })
1061 };
1062
1063 let visitor_expr = quote! {
1064 __Visitor {
1065 marker: _serde::#private::PhantomData::<#this_type #ty_generics>,
1066 lifetime: _serde::#private::PhantomData,
1067 }
1068 };
1069 let dispatch = match form {
1070 StructForm::Struct if has_flatten => quote! {
1071 _serde::Deserializer::deserialize_map(__deserializer, #visitor_expr)
1072 },
1073 StructForm::Struct => {
1074 let type_name = cattrs.name().deserialize_name();
1075 quote! {
1076 _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS, #visitor_expr)
1077 }
1078 }
1079 StructForm::ExternallyTagged(_) if has_flatten => quote! {
1080 _serde::de::VariantAccess::newtype_variant_seed(__variant, #visitor_expr)
1081 },
1082 StructForm::ExternallyTagged(_) => quote! {
1083 _serde::de::VariantAccess::struct_variant(__variant, FIELDS, #visitor_expr)
1084 },
1085 StructForm::InternallyTagged(_, deserializer) => quote! {
1086 _serde::Deserializer::deserialize_any(#deserializer, #visitor_expr)
1087 },
1088 StructForm::Untagged(_, deserializer) => quote! {
1089 _serde::Deserializer::deserialize_any(#deserializer, #visitor_expr)
1090 },
1091 };
1092
1093 quote_block! {
1094 #field_visitor
1095
1096 #[doc(hidden)]
1097 struct __Visitor #de_impl_generics #where_clause {
1098 marker: _serde::#private::PhantomData<#this_type #ty_generics>,
1099 lifetime: _serde::#private::PhantomData<&#delife ()>,
1100 }
1101
1102 #[automatically_derived]
1103 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
1104 type Value = #this_type #ty_generics;
1105
1106 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
1107 _serde::#private::Formatter::write_str(__formatter, #expecting)
1108 }
1109
1110 #visit_seq
1111
1112 #[inline]
1113 fn visit_map<__A>(self, mut __map: __A) -> _serde::#private::Result<Self::Value, __A::Error>
1114 where
1115 __A: _serde::de::MapAccess<#delife>,
1116 {
1117 #visit_map
1118 }
1119 }
1120
1121 #visitor_seed
1122
1123 #fields_stmt
1124
1125 #dispatch
1126 }
1127}
1128
1129#[cfg(feature = "deserialize_in_place")]
1131fn deserialize_struct_in_place(
1132 params: &Parameters,
1133 fields: &[Field],
1134 cattrs: &attr::Container,
1135) -> Option<Fragment> {
1136 if has_flatten(fields) {
1139 return None;
1140 }
1141
1142 let this_type = ¶ms.this_type;
1143 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
1144 split_with_de_lifetime(params);
1145 let delife = params.borrowed.de_lifetime();
1146
1147 let expecting = format!("struct {}", params.type_name());
1148 let expecting = cattrs.expecting().unwrap_or(&expecting);
1149
1150 let deserialized_fields: Vec<_> = fields
1151 .iter()
1152 .enumerate()
1153 .filter(|&(_, field)| !field.attrs.skip_deserializing())
1154 .map(|(i, field)| FieldWithAliases {
1155 ident: field_i(i),
1156 aliases: field.attrs.aliases(),
1157 })
1158 .collect();
1159
1160 let field_visitor = deserialize_field_identifier(&deserialized_fields, cattrs, false);
1161
1162 let mut_seq = if deserialized_fields.is_empty() {
1163 quote!(_)
1164 } else {
1165 quote!(mut __seq)
1166 };
1167 let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, expecting));
1168 let visit_map = Stmts(deserialize_map_in_place(params, fields, cattrs));
1169 let field_names = deserialized_fields.iter().flat_map(|field| field.aliases);
1170 let type_name = cattrs.name().deserialize_name();
1171
1172 let in_place_impl_generics = de_impl_generics.in_place();
1173 let in_place_ty_generics = de_ty_generics.in_place();
1174 let place_life = place_lifetime();
1175
1176 Some(quote_block! {
1177 #field_visitor
1178
1179 #[doc(hidden)]
1180 struct __Visitor #in_place_impl_generics #where_clause {
1181 place: &#place_life mut #this_type #ty_generics,
1182 lifetime: _serde::#private::PhantomData<&#delife ()>,
1183 }
1184
1185 #[automatically_derived]
1186 impl #in_place_impl_generics _serde::de::Visitor<#delife> for __Visitor #in_place_ty_generics #where_clause {
1187 type Value = ();
1188
1189 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
1190 _serde::#private::Formatter::write_str(__formatter, #expecting)
1191 }
1192
1193 #[inline]
1194 fn visit_seq<__A>(self, #mut_seq: __A) -> _serde::#private::Result<Self::Value, __A::Error>
1195 where
1196 __A: _serde::de::SeqAccess<#delife>,
1197 {
1198 #visit_seq
1199 }
1200
1201 #[inline]
1202 fn visit_map<__A>(self, mut __map: __A) -> _serde::#private::Result<Self::Value, __A::Error>
1203 where
1204 __A: _serde::de::MapAccess<#delife>,
1205 {
1206 #visit_map
1207 }
1208 }
1209
1210 #[doc(hidden)]
1211 const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
1212
1213 _serde::Deserializer::deserialize_struct(__deserializer, #type_name, FIELDS, __Visitor {
1214 place: __place,
1215 lifetime: _serde::#private::PhantomData,
1216 })
1217 })
1218}
1219
1220fn deserialize_enum(
1222 params: &Parameters,
1223 variants: &[Variant],
1224 cattrs: &attr::Container,
1225) -> Fragment {
1226 match variants.iter().position(|var| var.attrs.untagged()) {
1228 Some(variant_idx) => {
1229 let (tagged, untagged) = variants.split_at(variant_idx);
1230 let tagged_frag = Expr(deserialize_homogeneous_enum(params, tagged, cattrs));
1231 deserialize_untagged_enum_after(params, untagged, cattrs, Some(tagged_frag))
1232 }
1233 None => deserialize_homogeneous_enum(params, variants, cattrs),
1234 }
1235}
1236
1237fn deserialize_homogeneous_enum(
1238 params: &Parameters,
1239 variants: &[Variant],
1240 cattrs: &attr::Container,
1241) -> Fragment {
1242 match cattrs.tag() {
1243 attr::TagType::External => deserialize_externally_tagged_enum(params, variants, cattrs),
1244 attr::TagType::Internal { tag } => {
1245 deserialize_internally_tagged_enum(params, variants, cattrs, tag)
1246 }
1247 attr::TagType::Adjacent { tag, content } => {
1248 deserialize_adjacently_tagged_enum(params, variants, cattrs, tag, content)
1249 }
1250 attr::TagType::None => deserialize_untagged_enum(params, variants, cattrs),
1251 }
1252}
1253
1254fn prepare_enum_variant_enum(variants: &[Variant]) -> (TokenStream, Stmts) {
1255 let deserialized_variants = variants
1256 .iter()
1257 .enumerate()
1258 .filter(|&(_i, variant)| !variant.attrs.skip_deserializing());
1259
1260 let fallthrough = deserialized_variants
1261 .clone()
1262 .find(|(_i, variant)| variant.attrs.other())
1263 .map(|(i, _variant)| {
1264 let ignore_variant = field_i(i);
1265 quote!(_serde::#private::Ok(__Field::#ignore_variant))
1266 });
1267
1268 let variants_stmt = {
1269 let variant_names = deserialized_variants
1270 .clone()
1271 .flat_map(|(_i, variant)| variant.attrs.aliases());
1272 quote! {
1273 #[doc(hidden)]
1274 const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
1275 }
1276 };
1277
1278 let deserialized_variants: Vec<_> = deserialized_variants
1279 .map(|(i, variant)| FieldWithAliases {
1280 ident: field_i(i),
1281 aliases: variant.attrs.aliases(),
1282 })
1283 .collect();
1284
1285 let variant_visitor = Stmts(deserialize_generated_identifier(
1286 &deserialized_variants,
1287 false, true,
1289 None,
1290 fallthrough,
1291 ));
1292
1293 (variants_stmt, variant_visitor)
1294}
1295
1296fn deserialize_externally_tagged_enum(
1298 params: &Parameters,
1299 variants: &[Variant],
1300 cattrs: &attr::Container,
1301) -> Fragment {
1302 let this_type = ¶ms.this_type;
1303 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
1304 split_with_de_lifetime(params);
1305 let delife = params.borrowed.de_lifetime();
1306
1307 let type_name = cattrs.name().deserialize_name();
1308 let expecting = format!("enum {}", params.type_name());
1309 let expecting = cattrs.expecting().unwrap_or(&expecting);
1310
1311 let (variants_stmt, variant_visitor) = prepare_enum_variant_enum(variants);
1312
1313 let variant_arms = variants
1315 .iter()
1316 .enumerate()
1317 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
1318 .map(|(i, variant)| {
1319 let variant_name = field_i(i);
1320
1321 let block = Match(deserialize_externally_tagged_variant(
1322 params, variant, cattrs,
1323 ));
1324
1325 quote! {
1326 (__Field::#variant_name, __variant) => #block
1327 }
1328 });
1329
1330 let all_skipped = variants
1331 .iter()
1332 .all(|variant| variant.attrs.skip_deserializing());
1333 let match_variant = if all_skipped {
1334 quote! {
1337 _serde::#private::Result::map(
1341 _serde::de::EnumAccess::variant::<__Field>(__data),
1342 |(__impossible, _)| match __impossible {})
1343 }
1344 } else {
1345 quote! {
1346 match _serde::de::EnumAccess::variant(__data)? {
1347 #(#variant_arms)*
1348 }
1349 }
1350 };
1351
1352 quote_block! {
1353 #variant_visitor
1354
1355 #[doc(hidden)]
1356 struct __Visitor #de_impl_generics #where_clause {
1357 marker: _serde::#private::PhantomData<#this_type #ty_generics>,
1358 lifetime: _serde::#private::PhantomData<&#delife ()>,
1359 }
1360
1361 #[automatically_derived]
1362 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
1363 type Value = #this_type #ty_generics;
1364
1365 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
1366 _serde::#private::Formatter::write_str(__formatter, #expecting)
1367 }
1368
1369 fn visit_enum<__A>(self, __data: __A) -> _serde::#private::Result<Self::Value, __A::Error>
1370 where
1371 __A: _serde::de::EnumAccess<#delife>,
1372 {
1373 #match_variant
1374 }
1375 }
1376
1377 #variants_stmt
1378
1379 _serde::Deserializer::deserialize_enum(
1380 __deserializer,
1381 #type_name,
1382 VARIANTS,
1383 __Visitor {
1384 marker: _serde::#private::PhantomData::<#this_type #ty_generics>,
1385 lifetime: _serde::#private::PhantomData,
1386 },
1387 )
1388 }
1389}
1390
1391fn deserialize_internally_tagged_enum(
1393 params: &Parameters,
1394 variants: &[Variant],
1395 cattrs: &attr::Container,
1396 tag: &str,
1397) -> Fragment {
1398 let (variants_stmt, variant_visitor) = prepare_enum_variant_enum(variants);
1399
1400 let variant_arms = variants
1402 .iter()
1403 .enumerate()
1404 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
1405 .map(|(i, variant)| {
1406 let variant_name = field_i(i);
1407
1408 let block = Match(deserialize_internally_tagged_variant(
1409 params,
1410 variant,
1411 cattrs,
1412 quote!(__deserializer),
1413 ));
1414
1415 quote! {
1416 __Field::#variant_name => #block
1417 }
1418 });
1419
1420 let expecting = format!("internally tagged enum {}", params.type_name());
1421 let expecting = cattrs.expecting().unwrap_or(&expecting);
1422
1423 quote_block! {
1424 #variant_visitor
1425
1426 #variants_stmt
1427
1428 let (__tag, __content) = _serde::Deserializer::deserialize_any(
1429 __deserializer,
1430 _serde::#private::de::TaggedContentVisitor::<__Field>::new(#tag, #expecting))?;
1431 let __deserializer = _serde::#private::de::ContentDeserializer::<__D::Error>::new(__content);
1432
1433 match __tag {
1434 #(#variant_arms)*
1435 }
1436 }
1437}
1438
1439fn deserialize_adjacently_tagged_enum(
1441 params: &Parameters,
1442 variants: &[Variant],
1443 cattrs: &attr::Container,
1444 tag: &str,
1445 content: &str,
1446) -> Fragment {
1447 let this_type = ¶ms.this_type;
1448 let this_value = ¶ms.this_value;
1449 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
1450 split_with_de_lifetime(params);
1451 let delife = params.borrowed.de_lifetime();
1452
1453 let (variants_stmt, variant_visitor) = prepare_enum_variant_enum(variants);
1454
1455 let variant_arms: &Vec<_> = &variants
1456 .iter()
1457 .enumerate()
1458 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
1459 .map(|(i, variant)| {
1460 let variant_index = field_i(i);
1461
1462 let block = Match(deserialize_untagged_variant(
1463 params,
1464 variant,
1465 cattrs,
1466 quote!(__deserializer),
1467 ));
1468
1469 quote! {
1470 __Field::#variant_index => #block
1471 }
1472 })
1473 .collect();
1474
1475 let rust_name = params.type_name();
1476 let expecting = format!("adjacently tagged enum {}", rust_name);
1477 let expecting = cattrs.expecting().unwrap_or(&expecting);
1478 let type_name = cattrs.name().deserialize_name();
1479 let deny_unknown_fields = cattrs.deny_unknown_fields();
1480
1481 let field_visitor_ty = if deny_unknown_fields {
1484 quote! { _serde::#private::de::TagOrContentFieldVisitor }
1485 } else {
1486 quote! { _serde::#private::de::TagContentOtherFieldVisitor }
1487 };
1488
1489 let mut missing_content = quote! {
1490 _serde::#private::Err(<__A::Error as _serde::de::Error>::missing_field(#content))
1491 };
1492 let mut missing_content_fallthrough = quote!();
1493 let missing_content_arms = variants
1494 .iter()
1495 .enumerate()
1496 .filter(|&(_, variant)| !variant.attrs.skip_deserializing())
1497 .filter_map(|(i, variant)| {
1498 let variant_index = field_i(i);
1499 let variant_ident = &variant.ident;
1500
1501 let arm = match variant.style {
1502 Style::Unit => quote! {
1503 _serde::#private::Ok(#this_value::#variant_ident)
1504 },
1505 Style::Newtype if variant.attrs.deserialize_with().is_none() => {
1506 let span = variant.original.span();
1507 let func = quote_spanned!(span=> _serde::#private::de::missing_field);
1508 quote! {
1509 #func(#content).map(#this_value::#variant_ident)
1510 }
1511 }
1512 _ => {
1513 missing_content_fallthrough = quote!(_ => #missing_content);
1514 return None;
1515 }
1516 };
1517 Some(quote! {
1518 __Field::#variant_index => #arm,
1519 })
1520 })
1521 .collect::<Vec<_>>();
1522 if !missing_content_arms.is_empty() {
1523 missing_content = quote! {
1524 match __field {
1525 #(#missing_content_arms)*
1526 #missing_content_fallthrough
1527 }
1528 };
1529 }
1530
1531 let next_key = quote! {
1533 _serde::de::MapAccess::next_key_seed(&mut __map, #field_visitor_ty {
1534 tag: #tag,
1535 content: #content,
1536 })?
1537 };
1538
1539 let variant_from_map = quote! {
1540 _serde::de::MapAccess::next_value_seed(&mut __map, _serde::#private::de::AdjacentlyTaggedEnumVariantSeed::<__Field> {
1541 enum_name: #rust_name,
1542 variants: VARIANTS,
1543 fields_enum: _serde::#private::PhantomData
1544 })?
1545 };
1546
1547 let next_relevant_key = if deny_unknown_fields {
1550 next_key
1551 } else {
1552 quote!({
1553 let mut __rk : _serde::#private::Option<_serde::#private::de::TagOrContentField> = _serde::#private::None;
1554 while let _serde::#private::Some(__k) = #next_key {
1555 match __k {
1556 _serde::#private::de::TagContentOtherField::Other => {
1557 let _ = _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
1558 continue;
1559 },
1560 _serde::#private::de::TagContentOtherField::Tag => {
1561 __rk = _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag);
1562 break;
1563 }
1564 _serde::#private::de::TagContentOtherField::Content => {
1565 __rk = _serde::#private::Some(_serde::#private::de::TagOrContentField::Content);
1566 break;
1567 }
1568 }
1569 }
1570
1571 __rk
1572 })
1573 };
1574
1575 let visit_remaining_keys = quote! {
1579 match #next_relevant_key {
1580 _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag) => {
1581 _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#tag))
1582 }
1583 _serde::#private::Some(_serde::#private::de::TagOrContentField::Content) => {
1584 _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#content))
1585 }
1586 _serde::#private::None => _serde::#private::Ok(__ret),
1587 }
1588 };
1589
1590 let finish_content_then_tag = if variant_arms.is_empty() {
1591 quote! {
1592 match #variant_from_map {}
1593 }
1594 } else {
1595 quote! {
1596 let __seed = __Seed {
1597 variant: #variant_from_map,
1598 marker: _serde::#private::PhantomData,
1599 lifetime: _serde::#private::PhantomData,
1600 };
1601 let __deserializer = _serde::#private::de::ContentDeserializer::<__A::Error>::new(__content);
1602 let __ret = _serde::de::DeserializeSeed::deserialize(__seed, __deserializer)?;
1603 #visit_remaining_keys
1605 }
1606 };
1607
1608 quote_block! {
1609 #variant_visitor
1610
1611 #variants_stmt
1612
1613 #[doc(hidden)]
1614 struct __Seed #de_impl_generics #where_clause {
1615 variant: __Field,
1616 marker: _serde::#private::PhantomData<#this_type #ty_generics>,
1617 lifetime: _serde::#private::PhantomData<&#delife ()>,
1618 }
1619
1620 #[automatically_derived]
1621 impl #de_impl_generics _serde::de::DeserializeSeed<#delife> for __Seed #de_ty_generics #where_clause {
1622 type Value = #this_type #ty_generics;
1623
1624 fn deserialize<__D>(self, __deserializer: __D) -> _serde::#private::Result<Self::Value, __D::Error>
1625 where
1626 __D: _serde::Deserializer<#delife>,
1627 {
1628 match self.variant {
1629 #(#variant_arms)*
1630 }
1631 }
1632 }
1633
1634 #[doc(hidden)]
1635 struct __Visitor #de_impl_generics #where_clause {
1636 marker: _serde::#private::PhantomData<#this_type #ty_generics>,
1637 lifetime: _serde::#private::PhantomData<&#delife ()>,
1638 }
1639
1640 #[automatically_derived]
1641 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
1642 type Value = #this_type #ty_generics;
1643
1644 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
1645 _serde::#private::Formatter::write_str(__formatter, #expecting)
1646 }
1647
1648 fn visit_map<__A>(self, mut __map: __A) -> _serde::#private::Result<Self::Value, __A::Error>
1649 where
1650 __A: _serde::de::MapAccess<#delife>,
1651 {
1652 match #next_relevant_key {
1654 _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag) => {
1656 let __field = #variant_from_map;
1658 match #next_relevant_key {
1660 _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag) => {
1662 _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#tag))
1663 }
1664 _serde::#private::Some(_serde::#private::de::TagOrContentField::Content) => {
1666 let __ret = _serde::de::MapAccess::next_value_seed(&mut __map,
1667 __Seed {
1668 variant: __field,
1669 marker: _serde::#private::PhantomData,
1670 lifetime: _serde::#private::PhantomData,
1671 })?;
1672 #visit_remaining_keys
1674 }
1675 _serde::#private::None => #missing_content
1677 }
1678 }
1679 _serde::#private::Some(_serde::#private::de::TagOrContentField::Content) => {
1681 let __content = _serde::de::MapAccess::next_value_seed(&mut __map, _serde::#private::de::ContentVisitor::new())?;
1683 match #next_relevant_key {
1685 _serde::#private::Some(_serde::#private::de::TagOrContentField::Tag) => {
1687 #finish_content_then_tag
1688 }
1689 _serde::#private::Some(_serde::#private::de::TagOrContentField::Content) => {
1691 _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#content))
1692 }
1693 _serde::#private::None => {
1695 _serde::#private::Err(<__A::Error as _serde::de::Error>::missing_field(#tag))
1696 }
1697 }
1698 }
1699 _serde::#private::None => {
1701 _serde::#private::Err(<__A::Error as _serde::de::Error>::missing_field(#tag))
1702 }
1703 }
1704 }
1705
1706 fn visit_seq<__A>(self, mut __seq: __A) -> _serde::#private::Result<Self::Value, __A::Error>
1707 where
1708 __A: _serde::de::SeqAccess<#delife>,
1709 {
1710 match _serde::de::SeqAccess::next_element(&mut __seq)? {
1712 _serde::#private::Some(__variant) => {
1713 match _serde::de::SeqAccess::next_element_seed(
1715 &mut __seq,
1716 __Seed {
1717 variant: __variant,
1718 marker: _serde::#private::PhantomData,
1719 lifetime: _serde::#private::PhantomData,
1720 },
1721 )? {
1722 _serde::#private::Some(__ret) => _serde::#private::Ok(__ret),
1723 _serde::#private::None => {
1725 _serde::#private::Err(_serde::de::Error::invalid_length(1, &self))
1726 }
1727 }
1728 }
1729 _serde::#private::None => {
1731 _serde::#private::Err(_serde::de::Error::invalid_length(0, &self))
1732 }
1733 }
1734 }
1735 }
1736
1737 #[doc(hidden)]
1738 const FIELDS: &'static [&'static str] = &[#tag, #content];
1739 _serde::Deserializer::deserialize_struct(
1740 __deserializer,
1741 #type_name,
1742 FIELDS,
1743 __Visitor {
1744 marker: _serde::#private::PhantomData::<#this_type #ty_generics>,
1745 lifetime: _serde::#private::PhantomData,
1746 },
1747 )
1748 }
1749}
1750
1751fn deserialize_untagged_enum(
1753 params: &Parameters,
1754 variants: &[Variant],
1755 cattrs: &attr::Container,
1756) -> Fragment {
1757 let first_attempt = None;
1758 deserialize_untagged_enum_after(params, variants, cattrs, first_attempt)
1759}
1760
1761fn deserialize_untagged_enum_after(
1762 params: &Parameters,
1763 variants: &[Variant],
1764 cattrs: &attr::Container,
1765 first_attempt: Option<Expr>,
1766) -> Fragment {
1767 let attempts = variants
1768 .iter()
1769 .filter(|variant| !variant.attrs.skip_deserializing())
1770 .map(|variant| {
1771 Expr(deserialize_untagged_variant(
1772 params,
1773 variant,
1774 cattrs,
1775 quote!(__deserializer),
1776 ))
1777 });
1778 let fallthrough_msg = format!(
1785 "data did not match any variant of untagged enum {}",
1786 params.type_name()
1787 );
1788 let fallthrough_msg = cattrs.expecting().unwrap_or(&fallthrough_msg);
1789
1790 let first_attempt = first_attempt.map(|expr| {
1794 quote! {
1795 if let _serde::#private::Result::<_, __D::Error>::Ok(__ok) = (|| #expr)() {
1796 return _serde::#private::Ok(__ok);
1797 }
1798 }
1799 });
1800
1801 let private2 = private;
1802 quote_block! {
1803 let __content = _serde::de::DeserializeSeed::deserialize(_serde::#private::de::ContentVisitor::new(), __deserializer)?;
1804 let __deserializer = _serde::#private::de::ContentRefDeserializer::<__D::Error>::new(&__content);
1805
1806 #first_attempt
1807
1808 #(
1809 if let _serde::#private2::Ok(__ok) = #attempts {
1810 return _serde::#private2::Ok(__ok);
1811 }
1812 )*
1813
1814 _serde::#private::Err(_serde::de::Error::custom(#fallthrough_msg))
1815 }
1816}
1817
1818fn deserialize_externally_tagged_variant(
1819 params: &Parameters,
1820 variant: &Variant,
1821 cattrs: &attr::Container,
1822) -> Fragment {
1823 if let Some(path) = variant.attrs.deserialize_with() {
1824 let (wrapper, wrapper_ty, unwrap_fn) = wrap_deserialize_variant_with(params, variant, path);
1825 return quote_block! {
1826 #wrapper
1827 _serde::#private::Result::map(
1828 _serde::de::VariantAccess::newtype_variant::<#wrapper_ty>(__variant), #unwrap_fn)
1829 };
1830 }
1831
1832 let variant_ident = &variant.ident;
1833
1834 match variant.style {
1835 Style::Unit => {
1836 let this_value = ¶ms.this_value;
1837 quote_block! {
1838 _serde::de::VariantAccess::unit_variant(__variant)?;
1839 _serde::#private::Ok(#this_value::#variant_ident)
1840 }
1841 }
1842 Style::Newtype => deserialize_externally_tagged_newtype_variant(
1843 variant_ident,
1844 params,
1845 &variant.fields[0],
1846 cattrs,
1847 ),
1848 Style::Tuple => deserialize_tuple(
1849 params,
1850 &variant.fields,
1851 cattrs,
1852 TupleForm::ExternallyTagged(variant_ident),
1853 ),
1854 Style::Struct => deserialize_struct(
1855 params,
1856 &variant.fields,
1857 cattrs,
1858 StructForm::ExternallyTagged(variant_ident),
1859 ),
1860 }
1861}
1862
1863fn deserialize_internally_tagged_variant(
1866 params: &Parameters,
1867 variant: &Variant,
1868 cattrs: &attr::Container,
1869 deserializer: TokenStream,
1870) -> Fragment {
1871 if variant.attrs.deserialize_with().is_some() {
1872 return deserialize_untagged_variant(params, variant, cattrs, deserializer);
1873 }
1874
1875 let variant_ident = &variant.ident;
1876
1877 match effective_style(variant) {
1878 Style::Unit => {
1879 let this_value = ¶ms.this_value;
1880 let type_name = params.type_name();
1881 let variant_name = variant.ident.to_string();
1882 let default = variant.fields.first().map(|field| {
1883 let default = Expr(expr_is_missing(field, cattrs));
1884 quote!((#default))
1885 });
1886 quote_block! {
1887 _serde::Deserializer::deserialize_any(#deserializer, _serde::#private::de::InternallyTaggedUnitVisitor::new(#type_name, #variant_name))?;
1888 _serde::#private::Ok(#this_value::#variant_ident #default)
1889 }
1890 }
1891 Style::Newtype => deserialize_untagged_newtype_variant(
1892 variant_ident,
1893 params,
1894 &variant.fields[0],
1895 &deserializer,
1896 ),
1897 Style::Struct => deserialize_struct(
1898 params,
1899 &variant.fields,
1900 cattrs,
1901 StructForm::InternallyTagged(variant_ident, deserializer),
1902 ),
1903 Style::Tuple => unreachable!("checked in serde_derive_internals"),
1904 }
1905}
1906
1907fn deserialize_untagged_variant(
1908 params: &Parameters,
1909 variant: &Variant,
1910 cattrs: &attr::Container,
1911 deserializer: TokenStream,
1912) -> Fragment {
1913 if let Some(path) = variant.attrs.deserialize_with() {
1914 let unwrap_fn = unwrap_to_variant_closure(params, variant, false);
1915 return quote_block! {
1916 _serde::#private::Result::map(#path(#deserializer), #unwrap_fn)
1917 };
1918 }
1919
1920 let variant_ident = &variant.ident;
1921
1922 match effective_style(variant) {
1923 Style::Unit => {
1924 let this_value = ¶ms.this_value;
1925 let type_name = params.type_name();
1926 let variant_name = variant.ident.to_string();
1927 let default = variant.fields.first().map(|field| {
1928 let default = Expr(expr_is_missing(field, cattrs));
1929 quote!((#default))
1930 });
1931 quote_expr! {
1932 match _serde::Deserializer::deserialize_any(
1933 #deserializer,
1934 _serde::#private::de::UntaggedUnitVisitor::new(#type_name, #variant_name)
1935 ) {
1936 _serde::#private::Ok(()) => _serde::#private::Ok(#this_value::#variant_ident #default),
1937 _serde::#private::Err(__err) => _serde::#private::Err(__err),
1938 }
1939 }
1940 }
1941 Style::Newtype => deserialize_untagged_newtype_variant(
1942 variant_ident,
1943 params,
1944 &variant.fields[0],
1945 &deserializer,
1946 ),
1947 Style::Tuple => deserialize_tuple(
1948 params,
1949 &variant.fields,
1950 cattrs,
1951 TupleForm::Untagged(variant_ident, deserializer),
1952 ),
1953 Style::Struct => deserialize_struct(
1954 params,
1955 &variant.fields,
1956 cattrs,
1957 StructForm::Untagged(variant_ident, deserializer),
1958 ),
1959 }
1960}
1961
1962fn deserialize_externally_tagged_newtype_variant(
1963 variant_ident: &syn::Ident,
1964 params: &Parameters,
1965 field: &Field,
1966 cattrs: &attr::Container,
1967) -> Fragment {
1968 let this_value = ¶ms.this_value;
1969
1970 if field.attrs.skip_deserializing() {
1971 let default = Expr(expr_is_missing(field, cattrs));
1972 return quote_block! {
1973 _serde::de::VariantAccess::unit_variant(__variant)?;
1974 _serde::#private::Ok(#this_value::#variant_ident(#default))
1975 };
1976 }
1977
1978 match field.attrs.deserialize_with() {
1979 None => {
1980 let field_ty = field.ty;
1981 let span = field.original.span();
1982 let func =
1983 quote_spanned!(span=> _serde::de::VariantAccess::newtype_variant::<#field_ty>);
1984 quote_expr! {
1985 _serde::#private::Result::map(#func(__variant), #this_value::#variant_ident)
1986 }
1987 }
1988 Some(path) => {
1989 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
1990 quote_block! {
1991 #wrapper
1992 _serde::#private::Result::map(
1993 _serde::de::VariantAccess::newtype_variant::<#wrapper_ty>(__variant),
1994 |__wrapper| #this_value::#variant_ident(__wrapper.value))
1995 }
1996 }
1997 }
1998}
1999
2000fn deserialize_untagged_newtype_variant(
2001 variant_ident: &syn::Ident,
2002 params: &Parameters,
2003 field: &Field,
2004 deserializer: &TokenStream,
2005) -> Fragment {
2006 let this_value = ¶ms.this_value;
2007 let field_ty = field.ty;
2008 match field.attrs.deserialize_with() {
2009 None => {
2010 let span = field.original.span();
2011 let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);
2012 quote_expr! {
2013 _serde::#private::Result::map(#func(#deserializer), #this_value::#variant_ident)
2014 }
2015 }
2016 Some(path) => {
2017 quote_block! {
2018 let __value: _serde::#private::Result<#field_ty, _> = #path(#deserializer);
2019 _serde::#private::Result::map(__value, #this_value::#variant_ident)
2020 }
2021 }
2022 }
2023}
2024
2025struct FieldWithAliases<'a> {
2026 ident: Ident,
2027 aliases: &'a BTreeSet<Name>,
2028}
2029
2030fn deserialize_generated_identifier(
2031 deserialized_fields: &[FieldWithAliases],
2032 has_flatten: bool,
2033 is_variant: bool,
2034 ignore_variant: Option<TokenStream>,
2035 fallthrough: Option<TokenStream>,
2036) -> Fragment {
2037 let this_value = quote!(__Field);
2038 let field_idents: &Vec<_> = &deserialized_fields
2039 .iter()
2040 .map(|field| &field.ident)
2041 .collect();
2042
2043 let visitor_impl = Stmts(deserialize_identifier(
2044 &this_value,
2045 deserialized_fields,
2046 is_variant,
2047 fallthrough,
2048 None,
2049 !is_variant && has_flatten,
2050 None,
2051 ));
2052
2053 let lifetime = if !is_variant && has_flatten {
2054 Some(quote!(<'de>))
2055 } else {
2056 None
2057 };
2058
2059 quote_block! {
2060 #[allow(non_camel_case_types)]
2061 #[doc(hidden)]
2062 enum __Field #lifetime {
2063 #(#field_idents,)*
2064 #ignore_variant
2065 }
2066
2067 #[doc(hidden)]
2068 struct __FieldVisitor;
2069
2070 #[automatically_derived]
2071 impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
2072 type Value = __Field #lifetime;
2073
2074 #visitor_impl
2075 }
2076
2077 #[automatically_derived]
2078 impl<'de> _serde::Deserialize<'de> for __Field #lifetime {
2079 #[inline]
2080 fn deserialize<__D>(__deserializer: __D) -> _serde::#private::Result<Self, __D::Error>
2081 where
2082 __D: _serde::Deserializer<'de>,
2083 {
2084 _serde::Deserializer::deserialize_identifier(__deserializer, __FieldVisitor)
2085 }
2086 }
2087 }
2088}
2089
2090fn deserialize_field_identifier(
2093 deserialized_fields: &[FieldWithAliases],
2094 cattrs: &attr::Container,
2095 has_flatten: bool,
2096) -> Stmts {
2097 let (ignore_variant, fallthrough) = if has_flatten {
2098 let ignore_variant = quote!(__other(_serde::#private::de::Content<'de>),);
2099 let fallthrough = quote!(_serde::#private::Ok(__Field::__other(__value)));
2100 (Some(ignore_variant), Some(fallthrough))
2101 } else if cattrs.deny_unknown_fields() {
2102 (None, None)
2103 } else {
2104 let ignore_variant = quote!(__ignore,);
2105 let fallthrough = quote!(_serde::#private::Ok(__Field::__ignore));
2106 (Some(ignore_variant), Some(fallthrough))
2107 };
2108
2109 Stmts(deserialize_generated_identifier(
2110 deserialized_fields,
2111 has_flatten,
2112 false,
2113 ignore_variant,
2114 fallthrough,
2115 ))
2116}
2117
2118fn deserialize_custom_identifier(
2121 params: &Parameters,
2122 variants: &[Variant],
2123 cattrs: &attr::Container,
2124) -> Fragment {
2125 let is_variant = match cattrs.identifier() {
2126 attr::Identifier::Variant => true,
2127 attr::Identifier::Field => false,
2128 attr::Identifier::No => unreachable!(),
2129 };
2130
2131 let this_type = params.this_type.to_token_stream();
2132 let this_value = params.this_value.to_token_stream();
2133
2134 let (ordinary, fallthrough, fallthrough_borrowed) = if let Some(last) = variants.last() {
2135 let last_ident = &last.ident;
2136 if last.attrs.other() {
2137 let ordinary = &variants[..variants.len() - 1];
2141 let fallthrough = quote!(_serde::#private::Ok(#this_value::#last_ident));
2142 (ordinary, Some(fallthrough), None)
2143 } else if let Style::Newtype = last.style {
2144 let ordinary = &variants[..variants.len() - 1];
2145 let fallthrough = |value| {
2146 quote! {
2147 _serde::#private::Result::map(
2148 _serde::Deserialize::deserialize(
2149 _serde::#private::de::IdentifierDeserializer::from(#value)
2150 ),
2151 #this_value::#last_ident)
2152 }
2153 };
2154 (
2155 ordinary,
2156 Some(fallthrough(quote!(__value))),
2157 Some(fallthrough(quote!(_serde::#private::de::Borrowed(
2158 __value
2159 )))),
2160 )
2161 } else {
2162 (variants, None, None)
2163 }
2164 } else {
2165 (variants, None, None)
2166 };
2167
2168 let idents_aliases: Vec<_> = ordinary
2169 .iter()
2170 .map(|variant| FieldWithAliases {
2171 ident: variant.ident.clone(),
2172 aliases: variant.attrs.aliases(),
2173 })
2174 .collect();
2175
2176 let names = idents_aliases.iter().flat_map(|variant| variant.aliases);
2177
2178 let names_const = if fallthrough.is_some() {
2179 None
2180 } else if is_variant {
2181 let variants = quote! {
2182 #[doc(hidden)]
2183 const VARIANTS: &'static [&'static str] = &[ #(#names),* ];
2184 };
2185 Some(variants)
2186 } else {
2187 let fields = quote! {
2188 #[doc(hidden)]
2189 const FIELDS: &'static [&'static str] = &[ #(#names),* ];
2190 };
2191 Some(fields)
2192 };
2193
2194 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
2195 split_with_de_lifetime(params);
2196 let delife = params.borrowed.de_lifetime();
2197 let visitor_impl = Stmts(deserialize_identifier(
2198 &this_value,
2199 &idents_aliases,
2200 is_variant,
2201 fallthrough,
2202 fallthrough_borrowed,
2203 false,
2204 cattrs.expecting(),
2205 ));
2206
2207 quote_block! {
2208 #names_const
2209
2210 #[doc(hidden)]
2211 struct __FieldVisitor #de_impl_generics #where_clause {
2212 marker: _serde::#private::PhantomData<#this_type #ty_generics>,
2213 lifetime: _serde::#private::PhantomData<&#delife ()>,
2214 }
2215
2216 #[automatically_derived]
2217 impl #de_impl_generics _serde::de::Visitor<#delife> for __FieldVisitor #de_ty_generics #where_clause {
2218 type Value = #this_type #ty_generics;
2219
2220 #visitor_impl
2221 }
2222
2223 let __visitor = __FieldVisitor {
2224 marker: _serde::#private::PhantomData::<#this_type #ty_generics>,
2225 lifetime: _serde::#private::PhantomData,
2226 };
2227 _serde::Deserializer::deserialize_identifier(__deserializer, __visitor)
2228 }
2229}
2230
2231fn deserialize_identifier(
2232 this_value: &TokenStream,
2233 deserialized_fields: &[FieldWithAliases],
2234 is_variant: bool,
2235 fallthrough: Option<TokenStream>,
2236 fallthrough_borrowed: Option<TokenStream>,
2237 collect_other_fields: bool,
2238 expecting: Option<&str>,
2239) -> Fragment {
2240 let str_mapping = deserialized_fields.iter().map(|field| {
2241 let ident = &field.ident;
2242 let aliases = field.aliases;
2243 let private2 = private;
2244 quote! {
2246 #(
2247 #aliases => _serde::#private2::Ok(#this_value::#ident),
2248 )*
2249 }
2250 });
2251 let bytes_mapping = deserialized_fields.iter().map(|field| {
2252 let ident = &field.ident;
2253 let aliases = field
2255 .aliases
2256 .iter()
2257 .map(|alias| Literal::byte_string(alias.value.as_bytes()));
2258 let private2 = private;
2259 quote! {
2260 #(
2261 #aliases => _serde::#private2::Ok(#this_value::#ident),
2262 )*
2263 }
2264 });
2265
2266 let expecting = expecting.unwrap_or(if is_variant {
2267 "variant identifier"
2268 } else {
2269 "field identifier"
2270 });
2271
2272 let bytes_to_str = if fallthrough.is_some() || collect_other_fields {
2273 None
2274 } else {
2275 Some(quote! {
2276 let __value = &_serde::#private::from_utf8_lossy(__value);
2277 })
2278 };
2279
2280 let (
2281 value_as_str_content,
2282 value_as_borrowed_str_content,
2283 value_as_bytes_content,
2284 value_as_borrowed_bytes_content,
2285 ) = if collect_other_fields {
2286 (
2287 Some(quote! {
2288 let __value = _serde::#private::de::Content::String(_serde::#private::ToString::to_string(__value));
2289 }),
2290 Some(quote! {
2291 let __value = _serde::#private::de::Content::Str(__value);
2292 }),
2293 Some(quote! {
2294 let __value = _serde::#private::de::Content::ByteBuf(__value.to_vec());
2295 }),
2296 Some(quote! {
2297 let __value = _serde::#private::de::Content::Bytes(__value);
2298 }),
2299 )
2300 } else {
2301 (None, None, None, None)
2302 };
2303
2304 let fallthrough_arm_tokens;
2305 let fallthrough_arm = if let Some(fallthrough) = &fallthrough {
2306 fallthrough
2307 } else if is_variant {
2308 fallthrough_arm_tokens = quote! {
2309 _serde::#private::Err(_serde::de::Error::unknown_variant(__value, VARIANTS))
2310 };
2311 &fallthrough_arm_tokens
2312 } else {
2313 fallthrough_arm_tokens = quote! {
2314 _serde::#private::Err(_serde::de::Error::unknown_field(__value, FIELDS))
2315 };
2316 &fallthrough_arm_tokens
2317 };
2318
2319 let visit_other = if collect_other_fields {
2320 quote! {
2321 fn visit_bool<__E>(self, __value: bool) -> _serde::#private::Result<Self::Value, __E>
2322 where
2323 __E: _serde::de::Error,
2324 {
2325 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::Bool(__value)))
2326 }
2327
2328 fn visit_i8<__E>(self, __value: i8) -> _serde::#private::Result<Self::Value, __E>
2329 where
2330 __E: _serde::de::Error,
2331 {
2332 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::I8(__value)))
2333 }
2334
2335 fn visit_i16<__E>(self, __value: i16) -> _serde::#private::Result<Self::Value, __E>
2336 where
2337 __E: _serde::de::Error,
2338 {
2339 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::I16(__value)))
2340 }
2341
2342 fn visit_i32<__E>(self, __value: i32) -> _serde::#private::Result<Self::Value, __E>
2343 where
2344 __E: _serde::de::Error,
2345 {
2346 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::I32(__value)))
2347 }
2348
2349 fn visit_i64<__E>(self, __value: i64) -> _serde::#private::Result<Self::Value, __E>
2350 where
2351 __E: _serde::de::Error,
2352 {
2353 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::I64(__value)))
2354 }
2355
2356 fn visit_u8<__E>(self, __value: u8) -> _serde::#private::Result<Self::Value, __E>
2357 where
2358 __E: _serde::de::Error,
2359 {
2360 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::U8(__value)))
2361 }
2362
2363 fn visit_u16<__E>(self, __value: u16) -> _serde::#private::Result<Self::Value, __E>
2364 where
2365 __E: _serde::de::Error,
2366 {
2367 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::U16(__value)))
2368 }
2369
2370 fn visit_u32<__E>(self, __value: u32) -> _serde::#private::Result<Self::Value, __E>
2371 where
2372 __E: _serde::de::Error,
2373 {
2374 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::U32(__value)))
2375 }
2376
2377 fn visit_u64<__E>(self, __value: u64) -> _serde::#private::Result<Self::Value, __E>
2378 where
2379 __E: _serde::de::Error,
2380 {
2381 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::U64(__value)))
2382 }
2383
2384 fn visit_f32<__E>(self, __value: f32) -> _serde::#private::Result<Self::Value, __E>
2385 where
2386 __E: _serde::de::Error,
2387 {
2388 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::F32(__value)))
2389 }
2390
2391 fn visit_f64<__E>(self, __value: f64) -> _serde::#private::Result<Self::Value, __E>
2392 where
2393 __E: _serde::de::Error,
2394 {
2395 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::F64(__value)))
2396 }
2397
2398 fn visit_char<__E>(self, __value: char) -> _serde::#private::Result<Self::Value, __E>
2399 where
2400 __E: _serde::de::Error,
2401 {
2402 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::Char(__value)))
2403 }
2404
2405 fn visit_unit<__E>(self) -> _serde::#private::Result<Self::Value, __E>
2406 where
2407 __E: _serde::de::Error,
2408 {
2409 _serde::#private::Ok(__Field::__other(_serde::#private::de::Content::Unit))
2410 }
2411 }
2412 } else {
2413 let u64_mapping = deserialized_fields.iter().enumerate().map(|(i, field)| {
2414 let i = i as u64;
2415 let ident = &field.ident;
2416 quote!(#i => _serde::#private::Ok(#this_value::#ident))
2417 });
2418
2419 let u64_fallthrough_arm_tokens;
2420 let u64_fallthrough_arm = if let Some(fallthrough) = &fallthrough {
2421 fallthrough
2422 } else {
2423 let index_expecting = if is_variant { "variant" } else { "field" };
2424 let fallthrough_msg = format!(
2425 "{} index 0 <= i < {}",
2426 index_expecting,
2427 deserialized_fields.len(),
2428 );
2429 u64_fallthrough_arm_tokens = quote! {
2430 _serde::#private::Err(_serde::de::Error::invalid_value(
2431 _serde::de::Unexpected::Unsigned(__value),
2432 &#fallthrough_msg,
2433 ))
2434 };
2435 &u64_fallthrough_arm_tokens
2436 };
2437
2438 quote! {
2439 fn visit_u64<__E>(self, __value: u64) -> _serde::#private::Result<Self::Value, __E>
2440 where
2441 __E: _serde::de::Error,
2442 {
2443 match __value {
2444 #(#u64_mapping,)*
2445 _ => #u64_fallthrough_arm,
2446 }
2447 }
2448 }
2449 };
2450
2451 let visit_borrowed = if fallthrough_borrowed.is_some() || collect_other_fields {
2452 let str_mapping = str_mapping.clone();
2453 let bytes_mapping = bytes_mapping.clone();
2454 let fallthrough_borrowed_arm = fallthrough_borrowed.as_ref().unwrap_or(fallthrough_arm);
2455 Some(quote! {
2456 fn visit_borrowed_str<__E>(self, __value: &'de str) -> _serde::#private::Result<Self::Value, __E>
2457 where
2458 __E: _serde::de::Error,
2459 {
2460 match __value {
2461 #(#str_mapping)*
2462 _ => {
2463 #value_as_borrowed_str_content
2464 #fallthrough_borrowed_arm
2465 }
2466 }
2467 }
2468
2469 fn visit_borrowed_bytes<__E>(self, __value: &'de [u8]) -> _serde::#private::Result<Self::Value, __E>
2470 where
2471 __E: _serde::de::Error,
2472 {
2473 match __value {
2474 #(#bytes_mapping)*
2475 _ => {
2476 #bytes_to_str
2477 #value_as_borrowed_bytes_content
2478 #fallthrough_borrowed_arm
2479 }
2480 }
2481 }
2482 })
2483 } else {
2484 None
2485 };
2486
2487 quote_block! {
2488 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
2489 _serde::#private::Formatter::write_str(__formatter, #expecting)
2490 }
2491
2492 #visit_other
2493
2494 fn visit_str<__E>(self, __value: &str) -> _serde::#private::Result<Self::Value, __E>
2495 where
2496 __E: _serde::de::Error,
2497 {
2498 match __value {
2499 #(#str_mapping)*
2500 _ => {
2501 #value_as_str_content
2502 #fallthrough_arm
2503 }
2504 }
2505 }
2506
2507 fn visit_bytes<__E>(self, __value: &[u8]) -> _serde::#private::Result<Self::Value, __E>
2508 where
2509 __E: _serde::de::Error,
2510 {
2511 match __value {
2512 #(#bytes_mapping)*
2513 _ => {
2514 #bytes_to_str
2515 #value_as_bytes_content
2516 #fallthrough_arm
2517 }
2518 }
2519 }
2520
2521 #visit_borrowed
2522 }
2523}
2524
2525fn deserialize_map(
2526 struct_path: &TokenStream,
2527 params: &Parameters,
2528 fields: &[Field],
2529 cattrs: &attr::Container,
2530 has_flatten: bool,
2531) -> Fragment {
2532 let fields_names: Vec<_> = fields
2534 .iter()
2535 .enumerate()
2536 .map(|(i, field)| (field, field_i(i)))
2537 .collect();
2538
2539 let let_values = fields_names
2541 .iter()
2542 .filter(|&&(field, _)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
2543 .map(|(field, name)| {
2544 let field_ty = field.ty;
2545 quote! {
2546 let mut #name: _serde::#private::Option<#field_ty> = _serde::#private::None;
2547 }
2548 });
2549
2550 let let_collect = if has_flatten {
2552 Some(quote! {
2553 let mut __collect = _serde::#private::Vec::<_serde::#private::Option<(
2554 _serde::#private::de::Content,
2555 _serde::#private::de::Content
2556 )>>::new();
2557 })
2558 } else {
2559 None
2560 };
2561
2562 let value_arms = fields_names
2564 .iter()
2565 .filter(|&&(field, _)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
2566 .map(|(field, name)| {
2567 let deser_name = field.attrs.name().deserialize_name();
2568
2569 let visit = match field.attrs.deserialize_with() {
2570 None => {
2571 let field_ty = field.ty;
2572 let span = field.original.span();
2573 let func =
2574 quote_spanned!(span=> _serde::de::MapAccess::next_value::<#field_ty>);
2575 quote! {
2576 #func(&mut __map)?
2577 }
2578 }
2579 Some(path) => {
2580 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
2581 quote!({
2582 #wrapper
2583 match _serde::de::MapAccess::next_value::<#wrapper_ty>(&mut __map) {
2584 _serde::#private::Ok(__wrapper) => __wrapper.value,
2585 _serde::#private::Err(__err) => {
2586 return _serde::#private::Err(__err);
2587 }
2588 }
2589 })
2590 }
2591 };
2592 quote! {
2593 __Field::#name => {
2594 if _serde::#private::Option::is_some(&#name) {
2595 return _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#deser_name));
2596 }
2597 #name = _serde::#private::Some(#visit);
2598 }
2599 }
2600 });
2601
2602 let ignored_arm = if has_flatten {
2604 Some(quote! {
2605 __Field::__other(__name) => {
2606 __collect.push(_serde::#private::Some((
2607 __name,
2608 _serde::de::MapAccess::next_value_seed(&mut __map, _serde::#private::de::ContentVisitor::new())?)));
2609 }
2610 })
2611 } else if cattrs.deny_unknown_fields() {
2612 None
2613 } else {
2614 Some(quote! {
2615 _ => { let _ = _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?; }
2616 })
2617 };
2618
2619 let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
2620 let match_keys = if cattrs.deny_unknown_fields() && all_skipped {
2621 quote! {
2622 _serde::#private::Option::map(
2625 _serde::de::MapAccess::next_key::<__Field>(&mut __map)?,
2626 |__impossible| match __impossible {});
2627 }
2628 } else {
2629 quote! {
2630 while let _serde::#private::Some(__key) = _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
2631 match __key {
2632 #(#value_arms)*
2633 #ignored_arm
2634 }
2635 }
2636 }
2637 };
2638
2639 let extract_values = fields_names
2640 .iter()
2641 .filter(|&&(field, _)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
2642 .map(|(field, name)| {
2643 let missing_expr = Match(expr_is_missing(field, cattrs));
2644
2645 quote! {
2646 let #name = match #name {
2647 _serde::#private::Some(#name) => #name,
2648 _serde::#private::None => #missing_expr
2649 };
2650 }
2651 });
2652
2653 let extract_collected = fields_names
2654 .iter()
2655 .filter(|&&(field, _)| field.attrs.flatten() && !field.attrs.skip_deserializing())
2656 .map(|(field, name)| {
2657 let field_ty = field.ty;
2658 let func = match field.attrs.deserialize_with() {
2659 None => {
2660 let span = field.original.span();
2661 quote_spanned!(span=> _serde::de::Deserialize::deserialize)
2662 }
2663 Some(path) => quote!(#path),
2664 };
2665 quote! {
2666 let #name: #field_ty = #func(
2667 _serde::#private::de::FlatMapDeserializer(
2668 &mut __collect,
2669 _serde::#private::PhantomData))?;
2670 }
2671 });
2672
2673 let collected_deny_unknown_fields = if has_flatten && cattrs.deny_unknown_fields() {
2674 Some(quote! {
2675 if let _serde::#private::Some(_serde::#private::Some((__key, _))) =
2676 __collect.into_iter().filter(_serde::#private::Option::is_some).next()
2677 {
2678 if let _serde::#private::Some(__key) = _serde::#private::de::content_as_str(&__key) {
2679 return _serde::#private::Err(
2680 _serde::de::Error::custom(format_args!("unknown field `{}`", &__key)));
2681 } else {
2682 return _serde::#private::Err(
2683 _serde::de::Error::custom(format_args!("unexpected map key")));
2684 }
2685 }
2686 })
2687 } else {
2688 None
2689 };
2690
2691 let result = fields_names.iter().map(|(field, name)| {
2692 let member = &field.member;
2693 if field.attrs.skip_deserializing() {
2694 let value = Expr(expr_is_missing(field, cattrs));
2695 quote!(#member: #value)
2696 } else {
2697 quote!(#member: #name)
2698 }
2699 });
2700
2701 let let_default = match cattrs.default() {
2702 attr::Default::Default => Some(quote!(
2703 let __default: Self::Value = _serde::#private::Default::default();
2704 )),
2705 attr::Default::Path(path) => Some(quote_spanned!(path.span()=>
2710 let __default: Self::Value = #path();
2711 )),
2712 attr::Default::None => {
2713 None
2716 }
2717 };
2718
2719 let mut result = quote!(#struct_path { #(#result),* });
2720 if params.has_getter {
2721 let this_type = ¶ms.this_type;
2722 let (_, ty_generics, _) = params.generics.split_for_impl();
2723 result = quote! {
2724 _serde::#private::Into::<#this_type #ty_generics>::into(#result)
2725 };
2726 }
2727
2728 quote_block! {
2729 #(#let_values)*
2730
2731 #let_collect
2732
2733 #match_keys
2734
2735 #let_default
2736
2737 #(#extract_values)*
2738
2739 #(#extract_collected)*
2740
2741 #collected_deny_unknown_fields
2742
2743 _serde::#private::Ok(#result)
2744 }
2745}
2746
2747#[cfg(feature = "deserialize_in_place")]
2748fn deserialize_map_in_place(
2749 params: &Parameters,
2750 fields: &[Field],
2751 cattrs: &attr::Container,
2752) -> Fragment {
2753 assert!(
2754 !has_flatten(fields),
2755 "inplace deserialization of maps does not support flatten fields"
2756 );
2757
2758 let fields_names: Vec<_> = fields
2760 .iter()
2761 .enumerate()
2762 .map(|(i, field)| (field, field_i(i)))
2763 .collect();
2764
2765 let let_flags = fields_names
2768 .iter()
2769 .filter(|&&(field, _)| !field.attrs.skip_deserializing())
2770 .map(|(_, name)| {
2771 quote! {
2772 let mut #name: bool = false;
2773 }
2774 });
2775
2776 let value_arms_from = fields_names
2778 .iter()
2779 .filter(|&&(field, _)| !field.attrs.skip_deserializing())
2780 .map(|(field, name)| {
2781 let deser_name = field.attrs.name().deserialize_name();
2782 let member = &field.member;
2783
2784 let visit = match field.attrs.deserialize_with() {
2785 None => {
2786 quote! {
2787 _serde::de::MapAccess::next_value_seed(&mut __map, _serde::#private::de::InPlaceSeed(&mut self.place.#member))?
2788 }
2789 }
2790 Some(path) => {
2791 let (wrapper, wrapper_ty) = wrap_deserialize_field_with(params, field.ty, path);
2792 quote!({
2793 #wrapper
2794 self.place.#member = match _serde::de::MapAccess::next_value::<#wrapper_ty>(&mut __map) {
2795 _serde::#private::Ok(__wrapper) => __wrapper.value,
2796 _serde::#private::Err(__err) => {
2797 return _serde::#private::Err(__err);
2798 }
2799 };
2800 })
2801 }
2802 };
2803 quote! {
2804 __Field::#name => {
2805 if #name {
2806 return _serde::#private::Err(<__A::Error as _serde::de::Error>::duplicate_field(#deser_name));
2807 }
2808 #visit;
2809 #name = true;
2810 }
2811 }
2812 });
2813
2814 let ignored_arm = if cattrs.deny_unknown_fields() {
2816 None
2817 } else {
2818 Some(quote! {
2819 _ => { let _ = _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?; }
2820 })
2821 };
2822
2823 let all_skipped = fields.iter().all(|field| field.attrs.skip_deserializing());
2824
2825 let match_keys = if cattrs.deny_unknown_fields() && all_skipped {
2826 quote! {
2827 _serde::#private::Option::map(
2830 _serde::de::MapAccess::next_key::<__Field>(&mut __map)?,
2831 |__impossible| match __impossible {});
2832 }
2833 } else {
2834 quote! {
2835 while let _serde::#private::Some(__key) = _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
2836 match __key {
2837 #(#value_arms_from)*
2838 #ignored_arm
2839 }
2840 }
2841 }
2842 };
2843
2844 let check_flags = fields_names
2845 .iter()
2846 .filter(|&&(field, _)| !field.attrs.skip_deserializing())
2847 .map(|(field, name)| {
2848 let missing_expr = expr_is_missing(field, cattrs);
2849 if field.attrs.default().is_none()
2852 && cattrs.default().is_none()
2853 && field.attrs.deserialize_with().is_some()
2854 {
2855 let missing_expr = Stmts(missing_expr);
2856 quote! {
2857 if !#name {
2858 #missing_expr;
2859 }
2860 }
2861 } else {
2862 let member = &field.member;
2863 let missing_expr = Expr(missing_expr);
2864 quote! {
2865 if !#name {
2866 self.place.#member = #missing_expr;
2867 };
2868 }
2869 }
2870 });
2871
2872 let this_type = ¶ms.this_type;
2873 let (_, _, ty_generics, _) = split_with_de_lifetime(params);
2874
2875 let let_default = match cattrs.default() {
2876 attr::Default::Default => Some(quote!(
2877 let __default: #this_type #ty_generics = _serde::#private::Default::default();
2878 )),
2879 attr::Default::Path(path) => Some(quote_spanned!(path.span()=>
2884 let __default: #this_type #ty_generics = #path();
2885 )),
2886 attr::Default::None => {
2887 None
2890 }
2891 };
2892
2893 quote_block! {
2894 #(#let_flags)*
2895
2896 #match_keys
2897
2898 #let_default
2899
2900 #(#check_flags)*
2901
2902 _serde::#private::Ok(())
2903 }
2904}
2905
2906fn field_i(i: usize) -> Ident {
2907 Ident::new(&format!("__field{}", i), Span::call_site())
2908}
2909
2910fn wrap_deserialize_with(
2913 params: &Parameters,
2914 value_ty: &TokenStream,
2915 deserialize_with: &syn::ExprPath,
2916) -> (TokenStream, TokenStream) {
2917 let this_type = ¶ms.this_type;
2918 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
2919 split_with_de_lifetime(params);
2920 let delife = params.borrowed.de_lifetime();
2921 let deserializer_var = quote!(__deserializer);
2922
2923 let value = quote_spanned! {deserialize_with.span()=>
2928 #deserialize_with(#deserializer_var)?
2929 };
2930 let wrapper = quote! {
2931 #[doc(hidden)]
2932 struct __DeserializeWith #de_impl_generics #where_clause {
2933 value: #value_ty,
2934 phantom: _serde::#private::PhantomData<#this_type #ty_generics>,
2935 lifetime: _serde::#private::PhantomData<&#delife ()>,
2936 }
2937
2938 #[automatically_derived]
2939 impl #de_impl_generics _serde::Deserialize<#delife> for __DeserializeWith #de_ty_generics #where_clause {
2940 fn deserialize<__D>(#deserializer_var: __D) -> _serde::#private::Result<Self, __D::Error>
2941 where
2942 __D: _serde::Deserializer<#delife>,
2943 {
2944 _serde::#private::Ok(__DeserializeWith {
2945 value: #value,
2946 phantom: _serde::#private::PhantomData,
2947 lifetime: _serde::#private::PhantomData,
2948 })
2949 }
2950 }
2951 };
2952
2953 let wrapper_ty = quote!(__DeserializeWith #de_ty_generics);
2954
2955 (wrapper, wrapper_ty)
2956}
2957
2958fn wrap_deserialize_field_with(
2959 params: &Parameters,
2960 field_ty: &syn::Type,
2961 deserialize_with: &syn::ExprPath,
2962) -> (TokenStream, TokenStream) {
2963 wrap_deserialize_with(params, "e!(#field_ty), deserialize_with)
2964}
2965
2966fn wrap_deserialize_variant_with(
2967 params: &Parameters,
2968 variant: &Variant,
2969 deserialize_with: &syn::ExprPath,
2970) -> (TokenStream, TokenStream, TokenStream) {
2971 let field_tys = variant.fields.iter().map(|field| field.ty);
2972 let (wrapper, wrapper_ty) =
2973 wrap_deserialize_with(params, "e!((#(#field_tys),*)), deserialize_with);
2974
2975 let unwrap_fn = unwrap_to_variant_closure(params, variant, true);
2976
2977 (wrapper, wrapper_ty, unwrap_fn)
2978}
2979
2980fn unwrap_to_variant_closure(
2982 params: &Parameters,
2983 variant: &Variant,
2984 with_wrapper: bool,
2985) -> TokenStream {
2986 let this_value = ¶ms.this_value;
2987 let variant_ident = &variant.ident;
2988
2989 let (arg, wrapper) = if with_wrapper {
2990 (quote! { __wrap }, quote! { __wrap.value })
2991 } else {
2992 let field_tys = variant.fields.iter().map(|field| field.ty);
2993 (quote! { __wrap: (#(#field_tys),*) }, quote! { __wrap })
2994 };
2995
2996 let field_access = (0..variant.fields.len()).map(|n| {
2997 Member::Unnamed(Index {
2998 index: n as u32,
2999 span: Span::call_site(),
3000 })
3001 });
3002
3003 match variant.style {
3004 Style::Struct if variant.fields.len() == 1 => {
3005 let member = &variant.fields[0].member;
3006 quote! {
3007 |#arg| #this_value::#variant_ident { #member: #wrapper }
3008 }
3009 }
3010 Style::Struct => {
3011 let members = variant.fields.iter().map(|field| &field.member);
3012 quote! {
3013 |#arg| #this_value::#variant_ident { #(#members: #wrapper.#field_access),* }
3014 }
3015 }
3016 Style::Tuple => quote! {
3017 |#arg| #this_value::#variant_ident(#(#wrapper.#field_access),*)
3018 },
3019 Style::Newtype => quote! {
3020 |#arg| #this_value::#variant_ident(#wrapper)
3021 },
3022 Style::Unit => quote! {
3023 |#arg| #this_value::#variant_ident
3024 },
3025 }
3026}
3027
3028fn expr_is_missing(field: &Field, cattrs: &attr::Container) -> Fragment {
3029 match field.attrs.default() {
3030 attr::Default::Default => {
3031 let span = field.original.span();
3032 let func = quote_spanned!(span=> _serde::#private::Default::default);
3033 return quote_expr!(#func());
3034 }
3035 attr::Default::Path(path) => {
3036 return Fragment::Expr(quote_spanned!(path.span()=> #path()));
3041 }
3042 attr::Default::None => { }
3043 }
3044
3045 match *cattrs.default() {
3046 attr::Default::Default | attr::Default::Path(_) => {
3047 let member = &field.member;
3048 return quote_expr!(__default.#member);
3049 }
3050 attr::Default::None => { }
3051 }
3052
3053 let name = field.attrs.name().deserialize_name();
3054 match field.attrs.deserialize_with() {
3055 None => {
3056 let span = field.original.span();
3057 let func = quote_spanned!(span=> _serde::#private::de::missing_field);
3058 quote_expr! {
3059 #func(#name)?
3060 }
3061 }
3062 Some(_) => {
3063 quote_expr! {
3064 return _serde::#private::Err(<__A::Error as _serde::de::Error>::missing_field(#name))
3065 }
3066 }
3067 }
3068}
3069
3070fn expr_is_missing_seq(
3071 assign_to: Option<TokenStream>,
3072 index: usize,
3073 field: &Field,
3074 cattrs: &attr::Container,
3075 expecting: &str,
3076) -> TokenStream {
3077 match field.attrs.default() {
3078 attr::Default::Default => {
3079 let span = field.original.span();
3080 return quote_spanned!(span=> #assign_to _serde::#private::Default::default());
3081 }
3082 attr::Default::Path(path) => {
3083 return quote_spanned!(path.span()=> #assign_to #path());
3088 }
3089 attr::Default::None => { }
3090 }
3091
3092 match *cattrs.default() {
3093 attr::Default::Default | attr::Default::Path(_) => {
3094 let member = &field.member;
3095 quote!(#assign_to __default.#member)
3096 }
3097 attr::Default::None => quote!(
3098 return _serde::#private::Err(_serde::de::Error::invalid_length(#index, &#expecting))
3099 ),
3100 }
3101}
3102
3103fn effective_style(variant: &Variant) -> Style {
3104 match variant.style {
3105 Style::Newtype if variant.fields[0].attrs.skip_deserializing() => Style::Unit,
3106 other => other,
3107 }
3108}
3109
3110fn has_flatten(fields: &[Field]) -> bool {
3113 fields
3114 .iter()
3115 .any(|field| field.attrs.flatten() && !field.attrs.skip_deserializing())
3116}
3117
3118struct DeImplGenerics<'a>(&'a Parameters);
3119#[cfg(feature = "deserialize_in_place")]
3120struct InPlaceImplGenerics<'a>(&'a Parameters);
3121
3122impl<'a> ToTokens for DeImplGenerics<'a> {
3123 fn to_tokens(&self, tokens: &mut TokenStream) {
3124 let mut generics = self.0.generics.clone();
3125 if let Some(de_lifetime) = self.0.borrowed.de_lifetime_param() {
3126 generics.params = Some(syn::GenericParam::Lifetime(de_lifetime))
3127 .into_iter()
3128 .chain(generics.params)
3129 .collect();
3130 }
3131 let (impl_generics, _, _) = generics.split_for_impl();
3132 impl_generics.to_tokens(tokens);
3133 }
3134}
3135
3136#[cfg(feature = "deserialize_in_place")]
3137impl<'a> ToTokens for InPlaceImplGenerics<'a> {
3138 fn to_tokens(&self, tokens: &mut TokenStream) {
3139 let place_lifetime = place_lifetime();
3140 let mut generics = self.0.generics.clone();
3141
3142 for param in &mut generics.params {
3144 match param {
3145 syn::GenericParam::Lifetime(param) => {
3146 param.bounds.push(place_lifetime.lifetime.clone());
3147 }
3148 syn::GenericParam::Type(param) => {
3149 param.bounds.push(syn::TypeParamBound::Lifetime(
3150 place_lifetime.lifetime.clone(),
3151 ));
3152 }
3153 syn::GenericParam::Const(_) => {}
3154 }
3155 }
3156 generics.params = Some(syn::GenericParam::Lifetime(place_lifetime))
3157 .into_iter()
3158 .chain(generics.params)
3159 .collect();
3160 if let Some(de_lifetime) = self.0.borrowed.de_lifetime_param() {
3161 generics.params = Some(syn::GenericParam::Lifetime(de_lifetime))
3162 .into_iter()
3163 .chain(generics.params)
3164 .collect();
3165 }
3166 let (impl_generics, _, _) = generics.split_for_impl();
3167 impl_generics.to_tokens(tokens);
3168 }
3169}
3170
3171#[cfg(feature = "deserialize_in_place")]
3172impl<'a> DeImplGenerics<'a> {
3173 fn in_place(self) -> InPlaceImplGenerics<'a> {
3174 InPlaceImplGenerics(self.0)
3175 }
3176}
3177
3178struct DeTypeGenerics<'a>(&'a Parameters);
3179#[cfg(feature = "deserialize_in_place")]
3180struct InPlaceTypeGenerics<'a>(&'a Parameters);
3181
3182fn de_type_generics_to_tokens(
3183 mut generics: syn::Generics,
3184 borrowed: &BorrowedLifetimes,
3185 tokens: &mut TokenStream,
3186) {
3187 if borrowed.de_lifetime_param().is_some() {
3188 let def = syn::LifetimeParam {
3189 attrs: Vec::new(),
3190 lifetime: syn::Lifetime::new("'de", Span::call_site()),
3191 colon_token: None,
3192 bounds: Punctuated::new(),
3193 };
3194 generics.params = Some(syn::GenericParam::Lifetime(def))
3196 .into_iter()
3197 .chain(generics.params)
3198 .collect();
3199 }
3200 let (_, ty_generics, _) = generics.split_for_impl();
3201 ty_generics.to_tokens(tokens);
3202}
3203
3204impl<'a> ToTokens for DeTypeGenerics<'a> {
3205 fn to_tokens(&self, tokens: &mut TokenStream) {
3206 de_type_generics_to_tokens(self.0.generics.clone(), &self.0.borrowed, tokens);
3207 }
3208}
3209
3210#[cfg(feature = "deserialize_in_place")]
3211impl<'a> ToTokens for InPlaceTypeGenerics<'a> {
3212 fn to_tokens(&self, tokens: &mut TokenStream) {
3213 let mut generics = self.0.generics.clone();
3214 generics.params = Some(syn::GenericParam::Lifetime(place_lifetime()))
3215 .into_iter()
3216 .chain(generics.params)
3217 .collect();
3218
3219 de_type_generics_to_tokens(generics, &self.0.borrowed, tokens);
3220 }
3221}
3222
3223#[cfg(feature = "deserialize_in_place")]
3224impl<'a> DeTypeGenerics<'a> {
3225 fn in_place(self) -> InPlaceTypeGenerics<'a> {
3226 InPlaceTypeGenerics(self.0)
3227 }
3228}
3229
3230#[cfg(feature = "deserialize_in_place")]
3231fn place_lifetime() -> syn::LifetimeParam {
3232 syn::LifetimeParam {
3233 attrs: Vec::new(),
3234 lifetime: syn::Lifetime::new("'place", Span::call_site()),
3235 colon_token: None,
3236 bounds: Punctuated::new(),
3237 }
3238}
3239
3240fn split_with_de_lifetime(
3241 params: &Parameters,
3242) -> (
3243 DeImplGenerics,
3244 DeTypeGenerics,
3245 syn::TypeGenerics,
3246 Option<&syn::WhereClause>,
3247) {
3248 let de_impl_generics = DeImplGenerics(params);
3249 let de_ty_generics = DeTypeGenerics(params);
3250 let (_, ty_generics, where_clause) = params.generics.split_for_impl();
3251 (de_impl_generics, de_ty_generics, ty_generics, where_clause)
3252}