1use proc_macro::TokenStream;
4use quote::quote;
5use serde::Deserialize;
6
7static NAPI_EXPORTS: &str = include_str!("./symbol_exports.json");
8
9#[derive(Deserialize)]
10struct SymbolExports {
11 pub symbols: Vec<String>,
12}
13
14#[proc_macro_attribute]
15pub fn napi_sym(_attr: TokenStream, item: TokenStream) -> TokenStream {
16 let func = syn::parse::<syn::ItemFn>(item).expect("expected a function");
17
18 let exports: SymbolExports =
19 serde_json::from_str(NAPI_EXPORTS).expect("failed to parse exports");
20 let name = &func.sig.ident;
21 assert!(
22 exports.symbols.contains(&name.to_string()),
23 "cli/napi/sym/symbol_exports.json is out of sync!"
24 );
25
26 TokenStream::from(quote! {
27 crate::napi_wrap! {
28 #func
29 }
30 })
31}