use crate::enums::parse::{EnumInfo, EnumVariantType};
use quote::quote;
pub fn generate_partial_eq(enum_info: &EnumInfo) -> proc_macro2::TokenStream {
if !enum_info.partial_eq {
return quote! {};
}
let mut comp_arms = quote! {};
let enum_name = &enum_info.name;
let primitive_ty = &enum_info.primitive;
for var in enum_info.variants.iter() {
let name = &var.name;
let arm = match var.value {
EnumVariantType::UnsignedValue(ref v) => {
quote! { (Self::#name, #v) => true, }
}
EnumVariantType::CatchAll(_)
| EnumVariantType::CatchPrimitive(_)
| EnumVariantType::Skip(_) => {
quote! { _ => false, }
}
};
comp_arms = quote! {
#comp_arms
#arm
}
}
quote! {
impl std::cmp::PartialEq<#primitive_ty> for #enum_name {
fn eq(&self, other: &#primitive_ty) -> bool {
match (self, other) {
#comp_arms
}
}
}
}
}