| 1 | use proc_macro2::{Ident, Literal, TokenStream}; |
| 2 | use quote::ToTokens; |
| 3 | |
| 4 | use crate::{codegen::js_mod_to_token_stream, BindgenResult, NapiConst, TryToTokens}; |
| 5 | |
| 6 | impl TryToTokens for NapiConst { |
| 7 | fn try_to_tokens(&self, tokens: &mut TokenStream) -> BindgenResult<()> { |
| 8 | let register: TokenStream = self.gen_module_register(); |
| 9 | (quote! { |
| 10 | #register |
| 11 | }) |
| 12 | .to_tokens(tokens); |
| 13 | |
| 14 | Ok(()) |
| 15 | } |
| 16 | } |
| 17 | |
| 18 | impl NapiConst { |
| 19 | fn gen_module_register(&self) -> TokenStream { |
| 20 | let name_ident = &self.name; |
| 21 | let js_name_lit = Literal::string(&format!(" {}\0" , self.name)); |
| 22 | let register_name = &self.register_name; |
| 23 | let type_name = &self.type_name; |
| 24 | let cb_name = Ident::new( |
| 25 | &format!("__register__const__ {}_callback__" , register_name), |
| 26 | self.name.span(), |
| 27 | ); |
| 28 | let js_mod_ident = js_mod_to_token_stream(self.js_mod.as_ref()); |
| 29 | |
| 30 | quote! { |
| 31 | #[allow(non_snake_case)] |
| 32 | #[allow(clippy::all)] |
| 33 | unsafe fn #cb_name(env: napi::sys::napi_env) -> napi::Result<napi::sys::napi_value> { |
| 34 | <#type_name as napi::bindgen_prelude::ToNapiValue>::to_napi_value(env, #name_ident) |
| 35 | } |
| 36 | #[allow(non_snake_case)] |
| 37 | #[allow(clippy::all)] |
| 38 | #[cfg(all(not(test), not(target_family = "wasm" )))] |
| 39 | #[napi::bindgen_prelude::ctor] |
| 40 | fn #register_name() { |
| 41 | napi::bindgen_prelude::register_module_export(#js_mod_ident, #js_name_lit, #cb_name); |
| 42 | } |
| 43 | |
| 44 | #[allow(non_snake_case)] |
| 45 | #[allow(clippy::all)] |
| 46 | #[cfg(all(not(test), target_family = "wasm" ))] |
| 47 | #[no_mangle] |
| 48 | unsafe extern "C" fn #register_name() { |
| 49 | napi::bindgen_prelude::register_module_export(#js_mod_ident, #js_name_lit, #cb_name); |
| 50 | } |
| 51 | } |
| 52 | } |
| 53 | } |
| 54 | |