1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, Ident, ItemFn};
4
5#[proc_macro_attribute]
6pub fn params_handle(_attr: TokenStream, item: TokenStream) -> TokenStream {
7 let input = parse_macro_input!(item as ItemFn);
8
9 let fn_name = &input.sig.ident;
10 let struct_name = Ident::new(&fn_name.to_string(), proc_macro2::Span::call_site());
11 let fn_body = &input.block;
12
13 let expanded = quote! {
14 pub struct #struct_name;
15
16 impl ParamsProcessor for #struct_name {
17 fn process(&self, path: &str, params: &HashMap<String, String>) -> serde_json::Map<String, Value> {
18 #fn_body
19 }
20 }
21 };
22
23 TokenStream::from(expanded)
24}
25
26#[proc_macro_attribute]
27pub fn island_handle(_attr: TokenStream, item: TokenStream) -> TokenStream {
28 let input = parse_macro_input!(item as ItemFn);
29
30 let fn_name = &input.sig.ident;
31 let struct_name = Ident::new(&fn_name.to_string(), proc_macro2::Span::call_site());
32 let fn_body = &input.block;
33
34 let expanded = quote! {
35 pub struct #struct_name;
36
37 impl IslandProcessor for #struct_name {
38 fn process(&self, island_manager: &Arc<IslandManager>, context: &ProcessContext) -> Value {
39 #fn_body
40 }
41 }
42 };
43
44 TokenStream::from(expanded)
45}