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