1#![allow(ambiguous_glob_reexports)]
4
5#[cfg(any(
6 target_env = "msvc",
7 all(not(target_family = "wasm"), feature = "dyn-symbols")
8))]
9macro_rules! generate {
10 (@stub_fn $name:ident($($param:ident: $ptype:ty,)*) -> napi_status) => {
11 unsafe extern "C" fn $name($(_: $ptype,)*) -> napi_status {
12 eprintln!("Node-API symbol {} has not been loaded", stringify!($name));
13 1
14 }
15 };
16 (@stub_fn $name:ident($($param:ident: $ptype:ty,)*) -> $rtype:ty) => {
17 unsafe extern "C" fn $name($(_: $ptype,)*) -> $rtype {
18 eprintln!("Node-API symbol {} has not been loaded", stringify!($name));
19 unsafe { std::mem::zeroed() }
20 }
21 };
22 (@stub_fn $name:ident($($param:ident: $ptype:ty,)*)) => {
23 unsafe extern "C" fn $name($(_: $ptype,)*) {
24 eprintln!("Node-API symbol {} has not been loaded", stringify!($name));
25 }
26 };
27 (extern "C" {
28 $(
29 $(#[$cfg:meta])*
30 fn $name:ident($($param:ident: $ptype:ty$(,)?)*)$( -> $rtype:ty)?;
31 )+
32 }) => {
33 struct Napi {
34 $(
35 $(#[$cfg])*
36 $name: unsafe extern "C" fn(
37 $($param: $ptype,)*
38 )$( -> $rtype)*,
39 )*
40 }
41
42 static mut NAPI: Napi = {
43 $(
44 $(#[$cfg])*
45 generate!(@stub_fn $name($($param: $ptype,)*) $( -> $rtype)?);
46 )*
47
48 Napi {
49 $(
50 $(#[$cfg])*
51 $name,
52 )*
53 }
54 };
55
56 #[allow(clippy::missing_safety_doc)]
57 pub unsafe fn load(
58 host: &libloading::Library,
59 ) -> Result<(), libloading::Error> {
60 NAPI = Napi {
61 $(
62 $(#[$cfg])*
63 $name: {
64 let symbol: Result<libloading::Symbol<unsafe extern "C" fn ($(_: $ptype,)*)$( -> $rtype)*>, libloading::Error> = host.get(stringify!($name).as_bytes());
65 match symbol {
66 Ok(f) => *f,
67 Err(_) => {
68 NAPI.$name
70 }
71 }
72 },
73 )*
74 };
75
76 Ok(())
77 }
78
79 $(
80 $(#[$cfg])*
81 #[inline]
82 #[allow(clippy::missing_safety_doc)]
83 pub unsafe fn $name($($param: $ptype,)*)$( -> $rtype)* {
84 (NAPI.$name)($($param,)*)
85 }
86 )*
87 };
88}
89
90#[cfg(any(
91 target_family = "wasm",
92 all(not(target_env = "msvc"), not(feature = "dyn-symbols"))
93))]
94macro_rules! generate {
95 (extern "C" {
96 $(
97 $(#[$cfg:meta])*
98 fn $name:ident($($param:ident: $ptype:ty$(,)?)*)$( -> $rtype:ty)?;
99 )+
100 }) => {
101 extern "C" {
102 $(
103 $(#[$cfg])*
104 pub fn $name($($param: $ptype,)*)$( -> $rtype)*;
105 )*
106 }
107 };
108}
109
110mod functions;
111mod types;
112
113pub use functions::*;
114pub use types::*;
115
116#[cfg(any(
117 target_env = "msvc",
118 all(not(target_family = "wasm"), feature = "dyn-symbols")
119))]
120pub unsafe fn setup() -> libloading::Library {
128 match load_all() {
129 Err(err) => panic!("{}", err),
130 Ok(l) => l,
131 }
132}
133
134#[cfg_attr(target_env = "ohos", link(name = "ace_napi.z"))]
136extern "C" {}