Skip to main content

serde_derive/
ser.rs

1use crate::de::field_i;
2use crate::deprecated::allow_deprecated;
3use crate::fragment::{Fragment, Match, Stmts};
4use crate::internals::ast::{Container, Data, Field, Style, Variant};
5use crate::internals::name::Name;
6use crate::internals::{attr, replace_receiver, Ctxt, Derive};
7use crate::{bound, dummy, pretend, private, this};
8use proc_macro2::{Span, TokenStream};
9use quote::{quote, quote_spanned};
10use syn::spanned::Spanned;
11use syn::{parse_quote, Ident, Index, Member};
12
13pub fn expand_derive_serialize(input: &mut syn::DeriveInput) -> syn::Result<TokenStream> {
14    replace_receiver(input);
15
16    let ctxt = Ctxt::new();
17    let Some(cont) = Container::from_ast(&ctxt, input, Derive::Serialize, &private.ident()) else {
18        return Err(ctxt.check().unwrap_err());
19    };
20    precondition(&ctxt, &cont);
21    ctxt.check()?;
22
23    let ident = &cont.ident;
24    let params = Parameters::new(&cont);
25    let (impl_generics, ty_generics, where_clause) = params.generics.split_for_impl();
26    let body = Stmts(serialize_body(&cont, &params));
27    let allow_deprecated = allow_deprecated(input);
28
29    let impl_block = if let Some(remote) = cont.attrs.remote() {
30        let vis = &input.vis;
31        let used = pretend::pretend_used(&cont, params.is_packed);
32        {
    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, "automatically_derived");
            _s
        });
    ::quote::ToTokens::to_tokens(&allow_deprecated, &mut _s);
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::ToTokens::to_tokens(&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::ToTokens::to_tokens(&vis, &mut _s);
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "serialize");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__S");
            ::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_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::ToTokens::to_tokens(&remote, &mut _s);
                    ::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__serializer");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__S");
                    _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, "__S");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ok");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__S");
            ::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, "__S");
            ::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, "Serializer");
            ::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(&used, &mut _s);
                    ::quote::ToTokens::to_tokens(&body, &mut _s);
                    _s
                });
            _s
        });
    _s
}quote! {
33            #[automatically_derived]
34            #allow_deprecated
35            impl #impl_generics #ident #ty_generics #where_clause {
36                #vis fn serialize<__S>(__self: &#remote #ty_generics, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>
37                where
38                    __S: _serde::Serializer,
39                {
40                    #used
41                    #body
42                }
43            }
44        }
45    } else {
46        {
    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, "automatically_derived");
            _s
        });
    ::quote::ToTokens::to_tokens(&allow_deprecated, &mut _s);
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
    ::quote::__private::push_ident(&mut _s, "_serde");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Serialize");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&ident, &mut _s);
    ::quote::ToTokens::to_tokens(&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, "fn");
            ::quote::__private::push_ident(&mut _s, "serialize");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__S");
            ::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_and(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__serializer");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__S");
                    _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, "__S");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Ok");
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "__S");
            ::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, "__S");
            ::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, "Serializer");
            ::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(&body, &mut _s);
                    _s
                });
            _s
        });
    _s
}quote! {
47            #[automatically_derived]
48            #allow_deprecated
49            impl #impl_generics _serde::Serialize for #ident #ty_generics #where_clause {
50                fn serialize<__S>(&self, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>
51                where
52                    __S: _serde::Serializer,
53                {
54                    #body
55                }
56            }
57        }
58    };
59
60    Ok(dummy::wrap_in_const(
61        cont.attrs.custom_serde_path(),
62        impl_block,
63    ))
64}
65
66fn precondition(cx: &Ctxt, cont: &Container) {
67    match cont.attrs.identifier() {
68        attr::Identifier::No => {}
69        attr::Identifier::Field => {
70            cx.error_spanned_by(cont.original, "field identifiers cannot be serialized");
71        }
72        attr::Identifier::Variant => {
73            cx.error_spanned_by(cont.original, "variant identifiers cannot be serialized");
74        }
75    }
76}
77
78struct Parameters {
79    /// Variable holding the value being serialized. Either `self` for local
80    /// types or `__self` for remote types.
81    self_var: Ident,
82
83    /// Path to the type the impl is for. Either a single `Ident` for local
84    /// types (does not include generic parameters) or `some::remote::Path` for
85    /// remote types.
86    this_type: syn::Path,
87
88    /// Same as `this_type` but using `::<T>` for generic parameters for use in
89    /// expression position.
90    this_value: syn::Path,
91
92    /// Generics including any explicit and inferred bounds for the impl.
93    generics: syn::Generics,
94
95    /// Type has a `serde(remote = "...")` attribute.
96    is_remote: bool,
97
98    /// Type has a repr(packed) attribute.
99    is_packed: bool,
100}
101
102impl Parameters {
103    fn new(cont: &Container) -> Self {
104        let is_remote = cont.attrs.remote().is_some();
105        let self_var = if is_remote {
106            Ident::new("__self", Span::call_site())
107        } else {
108            Ident::new("self", Span::call_site())
109        };
110
111        let this_type = this::this_type(cont);
112        let this_value = this::this_value(cont);
113        let is_packed = cont.attrs.is_packed();
114        let generics = build_generics(cont);
115
116        Parameters {
117            self_var,
118            this_type,
119            this_value,
120            generics,
121            is_remote,
122            is_packed,
123        }
124    }
125
126    /// Type name to use in error messages and `&'static str` arguments to
127    /// various Serializer methods.
128    fn type_name(&self) -> String {
129        self.this_type.segments.last().unwrap().ident.to_string()
130    }
131}
132
133// All the generics in the input, plus a bound `T: Serialize` for each generic
134// field type that will be serialized by us.
135fn build_generics(cont: &Container) -> syn::Generics {
136    let generics = bound::without_defaults(cont.generics);
137
138    let generics =
139        bound::with_where_predicates_from_fields(cont, &generics, attr::Field::ser_bound);
140
141    let generics =
142        bound::with_where_predicates_from_variants(cont, &generics, attr::Variant::ser_bound);
143
144    match cont.attrs.ser_bound() {
145        Some(predicates) => bound::with_where_predicates(&generics, predicates),
146        None => bound::with_bound(
147            cont,
148            &generics,
149            needs_serialize_bound,
150            &::syn::__private::parse_quote({
        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, "Serialize");
        _s
    })parse_quote!(_serde::Serialize),
151        ),
152    }
153}
154
155// Fields with a `skip_serializing` or `serialize_with` attribute, or which
156// belong to a variant with a `skip_serializing` or `serialize_with` attribute,
157// are not serialized by us so we do not generate a bound. Fields with a `bound`
158// attribute specify their own bound so we do not generate one. All other fields
159// may need a `T: Serialize` bound where T is the type of the field.
160fn needs_serialize_bound(field: &attr::Field, variant: Option<&attr::Variant>) -> bool {
161    !field.skip_serializing()
162        && field.serialize_with().is_none()
163        && field.ser_bound().is_none()
164        && variant.map_or(true, |variant| {
165            !variant.skip_serializing()
166                && variant.serialize_with().is_none()
167                && variant.ser_bound().is_none()
168        })
169}
170
171fn serialize_body(cont: &Container, params: &Parameters) -> Fragment {
172    if cont.attrs.transparent() {
173        serialize_transparent(cont, params)
174    } else if let Some(type_into) = cont.attrs.type_into() {
175        serialize_into(params, type_into)
176    } else {
177        match &cont.data {
178            Data::Enum(variants) => serialize_enum(params, variants, &cont.attrs),
179            Data::Struct(Style::Struct, fields) => serialize_struct(params, fields, &cont.attrs),
180            Data::Struct(Style::Tuple, fields) => {
181                serialize_tuple_struct(params, fields, &cont.attrs)
182            }
183            Data::Struct(Style::Newtype, fields) => {
184                serialize_newtype_struct(params, &fields[0], &cont.attrs)
185            }
186            Data::Struct(Style::Unit, _) => serialize_unit_struct(&cont.attrs),
187        }
188    }
189}
190
191fn serialize_transparent(cont: &Container, params: &Parameters) -> Fragment {
192    let fields = match &cont.data {
193        Data::Struct(_, fields) => fields,
194        Data::Enum(_) => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
195    };
196
197    let self_var = &params.self_var;
198    let transparent_field = fields.iter().find(|f| f.attrs.transparent()).unwrap();
199    let member = &transparent_field.member;
200
201    let path = match transparent_field.attrs.serialize_with() {
202        Some(path) => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&path, &mut _s);
    _s
}quote!(#path),
203        None => {
204            let span = transparent_field.original.span();
205            {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "Serialize");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "serialize");
    _s
}quote_spanned!(span=> _serde::Serialize::serialize)
206        }
207    };
208
209    crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::ToTokens::to_tokens(&path, &mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_and(&mut _s);
                ::quote::ToTokens::to_tokens(&self_var, &mut _s);
                ::quote::__private::push_dot(&mut _s);
                ::quote::ToTokens::to_tokens(&member, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__serializer");
                _s
            });
        _s
    });quote_block! {
210        #path(&#self_var.#member, __serializer)
211    }
212}
213
214fn serialize_into(params: &Parameters, type_into: &syn::Type) -> Fragment {
215    let self_var = &params.self_var;
216    crate::fragment::Fragment::Block({
        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, "Serialize");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize");
        ::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, "_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(&type_into, &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::__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, "Clone");
                        ::quote::__private::push_colon2(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "clone");
                        ::quote::__private::push_group(&mut _s,
                            ::quote::__private::Delimiter::Parenthesis,
                            {
                                let mut _s = ::quote::__private::TokenStream::new();
                                ::quote::ToTokens::to_tokens(&self_var, &mut _s);
                                _s
                            });
                        _s
                    });
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__serializer");
                _s
            });
        _s
    });quote_block! {
217        _serde::Serialize::serialize(
218            &_serde::#private::Into::<#type_into>::into(_serde::#private::Clone::clone(#self_var)),
219            __serializer)
220    }
221}
222
223fn serialize_unit_struct(cattrs: &attr::Container) -> Fragment {
224    let type_name = cattrs.name().serialize_name();
225
226    crate::fragment::Fragment::Expr({
        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, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_unit_struct");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                _s
            });
        _s
    });quote_expr! {
227        _serde::Serializer::serialize_unit_struct(__serializer, #type_name)
228    }
229}
230
231fn serialize_newtype_struct(
232    params: &Parameters,
233    field: &Field,
234    cattrs: &attr::Container,
235) -> Fragment {
236    let type_name = cattrs.name().serialize_name();
237
238    let mut field_expr = get_member(
239        params,
240        field,
241        &Member::Unnamed(Index {
242            index: 0,
243            span: Span::call_site(),
244        }),
245    );
246    if let Some(path) = field.attrs.serialize_with() {
247        field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
248    }
249
250    let span = field.original.span();
251    let func = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "Serializer");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "serialize_newtype_struct");
    _s
}quote_spanned!(span=> _serde::Serializer::serialize_newtype_struct);
252    crate::fragment::Fragment::Expr({
        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::__private::push_ident(&mut _s, "__serializer");
                ::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_expr, &mut _s);
                _s
            });
        _s
    });quote_expr! {
253        #func(__serializer, #type_name, #field_expr)
254    }
255}
256
257fn serialize_tuple_struct(
258    params: &Parameters,
259    fields: &[Field],
260    cattrs: &attr::Container,
261) -> Fragment {
262    let serialize_stmts =
263        serialize_tuple_struct_visitor(fields, params, false, &TupleTrait::SerializeTupleStruct);
264
265    let type_name = cattrs.name().serialize_name();
266
267    let mut serialized_fields = fields
268        .iter()
269        .enumerate()
270        .filter(|(_, field)| !field.attrs.skip_serializing())
271        .peekable();
272
273    let let_mut = mut_if(serialized_fields.peek().is_some());
274
275    let len = serialized_fields
276        .map(|(i, field)| match field.attrs.skip_serializing_if() {
277            None => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::parse(&mut _s, "1");
    _s
}quote!(1),
278            Some(path) => {
279                let index = syn::Index {
280                    index: i as u32,
281                    span: Span::call_site(),
282                };
283                let field_expr = get_member(params, field, &Member::Unnamed(index));
284                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::ToTokens::to_tokens(&path, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
            _s
        });
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::parse(&mut _s, "0");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "else");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::parse(&mut _s, "1");
            _s
        });
    _s
}quote!(if #path(#field_expr) { 0 } else { 1 })
285            }
286        })
287        .fold({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::parse(&mut _s, "0");
    _s
}quote!(0), |sum, expr| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&sum, &mut _s);
    ::quote::__private::push_add(&mut _s);
    ::quote::ToTokens::to_tokens(&expr, &mut _s);
    _s
}quote!(#sum + #expr));
288
289    crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_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, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&len, &mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_stmts, i) = serialize_stmts.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_stmts =
                    match serialize_stmts.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_stmts, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeTupleStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
