use crate::{api, prelude::*};
#[derive(Clone, Debug)]
pub struct NapiRef(NapiEnv, napi_ref);
impl NapiRef {
pub(crate) fn from_raw(env: NapiEnv, reference: napi_ref) -> NapiRef {
NapiRef(env, reference)
}
pub fn new<T: NapiValueT>(value: T, count: u32) -> NapiResult<NapiRef> {
let reference = napi_call!(
=napi_create_reference,
value.env(),
value.raw(),
count,
);
Ok(NapiRef(value.env(), reference))
}
pub fn inc(&mut self) -> NapiResult<u32> {
Ok(napi_call!(=napi_reference_ref, self.0, self.1))
}
pub fn dec(&mut self) -> NapiResult<u32> {
Ok(napi_call!(=napi_reference_unref, self.0, self.1))
}
pub fn deref<T: NapiValueT>(&self) -> NapiResult<T> {
let value = napi_call!(=napi_get_reference_value, self.0, self.1);
Ok(T::from_raw(self.0, value))
}
}
impl Drop for NapiRef {
fn drop(&mut self) {
unsafe {
api::napi_delete_reference(self.0, self.1);
}
}
}