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(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/// Loads N-API symbols from host process.
115/// Must be called at least once before using any functions in bindings or
116/// they will panic.
117/// Safety: `env` must be a valid `napi_env` for the current thread
118#[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// On OpenHarmony we need to link against `ace_napi.z`.
128#[cfg_attr(target_env = "ohos", link(name = "ace_napi.z"))]
129extern "C" {}