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