pub(crate) mod meta;
pub(super) fn export(meta: meta::Meta, name: &syn::Ident, expr: Box<syn::Expr>) -> Box<syn::Expr> {
let create_name = quote::format_ident!("__NEON_EXPORT_CREATE__{name}");
let export_name = meta
.name
.map(|name| quote::quote!(#name))
.unwrap_or_else(|| quote::quote!(stringify!(#name)));
let value = meta
.json
.then(|| quote::quote!(neon::types::extract::Json(&#name)))
.unwrap_or_else(|| quote::quote!(#name));
let create_fn = quote::quote!({
#[doc(hidden)]
#[neon::macro_internal::linkme::distributed_slice(neon::macro_internal::EXPORTS)]
#[linkme(crate = neon::macro_internal::linkme)]
fn #create_name<'cx>(
cx: &mut neon::context::ModuleContext<'cx>,
) -> neon::result::NeonResult<(&'static str, neon::handle::Handle<'cx, neon::types::JsValue>)> {
neon::types::extract::TryIntoJs::try_into_js(#value, cx).map(|v| (
#export_name,
neon::handle::Handle::upcast(&v),
))
}
});
let expr = quote::quote!({
#create_fn
#expr
});
Box::new(syn::Expr::Verbatim(expr))
}