strum_macros/macros/
enum_is.rs

1use crate::helpers::{non_enum_error, snakify, HasStrumVariantProperties};
2use proc_macro2::TokenStream;
3use quote::{format_ident, quote};
4use syn::{Data, DeriveInput};
5
6pub fn enum_is_inner(ast: &DeriveInput) -> syn::Result<TokenStream> {
7    let variants = match &ast.data {
8        Data::Enum(v) => &v.variants,
9        _ => return Err(non_enum_error()),
10    };
11    let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();
12
13    let enum_name = &ast.ident;
14    let variants: Vec<_> = variants
15        .iter()
16        .filter_map(|variant| {
17            if variant.get_variant_properties().ok()?.disabled.is_some() {
18                return None;
19            }
20
21            let variant_name = &variant.ident;
22            let fn_name = format_ident!("is_{}", snakify(&variant_name.to_string()));
23            let doc_comment = format!("Returns [true] if the enum is [{}::{}] otherwise [false]", enum_name, variant_name);
24            Some(quote! {
25                #[must_use]
26                #[inline]
27                #[doc = #doc_comment]
28                pub const fn #fn_name(&self) -> bool {
29                    match self {
30                        &#enum_name::#variant_name { .. } => true,
31                        _ => false
32                    }
33                }
34            })
35        })
36        .collect();
37
38    Ok(quote! {
39        impl #impl_generics #enum_name  #ty_generics #where_clause {
40            #(#variants)*
41        }
42    }
43    .into())
44}