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