feat(napi-derive): allow partial implement From/To Napivalue for Object ()

This commit is contained in:
LongYinan 2023-01-24 14:51:16 +08:00 committed by GitHub
parent e79eb34118
commit c8352a1fb0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 99 additions and 27 deletions
crates
backend/src
macro/src/parser

View file

@ -80,6 +80,8 @@ pub struct NapiStruct {
pub fields: Vec<NapiStructField>,
pub is_tuple: bool,
pub kind: NapiStructKind,
pub object_from_js: bool,
pub object_to_js: bool,
pub js_mod: Option<String>,
pub comments: Vec<String>,
pub implement_iterator: bool,

View file

@ -558,6 +558,46 @@ impl NapiStruct {
}
};
let to_napi_value = if self.object_to_js {
quote! {
impl napi::bindgen_prelude::ToNapiValue for #name {
unsafe fn to_napi_value(env: napi::bindgen_prelude::sys::napi_env, val: #name) -> napi::bindgen_prelude::Result<napi::bindgen_prelude::sys::napi_value> {
let env_wrapper = napi::bindgen_prelude::Env::from(env);
let mut obj = env_wrapper.create_object()?;
let #destructed_fields = val;
#(#obj_field_setters)*
napi::bindgen_prelude::Object::to_napi_value(env, obj)
}
}
}
} else {
quote! {}
};
let from_napi_value = if self.object_from_js {
quote! {
impl napi::bindgen_prelude::FromNapiValue for #name {
unsafe fn from_napi_value(
env: napi::bindgen_prelude::sys::napi_env,
napi_val: napi::bindgen_prelude::sys::napi_value
) -> napi::bindgen_prelude::Result<Self> {
let env_wrapper = napi::bindgen_prelude::Env::from(env);
let mut obj = napi::bindgen_prelude::Object::from_napi_value(env, napi_val)?;
#(#obj_field_getters)*
let val = #destructed_fields;
Ok(val)
}
}
}
} else {
quote! {}
};
quote! {
impl napi::bindgen_prelude::TypeName for #name {
fn type_name() -> &'static str {
@ -569,33 +609,9 @@ impl NapiStruct {
}
}
impl napi::bindgen_prelude::ToNapiValue for #name {
unsafe fn to_napi_value(env: napi::bindgen_prelude::sys::napi_env, val: #name) -> napi::bindgen_prelude::Result<napi::bindgen_prelude::sys::napi_value> {
let env_wrapper = napi::bindgen_prelude::Env::from(env);
let mut obj = env_wrapper.create_object()?;
#to_napi_value
let #destructed_fields = val;
#(#obj_field_setters)*
napi::bindgen_prelude::Object::to_napi_value(env, obj)
}
}
impl napi::bindgen_prelude::FromNapiValue for #name {
unsafe fn from_napi_value(
env: napi::bindgen_prelude::sys::napi_env,
napi_val: napi::bindgen_prelude::sys::napi_value
) -> napi::bindgen_prelude::Result<Self> {
let env_wrapper = napi::bindgen_prelude::Env::from(env);
let mut obj = napi::bindgen_prelude::Object::from_napi_value(env, napi_val)?;
#(#obj_field_getters)*
let val = #destructed_fields;
Ok(val)
}
}
#from_napi_value
impl napi::bindgen_prelude::ValidateNapiValue for #name {}
}

View file

@ -56,6 +56,8 @@ macro_rules! attrgen {
(strict, Strict(Span)),
(return_if_invalid, ReturnIfInvalid(Span)),
(object, Object(Span)),
(object_from_js, ObjectFromJs(Span, Option<bool>)),
(object_to_js, ObjectToJs(Span, Option<bool>)),
(custom_finalize, CustomFinalize(Span)),
(namespace, Namespace(Span, String, Span)),
(iterator, Iterator(Span)),

View file

@ -995,6 +995,8 @@ impl ConvertToAST for syn::ItemStruct {
fields,
is_tuple,
kind: struct_kind,
object_from_js: opts.object_from_js(),
object_to_js: opts.object_to_js(),
js_mod: namespace,
comments: extract_doc_comments(&self.attrs),
implement_iterator,