1use crate::de::{deserialize_seq, has_flatten, Parameters, TupleForm};
2#[cfg(feature = "deserialize_in_place")]
3use crate::de::{deserialize_seq_in_place, place_lifetime};
4use crate::fragment::{Fragment, Stmts};
5use crate::internals::ast::Field;
6use crate::internals::attr;
7use crate::private;
8use proc_macro2::TokenStream;
9use quote::{quote, quote_spanned};
10use syn::spanned::Spanned;
11
12pub(super) fn deserialize(
14 params: &Parameters,
15 fields: &[Field],
16 cattrs: &attr::Container,
17 form: TupleForm,
18) -> Fragment {
19 if !!has_flatten(fields) {
{
::core::panicking::panic_fmt(format_args!("tuples and tuple variants cannot have flatten fields"));
}
};assert!(
20 !has_flatten(fields),
21 "tuples and tuple variants cannot have flatten fields"
22 );
23
24 let field_count = fields
25 .iter()
26 .filter(|field| !field.attrs.skip_deserializing())
27 .count();
28
29 let this_type = ¶ms.this_type;
30 let this_value = ¶ms.this_value;
31 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
32 params.generics_with_de_lifetime();
33 let delife = params.borrowed.de_lifetime();
34
35 let construct = if params.has_getter {
39 let local = ¶ms.local;
40 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&local, &mut _s);
_s
}quote!(#local)
41 } else {
42 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&this_value, &mut _s);
_s
}quote!(#this_value)
43 };
44
45 let type_path = match form {
46 TupleForm::Tuple => construct,
47 TupleForm::ExternallyTagged(variant_ident) | TupleForm::Untagged(variant_ident) => {
48 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&construct, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&variant_ident, &mut _s);
_s
}quote!(#construct::#variant_ident)
49 }
50 };
51 let expecting = match form {
52 TupleForm::Tuple => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("tuple struct {0}",
params.type_name()))
})format!("tuple struct {}", params.type_name()),
53 TupleForm::ExternallyTagged(variant_ident) | TupleForm::Untagged(variant_ident) => {
54 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("tuple variant {0}::{1}",
params.type_name(), variant_ident))
})format!("tuple variant {}::{}", params.type_name(), variant_ident)
55 }
56 };
57 let expecting = cattrs.expecting().unwrap_or(&expecting);
58
59 let nfields = fields.len();
60
61 let visit_newtype_struct = match form {
62 TupleForm::Tuple if nfields == 1 => {
63 Some(deserialize_newtype_struct(&type_path, params, &fields[0]))
64 }
65 _ => None,
66 };
67
68 let visit_seq = Stmts(deserialize_seq(
69 &type_path, params, fields, false, cattrs, expecting,
70 ));
71
72 let visitor_expr = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__Visitor");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "marker");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "PhantomData");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&this_type, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "lifetime");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "PhantomData");
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
73 __Visitor {
74 marker: _serde::#private::PhantomData::<#this_type #ty_generics>,
75 lifetime: _serde::#private::PhantomData,
76 }
77 };
78 let dispatch = match form {
79 TupleForm::Tuple if nfields == 1 => {
80 let type_name = cattrs.name().deserialize_name();
81 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Deserializer");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize_newtype_struct");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__deserializer");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&type_name, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&visitor_expr, &mut _s);
_s
});
_s
}quote! {
82 _serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr)
83 }
84 }
85 TupleForm::Tuple => {
86 let type_name = cattrs.name().deserialize_name();
87 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Deserializer");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize_tuple_struct");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__deserializer");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&type_name, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&field_count, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&visitor_expr, &mut _s);
_s
});
_s
}quote! {
88 _serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #field_count, #visitor_expr)
89 }
90 }
91 TupleForm::ExternallyTagged(_) => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "VariantAccess");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "tuple_variant");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__variant");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&field_count, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&visitor_expr, &mut _s);
_s
});
_s
}quote! {
92 _serde::de::VariantAccess::tuple_variant(__variant, #field_count, #visitor_expr)
93 },
94 TupleForm::Untagged(_) => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Deserializer");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize_tuple");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__deserializer");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&field_count, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&visitor_expr, &mut _s);
_s
});
_s
}quote! {
95 _serde::Deserializer::deserialize_tuple(__deserializer, #field_count, #visitor_expr)
96 },
97 };
98
99 let visitor_var = if field_count == 0 {
100 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_underscore(&mut _s);
_s
}quote!(_)
101 } else {
102 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "__seq");
_s
}quote!(mut __seq)
103 };
104
105 crate::fragment::Fragment::Block({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "hidden");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "struct");
::quote::__private::push_ident(&mut _s, "__Visitor");
::quote::ToTokens::to_tokens(&de_impl_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "marker");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "PhantomData");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&this_type, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "lifetime");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "PhantomData");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::ToTokens::to_tokens(&delife, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"automatically_derived");
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&de_impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Visitor");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&delife, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::__private::push_ident(&mut _s, "__Visitor");
::quote::ToTokens::to_tokens(&de_ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "type");
::quote::__private::push_ident(&mut _s, "Value");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&this_type, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "expecting");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__formatter");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Formatter");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Formatter");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "write_str");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__formatter");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&expecting, &mut _s);
_s
});
_s
});
::quote::ToTokens::to_tokens(&visit_newtype_struct, &mut _s);
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "inline");
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "visit_seq");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__A");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&visitor_var, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "__A");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Value");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__A");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "__A");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SeqAccess");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&delife, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&visit_seq, &mut _s);
_s
});
_s
});
::quote::ToTokens::to_tokens(&dispatch, &mut _s);
_s
});quote_block! {
106 #[doc(hidden)]
107 struct __Visitor #de_impl_generics #where_clause {
108 marker: _serde::#private::PhantomData<#this_type #ty_generics>,
109 lifetime: _serde::#private::PhantomData<&#delife ()>,
110 }
111
112 #[automatically_derived]
113 impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
114 type Value = #this_type #ty_generics;
115
116 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
117 _serde::#private::Formatter::write_str(__formatter, #expecting)
118 }
119
120 #visit_newtype_struct
121
122 #[inline]
123 fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::#private::Result<Self::Value, __A::Error>
124 where
125 __A: _serde::de::SeqAccess<#delife>,
126 {
127 #visit_seq
128 }
129 }
130
131 #dispatch
132 }
133}
134
135fn deserialize_newtype_struct(
136 type_path: &TokenStream,
137 params: &Parameters,
138 field: &Field,
139) -> TokenStream {
140 let delife = params.borrowed.de_lifetime();
141 let field_ty = field.ty;
142 let deserializer_var = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__e");
_s
}quote!(__e);
143
144 let value = match field.attrs.deserialize_with() {
145 None => {
146 let span = field.original.span();
147 let func = {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&field_ty, &mut _s);
::quote::__private::push_ident_spanned(&mut _s, _span, "as");
::quote::__private::push_ident_spanned(&mut _s, _span, "_serde");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Deserialize");
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "deserialize");
_s
}quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);
148 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&func, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&deserializer_var, &mut _s);
_s
});
::quote::__private::push_question(&mut _s);
_s
}quote! {
149 #func(#deserializer_var)?
150 }
151 }
152 Some(path) => {
153 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(path.span()).__into_span();
::quote::ToTokens::to_tokens(&path, &mut _s);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&deserializer_var, &mut _s);
_s
});
::quote::__private::push_question_spanned(&mut _s, _span);
_s
}quote_spanned! {path.span()=>
158 #path(#deserializer_var)?
159 }
160 }
161 };
162
163 let mut result = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&type_path, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__field0");
_s
});
_s
}quote!(#type_path(__field0));
164 if params.has_getter {
165 let this_type = ¶ms.this_type;
166 let (_, ty_generics, _) = params.generics.split_for_impl();
167 result = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Into");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&this_type, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result, &mut _s);
_s
});
_s
}quote! {
168 _serde::#private::Into::<#this_type #ty_generics>::into(#result)
169 };
170 }
171
172 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "inline");
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "visit_newtype_struct");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__E");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&deserializer_var, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "__E");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Value");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__E");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "__E");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Deserializer");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&delife, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__field0");
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&field_ty, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&value, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "_serde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result, &mut _s);
_s
});
_s
});
_s
}quote! {
173 #[inline]
174 fn visit_newtype_struct<__E>(self, #deserializer_var: __E) -> _serde::#private::Result<Self::Value, __E::Error>
175 where
176 __E: _serde::Deserializer<#delife>,
177 {
178 let __field0: #field_ty = #value;
179 _serde::#private::Ok(#result)
180 }
181 }
182}
183
184#[cfg(feature = "deserialize_in_place")]
186pub(super) fn deserialize_in_place(
187 params: &Parameters,
188 fields: &[Field],
189 cattrs: &attr::Container,
190) -> Fragment {
191 assert!(
192 !has_flatten(fields),
193 "tuples and tuple variants cannot have flatten fields"
194 );
195
196 let field_count = fields
197 .iter()
198 .filter(|field| !field.attrs.skip_deserializing())
199 .count();
200
201 let this_type = ¶ms.this_type;
202 let (de_impl_generics, de_ty_generics, ty_generics, where_clause) =
203 params.generics_with_de_lifetime();
204 let delife = params.borrowed.de_lifetime();
205
206 let expecting = format!("tuple struct {}", params.type_name());
207 let expecting = cattrs.expecting().unwrap_or(&expecting);
208
209 let nfields = fields.len();
210
211 let visit_newtype_struct = if nfields == 1 {
212 assert!(fields[0].attrs.deserialize_with().is_none());
215
216 Some(quote! {
217 #[inline]
218 fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::#private::Result<Self::Value, __E::Error>
219 where
220 __E: _serde::Deserializer<#delife>,
221 {
222 _serde::Deserialize::deserialize_in_place(__e, &mut self.place.0)
223 }
224 })
225 } else {
226 None
227 };
228
229 let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, expecting));
230
231 let visitor_expr = quote! {
232 __Visitor {
233 place: __place,
234 lifetime: _serde::#private::PhantomData,
235 }
236 };
237
238 let type_name = cattrs.name().deserialize_name();
239 let dispatch = if nfields == 1 {
240 quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))
241 } else {
242 quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #field_count, #visitor_expr))
243 };
244
245 let visitor_var = if field_count == 0 {
246 quote!(_)
247 } else {
248 quote!(mut __seq)
249 };
250
251 let in_place_impl_generics = de_impl_generics.in_place();
252 let in_place_ty_generics = de_ty_generics.in_place();
253 let place_life = place_lifetime();
254
255 quote_block! {
256 #[doc(hidden)]
257 struct __Visitor #in_place_impl_generics #where_clause {
258 place: &#place_life mut #this_type #ty_generics,
259 lifetime: _serde::#private::PhantomData<&#delife ()>,
260 }
261
262 #[automatically_derived]
263 impl #in_place_impl_generics _serde::de::Visitor<#delife> for __Visitor #in_place_ty_generics #where_clause {
264 type Value = ();
265
266 fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result {
267 _serde::#private::Formatter::write_str(__formatter, #expecting)
268 }
269
270 #visit_newtype_struct
271
272 #[inline]
273 fn visit_seq<__A>(self, #visitor_var: __A) -> _serde::#private::Result<Self::Value, __A::Error>
274 where
275 __A: _serde::de::SeqAccess<#delife>,
276 {
277 #visit_seq
278 }
279 }
280
281 #dispatch
282 }
283}