290        let #let_mut __serde_state = _serde::Serializer::serialize_tuple_struct(__serializer, #type_name, #len)?;
291        #(#serialize_stmts)*
292        _serde::ser::SerializeTupleStruct::end(__serde_state)
293    }
294}
295
296fn serialize_struct(params: &Parameters, fields: &[Field], cattrs: &attr::Container) -> Fragment {
297    if !(fields.len() as u64 <= u64::from(u32::MAX)) {
    {
        ::core::panicking::panic_fmt(format_args!("too many fields in {0}: {1}, maximum supported count is {2}",
                cattrs.name().serialize_name(), fields.len(), u32::MAX));
    }
};assert!(
298        fields.len() as u64 <= u64::from(u32::MAX),
299        "too many fields in {}: {}, maximum supported count is {}",
300        cattrs.name().serialize_name(),
301        fields.len(),
302        u32::MAX,
303    );
304
305    let has_non_skipped_flatten = fields
306        .iter()
307        .any(|field| field.attrs.flatten() && !field.attrs.skip_serializing());
308    if has_non_skipped_flatten {
309        serialize_struct_as_map(params, fields, cattrs)
310    } else {
311        serialize_struct_as_struct(params, fields, cattrs)
312    }
313}
314
315fn serialize_struct_tag_field(cattrs: &attr::Container, struct_trait: &StructTrait) -> TokenStream {
316    match cattrs.tag() {
317        attr::TagType::Internal { tag } => {
318            let type_name = cattrs.name().serialize_name();
319            let func = struct_trait.serialize_field(Span::call_site());
320            {
    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::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "mut");
            ::quote::__private::push_ident(&mut _s, "__serde_state");
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&tag, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&type_name, &mut _s);
            _s
        });
    ::quote::__private::push_question(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
321                #func(&mut __serde_state, #tag, #type_name)?;
322            }
323        }
324        _ => ::quote::__private::TokenStream::new()quote! {},
325    }
326}
327
328fn serialize_struct_as_struct(
329    params: &Parameters,
330    fields: &[Field],
331    cattrs: &attr::Container,
332) -> Fragment {
333    let serialize_fields =
334        serialize_struct_visitor(fields, params, false, &StructTrait::SerializeStruct);
335
336    let type_name = cattrs.name().serialize_name();
337
338    let tag_field = serialize_struct_tag_field(cattrs, &StructTrait::SerializeStruct);
339    let tag_field_exists = !tag_field.is_empty();
340
341    let mut serialized_fields = fields
342        .iter()
343        .filter(|&field| !field.attrs.skip_serializing())
344        .peekable();
345
346    let let_mut = mut_if(serialized_fields.peek().is_some() || tag_field_exists);
347
348    let len = serialized_fields
349        .map(|field| match field.attrs.skip_serializing_if() {
350            None => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::parse(&mut _s, "1");
    _s
}quote!(1),
351            Some(path) => {
352                let field_expr = get_member(params, field, &field.member);
353                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::ToTokens::to_tokens(&path, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
            _s
        });
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::parse(&mut _s, "0");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "else");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::parse(&mut _s, "1");
            _s
        });
    _s
}quote!(if #path(#field_expr) { 0 } else { 1 })
354            }
355        })
356        .fold(
357            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&tag_field_exists, &mut _s);
    ::quote::__private::push_ident(&mut _s, "as");
    ::quote::__private::push_ident(&mut _s, "usize");
    _s
}quote!(#tag_field_exists as usize),
358            |sum, expr| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&sum, &mut _s);
    ::quote::__private::push_add(&mut _s);
    ::quote::ToTokens::to_tokens(&expr, &mut _s);
    _s
}quote!(#sum + #expr),
359        );
360
361    crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_struct");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&len, &mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::ToTokens::to_tokens(&tag_field, &mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_fields, i) =
                serialize_fields.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_fields =
                    match serialize_fields.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_fields, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
