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, ¶ms));
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 self_var: Ident,
82
83 this_type: syn::Path,
87
88 this_value: syn::Path,
91
92 generics: syn::Generics,
94
95 is_remote: bool,
97
98 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 fn type_name(&self) -> String {
129 self.this_type.segments.last().unwrap().ident.to_string()
130 }
131}
132
133fn 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
155fn 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 = ¶ms.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 = ¶ms.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 = ¶ms.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 = ¶ms.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 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 = ¶ms.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(¶ms.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 #[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 = ¶ms.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(¶ms.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 = ¶ms.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(¶ms.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 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
1265fn 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 = ¶ms.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}