1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, ItemFn};
4
5#[proc_macro_attribute]
17pub fn server_component(_attr: TokenStream, item: TokenStream) -> TokenStream {
18 let input = parse_macro_input!(item as ItemFn);
19 let fn_name = &input.sig.ident;
20 let fn_name_str = fn_name.to_string();
21 let vis = &input.vis;
22 let block = &input.block;
23 let output = &input.sig.output;
24
25 let expanded = quote! {
26 #vis fn #fn_name() #output {
27 next_rs_rsc::global_registry().register_server(module_path!(), #fn_name_str);
28 (|| #block)()
29 }
30 };
31
32 expanded.into()
33}
34
35#[proc_macro_attribute]
48pub fn client_component(_attr: TokenStream, item: TokenStream) -> TokenStream {
49 let input = parse_macro_input!(item as ItemFn);
50 let fn_name = &input.sig.ident;
51 let fn_name_str = fn_name.to_string();
52 let vis = &input.vis;
53 let block = &input.block;
54 let output = &input.sig.output;
55
56 let expanded = quote! {
57 #vis fn #fn_name() #output {
58 next_rs_rsc::global_registry().register_client(module_path!(), #fn_name_str);
59 (|| #block)()
60 }
61 };
62
63 expanded.into()
64}
65
66#[proc_macro_attribute]
78pub fn server_action(_attr: TokenStream, item: TokenStream) -> TokenStream {
79 let input = parse_macro_input!(item as ItemFn);
80 let fn_name = &input.sig.ident;
81 let fn_name_str = fn_name.to_string();
82 let vis = &input.vis;
83 let sig = &input.sig;
84 let block = &input.block;
85
86 let expanded = quote! {
87 #vis #sig {
88 next_rs_rsc::global_registry().register_server(module_path!(), #fn_name_str);
89 #block
90 }
91 };
92
93 expanded.into()
94}