napi_sym/
lib.rs

1// Copyright 2018-2025 the Deno authors. MIT license.
2
3use 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}