362        let #let_mut __serde_state = _serde::Serializer::serialize_struct(__serializer, #type_name, #len)?;
363        #tag_field
364        #(#serialize_fields)*
365        _serde::ser::SerializeStruct::end(__serde_state)
366    }
367}
368
369fn serialize_struct_as_map(
370    params: &Parameters,
371    fields: &[Field],
372    cattrs: &attr::Container,
373) -> Fragment {
374    let serialize_fields =
375        serialize_struct_visitor(fields, params, false, &StructTrait::SerializeMap);
376
377    let tag_field = serialize_struct_tag_field(cattrs, &StructTrait::SerializeMap);
378    let tag_field_exists = !tag_field.is_empty();
379
380    let mut serialized_fields = fields
381        .iter()
382        .filter(|&field| !field.attrs.skip_serializing())
383        .peekable();
384
385    let let_mut = mut_if(serialized_fields.peek().is_some() || tag_field_exists);
386
387    crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_map");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&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, "None");
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::ToTokens::to_tokens(&tag_field, &mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_fields, i) =
                serialize_fields.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_fields =
                    match serialize_fields.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_fields, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeMap");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
388        let #let_mut __serde_state = _serde::Serializer::serialize_map(__serializer, _serde::#private::None)?;
389        #tag_field
390        #(#serialize_fields)*
391        _serde::ser::SerializeMap::end(__serde_state)
392    }
393}
394
395fn serialize_enum(params: &Parameters, variants: &[Variant], cattrs: &attr::Container) -> Fragment {
396    if !(variants.len() as u64 <= u64::from(u32::MAX)) {
    ::core::panicking::panic("assertion failed: variants.len() as u64 <= u64::from(u32::MAX)")
};assert!(variants.len() as u64 <= u64::from(u32::MAX));
397
398    let self_var = &params.self_var;
399
400    let mut arms: Vec<_> = variants
401        .iter()
402        .enumerate()
403        .map(|(variant_index, variant)| {
404            serialize_variant(params, variant, variant_index as u32, cattrs)
405        })
406        .collect();
407
408    if cattrs.remote().is_some() && cattrs.non_exhaustive() {
409        arms.push({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "ref");
    ::quote::__private::push_ident(&mut _s, "unrecognized");
    ::quote::__private::push_fat_arrow(&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, "Err");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            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, "ser");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Error");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "custom");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    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, "ser");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s,
                        "CannotSerializeVariant");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "unrecognized");
                            _s
                        });
                    _s
                });
            _s
        });
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
410            ref unrecognized => _serde::#private::Err(_serde::ser::Error::custom(_serde::#private::ser::CannotSerializeVariant(unrecognized))),
411        });
412    }
413
414    crate::fragment::Fragment::Expr({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "match");
        ::quote::__private::push_star(&mut _s);
        ::quote::ToTokens::to_tokens(&self_var, &mut _s);
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Brace,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                {
                    use ::quote::__private::ext::*;
                    let has_iter = ::quote::__private::HasIterator::<false>;
                    #[allow(unused_mut)]
                    let (mut arms, i) = arms.quote_into_iter();
                    let has_iter = has_iter | i;
                    <_ as
                            ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                    while true {
                        let arms =
                            match arms.next() {
                                Some(_x) => ::quote::__private::RepInterp(_x),
                                None => break,
                            };
                        ::quote::ToTokens::to_tokens(&arms, &mut _s);
                    }
                }
                _s
            });
        _s
    });quote_expr! {
415        match *#self_var {
416            #(#arms)*
417        }
418    }
419}
420
421fn serialize_variant(
422    params: &Parameters,
423    variant: &Variant,
424    variant_index: u32,
425    cattrs: &attr::Container,
426) -> TokenStream {
427    let this_value = &params.this_value;
428    let variant_ident = &variant.ident;
429
430    if variant.attrs.skip_serializing() {
431        let skipped_msg = ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("the enum variant {0}::{1} cannot be serialized",
                params.type_name(), variant_ident))
    })format!(
432            "the enum variant {}::{} cannot be serialized",
433            params.type_name(),
434            variant_ident
435        );
436        let skipped_err = {
    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, "Err");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            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, "ser");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Error");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "custom");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&skipped_msg, &mut _s);
                    _s
                });
            _s
        });
    _s
}quote! {
437            _serde::#private::Err(_serde::ser::Error::custom(#skipped_msg))
438        };
439        let fields_pat = match variant.style {
440            Style::Unit => ::quote::__private::TokenStream::new()quote!(),
441            Style::Newtype | Style::Tuple => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    _s
}quote!((..)),
442            Style::Struct => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_dot2(&mut _s);
            _s
        });
    _s
}quote!({ .. }),
443        };
444        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&this_value, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&variant_ident, &mut _s);
    ::quote::ToTokens::to_tokens(&fields_pat, &mut _s);
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::ToTokens::to_tokens(&skipped_err, &mut _s);
    ::quote::__private::push_comma(&mut _s);
    _s
}quote! {
445            #this_value::#variant_ident #fields_pat => #skipped_err,
446        }
447    } else {
448        // variant wasn't skipped
449        let case = match variant.style {
450            Style::Unit => {
451                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&this_value, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&variant_ident, &mut _s);
    _s
}quote! {
452                    #this_value::#variant_ident
453                }
454            }
455            Style::Newtype => {
456                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&this_value, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&variant_ident, &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, "ref");
            ::quote::__private::push_ident(&mut _s, "__field0");
            _s
        });
    _s
}quote! {
457                    #this_value::#variant_ident(ref __field0)
458                }
459            }
460            Style::Tuple => {
461                let field_names = (0..variant.fields.len()).map(field_i);
462                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&this_value, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&variant_ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let mut _first = true;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut field_names, i) = field_names.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let field_names =
                        match field_names.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    if !_first { ::quote::__private::push_comma(&mut _s); }
                    _first = false;
                    ::quote::__private::push_ident(&mut _s, "ref");
                    ::quote::ToTokens::to_tokens(&field_names, &mut _s);
                }
            }
            _s
        });
    _s
}quote! {
463                    #this_value::#variant_ident(#(ref #field_names),*)
464                }
465            }
466            Style::Struct => {
467                let members = variant.fields.iter().map(|f| &f.member);
468                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&this_value, &mut _s);
    ::quote::__private::push_colon2(&mut _s);
    ::quote::ToTokens::to_tokens(&variant_ident, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let mut _first = true;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut members, i) = members.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let members =
                        match members.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    if !_first { ::quote::__private::push_comma(&mut _s); }
                    _first = false;
                    ::quote::__private::push_ident(&mut _s, "ref");
                    ::quote::ToTokens::to_tokens(&members, &mut _s);
                }
            }
            _s
        });
    _s
}quote! {
469                    #this_value::#variant_ident { #(ref #members),* }
470                }
471            }
472        };
473
474        let body = Match(match (cattrs.tag(), variant.attrs.untagged()) {
475            (attr::TagType::External, false) => {
476                serialize_externally_tagged_variant(params, variant, variant_index, cattrs)
477            }
478            (attr::TagType::Internal { tag }, false) => {
479                serialize_internally_tagged_variant(params, variant, cattrs, tag)
480            }
481            (attr::TagType::Adjacent { tag, content }, false) => {
482                serialize_adjacently_tagged_variant(
483                    params,
484                    variant,
485                    cattrs,
486                    variant_index,
487                    tag,
488                    content,
489                )
490            }
491            (attr::TagType::None, _) | (_, true) => {
492                serialize_untagged_variant(params, variant, cattrs)
493            }
494        });
495
496        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&case, &mut _s);
    ::quote::__private::push_fat_arrow(&mut _s);
    ::quote::ToTokens::to_tokens(&body, &mut _s);
    _s
}quote! {
497            #case => #body
498        }
499    }
500}
501
502fn serialize_externally_tagged_variant(
503    params: &Parameters,
504    variant: &Variant,
505    variant_index: u32,
506    cattrs: &attr::Container,
507) -> Fragment {
508    let type_name = cattrs.name().serialize_name();
509    let variant_name = variant.attrs.name().serialize_name();
510
511    if let Some(path) = variant.attrs.serialize_with() {
512        let ser = wrap_serialize_variant_with(params, path, variant);
513        return crate::fragment::Fragment::Expr({
        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, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_newtype_variant");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_index, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&ser, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        _s
    })quote_expr! {
514            _serde::Serializer::serialize_newtype_variant(
515                __serializer,
516                #type_name,
517                #variant_index,
518                #variant_name,
519                #ser,
520            )
521        };
522    }
523
524    match effective_style(variant) {
525        Style::Unit => {
526            crate::fragment::Fragment::Expr({
        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, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_unit_variant");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_index, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        _s
    });quote_expr! {
527                _serde::Serializer::serialize_unit_variant(
528                    __serializer,
529                    #type_name,
530                    #variant_index,
531                    #variant_name,
532                )
533            }
534        }
535        Style::Newtype => {
536            let field = &variant.fields[0];
537            let mut field_expr = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "__field0");
    _s
}quote!(__field0);
538            if let Some(path) = field.attrs.serialize_with() {
539                field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
540            }
541
542            let span = field.original.span();
543            let func = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "Serializer");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "serialize_newtype_variant");
    _s
}quote_spanned!(span=> _serde::Serializer::serialize_newtype_variant);
544            crate::fragment::Fragment::Expr({
        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::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_index, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        _s
    });quote_expr! {
545                #func(
546                    __serializer,
547                    #type_name,
548                    #variant_index,
549                    #variant_name,
550                    #field_expr,
551                )
552            }
553        }
554        Style::Tuple => serialize_tuple_variant(
555            TupleVariant::ExternallyTagged {
556                type_name,
557                variant_index,
558                variant_name,
559            },
560            params,
561            &variant.fields,
562        ),
563        Style::Struct => serialize_struct_variant(
564            StructVariant::ExternallyTagged {
565                variant_index,
566                variant_name,
567            },
568            params,
569            &variant.fields,
570            type_name,
571        ),
572    }
573}
574
575fn serialize_internally_tagged_variant(
576    params: &Parameters,
577    variant: &Variant,
578    cattrs: &attr::Container,
579    tag: &str,
580) -> Fragment {
581    let type_name = cattrs.name().serialize_name();
582    let variant_name = variant.attrs.name().serialize_name();
583
584    let enum_ident_str = params.type_name();
585    let variant_ident_str = variant.ident.to_string();
586
587    if let Some(path) = variant.attrs.serialize_with() {
588        let ser = wrap_serialize_variant_with(params, path, variant);
589        return crate::fragment::Fragment::Expr({
        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, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_tagged_newtype");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&enum_ident_str, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_ident_str, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&tag, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&ser, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        _s
    })quote_expr! {
590            _serde::#private::ser::serialize_tagged_newtype(
591                __serializer,
592                #enum_ident_str,
593                #variant_ident_str,
594                #tag,
595                #variant_name,
596                #ser,
597            )
598        };
599    }
600
601    match effective_style(variant) {
602        Style::Unit => {
603            crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::__private::push_ident(&mut _s, "mut");
        ::quote::__private::push_ident(&mut _s, "__struct");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_struct");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::parse(&mut _s, "1");
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_field");
        ::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, "mut");
                ::quote::__private::push_ident(&mut _s, "__struct");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&tag, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__struct");
                _s
            });
        _s
    });quote_block! {
604                let mut __struct = _serde::Serializer::serialize_struct(
605                    __serializer, #type_name, 1)?;
606                _serde::ser::SerializeStruct::serialize_field(
607                    &mut __struct, #tag, #variant_name)?;
608                _serde::ser::SerializeStruct::end(__struct)
609            }
610        }
611        Style::Newtype => {
612            let field = &variant.fields[0];
613            let mut field_expr = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "__field0");
    _s
}quote!(__field0);
614            if let Some(path) = field.attrs.serialize_with() {
615                field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
616            }
617
618            let span = field.original.span();
619            let func = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident_spanned(&mut _s, _span, "_serde");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::ToTokens::to_tokens(&private, &mut _s);
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "serialize_tagged_newtype");
    _s
}quote_spanned!(span=> _serde::#private::ser::serialize_tagged_newtype);
620            crate::fragment::Fragment::Expr({
        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::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&enum_ident_str, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_ident_str, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&tag, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        _s
    });quote_expr! {
621                #func(
622                    __serializer,
623                    #enum_ident_str,
624                    #variant_ident_str,
625                    #tag,
626                    #variant_name,
627                    #field_expr,
628                )
629            }
630        }
631        Style::Struct => serialize_struct_variant(
632            StructVariant::InternallyTagged { tag, variant_name },
633            params,
634            &variant.fields,
635            type_name,
636        ),
637        Style::Tuple => {
    ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
            format_args!("checked in serde_derive_internals")));
}unreachable!("checked in serde_derive_internals"),
638    }
639}
640
641fn serialize_adjacently_tagged_variant(
642    params: &Parameters,
643    variant: &Variant,
644    cattrs: &attr::Container,
645    variant_index: u32,
646    tag: &str,
647    content: &str,
648) -> Fragment {
649    let this_type = &params.this_type;
650    let type_name = cattrs.name().serialize_name();
651    let variant_name = variant.attrs.name().serialize_name();
652    let serialize_variant = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_and(&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, "ser");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "AdjacentlyTaggedEnumVariant");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "enum_name");
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&type_name, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "variant_index");
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&variant_index, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::__private::push_ident(&mut _s, "variant_name");
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            _s
        });
    _s
}quote! {
653        &_serde::#private::ser::AdjacentlyTaggedEnumVariant {
654            enum_name: #type_name,
655            variant_index: #variant_index,
656            variant_name: #variant_name,
657        }
658    };
659
660    let inner = Stmts(if let Some(path) = variant.attrs.serialize_with() {
661        let ser = wrap_serialize_variant_with(params, path, variant);
662        crate::fragment::Fragment::Expr({
        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, "Serialize");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::ToTokens::to_tokens(&ser, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__serializer");
                _s
            });
        _s
    });quote_expr! {
663            _serde::Serialize::serialize(#ser, __serializer)
664        }
665    } else {
666        match effective_style(variant) {
667            Style::Unit => {
668                return crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::__private::push_ident(&mut _s, "mut");
        ::quote::__private::push_ident(&mut _s, "__struct");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_struct");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::parse(&mut _s, "1");
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_field");
        ::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, "mut");
                ::quote::__private::push_ident(&mut _s, "__struct");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&tag, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&serialize_variant, &mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__struct");
                _s
            });
        _s
    })quote_block! {
669                    let mut __struct = _serde::Serializer::serialize_struct(
670                        __serializer, #type_name, 1)?;
671                    _serde::ser::SerializeStruct::serialize_field(
672                        &mut __struct, #tag, #serialize_variant)?;
673                    _serde::ser::SerializeStruct::end(__struct)
674                };
675            }
676            Style::Newtype => {
677                let field = &variant.fields[0];
678                let mut field_expr = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "__field0");
    _s
}quote!(__field0);
679                if let Some(path) = field.attrs.serialize_with() {
680                    field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
681                }
682
683                let span = field.original.span();
684                let func = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "SerializeStruct");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "serialize_field");
    _s
}quote_spanned!(span=> _serde::ser::SerializeStruct::serialize_field);
685                return crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::__private::push_ident(&mut _s, "mut");
        ::quote::__private::push_ident(&mut _s, "__struct");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_struct");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::parse(&mut _s, "2");
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_field");
        ::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, "mut");
                ::quote::__private::push_ident(&mut _s, "__struct");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&tag, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&serialize_variant, &mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::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::__private::push_and(&mut _s);
                ::quote::__private::push_ident(&mut _s, "mut");
                ::quote::__private::push_ident(&mut _s, "__struct");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&content, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__struct");
                _s
            });
        _s
    })quote_block! {
686                    let mut __struct = _serde::Serializer::serialize_struct(
687                        __serializer, #type_name, 2)?;
688                    _serde::ser::SerializeStruct::serialize_field(
689                        &mut __struct, #tag, #serialize_variant)?;
690                    #func(
691                        &mut __struct, #content, #field_expr)?;
692                    _serde::ser::SerializeStruct::end(__struct)
693                };
694            }
695            Style::Tuple => {
696                serialize_tuple_variant(TupleVariant::Untagged, params, &variant.fields)
697            }
698            Style::Struct => serialize_struct_variant(
699                StructVariant::Untagged,
700                params,
701                &variant.fields,
702                variant_name,
703            ),
704        }
705    });
706
707    let fields_ty = variant.fields.iter().map(|f| &f.ty);
708    let fields_ident: &[_] = &match variant.style {
709        Style::Unit => {
710            if variant.attrs.serialize_with().is_some() {
711                ::alloc::vec::Vec::new()vec![]
712            } else {
713                ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
714            }
715        }
716        Style::Newtype => ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
        [Member::Named(field_i(0))]))vec![Member::Named(field_i(0))],
