feat(napi-derive): allow partial implement From/To Napivalue for Object (#1448)
This commit is contained in:
parent
e79eb34118
commit
c8352a1fb0
9 changed files with 99 additions and 27 deletions
|
@ -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,
|
||||
|
|
|
@ -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 {}
|
||||
}
|
||||
|
|
|
@ -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)),
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue