in lain_derive/src/serialize.rs [545:604]
fn serialized_size_enum_visitor(
variants: &[Variant],
cont_ident: &syn::Ident,
visitor_type: SerializedSizeVisitorType,
) -> Vec<TokenStream> {
let match_arms = variants
.iter()
.map(|variant| {
let variant_ident = &variant.ident;
let full_ident = quote! {#cont_ident::#variant_ident};
// TODO BUGBUG: need to decouple BinarySerialize from NewFuzzed to not hit this case with mixed unit/struct enum
if variant.fields.is_empty() {
return match visitor_type {
SerializedSizeVisitorType::SerializedSize
| SerializedSizeVisitorType::MinEnumVariantSize => {
quote_spanned! { variant.original.span() =>
#full_ident => {
0
}
}
}
_ => quote_spanned! { variant.original.span() =>
0
},
};
}
let mut field_identifiers = vec![];
let field_sizes: Vec<TokenStream> = variant
.fields
.iter()
.map(|field| {
let (value_ident, _field_ident_string, field_size) =
field_serialized_size(field, "__field", true, visitor_type);
field_identifiers.push(quote_spanned! { field.member.span() => #value_ident });
field_size
})
.collect();
match visitor_type {
SerializedSizeVisitorType::SerializedSize
| SerializedSizeVisitorType::MinEnumVariantSize => {
quote_spanned! { variant.original.span() =>
#full_ident(#(ref #field_identifiers,)*) => {
0 #(+#field_sizes)*
}
}
}
_ => quote_spanned! { variant.original.span() =>
0 #(+#field_sizes)*
},
}
})
.collect();
match_arms
}