717        Style::Tuple => (0..variant.fields.len())
718            .map(|i| Member::Named(field_i(i)))
719            .collect(),
720        Style::Struct => variant.fields.iter().map(|f| f.member.clone()).collect(),
721    };
722
723    let (_, ty_generics, where_clause) = params.generics.split_for_impl();
724
725    let wrapper_generics = if fields_ident.is_empty() {
726        params.generics.clone()
727    } else {
728        bound::with_lifetime_bound(&params.generics, "'__a")
729    };
730    let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();
731
732    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, "__AdjacentlyTagged");
        ::quote::ToTokens::to_tokens(&wrapper_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, "data");
                ::quote::__private::push_colon(&mut _s);
                ::quote::__private::push_group(&mut _s,
                    ::quote::__private::Delimiter::Parenthesis,
                    {
                        let mut _s = ::quote::__private::TokenStream::new();
                        {
                            use ::quote::__private::ext::*;
                            let has_iter = ::quote::__private::HasIterator::<false>;
                            #[allow(unused_mut)]
                            let (mut fields_ty, i) = fields_ty.quote_into_iter();
                            let has_iter = has_iter | i;
                            <_ as
                                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                            while true {
                                let fields_ty =
                                    match fields_ty.next() {
                                        Some(_x) => ::quote::__private::RepInterp(_x),
                                        None => break,
                                    };
                                ::quote::__private::push_and(&mut _s);
                                ::quote::__private::push_lifetime(&mut _s, "\'__a");
                                ::quote::ToTokens::to_tokens(&fields_ty, &mut _s);
                                ::quote::__private::push_comma(&mut _s);
                            }
                        }
                        _s
                    });
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_ident(&mut _s, "phantom");
                ::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);
                _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(&wrapper_impl_generics, &mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serialize");
        ::quote::__private::push_ident(&mut _s, "for");
        ::quote::__private::push_ident(&mut _s, "__AdjacentlyTagged");
        ::quote::ToTokens::to_tokens(&wrapper_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, "fn");
                ::quote::__private::push_ident(&mut _s, "serialize");
                ::quote::__private::push_lt(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__S");
                ::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_and(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "self");
                        ::quote::__private::push_comma(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "__serializer");
                        ::quote::__private::push_colon(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "__S");
                        _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, "__S");
                ::quote::__private::push_colon2(&mut _s);
                ::quote::__private::push_ident(&mut _s, "Ok");
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__S");
                ::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, "__S");
                ::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, "Serializer");
                ::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_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, "allow");
                                ::quote::__private::push_group(&mut _s,
                                    ::quote::__private::Delimiter::Parenthesis,
                                    {
                                        let mut _s = ::quote::__private::TokenStream::new();
                                        ::quote::__private::push_ident(&mut _s, "unused_variables");
                                        _s
                                    });
                                _s
                            });
                        ::quote::__private::push_ident(&mut _s, "let");
                        ::quote::__private::push_group(&mut _s,
                            ::quote::__private::Delimiter::Parenthesis,
                            {
                                let mut _s = ::quote::__private::TokenStream::new();
                                {
                                    use ::quote::__private::ext::*;
                                    let has_iter = ::quote::__private::HasIterator::<false>;
                                    #[allow(unused_mut)]
                                    let (mut fields_ident, i) = fields_ident.quote_into_iter();
                                    let has_iter = has_iter | i;
                                    <_ as
                                            ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                    while true {
                                        let fields_ident =
                                            match fields_ident.next() {
                                                Some(_x) => ::quote::__private::RepInterp(_x),
                                                None => break,
                                            };
                                        ::quote::ToTokens::to_tokens(&fields_ident, &mut _s);
                                        ::quote::__private::push_comma(&mut _s);
                                    }
                                }
                                _s
                            });
                        ::quote::__private::push_eq(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "self");
                        ::quote::__private::push_dot(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "data");
                        ::quote::__private::push_semi(&mut _s);
                        ::quote::ToTokens::to_tokens(&inner, &mut _s);
                        _s
                    });
                _s
            });
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::__private::push_ident(&mut _s, "mut");
        ::quote::__private::push_ident(&mut _s, "__struct");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_struct");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::parse(&mut _s, "2");
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_field");
        ::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, "mut");
                ::quote::__private::push_ident(&mut _s, "__struct");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&tag, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&serialize_variant, &mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_field");
        ::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, "mut");
                ::quote::__private::push_ident(&mut _s, "__struct");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&content, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_and(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__AdjacentlyTagged");
                ::quote::__private::push_group(&mut _s,
                    ::quote::__private::Delimiter::Brace,
                    {
                        let mut _s = ::quote::__private::TokenStream::new();
                        ::quote::__private::push_ident(&mut _s, "data");
                        ::quote::__private::push_colon(&mut _s);
                        ::quote::__private::push_group(&mut _s,
                            ::quote::__private::Delimiter::Parenthesis,
                            {
                                let mut _s = ::quote::__private::TokenStream::new();
                                {
                                    use ::quote::__private::ext::*;
                                    let has_iter = ::quote::__private::HasIterator::<false>;
                                    #[allow(unused_mut)]
                                    let (mut fields_ident, i) = fields_ident.quote_into_iter();
                                    let has_iter = has_iter | i;
                                    <_ as
                                            ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                    while true {
                                        let fields_ident =
                                            match fields_ident.next() {
                                                Some(_x) => ::quote::__private::RepInterp(_x),
                                                None => break,
                                            };
                                        ::quote::ToTokens::to_tokens(&fields_ident, &mut _s);
                                        ::quote::__private::push_comma(&mut _s);
                                    }
                                }
                                _s
                            });
                        ::quote::__private::push_comma(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "phantom");
                        ::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);
                        _s
                    });
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__struct");
                _s
            });
        _s
    });quote_block! {
733        #[doc(hidden)]
734        struct __AdjacentlyTagged #wrapper_generics #where_clause {
735            data: (#(&'__a #fields_ty,)*),
736            phantom: _serde::#private::PhantomData<#this_type #ty_generics>,
737        }
738
739        #[automatically_derived]
740        impl #wrapper_impl_generics _serde::Serialize for __AdjacentlyTagged #wrapper_ty_generics #where_clause {
741            fn serialize<__S>(&self, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>
742            where
743                __S: _serde::Serializer,
744            {
745                // Elements that have skip_serializing will be unused.
746                #[allow(unused_variables)]
747                let (#(#fields_ident,)*) = self.data;
748                #inner
749            }
750        }
751
752        let mut __struct = _serde::Serializer::serialize_struct(
753            __serializer, #type_name, 2)?;
754        _serde::ser::SerializeStruct::serialize_field(
755            &mut __struct, #tag, #serialize_variant)?;
756        _serde::ser::SerializeStruct::serialize_field(
757            &mut __struct, #content, &__AdjacentlyTagged {
758                data: (#(#fields_ident,)*),
759                phantom: _serde::#private::PhantomData::<#this_type #ty_generics>,
760            })?;
761        _serde::ser::SerializeStruct::end(__struct)
762    }
763}
764
765fn serialize_untagged_variant(
766    params: &Parameters,
767    variant: &Variant,
768    cattrs: &attr::Container,
769) -> Fragment {
770    if let Some(path) = variant.attrs.serialize_with() {
771        let ser = wrap_serialize_variant_with(params, path, variant);
772        return crate::fragment::Fragment::Expr({
        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, "Serialize");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::ToTokens::to_tokens(&ser, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__serializer");
                _s
            });
        _s
    })quote_expr! {
773            _serde::Serialize::serialize(#ser, __serializer)
774        };
775    }
776
777    match effective_style(variant) {
778        Style::Unit => {
779            crate::fragment::Fragment::Expr({
        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, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_unit");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                _s
            });
        _s
    });quote_expr! {
780                _serde::Serializer::serialize_unit(__serializer)
781            }
782        }
783        Style::Newtype => {
784            let field = &variant.fields[0];
785            let mut field_expr = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "__field0");
    _s
}quote!(__field0);
786            if let Some(path) = field.attrs.serialize_with() {
787                field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
788            }
789
790            let span = field.original.span();
791            let func = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "Serialize");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "serialize");
    _s
}quote_spanned!(span=> _serde::Serialize::serialize);
792            crate::fragment::Fragment::Expr({
        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(&field_expr, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__serializer");
                _s
            });
        _s
    });quote_expr! {
793                #func(#field_expr, __serializer)
794            }
795        }
796        Style::Tuple => serialize_tuple_variant(TupleVariant::Untagged, params, &variant.fields),
797        Style::Struct => {
798            let type_name = cattrs.name().serialize_name();
799            serialize_struct_variant(StructVariant::Untagged, params, &variant.fields, type_name)
800        }
801    }
802}
803
804enum TupleVariant<'a> {
805    ExternallyTagged {
806        type_name: &'a Name,
807        variant_index: u32,
808        variant_name: &'a Name,
809    },
810    Untagged,
811}
812
813fn serialize_tuple_variant(
814    context: TupleVariant,
815    params: &Parameters,
816    fields: &[Field],
817) -> Fragment {
818    let tuple_trait = match context {
819        TupleVariant::ExternallyTagged { .. } => TupleTrait::SerializeTupleVariant,
820        TupleVariant::Untagged => TupleTrait::SerializeTuple,
821    };
822
823    let serialize_stmts = serialize_tuple_struct_visitor(fields, params, true, &tuple_trait);
824
825    let mut serialized_fields = fields
826        .iter()
827        .enumerate()
828        .filter(|(_, field)| !field.attrs.skip_serializing())
829        .peekable();
830
831    let let_mut = mut_if(serialized_fields.peek().is_some());
832
833    let len = serialized_fields
834        .map(|(i, field)| match field.attrs.skip_serializing_if() {
835            None => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::parse(&mut _s, "1");
    _s
}quote!(1),
836            Some(path) => {
837                let field_expr = field_i(i);
838                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::ToTokens::to_tokens(&path, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
            _s
        });
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::parse(&mut _s, "0");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "else");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::parse(&mut _s, "1");
            _s
        });
    _s
}quote!(if #path(#field_expr) { 0 } else { 1 })
839            }
840        })
841        .fold({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::parse(&mut _s, "0");
    _s
}quote!(0), |sum, expr| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&sum, &mut _s);
    ::quote::__private::push_add(&mut _s);
    ::quote::ToTokens::to_tokens(&expr, &mut _s);
    _s
}quote!(#sum + #expr));
842
843    match context {
844        TupleVariant::ExternallyTagged {
845            type_name,
846            variant_index,
847            variant_name,
848        } => {
849            crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_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, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&type_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_index, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&len, &mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_stmts, i) = serialize_stmts.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_stmts =
                    match serialize_stmts.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_stmts, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeTupleVariant");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
850                let #let_mut __serde_state = _serde::Serializer::serialize_tuple_variant(
851                    __serializer,
852                    #type_name,
853                    #variant_index,
854                    #variant_name,
855                    #len)?;
856                #(#serialize_stmts)*
857                _serde::ser::SerializeTupleVariant::end(__serde_state)
858            }
859        }
860        TupleVariant::Untagged => {
861            crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_tuple");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&len, &mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_stmts, i) = serialize_stmts.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_stmts =
                    match serialize_stmts.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_stmts, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeTuple");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
862                let #let_mut __serde_state = _serde::Serializer::serialize_tuple(
863                    __serializer,
864                    #len)?;
865                #(#serialize_stmts)*
866                _serde::ser::SerializeTuple::end(__serde_state)
867            }
868        }
869    }
870}
871
872enum StructVariant<'a> {
873    ExternallyTagged {
874        variant_index: u32,
875        variant_name: &'a Name,
876    },
877    InternallyTagged {
878        tag: &'a str,
879        variant_name: &'a Name,
880    },
881    Untagged,
882}
883
884fn serialize_struct_variant(
885    context: StructVariant,
886    params: &Parameters,
887    fields: &[Field],
888    name: &Name,
889) -> Fragment {
890    if fields.iter().any(|field| field.attrs.flatten()) {
891        return serialize_struct_variant_with_flatten(context, params, fields, name);
892    }
893
894    let struct_trait = match context {
895        StructVariant::ExternallyTagged { .. } => StructTrait::SerializeStructVariant,
896        StructVariant::InternallyTagged { .. } | StructVariant::Untagged => {
897            StructTrait::SerializeStruct
898        }
899    };
900
901    let serialize_fields = serialize_struct_visitor(fields, params, true, &struct_trait);
902
903    let mut serialized_fields = fields
904        .iter()
905        .filter(|&field| !field.attrs.skip_serializing())
906        .peekable();
907
908    let let_mut = mut_if(serialized_fields.peek().is_some());
909
910    let len = serialized_fields
911        .map(|field| {
912            let member = &field.member;
913
914            match field.attrs.skip_serializing_if() {
915                Some(path) => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::ToTokens::to_tokens(&path, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&member, &mut _s);
            _s
        });
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::parse(&mut _s, "0");
            _s
        });
    ::quote::__private::push_ident(&mut _s, "else");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::parse(&mut _s, "1");
            _s
        });
    _s
}quote!(if #path(#member) { 0 } else { 1 }),
916                None => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::parse(&mut _s, "1");
    _s
}quote!(1),
917            }
918        })
919        .fold({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::parse(&mut _s, "0");
    _s
}quote!(0), |sum, expr| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&sum, &mut _s);
    ::quote::__private::push_add(&mut _s);
    ::quote::ToTokens::to_tokens(&expr, &mut _s);
    _s
}quote!(#sum + #expr));
920
921    match context {
922        StructVariant::ExternallyTagged {
923            variant_index,
924            variant_name,
925        } => {
926            crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_struct_variant");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_index, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&len, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_fields, i) =
                serialize_fields.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_fields =
                    match serialize_fields.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_fields, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStructVariant");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
927                let #let_mut __serde_state = _serde::Serializer::serialize_struct_variant(
928                    __serializer,
929                    #name,
930                    #variant_index,
931                    #variant_name,
932                    #len,
933                )?;
934                #(#serialize_fields)*
935                _serde::ser::SerializeStructVariant::end(__serde_state)
936            }
937        }
938        StructVariant::InternallyTagged { tag, variant_name } => {
939            crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::__private::push_ident(&mut _s, "mut");
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_struct");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&len, &mut _s);
                ::quote::__private::push_add(&mut _s);
                ::quote::__private::parse(&mut _s, "1");
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_field");
        ::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, "mut");
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&tag, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_fields, i) =
                serialize_fields.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_fields =
                    match serialize_fields.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_fields, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
