feat(napi): implement as_object and validate for ClassInstance (#1284)

This commit is contained in:
LongYinan 2022-08-23 17:02:41 +08:00 committed by GitHub
parent 99e17c7294
commit 49ec8917df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -3,7 +3,10 @@ use std::ops::{Deref, DerefMut};
use std::ptr; use std::ptr;
use super::Object; use super::Object;
use crate::{bindgen_runtime::FromNapiValue, check_status, sys, NapiRaw}; use crate::{
bindgen_runtime::{FromNapiValue, TypeName, ValidateNapiValue},
check_status, sys, Env, NapiRaw, NapiValue, ValueType,
};
pub type This<T = Object> = T; pub type This<T = Object> = T;
@ -17,6 +20,10 @@ impl<T: 'static> ClassInstance<T> {
pub fn new(value: sys::napi_value, inner: &'static mut T) -> Self { pub fn new(value: sys::napi_value, inner: &'static mut T) -> Self {
Self { value, inner } Self { value, inner }
} }
pub fn as_object(&self, env: Env) -> Object {
unsafe { Object::from_raw_unchecked(env.raw(), self.value) }
}
} }
impl<T: 'static> NapiRaw for ClassInstance<T> { impl<T: 'static> NapiRaw for ClassInstance<T> {
@ -25,6 +32,31 @@ impl<T: 'static> NapiRaw for ClassInstance<T> {
} }
} }
impl<T: 'static> TypeName for ClassInstance<T>
where
&'static T: TypeName,
{
fn type_name() -> &'static str {
type_name::<&T>()
}
fn value_type() -> ValueType {
<&T>::value_type()
}
}
impl<T: 'static> ValidateNapiValue for ClassInstance<T>
where
&'static T: ValidateNapiValue,
{
unsafe fn validate(
env: sys::napi_env,
napi_val: sys::napi_value,
) -> crate::Result<sys::napi_value> {
unsafe { <&T>::validate(env, napi_val) }
}
}
impl<T: 'static> FromNapiValue for ClassInstance<T> { impl<T: 'static> FromNapiValue for ClassInstance<T> {
unsafe fn from_napi_value(env: sys::napi_env, napi_val: sys::napi_value) -> crate::Result<Self> { unsafe fn from_napi_value(env: sys::napi_env, napi_val: sys::napi_value) -> crate::Result<Self> {
let mut value = ptr::null_mut(); let mut value = ptr::null_mut();