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,
}
}