fn serialized_size_enum_visitor()

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
}