Skip to main content

neon_macros/
lib.rs

1//! Procedural macros supporting [Neon](https://docs.rs/neon/latest/neon/)
2
3mod 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}