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