• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::helpers::{non_enum_error, snakify, HasStrumVariantProperties};
2 use proc_macro2::TokenStream;
3 use quote::{format_ident, quote};
4 use syn::{Data, DeriveInput};
5 
enum_is_inner(ast: &DeriveInput) -> syn::Result<TokenStream>6 pub 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 }
45