1mod export;
4
5#[proc_macro_attribute]
6pub fn main(
7 _attr: proc_macro::TokenStream,
8 item: proc_macro::TokenStream,
9) -> proc_macro::TokenStream {
10 let syn::ItemFn {
11 attrs,
12 vis,
13 sig,
14 block,
15 } = syn::parse_macro_input!(item as syn::ItemFn);
16
17 let name = &sig.ident;
18 let export_name = quote::format_ident!("__NEON_MAIN__{name}");
19 let export_fn = quote::quote!({
20 #[neon::macro_internal::linkme::distributed_slice(neon::macro_internal::MAIN)]
21 #[linkme(crate = neon::macro_internal::linkme)]
22 fn #export_name(cx: neon::context::ModuleContext) -> neon::result::NeonResult<()> {
23 #name(cx)
24 }
25 });
26
27 quote::quote!(
28 #(#attrs) *
29 #vis #sig {
30 #export_fn
31 #block
32 }
33 )
34 .into()
35}
36
37#[proc_macro_attribute]
38pub fn export(
39 attr: proc_macro::TokenStream,
40 item: proc_macro::TokenStream,
41) -> proc_macro::TokenStream {
42 export::export(attr, item)
43}