ssrkit_macros/
lib.rs

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}