use crate::{api, prelude::*};
use std::mem::MaybeUninit;
#[derive(Clone, Debug)]
pub struct NapiHandleScope(NapiEnv, napi_handle_scope);
impl NapiHandleScope {
pub(crate) fn from_raw(env: NapiEnv, handle: napi_handle_scope) -> NapiHandleScope {
NapiHandleScope(env, handle)
}
pub fn env(&self) -> NapiEnv {
self.0
}
pub fn raw(&self) -> napi_handle_scope {
self.1
}
pub fn open(env: NapiEnv) -> NapiResult<NapiHandleScope> {
let handle = napi_call!(=napi_open_handle_scope, env);
Ok(NapiHandleScope(env, handle))
}
pub fn close(&mut self) -> NapiResult<()> {
napi_call!(napi_close_handle_scope, self.env(), self.raw())
}
}
impl Drop for NapiHandleScope {
fn drop(&mut self) {
if let Err(e) = self.close() {
log::warn!("[{}] napi_close_handle_scope failed.", e);
}
}
}
#[derive(Clone, Debug)]
pub struct NapiEscapableHandleScope(NapiEnv, napi_escapable_handle_scope);
impl NapiEscapableHandleScope {
pub(crate) fn from_value(
env: NapiEnv,
handle: napi_escapable_handle_scope,
) -> NapiEscapableHandleScope {
NapiEscapableHandleScope(env, handle)
}
pub fn env(&self) -> NapiEnv {
self.0
}
pub fn raw(&self) -> napi_escapable_handle_scope {
self.1
}
pub fn open(env: NapiEnv) -> NapiResult<NapiEscapableHandleScope> {
let handle = napi_call!(=napi_open_escapable_handle_scope, env);
Ok(NapiEscapableHandleScope(env, handle))
}
pub fn close(&mut self) -> NapiResult<()> {
napi_call!(napi_close_escapable_handle_scope, self.env(), self.raw())
}
pub fn escape<T: NapiValueT>(&mut self, escapee: T) -> NapiResult<T> {
let escapee = napi_call!(=napi_escape_handle, self.env(), self.1, escapee.raw());
Ok(T::from_raw(self.env(), escapee))
}
}
impl Drop for NapiEscapableHandleScope {
fn drop(&mut self) {
if let Err(e) = self.close() {
log::warn!("[{}] napi_close_escapable_handle_scope failed.", e);
}
}
}