napi-sys-ohos 1.1.6

Harmony N-API raw binding
Documentation
// borrowed from https://github.com/neon-bindings/neon/tree/main/crates/neon/src/sys/bindings

#![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(_) => {
                // ignore error, use the stub function
                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")
))]
/// Loads N-API symbols from host process.
/// Must be called at least once before using any functions in bindings or
/// they will panic
///
/// # Safety
///
/// The returned Library must be kept alive as long as any N-API
pub unsafe fn setup() -> libloading::Library {
  match load_all() {
    Err(err) => panic!("{}", err),
    Ok(l) => l,
  }
}

// On OpenHarmony we need to link against `ace_napi.z`.
#[cfg_attr(target_env = "ohos", link(name = "ace_napi.z"))]
extern "C" {}