940                let mut __serde_state = _serde::Serializer::serialize_struct(
941                    __serializer,
942                    #name,
943                    #len + 1,
944                )?;
945                _serde::ser::SerializeStruct::serialize_field(
946                    &mut __serde_state,
947                    #tag,
948                    #variant_name,
949                )?;
950                #(#serialize_fields)*
951                _serde::ser::SerializeStruct::end(__serde_state)
952            }
953        }
954        StructVariant::Untagged => {
955            crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_struct");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&len, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_fields, i) =
                serialize_fields.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_fields =
                    match serialize_fields.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_fields, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeStruct");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
956                let #let_mut __serde_state = _serde::Serializer::serialize_struct(
957                    __serializer,
958                    #name,
959                    #len,
960                )?;
961                #(#serialize_fields)*
962                _serde::ser::SerializeStruct::end(__serde_state)
963            }
964        }
965    }
966}
967
968fn serialize_struct_variant_with_flatten(
969    context: StructVariant,
970    params: &Parameters,
971    fields: &[Field],
972    name: &Name,
973) -> Fragment {
974    let struct_trait = StructTrait::SerializeMap;
975    let serialize_fields = serialize_struct_visitor(fields, params, true, &struct_trait);
976
977    let mut serialized_fields = fields
978        .iter()
979        .filter(|&field| !field.attrs.skip_serializing())
980        .peekable();
981
982    let let_mut = mut_if(serialized_fields.peek().is_some());
983
984    match context {
985        StructVariant::ExternallyTagged {
986            variant_index,
987            variant_name,
988        } => {
989            let this_type = &params.this_type;
990            let fields_ty = fields.iter().map(|f| &f.ty);
991            let members = &fields.iter().map(|f| &f.member).collect::<Vec<_>>();
992
993            let (_, ty_generics, where_clause) = params.generics.split_for_impl();
994            let wrapper_generics = bound::with_lifetime_bound(&params.generics, "'__a");
995            let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();
996
997            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, "__EnumFlatten");
        ::quote::ToTokens::to_tokens(&wrapper_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, "data");
                ::quote::__private::push_colon(&mut _s);
                ::quote::__private::push_group(&mut _s,
                    ::quote::__private::Delimiter::Parenthesis,
                    {
                        let mut _s = ::quote::__private::TokenStream::new();
                        {
                            use ::quote::__private::ext::*;
                            let has_iter = ::quote::__private::HasIterator::<false>;
                            #[allow(unused_mut)]
                            let (mut fields_ty, i) = fields_ty.quote_into_iter();
                            let has_iter = has_iter | i;
                            <_ as
                                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                            while true {
                                let fields_ty =
                                    match fields_ty.next() {
                                        Some(_x) => ::quote::__private::RepInterp(_x),
                                        None => break,
                                    };
                                ::quote::__private::push_and(&mut _s);
                                ::quote::__private::push_lifetime(&mut _s, "\'__a");
                                ::quote::ToTokens::to_tokens(&fields_ty, &mut _s);
                                ::quote::__private::push_comma(&mut _s);
                            }
                        }
                        _s
                    });
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_ident(&mut _s, "phantom");
                ::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);
                _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(&wrapper_impl_generics, &mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serialize");
        ::quote::__private::push_ident(&mut _s, "for");
        ::quote::__private::push_ident(&mut _s, "__EnumFlatten");
        ::quote::ToTokens::to_tokens(&wrapper_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, "fn");
                ::quote::__private::push_ident(&mut _s, "serialize");
                ::quote::__private::push_lt(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__S");
                ::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_and(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "self");
                        ::quote::__private::push_comma(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "__serializer");
                        ::quote::__private::push_colon(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "__S");
                        _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, "__S");
                ::quote::__private::push_colon2(&mut _s);
                ::quote::__private::push_ident(&mut _s, "Ok");
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__S");
                ::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, "__S");
                ::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, "Serializer");
                ::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_group(&mut _s,
                            ::quote::__private::Delimiter::Parenthesis,
                            {
                                let mut _s = ::quote::__private::TokenStream::new();
                                {
                                    use ::quote::__private::ext::*;
                                    let has_iter = ::quote::__private::HasIterator::<false>;
                                    #[allow(unused_mut)]
                                    let (mut members, i) = members.quote_into_iter();
                                    let has_iter = has_iter | i;
                                    <_ as
                                            ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                    while true {
                                        let members =
                                            match members.next() {
                                                Some(_x) => ::quote::__private::RepInterp(_x),
                                                None => break,
                                            };
                                        ::quote::ToTokens::to_tokens(&members, &mut _s);
                                        ::quote::__private::push_comma(&mut _s);
                                    }
                                }
                                _s
                            });
                        ::quote::__private::push_eq(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "self");
                        ::quote::__private::push_dot(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "data");
                        ::quote::__private::push_semi(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "let");
                        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
                        ::quote::__private::push_ident(&mut _s, "__serde_state");
                        ::quote::__private::push_eq(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "_serde");
                        ::quote::__private::push_colon2(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "Serializer");
                        ::quote::__private::push_colon2(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "serialize_map");
                        ::quote::__private::push_group(&mut _s,
                            ::quote::__private::Delimiter::Parenthesis,
                            {
                                let mut _s = ::quote::__private::TokenStream::new();
                                ::quote::__private::push_ident(&mut _s, "__serializer");
                                ::quote::__private::push_comma(&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, "None");
                                _s
                            });
                        ::quote::__private::push_question(&mut _s);
                        ::quote::__private::push_semi(&mut _s);
                        {
                            use ::quote::__private::ext::*;
                            let has_iter = ::quote::__private::HasIterator::<false>;
                            #[allow(unused_mut)]
                            let (mut serialize_fields, i) =
                                serialize_fields.quote_into_iter();
                            let has_iter = has_iter | i;
                            <_ as
                                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                            while true {
                                let serialize_fields =
                                    match serialize_fields.next() {
                                        Some(_x) => ::quote::__private::RepInterp(_x),
                                        None => break,
                                    };
                                ::quote::ToTokens::to_tokens(&serialize_fields, &mut _s);
                            }
                        }
                        ::quote::__private::push_ident(&mut _s, "_serde");
                        ::quote::__private::push_colon2(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "ser");
                        ::quote::__private::push_colon2(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "SerializeMap");
                        ::quote::__private::push_colon2(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "end");
                        ::quote::__private::push_group(&mut _s,
                            ::quote::__private::Delimiter::Parenthesis,
                            {
                                let mut _s = ::quote::__private::TokenStream::new();
                                ::quote::__private::push_ident(&mut _s, "__serde_state");
                                _s
                            });
                        _s
                    });
                _s
            });
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_newtype_variant");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_index, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::__private::push_and(&mut _s);
                ::quote::__private::push_ident(&mut _s, "__EnumFlatten");
                ::quote::__private::push_group(&mut _s,
                    ::quote::__private::Delimiter::Brace,
                    {
                        let mut _s = ::quote::__private::TokenStream::new();
                        ::quote::__private::push_ident(&mut _s, "data");
                        ::quote::__private::push_colon(&mut _s);
                        ::quote::__private::push_group(&mut _s,
                            ::quote::__private::Delimiter::Parenthesis,
                            {
                                let mut _s = ::quote::__private::TokenStream::new();
                                {
                                    use ::quote::__private::ext::*;
                                    let has_iter = ::quote::__private::HasIterator::<false>;
                                    #[allow(unused_mut)]
                                    let (mut members, i) = members.quote_into_iter();
                                    let has_iter = has_iter | i;
                                    <_ as
                                            ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                    while true {
                                        let members =
                                            match members.next() {
                                                Some(_x) => ::quote::__private::RepInterp(_x),
                                                None => break,
                                            };
                                        ::quote::ToTokens::to_tokens(&members, &mut _s);
                                        ::quote::__private::push_comma(&mut _s);
                                    }
                                }
                                _s
                            });
                        ::quote::__private::push_comma(&mut _s);
                        ::quote::__private::push_ident(&mut _s, "phantom");
                        ::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);
                        _s
                    });
                _s
            });
        _s
    });quote_block! {
998                #[doc(hidden)]
999                struct __EnumFlatten #wrapper_generics #where_clause {
1000                    data: (#(&'__a #fields_ty,)*),
1001                    phantom: _serde::#private::PhantomData<#this_type #ty_generics>,
1002                }
1003
1004                #[automatically_derived]
1005                impl #wrapper_impl_generics _serde::Serialize for __EnumFlatten #wrapper_ty_generics #where_clause {
1006                    fn serialize<__S>(&self, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>
1007                    where
1008                        __S: _serde::Serializer,
1009                    {
1010                        let (#(#members,)*) = self.data;
1011                        let #let_mut __serde_state = _serde::Serializer::serialize_map(
1012                            __serializer,
1013                            _serde::#private::None)?;
1014                        #(#serialize_fields)*
1015                        _serde::ser::SerializeMap::end(__serde_state)
1016                    }
1017                }
1018
1019                _serde::Serializer::serialize_newtype_variant(
1020                    __serializer,
1021                    #name,
1022                    #variant_index,
1023                    #variant_name,
1024                    &__EnumFlatten {
1025                        data: (#(#members,)*),
1026                        phantom: _serde::#private::PhantomData::<#this_type #ty_generics>,
1027                    })
1028            }
1029        }
1030        StructVariant::InternallyTagged { tag, variant_name } => {
1031            crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_map");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&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, "None");
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeMap");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_entry");
        ::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, "mut");
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&tag, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                ::quote::ToTokens::to_tokens(&variant_name, &mut _s);
                ::quote::__private::push_comma(&mut _s);
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_fields, i) =
                serialize_fields.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_fields =
                    match serialize_fields.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_fields, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeMap");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
