libnode_sys 0.0.7

C bindings for libnode
Documentation
use std::ffi::c_char;
use std::ffi::c_int;
use std::ffi::c_uint;
use std::ffi::c_void;
use std::sync::OnceLock;

use super::super::*;

#[allow(non_camel_case_types)]
pub type napi_addon_register_func =
  Option<unsafe extern "C" fn(env: napi_env, exports: napi_value) -> napi_value>;

#[repr(C)]
#[derive(Copy, Clone)]
#[allow(non_camel_case_types)]
pub struct napi_module {
  pub nm_version: c_int,
  pub nm_flags: c_uint,
  pub nm_filename: *const c_char,
  pub nm_register_func: napi_addon_register_func,
  pub nm_modname: *const c_char,
  pub nm_priv: *mut c_void,
  pub reserved: [*mut c_void; 4usize],
}

static CACHE: OnceLock<crate::load::Symbol<SIGNATURE>> = OnceLock::new();
const SYMBOL: &[u8] = "napi_module_register".as_bytes();

type SIGNATURE = fn(mod_: *mut napi_module) -> napi_status;

pub unsafe fn napi_module_register(mod_: *mut napi_module) -> napi_status {
  CACHE.get_or_init(|| unsafe { crate::load::get_sym(SYMBOL).unwrap() })(mod_)
}