enum_downcast_derive/
lib.rs

1mod variant;
2
3use proc_macro2::TokenStream;
4use syn::{parse_macro_input, parse_quote};
5
6use crate::variant::generate_variant;
7
8#[proc_macro_derive(EnumDowncast, attributes(enum_downcast))]
9pub fn enum_downcast_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
10    impl_enum_downcast(parse_macro_input!(input)).into()
11}
12
13fn impl_enum_downcast(item: syn::ItemEnum) -> TokenStream {
14    let mut tokens = TokenStream::new();
15    for variant in &item.variants {
16        if variant
17            .attrs
18            .contains(&parse_quote! {#[enum_downcast(skip)]})
19        {
20            continue;
21        }
22        tokens.extend(generate_variant(&item, variant));
23    }
24    tokens
25}