fn serialized_size_enum()

in lain_derive/src/serialize.rs [336:393]


fn serialized_size_enum(
    variants: &[Variant],
    cont_ident: &syn::Ident,
    size: Option<usize>,
    min_size: Option<usize>,
) -> SerializedSizeBodies {
    let match_arms = serialized_size_enum_visitor(
        variants,
        cont_ident,
        SerializedSizeVisitorType::SerializedSize,
    );
    let nonzero_variants = serialized_size_enum_visitor(
        variants,
        cont_ident,
        SerializedSizeVisitorType::MinNonzeroElements,
    );
    let max_obj = serialized_size_enum_visitor(
        variants,
        cont_ident,
        SerializedSizeVisitorType::MaxDefaultObjectSize,
    );
    let min_variant = serialized_size_enum_visitor(
        variants,
        cont_ident,
        SerializedSizeVisitorType::MinEnumVariantSize,
    );

    let serialized_size = if let Some(size) = size {
        quote! {#size}
    } else {
        quote! {
            match *self {
                #(#match_arms)*
            }
        }
    };

    let min_nonzero = if let Some(min_size) = min_size {
        quote! {#min_size}
    } else {
        quote! {*[#(#nonzero_variants,)*].iter().min_by(|a, b| a.cmp(b)).unwrap()}
    };

    let max_default = quote! {*[#(#max_obj,)*].iter().max_by(|a, b| a.cmp(b)).unwrap()};

    let min_variant = quote! {
        match *self {
            #(#min_variant)*
        }
    };

    SerializedSizeBodies {
        serialized_size,
        min_nonzero_elements_size: min_nonzero,
        max_default_object_size: max_default,
        min_enum_variant_size: min_variant,
    }
}