1 // Copyright 2017 Serde Developers
3 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6 // option. This file may not be copied, modified, or distributed
7 // except according to those terms.
9 use syn
::{self, Ident}
;
13 use fragment
::{Fragment, Stmts, Match}
;
14 use internals
::ast
::{Body, Container, Field, Style, Variant}
;
15 use internals
::{attr, Ctxt}
;
19 pub fn expand_derive_serialize(input
: &syn
::DeriveInput
) -> Result
<Tokens
, String
> {
20 let ctxt
= Ctxt
::new();
21 let cont
= Container
::from_ast(&ctxt
, input
);
22 precondition(&ctxt
, &cont
);
25 let ident
= &cont
.ident
;
26 let params
= Parameters
::new(&cont
);
27 let (impl_generics
, ty_generics
, where_clause
) = params
.generics
.split_for_impl();
28 let dummy_const
= Ident
::new(format
!("_IMPL_SERIALIZE_FOR_{}", ident
));
29 let body
= Stmts(serialize_body(&cont
, ¶ms
));
31 let impl_block
= if let Some(remote
) = cont
.attrs
.remote() {
34 impl #impl_generics #ident #ty_generics #where_clause {
35 #vis fn serialize<__S>(__self: &#remote #ty_generics, __serializer: __S) -> _serde::export::Result<__S::Ok, __S::Error>
36 where __S
: _serde
::Serializer
44 #[automatically_derived]
45 impl #impl_generics _serde::Serialize for #ident #ty_generics #where_clause {
46 fn serialize
<__S
>(&self, __serializer
: __S
) -> _serde
::export
::Result
<__S
::Ok
, __S
::Error
>
47 where __S
: _serde
::Serializer
55 let generated
= quote
! {
56 #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
57 const #dummy_const: () = {
58 extern crate serde
as _serde
;
65 fn precondition(cx
: &Ctxt
, cont
: &Container
) {
66 match cont
.attrs
.identifier() {
67 attr
::Identifier
::No
=> {}
68 attr
::Identifier
::Field
=> {
69 cx
.error("field identifiers cannot be serialized");
71 attr
::Identifier
::Variant
=> {
72 cx
.error("variant identifiers cannot be serialized");
78 /// Variable holding the value being serialized. Either `self` for local
79 /// types or `__self` for remote types.
82 /// Path to the type the impl is for. Either a single `Ident` for local
83 /// types or `some::remote::Ident` for remote types. Does not include
84 /// generic parameters.
87 /// Generics including any explicit and inferred bounds for the impl.
88 generics
: syn
::Generics
,
90 /// Type has a `serde(remote = "...")` attribute.
95 fn new(cont
: &Container
) -> Self {
96 let is_remote
= cont
.attrs
.remote().is_some();
97 let self_var
= if is_remote
{
103 let this
= match cont
.attrs
.remote() {
104 Some(remote
) => remote
.clone(),
105 None
=> cont
.ident
.clone().into(),
108 let generics
= build_generics(cont
);
114 is_remote
: is_remote
,
118 /// Type name to use in error messages and `&'static str` arguments to
119 /// various Serializer methods.
120 fn type_name(&self) -> &str {
121 self.this
.segments
.last().unwrap().ident
.as_ref()
125 // All the generics in the input, plus a bound `T: Serialize` for each generic
126 // field type that will be serialized by us.
127 fn build_generics(cont
: &Container
) -> syn
::Generics
{
128 let generics
= bound
::without_defaults(cont
.generics
);
131 bound
::with_where_predicates_from_fields(cont
, &generics
, attr
::Field
::ser_bound
);
133 match cont
.attrs
.ser_bound() {
134 Some(predicates
) => bound
::with_where_predicates(&generics
, predicates
),
139 needs_serialize_bound
,
140 &path
!(_serde
::Serialize
),
146 // Fields with a `skip_serializing` or `serialize_with` attribute, or which
147 // belong to a variant with a `serialize_with` attribute, are not serialized by
148 // us so we do not generate a bound. Fields with a `bound` attribute specify
149 // their own bound so we do not generate one. All other fields may need a `T:
150 // Serialize` bound where T is the type of the field.
151 fn needs_serialize_bound(field
: &attr
::Field
, variant
: Option
<&attr
::Variant
>) -> bool
{
152 !field
.skip_serializing() &&
153 field
.serialize_with().is_none() &&
154 field
.ser_bound().is_none() &&
155 variant
.map_or(true, |variant
| variant
.serialize_with().is_none())
158 fn serialize_body(cont
: &Container
, params
: &Parameters
) -> Fragment
{
159 if let Some(into_type
) = cont
.attrs
.into_type() {
160 serialize_into(params
, into_type
)
163 Body
::Enum(ref variants
) => serialize_enum(params
, variants
, &cont
.attrs
),
164 Body
::Struct(Style
::Struct
, ref fields
) => {
165 if fields
.iter().any(|field
| field
.ident
.is_none()) {
166 panic
!("struct has unnamed fields");
168 serialize_struct(params
, fields
, &cont
.attrs
)
170 Body
::Struct(Style
::Tuple
, ref fields
) => {
171 if fields
.iter().any(|field
| field
.ident
.is_some()) {
172 panic
!("tuple struct has named fields");
174 serialize_tuple_struct(params
, fields
, &cont
.attrs
)
176 Body
::Struct(Style
::Newtype
, ref fields
) => {
177 serialize_newtype_struct(params
, &fields
[0], &cont
.attrs
)
179 Body
::Struct(Style
::Unit
, _
) => serialize_unit_struct(&cont
.attrs
),
184 fn serialize_into(params
: &Parameters
, into_type
: &syn
::Ty
) -> Fragment
{
185 let self_var
= ¶ms
.self_var
;
187 _serde
::Serialize
::serialize(
188 &_serde
::export
::Into
::<#into_type>::into(_serde::export::Clone::clone(#self_var)),
193 fn serialize_unit_struct(cattrs
: &attr
::Container
) -> Fragment
{
194 let type_name
= cattrs
.name().serialize_name();
197 _serde
::Serializer
::serialize_unit_struct(__serializer
, #type_name)
201 fn serialize_newtype_struct(
204 cattrs
: &attr
::Container
,
206 let type_name
= cattrs
.name().serialize_name();
208 let mut field_expr
= get_field(params
, field
, 0);
209 if let Some(path
) = field
.attrs
.serialize_with() {
210 field_expr
= wrap_serialize_field_with(params
, field
.ty
, path
, field_expr
);
214 _serde
::Serializer
::serialize_newtype_struct(__serializer
, #type_name, #field_expr)
218 fn serialize_tuple_struct(
221 cattrs
: &attr
::Container
,
223 let serialize_stmts
= serialize_tuple_struct_visitor(
227 quote
!(_serde
::ser
::SerializeTupleStruct
::serialize_field
),
230 let type_name
= cattrs
.name().serialize_name();
231 let len
= serialize_stmts
.len();
232 let let_mut
= mut_if(len
> 0);
235 let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple_struct(__serializer, #type_name, #len));
237 _serde
::ser
::SerializeTupleStruct
::end(__serde_state
)
241 fn serialize_struct(params
: &Parameters
, fields
: &[Field
], cattrs
: &attr
::Container
) -> Fragment
{
242 assert
!(fields
.len() as u64 <= u32::MAX
as u64);
244 let serialize_fields
= serialize_struct_visitor(
248 quote
!(_serde
::ser
::SerializeStruct
::serialize_field
),
249 quote
!(_serde
::ser
::SerializeStruct
::skip_field
),
252 let type_name
= cattrs
.name().serialize_name();
254 let mut serialized_fields
= fields
256 .filter(|&field
| !field
.attrs
.skip_serializing())
259 let let_mut
= mut_if(serialized_fields
.peek().is_some());
261 let len
= serialized_fields
263 |field
| match field
.attrs
.skip_serializing_if() {
266 let ident
= field
.ident
.clone().expect("struct has unnamed fields");
267 let field_expr
= get_field(params
, field
, ident
);
268 quote
!(if #path(#field_expr) { 0 } else { 1 })
272 .fold(quote
!(0), |sum
, expr
| quote
!(#sum + #expr));
275 let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(__serializer, #type_name, #len));
276 #(#serialize_fields)*
277 _serde
::ser
::SerializeStruct
::end(__serde_state
)
281 fn serialize_enum(params
: &Parameters
, variants
: &[Variant
], cattrs
: &attr
::Container
) -> Fragment
{
282 assert
!(variants
.len() as u64 <= u32::MAX
as u64);
284 let self_var
= ¶ms
.self_var
;
286 let arms
: Vec
<_
> = variants
290 |(variant_index
, variant
)| {
291 serialize_variant(params
, variant
, variant_index
as u32, cattrs
)
303 fn serialize_variant(
307 cattrs
: &attr
::Container
,
309 let this
= ¶ms
.this
;
310 let variant_ident
= variant
.ident
.clone();
312 if variant
.attrs
.skip_serializing() {
313 let skipped_msg
= format
!(
314 "the enum variant {}::{} cannot be serialized",
318 let skipped_err
= quote
! {
319 _serde
::export
::Err(_serde
::ser
::Error
::custom(#skipped_msg))
321 let fields_pat
= match variant
.style
{
322 Style
::Unit
=> quote
!(),
323 Style
::Newtype
| Style
::Tuple
=> quote
!((..)),
333 #this::#variant_ident #fields_pat => #skipped_err,
336 // variant wasn't skipped
337 let case
= match variant
.style
{
340 #this::#variant_ident
345 #this::#variant_ident(ref __field0)
350 (0..variant
.fields
.len()).map(|i
| Ident
::new(format
!("__field{}", i
)));
352 #this::#variant_ident(#(ref #field_names),*)
363 .expect("struct variant has unnamed fields")
367 #this::#variant_ident { #(ref #fields),* }
373 match *cattrs
.tag() {
374 attr
::EnumTag
::External
=> {
375 serialize_externally_tagged_variant(params
, variant
, variant_index
, cattrs
)
377 attr
::EnumTag
::Internal { ref tag }
=> {
378 serialize_internally_tagged_variant(params
, variant
, cattrs
, tag
)
380 attr
::EnumTag
::Adjacent
{
383 } => serialize_adjacently_tagged_variant(params
, variant
, cattrs
, tag
, content
),
384 attr
::EnumTag
::None
=> serialize_untagged_variant(params
, variant
, cattrs
),
394 fn serialize_externally_tagged_variant(
398 cattrs
: &attr
::Container
,
400 let type_name
= cattrs
.name().serialize_name();
401 let variant_name
= variant
.attrs
.name().serialize_name();
403 if let Some(path
) = variant
.attrs
.serialize_with() {
404 let ser
= wrap_serialize_variant_with(params
, path
, &variant
);
406 _serde
::Serializer
::serialize_newtype_variant(
416 match variant
.style
{
419 _serde
::Serializer
::serialize_unit_variant(
428 let field
= &variant
.fields
[0];
429 let mut field_expr
= quote
!(__field0
);
430 if let Some(path
) = field
.attrs
.serialize_with() {
431 field_expr
= wrap_serialize_field_with(params
, field
.ty
, path
, field_expr
);
435 _serde
::Serializer
::serialize_newtype_variant(
445 serialize_tuple_variant(
446 TupleVariant
::ExternallyTagged
{
447 type_name
: type_name
,
448 variant_index
: variant_index
,
449 variant_name
: variant_name
,
456 serialize_struct_variant(
457 StructVariant
::ExternallyTagged
{
458 variant_index
: variant_index
,
459 variant_name
: variant_name
,
469 fn serialize_internally_tagged_variant(
472 cattrs
: &attr
::Container
,
475 let type_name
= cattrs
.name().serialize_name();
476 let variant_name
= variant
.attrs
.name().serialize_name();
478 let enum_ident_str
= params
.type_name();
479 let variant_ident_str
= variant
.ident
.as_ref();
481 if let Some(path
) = variant
.attrs
.serialize_with() {
482 let ser
= wrap_serialize_variant_with(params
, path
, &variant
);
484 _serde
::private
::ser
::serialize_tagged_newtype(
495 match variant
.style
{
498 let mut __struct
= try
!(_serde
::Serializer
::serialize_struct(
499 __serializer
, #type_name, 1));
500 try
!(_serde
::ser
::SerializeStruct
::serialize_field(
501 &mut __struct
, #tag, #variant_name));
502 _serde
::ser
::SerializeStruct
::end(__struct
)
506 let field
= &variant
.fields
[0];
507 let mut field_expr
= quote
!(__field0
);
508 if let Some(path
) = field
.attrs
.serialize_with() {
509 field_expr
= wrap_serialize_field_with(params
, field
.ty
, path
, field_expr
);
513 _serde
::private
::ser
::serialize_tagged_newtype(
524 serialize_struct_variant(
525 StructVariant
::InternallyTagged
{
527 variant_name
: variant_name
,
534 Style
::Tuple
=> unreachable
!("checked in serde_derive_internals"),
538 fn serialize_adjacently_tagged_variant(
541 cattrs
: &attr
::Container
,
545 let this
= ¶ms
.this
;
546 let type_name
= cattrs
.name().serialize_name();
547 let variant_name
= variant
.attrs
.name().serialize_name();
550 if let Some(path
) = variant
.attrs
.serialize_with() {
551 let ser
= wrap_serialize_variant_with(params
, path
, &variant
);
553 _serde
::Serialize
::serialize(#ser, __serializer)
556 match variant
.style
{
558 return quote_block
! {
559 let mut __struct
= try
!(_serde
::Serializer
::serialize_struct(
560 __serializer
, #type_name, 1));
561 try
!(_serde
::ser
::SerializeStruct
::serialize_field(
562 &mut __struct
, #tag, #variant_name));
563 _serde
::ser
::SerializeStruct
::end(__struct
)
567 let field
= &variant
.fields
[0];
568 let mut field_expr
= quote
!(__field0
);
569 if let Some(path
) = field
.attrs
.serialize_with() {
570 field_expr
= wrap_serialize_field_with(params
, field
.ty
, path
, field_expr
);
574 _serde
::Serialize
::serialize(#field_expr, __serializer)
578 serialize_tuple_variant(TupleVariant
::Untagged
, params
, &variant
.fields
)
581 serialize_struct_variant(
582 StructVariant
::Untagged
,
592 let fields_ty
= variant
.fields
.iter().map(|f
| &f
.ty
);
593 let ref fields_ident
: Vec
<_
> = match variant
.style
{
595 if variant
.attrs
.serialize_with().is_some() {
601 Style
::Newtype
=> vec
![Ident
::new("__field0")],
603 (0..variant
.fields
.len())
604 .map(|i
| Ident
::new(format
!("__field{}", i
)))
615 .expect("struct variant has unnamed fields")
622 let (_
, ty_generics
, where_clause
) = params
.generics
.split_for_impl();
624 let wrapper_generics
= if let Style
::Unit
= variant
.style
{
625 params
.generics
.clone()
627 bound
::with_lifetime_bound(¶ms
.generics
, "'__a")
629 let (wrapper_impl_generics
, wrapper_ty_generics
, _
) = wrapper_generics
.split_for_impl();
632 struct __AdjacentlyTagged
#wrapper_generics #where_clause {
633 data
: (#(&'__a #fields_ty,)*),
634 phantom
: _serde
::export
::PhantomData
<#this #ty_generics>,
637 impl #wrapper_impl_generics _serde::Serialize for __AdjacentlyTagged #wrapper_ty_generics #where_clause {
638 fn serialize
<__S
>(&self, __serializer
: __S
) -> _serde
::export
::Result
<__S
::Ok
, __S
::Error
>
639 where __S
: _serde
::Serializer
641 let (#(#fields_ident,)*) = self.data;
646 let mut __struct
= try
!(_serde
::Serializer
::serialize_struct(
647 __serializer
, #type_name, 2));
648 try
!(_serde
::ser
::SerializeStruct
::serialize_field(
649 &mut __struct
, #tag, #variant_name));
650 try
!(_serde
::ser
::SerializeStruct
::serialize_field(
651 &mut __struct
, #content, &__AdjacentlyTagged {
652 data
: (#(#fields_ident,)*),
653 phantom
: _serde
::export
::PhantomData
::<#this #ty_generics>,
655 _serde
::ser
::SerializeStruct
::end(__struct
)
659 fn serialize_untagged_variant(
662 cattrs
: &attr
::Container
,
664 if let Some(path
) = variant
.attrs
.serialize_with() {
665 let ser
= wrap_serialize_variant_with(params
, path
, &variant
);
667 _serde
::Serialize
::serialize(#ser, __serializer)
671 match variant
.style
{
674 _serde
::Serializer
::serialize_unit(__serializer
)
678 let field
= &variant
.fields
[0];
679 let mut field_expr
= quote
!(__field0
);
680 if let Some(path
) = field
.attrs
.serialize_with() {
681 field_expr
= wrap_serialize_field_with(params
, field
.ty
, path
, field_expr
);
685 _serde
::Serialize
::serialize(#field_expr, __serializer)
688 Style
::Tuple
=> serialize_tuple_variant(TupleVariant
::Untagged
, params
, &variant
.fields
),
690 let type_name
= cattrs
.name().serialize_name();
691 serialize_struct_variant(StructVariant
::Untagged
, params
, &variant
.fields
, &type_name
)
700 variant_name
: String
,
705 fn serialize_tuple_variant(
706 context
: TupleVariant
,
710 let method
= match context
{
711 TupleVariant
::ExternallyTagged { .. }
=> {
712 quote
!(_serde
::ser
::SerializeTupleVariant
::serialize_field
)
714 TupleVariant
::Untagged
=> quote
!(_serde
::ser
::SerializeTuple
::serialize_element
),
717 let serialize_stmts
= serialize_tuple_struct_visitor(fields
, params
, true, method
);
719 let len
= serialize_stmts
.len();
720 let let_mut
= mut_if(len
> 0);
723 TupleVariant
::ExternallyTagged
{
729 let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple_variant(
736 _serde
::ser
::SerializeTupleVariant
::end(__serde_state
)
739 TupleVariant
::Untagged
=> {
741 let #let_mut __serde_state = try!(_serde::Serializer::serialize_tuple(
745 _serde
::ser
::SerializeTuple
::end(__serde_state
)
751 enum StructVariant
<'a
> {
754 variant_name
: String
,
756 InternallyTagged { tag: &'a str, variant_name: String }
,
760 fn serialize_struct_variant
<'a
>(
761 context
: StructVariant
<'a
>,
766 let (method
, skip_method
) = match context
{
767 StructVariant
::ExternallyTagged { .. }
=> {
769 quote
!(_serde
::ser
::SerializeStructVariant
::serialize_field
),
770 quote
!(_serde
::ser
::SerializeStructVariant
::skip_field
),
773 StructVariant
::InternallyTagged { .. }
|
774 StructVariant
::Untagged
=> {
776 quote
!(_serde
::ser
::SerializeStruct
::serialize_field
),
777 quote
!(_serde
::ser
::SerializeStruct
::skip_field
),
782 let serialize_fields
= serialize_struct_visitor(fields
, params
, true, method
, skip_method
);
784 let mut serialized_fields
= fields
786 .filter(|&field
| !field
.attrs
.skip_serializing())
789 let let_mut
= mut_if(serialized_fields
.peek().is_some());
791 let len
= serialized_fields
794 let ident
= field
.ident
.clone().expect("struct has unnamed fields");
796 match field
.attrs
.skip_serializing_if() {
797 Some(path
) => quote
!(if #path(#ident) { 0 } else { 1 }),
802 .fold(quote
!(0), |sum
, expr
| quote
!(#sum + #expr));
805 StructVariant
::ExternallyTagged
{
810 let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct_variant(
817 #(#serialize_fields)*
818 _serde
::ser
::SerializeStructVariant
::end(__serde_state
)
821 StructVariant
::InternallyTagged { tag, variant_name }
=> {
823 let mut __serde_state
= try
!(_serde
::Serializer
::serialize_struct(
828 try
!(_serde
::ser
::SerializeStruct
::serialize_field(
833 #(#serialize_fields)*
834 _serde
::ser
::SerializeStruct
::end(__serde_state
)
837 StructVariant
::Untagged
=> {
839 let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(
844 #(#serialize_fields)*
845 _serde
::ser
::SerializeStruct
::end(__serde_state
)
851 fn serialize_tuple_struct_visitor(
862 let mut field_expr
= if is_enum
{
863 let id
= Ident
::new(format
!("__field{}", i
));
866 get_field(params
, field
, i
)
871 .skip_serializing_if()
872 .map(|path
| quote
!(#path(#field_expr)));
874 if let Some(path
) = field
.attrs
.serialize_with() {
875 field_expr
= wrap_serialize_field_with(params
, field
.ty
, path
, field_expr
);
879 try
!(#func(&mut __serde_state, #field_expr));
884 Some(skip
) => quote
!(if !#skip { #ser }),
891 fn serialize_struct_visitor(
900 .filter(|&field
| !field
.attrs
.skip_serializing())
903 let field_ident
= field
.ident
.clone().expect("struct has unnamed field");
904 let mut field_expr
= if is_enum
{
907 get_field(params
, field
, field_ident
)
910 let key_expr
= field
.attrs
.name().serialize_name();
914 .skip_serializing_if()
915 .map(|path
| quote
!(#path(#field_expr)));
917 if let Some(path
) = field
.attrs
.serialize_with() {
918 field_expr
= wrap_serialize_field_with(params
, field
.ty
, path
, field_expr
);
922 try
!(#func(&mut __serde_state, #key_expr, #field_expr));
932 try
!(#skip_func(&mut __serde_state, #key_expr));
942 fn wrap_serialize_field_with(
945 serialize_with
: &syn
::Path
,
948 wrap_serialize_with(params
,
951 &[quote
!(#field_expr)])
954 fn wrap_serialize_variant_with(
956 serialize_with
: &syn
::Path
,
959 let field_tys
: Vec
<_
> = variant
.fields
.iter().map(|field
| field
.ty
).collect();
960 let field_exprs
: Vec
<_
> = variant
.fields
.iter()
963 let id
= field
.ident
.as_ref().map_or_else(|| Ident
::new(format
!("__field{}", i
)),
968 wrap_serialize_with(params
, serialize_with
, field_tys
.as_slice(), field_exprs
.as_slice())
971 fn wrap_serialize_with(
973 serialize_with
: &syn
::Path
,
974 field_tys
: &[&syn
::Ty
],
975 field_exprs
: &[Tokens
],
977 let this
= ¶ms
.this
;
978 let (_
, ty_generics
, where_clause
) = params
.generics
.split_for_impl();
980 let wrapper_generics
= if field_exprs
.len() == 0 {
981 params
.generics
.clone()
983 bound
::with_lifetime_bound(¶ms
.generics
, "'__a")
985 let (wrapper_impl_generics
, wrapper_ty_generics
, _
) = wrapper_generics
.split_for_impl();
987 let field_access
= (0..field_exprs
.len()).map(|n
| Ident
::new(format
!("{}", n
)));
990 struct __SerializeWith
#wrapper_impl_generics #where_clause {
991 values
: (#(&'__a #field_tys, )*),
992 phantom
: _serde
::export
::PhantomData
<#this #ty_generics>,
995 impl #wrapper_impl_generics _serde::Serialize for __SerializeWith #wrapper_ty_generics #where_clause {
996 fn serialize
<__S
>(&self, __s
: __S
) -> _serde
::export
::Result
<__S
::Ok
, __S
::Error
>
997 where __S
: _serde
::Serializer
999 #serialize_with(#(self.values.#field_access, )* __s)
1004 values
: (#(#field_exprs, )*),
1005 phantom
: _serde
::export
::PhantomData
::<#this #ty_generics>,
1010 // Serialization of an empty struct results in code like:
1012 // let mut __serde_state = try!(serializer.serialize_struct("S", 0));
1013 // _serde::ser::SerializeStruct::end(__serde_state)
1015 // where we want to omit the `mut` to avoid a warning.
1016 fn mut_if(is_mut
: bool
) -> Option
<Tokens
> {
1017 if is_mut { Some(quote!(mut)) }
else { None }
1020 fn get_field
<I
>(params
: &Parameters
, field
: &Field
, ident
: I
) -> Tokens
1024 let self_var
= ¶ms
.self_var
;
1025 match (params
.is_remote
, field
.attrs
.getter()) {
1027 let ident
= ident
.into();
1028 quote
!(&#self_var.#ident)
1032 let ident
= ident
.into();
1033 quote
!(_serde
::private
::ser
::constrain
::<#ty>(&#self_var.#ident))
1035 (true, Some(getter
)) => {
1037 quote
!(_serde
::private
::ser
::constrain
::<#ty>(&#getter(#self_var)))
1039 (false, Some(_
)) => {
1040 unreachable
!("getter is only allowed for remote impls");