1use proc_macro::TokenStream;
2use proc_macro_error::emit_error;
3use quote::quote;
4
5#[proc_macro_error::proc_macro_error]
7#[proc_macro_attribute]
8pub fn web_handler(_attr: TokenStream, item: TokenStream) -> TokenStream {
9 let input = syn::parse_macro_input!(item as syn::ItemFn);
10 let func_name = &input.sig.ident;
11 let hook_name = quote::format_ident!(
12 "_edgedb_sdk_init_web_handler_{}", func_name);
13 quote! {
14 #input
15
16 #[export_name = stringify!(#hook_name)]
17 extern fn #hook_name() {
18 ::edgedb_sdk::web::register_handler(#func_name);
19 }
20
21 }.into()
22}
23
24#[proc_macro_error::proc_macro_error]
46#[proc_macro_attribute]
47pub fn init_hook(_attr: TokenStream, item: TokenStream) -> TokenStream {
48 let input = syn::parse_macro_input!(item as syn::ItemFn);
49 if !input.sig.generics.params.is_empty() {
50 emit_error!(input.sig.generics, "no generics allowed on init hook");
51 }
52 if !input.sig.inputs.is_empty() {
53 emit_error!(input.sig.inputs, "no params allowed on init hook");
54 }
55 if !matches!(input.sig.output, syn::ReturnType::Default) {
56 emit_error!(input.sig.output, "no return value allowed on init hook");
57 }
58 let func_name = &input.sig.ident;
59 let hook_name = quote::format_ident!("_edgedb_sdk_init_{}", func_name);
60 quote! {
61 #input
62
63 #[export_name = stringify!(#hook_name)]
64 extern fn #hook_name() {
65 #func_name();
66 }
67
68 }.into()
69}