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