mod function;
mod global;
pub(crate) fn export(
attr: proc_macro::TokenStream,
item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
let item = syn::parse_macro_input!(item as syn::Item);
match item {
syn::Item::Fn(item) => {
let parser = function::meta::Parser::new(item);
let (item, meta) = syn::parse_macro_input!(attr with parser);
function::export(meta, item)
}
syn::Item::Const(mut item) => {
let meta = syn::parse_macro_input!(attr with global::meta::Parser);
item.expr = global::export(meta, &item.ident, item.expr);
quote::quote!(#item).into()
}
syn::Item::Static(mut item) => {
let meta = syn::parse_macro_input!(attr with global::meta::Parser);
item.expr = global::export(meta, &item.ident, item.expr);
quote::quote!(#item).into()
}
_ => unsupported(item),
}
}
fn unsupported(item: syn::Item) -> proc_macro::TokenStream {
let span = syn::spanned::Spanned::span(&item);
let msg = "`neon::export` can only be applied to functions, consts, and statics.";
let err = syn::Error::new(span, msg);
err.into_compile_error().into()
}