1032                let #let_mut __serde_state = _serde::Serializer::serialize_map(
1033                    __serializer,
1034                    _serde::#private::None)?;
1035                _serde::ser::SerializeMap::serialize_entry(
1036                    &mut __serde_state,
1037                    #tag,
1038                    #variant_name,
1039                )?;
1040                #(#serialize_fields)*
1041                _serde::ser::SerializeMap::end(__serde_state)
1042            }
1043        }
1044        StructVariant::Untagged => {
1045            crate::fragment::Fragment::Block({
        let mut _s = ::quote::__private::TokenStream::new();
        ::quote::__private::push_ident(&mut _s, "let");
        ::quote::ToTokens::to_tokens(&let_mut, &mut _s);
        ::quote::__private::push_ident(&mut _s, "__serde_state");
        ::quote::__private::push_eq(&mut _s);
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "Serializer");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "serialize_map");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serializer");
                ::quote::__private::push_comma(&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, "None");
                _s
            });
        ::quote::__private::push_question(&mut _s);
        ::quote::__private::push_semi(&mut _s);
        {
            use ::quote::__private::ext::*;
            let has_iter = ::quote::__private::HasIterator::<false>;
            #[allow(unused_mut)]
            let (mut serialize_fields, i) =
                serialize_fields.quote_into_iter();
            let has_iter = has_iter | i;
            <_ as
                    ::quote::__private::CheckHasIterator<true>>::check(has_iter);
            while true {
                let serialize_fields =
                    match serialize_fields.next() {
                        Some(_x) => ::quote::__private::RepInterp(_x),
                        None => break,
                    };
                ::quote::ToTokens::to_tokens(&serialize_fields, &mut _s);
            }
        }
        ::quote::__private::push_ident(&mut _s, "_serde");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "ser");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "SerializeMap");
        ::quote::__private::push_colon2(&mut _s);
        ::quote::__private::push_ident(&mut _s, "end");
        ::quote::__private::push_group(&mut _s,
            ::quote::__private::Delimiter::Parenthesis,
            {
                let mut _s = ::quote::__private::TokenStream::new();
                ::quote::__private::push_ident(&mut _s, "__serde_state");
                _s
            });
        _s
    });quote_block! {
1046                let #let_mut __serde_state = _serde::Serializer::serialize_map(
1047                    __serializer,
1048                    _serde::#private::None)?;
1049                #(#serialize_fields)*
1050                _serde::ser::SerializeMap::end(__serde_state)
1051            }
1052        }
1053    }
1054}
1055
1056fn serialize_tuple_struct_visitor(
1057    fields: &[Field],
1058    params: &Parameters,
1059    is_enum: bool,
1060    tuple_trait: &TupleTrait,
1061) -> Vec<TokenStream> {
1062    let mut dst_fields = Vec::new();
1063
1064    for (i, field) in fields.iter().enumerate() {
1065        if field.attrs.skip_serializing() {
1066            continue;
1067        }
1068        let mut field_expr = if is_enum {
1069            let id = field_i(i);
1070            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&id, &mut _s);
    _s
}quote!(#id)
1071        } else {
1072            get_member(
1073                params,
1074                field,
1075                &Member::Unnamed(Index {
1076                    index: i as u32,
1077                    span: Span::call_site(),
1078                }),
1079            )
1080        };
1081
1082        let skip = field
1083            .attrs
1084            .skip_serializing_if()
1085            .map(|path| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&path, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
            _s
        });
    _s
}quote!(#path(#field_expr)));
1086
1087        if let Some(path) = field.attrs.serialize_with() {
1088            field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
1089        }
1090
1091        let span = field.original.span();
1092        let func = tuple_trait.serialize_element(span);
1093        let ser = {
    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::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "mut");
            ::quote::__private::push_ident(&mut _s, "__serde_state");
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
            _s
        });
    ::quote::__private::push_question(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
1094            #func(&mut __serde_state, #field_expr)?;
1095        };
1096
1097        dst_fields.push(match skip {
1098            None => ser,
1099            Some(skip) => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::__private::push_bang(&mut _s);
    ::quote::ToTokens::to_tokens(&skip, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ser, &mut _s);
            _s
        });
    _s
}quote!(if !#skip { #ser }),
1100        });
1101    }
1102    dst_fields
1103}
1104
1105fn serialize_struct_visitor(
1106    fields: &[Field],
1107    params: &Parameters,
1108    is_enum: bool,
1109    struct_trait: &StructTrait,
1110) -> Vec<TokenStream> {
1111    let mut dst_fields = Vec::new();
1112
1113    for field in fields {
1114        if field.attrs.skip_serializing() {
1115            continue;
1116        }
1117        let member = &field.member;
1118
1119        let mut field_expr = if is_enum {
1120            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&member, &mut _s);
    _s
}quote!(#member)
1121        } else {
1122            get_member(params, field, member)
1123        };
1124
1125        let key_expr = field.attrs.name().serialize_name();
1126
1127        let skip = field
1128            .attrs
1129            .skip_serializing_if()
1130            .map(|path| {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&path, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
            _s
        });
    _s
}quote!(#path(#field_expr)));
1131
1132        if let Some(path) = field.attrs.serialize_with() {
1133            field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
1134        }
1135
1136        let span = field.original.span();
1137        let ser = if field.attrs.flatten() {
1138            let func = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "Serialize");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "serialize");
    _s
}quote_spanned!(span=> _serde::Serialize::serialize);
1139            {
    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::__private::push_and(&mut _s);
            ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
            ::quote::__private::push_comma(&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, "ser");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "FlatMapSerializer");
            ::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, "mut");
                    ::quote::__private::push_ident(&mut _s, "__serde_state");
                    _s
                });
            _s
        });
    ::quote::__private::push_question(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
1140                #func(&#field_expr, _serde::#private::ser::FlatMapSerializer(&mut __serde_state))?;
1141            }
1142        } else {
1143            let func = struct_trait.serialize_field(span);
1144            {
    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::__private::push_and(&mut _s);
            ::quote::__private::push_ident(&mut _s, "mut");
            ::quote::__private::push_ident(&mut _s, "__serde_state");
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&key_expr, &mut _s);
            ::quote::__private::push_comma(&mut _s);
            ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
            _s
        });
    ::quote::__private::push_question(&mut _s);
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
1145                #func(&mut __serde_state, #key_expr, #field_expr)?;
1146            }
1147        };
1148
1149        dst_fields.push(match skip {
1150            None => ser,
1151            Some(skip) => {
1152                if let Some(skip_func) = struct_trait.skip_field(span) {
1153                    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::__private::push_bang(&mut _s);
    ::quote::ToTokens::to_tokens(&skip, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ser, &mut _s);
            _s
        });
    ::quote::__private::push_ident(&mut _s, "else");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&skip_func, &mut _s);
            ::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, "mut");
                    ::quote::__private::push_ident(&mut _s, "__serde_state");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::ToTokens::to_tokens(&key_expr, &mut _s);
                    _s
                });
            ::quote::__private::push_question(&mut _s);
            ::quote::__private::push_semi(&mut _s);
            _s
        });
    _s
}quote! {
1154                        if !#skip {
1155                            #ser
1156                        } else {
1157                            #skip_func(&mut __serde_state, #key_expr)?;
1158                        }
1159                    }
1160                } else {
1161                    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "if");
    ::quote::__private::push_bang(&mut _s);
    ::quote::ToTokens::to_tokens(&skip, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ser, &mut _s);
            _s
        });
    _s
}quote! {
1162                        if !#skip {
1163                            #ser
1164                        }
1165                    }
1166                }
1167            }
1168        });
1169    }
1170    dst_fields
1171}
1172
1173fn wrap_serialize_field_with(
1174    params: &Parameters,
1175    field_ty: &syn::Type,
1176    serialize_with: &syn::ExprPath,
1177    field_expr: &TokenStream,
1178) -> TokenStream {
1179    wrap_serialize_with(params, serialize_with, &[field_ty], &[{
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&field_expr, &mut _s);
    _s
}quote!(#field_expr)])
1180}
1181
1182fn wrap_serialize_variant_with(
1183    params: &Parameters,
1184    serialize_with: &syn::ExprPath,
1185    variant: &Variant,
1186) -> TokenStream {
1187    let field_tys: Vec<_> = variant.fields.iter().map(|field| field.ty).collect();
1188    let field_exprs: Vec<_> = variant
1189        .fields
1190        .iter()
1191        .map(|field| {
1192            let id = match &field.member {
1193                Member::Named(ident) => ident.clone(),
1194                Member::Unnamed(member) => field_i(member.index as usize),
1195            };
1196            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&id, &mut _s);
    _s
}quote!(#id)
1197        })
1198        .collect();
1199    wrap_serialize_with(
1200        params,
1201        serialize_with,
1202        field_tys.as_slice(),
1203        field_exprs.as_slice(),
1204    )
1205}
1206
1207fn wrap_serialize_with(
1208    params: &Parameters,
1209    serialize_with: &syn::ExprPath,
1210    field_tys: &[&syn::Type],
1211    field_exprs: &[TokenStream],
1212) -> TokenStream {
1213    let this_type = &params.this_type;
1214    let (_, ty_generics, where_clause) = params.generics.split_for_impl();
1215
1216    let wrapper_generics = if field_exprs.is_empty() {
1217        params.generics.clone()
1218    } else {
1219        bound::with_lifetime_bound(&params.generics, "'__a")
1220    };
1221    let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();
1222
1223    let field_access = (0..field_exprs.len()).map(|n| {
1224        Member::Unnamed(Index {
1225            index: n as u32,
1226            span: Span::call_site(),
1227        })
1228    });
1229
1230    let self_var = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "self");
    _s
}quote!(self);
1231    let serializer_var = {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "__s");
    _s
}quote!(__s);
1232
1233    // If #serialize_with returns wrong type, error will be reported on here.
1234    // We attach span of the path to this piece so error will be reported
1235    // on the #[serde(with = "...")]
1236    //                       ^^^^^
1237    let wrapper_serialize = {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(serialize_with.span()).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&serialize_with, &mut _s);
    ::quote::__private::push_group_spanned(&mut _s, _span,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut self_var, i) = self_var.quote_into_iter();
                let has_iter = has_iter | i;
                #[allow(unused_mut)]
                let (mut field_access, i) = field_access.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let self_var =
                        match self_var.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    let field_access =
                        match field_access.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&self_var, &mut _s);
                    ::quote::__private::push_dot_spanned(&mut _s, _span);
                    ::quote::__private::push_ident_spanned(&mut _s, _span,
                        "values");
                    ::quote::__private::push_dot_spanned(&mut _s, _span);
                    ::quote::ToTokens::to_tokens(&field_access, &mut _s);
                    ::quote::__private::push_comma_spanned(&mut _s, _span);
                }
            }
            ::quote::ToTokens::to_tokens(&serializer_var, &mut _s);
            _s
        });
    _s
}quote_spanned! {serialize_with.span()=>
1238        #serialize_with(#(#self_var.values.#field_access, )* #serializer_var)
1239    };
1240
1241    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_and(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            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, "__SerializeWith");
            ::quote::ToTokens::to_tokens(&wrapper_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, "values");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            {
                                use ::quote::__private::ext::*;
                                let has_iter = ::quote::__private::HasIterator::<false>;
                                #[allow(unused_mut)]
                                let (mut field_tys, i) = field_tys.quote_into_iter();
                                let has_iter = has_iter | i;
                                <_ as
                                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                while true {
                                    let field_tys =
                                        match field_tys.next() {
                                            Some(_x) => ::quote::__private::RepInterp(_x),
                                            None => break,
                                        };
                                    ::quote::__private::push_and(&mut _s);
                                    ::quote::__private::push_lifetime(&mut _s, "\'__a");
                                    ::quote::ToTokens::to_tokens(&field_tys, &mut _s);
                                    ::quote::__private::push_comma(&mut _s);
                                }
                            }
                            _s
                        });
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "phantom");
                    ::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);
                    _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(&wrapper_impl_generics, &mut _s);
            ::quote::__private::push_ident(&mut _s, "_serde");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Serialize");
            ::quote::__private::push_ident(&mut _s, "for");
            ::quote::__private::push_ident(&mut _s, "__SerializeWith");
            ::quote::ToTokens::to_tokens(&wrapper_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, "fn");
                    ::quote::__private::push_ident(&mut _s, "serialize");
                    ::quote::__private::push_lt(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__S");
                    ::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_and(&mut _s);
                            ::quote::ToTokens::to_tokens(&self_var, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::ToTokens::to_tokens(&serializer_var, &mut _s);
                            ::quote::__private::push_colon(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "__S");
                            _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, "__S");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Ok");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "__S");
                    ::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, "__S");
                    ::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, "Serializer");
                    ::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(&wrapper_serialize, &mut _s);
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "__SerializeWith");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "values");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            {
                                use ::quote::__private::ext::*;
                                let has_iter = ::quote::__private::HasIterator::<false>;
                                #[allow(unused_mut)]
                                let (mut field_exprs, i) = field_exprs.quote_into_iter();
                                let has_iter = has_iter | i;
                                <_ as
                                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                while true {
                                    let field_exprs =
                                        match field_exprs.next() {
                                            Some(_x) => ::quote::__private::RepInterp(_x),
                                            None => break,
                                        };
                                    ::quote::ToTokens::to_tokens(&field_exprs, &mut _s);
                                    ::quote::__private::push_comma(&mut _s);
                                }
                            }
                            _s
                        });
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "phantom");
                    ::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);
                    _s
                });
            _s
        });
    _s
}quote!(&{
1242        #[doc(hidden)]
1243        struct __SerializeWith #wrapper_impl_generics #where_clause {
1244            values: (#(&'__a #field_tys, )*),
1245            phantom: _serde::#private::PhantomData<#this_type #ty_generics>,
1246        }
1247
1248        #[automatically_derived]
1249        impl #wrapper_impl_generics _serde::Serialize for __SerializeWith #wrapper_ty_generics #where_clause {
1250            fn serialize<__S>(&#self_var, #serializer_var: __S) -> _serde::#private::Result<__S::Ok, __S::Error>
1251            where
1252                __S: _serde::Serializer,
1253            {
1254                #wrapper_serialize
1255            }
1256        }
1257
1258        __SerializeWith {
1259            values: (#(#field_exprs, )*),
1260            phantom: _serde::#private::PhantomData::<#this_type #ty_generics>,
1261        }
1262    })
1263}
1264
1265// Serialization of an empty struct results in code like:
1266//
1267//     let mut __serde_state = serializer.serialize_struct("S", 0)?;
1268//     _serde::ser::SerializeStruct::end(__serde_state)
1269//
1270// where we want to omit the `mut` to avoid a warning.
1271fn mut_if(is_mut: bool) -> Option<TokenStream> {
1272    if is_mut {
1273        Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "mut");
    _s
}quote!(mut))
1274    } else {
1275        None
1276    }
1277}
1278
1279fn get_member(params: &Parameters, field: &Field, member: &Member) -> TokenStream {
1280    let self_var = &params.self_var;
1281    match (params.is_remote, field.attrs.getter()) {
1282        (false, None) => {
1283            if params.is_packed {
1284                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_and(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&self_var, &mut _s);
            ::quote::__private::push_dot(&mut _s);
            ::quote::ToTokens::to_tokens(&member, &mut _s);
            _s
        });
    _s
}quote!(&{#self_var.#member})
1285            } else {
1286                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_and(&mut _s);
    ::quote::ToTokens::to_tokens(&self_var, &mut _s);
    ::quote::__private::push_dot(&mut _s);
    ::quote::ToTokens::to_tokens(&member, &mut _s);
    _s
}quote!(&#self_var.#member)
1287            }
1288        }
1289        (true, None) => {
1290            let inner = if params.is_packed {
1291                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_and(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&self_var, &mut _s);
            ::quote::__private::push_dot(&mut _s);
            ::quote::ToTokens::to_tokens(&member, &mut _s);
            _s
        });
    _s
}quote!(&{#self_var.#member})
1292            } else {
1293                {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_and(&mut _s);
    ::quote::ToTokens::to_tokens(&self_var, &mut _s);
    ::quote::__private::push_dot(&mut _s);
    ::quote::ToTokens::to_tokens(&member, &mut _s);
    _s
}quote!(&#self_var.#member)
1294            };
1295            let ty = field.ty;
1296            {
    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, "ser");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "constrain");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_lt(&mut _s);
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&inner, &mut _s);
            _s
        });
    _s
}quote!(_serde::#private::ser::constrain::<#ty>(#inner))
1297        }
1298        (true, Some(getter)) => {
1299            let ty = field.ty;
1300            {
    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, "ser");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "constrain");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_lt(&mut _s);
    ::quote::ToTokens::to_tokens(&ty, &mut _s);
    ::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_and(&mut _s);
            ::quote::ToTokens::to_tokens(&getter, &mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::ToTokens::to_tokens(&self_var, &mut _s);
                    _s
                });
            _s
        });
    _s
}quote!(_serde::#private::ser::constrain::<#ty>(&#getter(#self_var)))
1301        }
1302        (false, Some(_)) => {
1303            {
    ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
            format_args!("getter is only allowed for remote impls")));
};unreachable!("getter is only allowed for remote impls");
1304        }
1305    }
1306}
1307
1308fn effective_style(variant: &Variant) -> Style {
1309    match variant.style {
1310        Style::Newtype if variant.fields[0].attrs.skip_serializing() => Style::Unit,
1311        other => other,
1312    }
1313}
1314
1315enum StructTrait {
1316    SerializeMap,
1317    SerializeStruct,
1318    SerializeStructVariant,
1319}
1320
1321impl StructTrait {
1322    fn serialize_field(&self, span: Span) -> TokenStream {
1323        match *self {
1324            StructTrait::SerializeMap => {
1325                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "SerializeMap");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "serialize_entry");
    _s
}quote_spanned!(span=> _serde::ser::SerializeMap::serialize_entry)
1326            }
1327            StructTrait::SerializeStruct => {
1328                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "SerializeStruct");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "serialize_field");
    _s
}quote_spanned!(span=> _serde::ser::SerializeStruct::serialize_field)
1329            }
1330            StructTrait::SerializeStructVariant => {
1331                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "SerializeStructVariant");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "serialize_field");
    _s
}quote_spanned!(span=> _serde::ser::SerializeStructVariant::serialize_field)
1332            }
1333        }
1334    }
1335
1336    fn skip_field(&self, span: Span) -> Option<TokenStream> {
1337        match *self {
1338            StructTrait::SerializeMap => None,
1339            StructTrait::SerializeStruct => {
1340                Some({
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "SerializeStruct");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "skip_field");
    _s
}quote_spanned!(span=> _serde::ser::SerializeStruct::skip_field))
1341            }
1342            StructTrait::SerializeStructVariant => {
1343                Some({
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "SerializeStructVariant");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "skip_field");
    _s
}quote_spanned!(span=> _serde::ser::SerializeStructVariant::skip_field))
1344            }
1345        }
1346    }
1347}
1348
1349enum TupleTrait {
1350    SerializeTuple,
1351    SerializeTupleStruct,
1352    SerializeTupleVariant,
1353}
1354
1355impl TupleTrait {
1356    fn serialize_element(&self, span: Span) -> TokenStream {
1357        match *self {
1358            TupleTrait::SerializeTuple => {
1359                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "SerializeTuple");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "serialize_element");
    _s
}quote_spanned!(span=> _serde::ser::SerializeTuple::serialize_element)
1360            }
1361            TupleTrait::SerializeTupleStruct => {
1362                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "SerializeTupleStruct");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "serialize_field");
    _s
}quote_spanned!(span=> _serde::ser::SerializeTupleStruct::serialize_field)
1363            }
1364            TupleTrait::SerializeTupleVariant => {
1365                {
    let _span: ::quote::__private::Span =
        ::quote::__private::get_span(span).__into_span();
    let mut _s = ::quote::__private::TokenStream::new();
    ::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, "ser");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span,
        "SerializeTupleVariant");
    ::quote::__private::push_colon2_spanned(&mut _s, _span);
    ::quote::__private::push_ident_spanned(&mut _s, _span, "serialize_field");
    _s
}quote_spanned!(span=> _serde::ser::SerializeTupleVariant::serialize_field)
1366            }
1367        }
1368    }
1369}