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}