napi_sys_ohos/
lib.rs

1// borrowed from https://github.com/neon-bindings/neon/tree/main/crates/neon/src/sys/bindings
2
3#![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                // ignore error, use the stub function
69                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))]
120/// Loads N-API symbols from host process.
121/// Must be called at least once before using any functions in bindings or
122/// they will panic
123///
124/// # Safety
125///
126/// The returned Library must be kept alive as long as any N-API
127pub unsafe fn setup() -> libloading::Library {
128  match load_all() {
129    Err(err) => panic!("{}", err),
130    Ok(l) => l,
131  }
132}
133
134// On OpenHarmony we need to link against `ace_napi.z`.
135#[cfg_attr(target_env = "ohos", link(name = "ace_napi.z"))]
136extern "C" {}