serde_derive/de/
tuple.rs

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
12/// Generates `Deserialize::deserialize` body for a `struct Tuple(...);` including `struct Newtype(T);`
13pub(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 = &params.this_type;
30    let this_value = &params.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    // If there are getters (implying private fields), construct the local type
36    // and use an `Into` conversion to get the remote type. If there are no
37    // getters then construct the target type directly.
38    let construct = if params.has_getter {
39        let local = &params.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            // If #path returns wrong type, error will be reported here (^^^^^).
154            // We attach span of the path to the function so it will be reported
155            // on the #[serde(with = "...")]
156            //                       ^^^^^
157            {
    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 = &params.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/// Generates `Deserialize::deserialize_in_place` body for a `struct Tuple(...);` including `struct Newtype(T);`
185#[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 = &params.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        // We do not generate deserialize_in_place if every field has a
213        // deserialize_with.
214        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}