extendable_enums/
lib.rs

1use proc_macro2::Span;
2use proc_macro::TokenStream;
3use syn::{parse_macro_input, DeriveInput};
4use quote::quote;
5
6#[proc_macro_attribute]
7pub fn extendable_enum(args: TokenStream, source: TokenStream) -> TokenStream {
8    let mut name_string = args.to_string();
9    let source_ast = parse_macro_input!(source as DeriveInput);
10    if args.is_empty() {
11        name_string = format!("extend_from_{}", source_ast.ident);
12    }
13    let name = syn::Ident::new(&name_string, Span::call_site());
14    TokenStream::from(quote! {
15        use quote::quote;
16        use proc_macro2::TokenStream as TokenStream2;
17        use proc_macro::TokenStream;
18
19        #[proc_macro_attribute]
20        pub fn #name(_attr: TokenStream, dst: TokenStream) -> TokenStream {
21            let base = TokenStream2::from(quote! {
22                #source_ast
23            });
24            let dst_convert: TokenStream2 = dst.into();
25            let resp: TokenStream = extendable_enums_helpers::combine_data(base, dst_convert).into();
26            resp
27        }
28    })
29}