#![allow(ambiguous_glob_reexports)]
#![allow(dead_code)]
#[cfg(any(
target_env = "msvc",
all(not(target_family = "wasm"), feature = "dyn-symbols")
))]
macro_rules! generate {
(@stub_fn $name:ident($($param:ident: $ptype:ty,)*) -> napi_status) => {
unsafe extern "C" fn $name($(_: $ptype,)*) -> napi_status {
eprintln!("Node-API symbol {} has not been loaded", stringify!($name));
1
}
};
(@stub_fn $name:ident($($param:ident: $ptype:ty,)*) -> $rtype:ty) => {
unsafe extern "C" fn $name($(_: $ptype,)*) -> $rtype {
eprintln!("Node-API symbol {} has not been loaded", stringify!($name));
unsafe { std::mem::zeroed() }
}
};
(@stub_fn $name:ident($($param:ident: $ptype:ty,)*)) => {
unsafe extern "C" fn $name($(_: $ptype,)*) {
eprintln!("Node-API symbol {} has not been loaded", stringify!($name));
}
};
(extern "C" {
$(
$(#[$cfg:meta])*
fn $name:ident($($param:ident: $ptype:ty$(,)?)*)$( -> $rtype:ty)?;
)+
}) => {
struct Napi {
$(
$(#[$cfg])*
$name: unsafe extern "C" fn(
$($param: $ptype,)*
)$( -> $rtype)*,
)*
}
static mut NAPI: Napi = {
$(
$(#[$cfg])*
generate!(@stub_fn $name($($param: $ptype,)*) $( -> $rtype)?);
)*
Napi {
$(
$(#[$cfg])*
$name,
)*
}
};
#[allow(clippy::missing_safety_doc)]
pub unsafe fn load(
host: &libloading::Library,
) -> Result<(), libloading::Error> {
NAPI = Napi {
$(
$(#[$cfg])*
$name: {
let symbol: Result<libloading::Symbol<unsafe extern "C" fn ($(_: $ptype,)*)$( -> $rtype)*>, libloading::Error> = host.get(stringify!($name).as_bytes());
match symbol {
Ok(f) => *f,
Err(_) => {
NAPI.$name
}
}
},
)*
};
Ok(())
}
$(
$(#[$cfg])*
#[inline]
#[allow(clippy::missing_safety_doc)]
pub unsafe fn $name($($param: $ptype,)*)$( -> $rtype)* {
(NAPI.$name)($($param,)*)
}
)*
};
}
#[cfg(any(
target_family = "wasm",
all(not(target_env = "msvc"), not(feature = "dyn-symbols"))
))]
macro_rules! generate {
(extern "C" {
$(
$(#[$cfg:meta])*
fn $name:ident($($param:ident: $ptype:ty$(,)?)*)$( -> $rtype:ty)?;
)+
}) => {
extern "C" {
$(
$(#[$cfg])*
pub fn $name($($param: $ptype,)*)$( -> $rtype)*;
)*
}
};
}
mod functions;
mod types;
pub use functions::*;
pub use types::*;
#[cfg(any(
target_env = "msvc",
all(not(target_family = "wasm"), feature = "dyn-symbols")
))]
pub unsafe fn setup() -> libloading::Library {
match load_all() {
Err(err) => panic!("{}", err),
Ok(l) => l,
}
}
#[cfg_attr(target_env = "ohos", link(name = "ace_napi.z"))]
extern "C" {}