feat: support structured enum with discriminated unions (#2222)

* Structured enum

* Type indent

* Add test example

* Remove trailing commas

* discriminant

* discriminant conflict

* more test

* typo
This commit is contained in:
CPunisher 2024-08-22 14:59:50 +08:00 committed by GitHub
parent e02ec1e87c
commit c459f0acf6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 971 additions and 573 deletions

View File

@ -12,6 +12,7 @@ enum TypeDefKind {
Enum = 'enum',
StringEnum = 'string_enum',
Interface = 'interface',
Type = 'type',
Fn = 'fn',
Struct = 'struct',
Impl = 'impl',
@ -38,6 +39,10 @@ function prettyPrint(
s += `export interface ${line.name} {\n${line.def}\n}`
break
case TypeDefKind.Type:
s += `export type ${line.name} = \n${line.def}`
break
case TypeDefKind.Enum:
const enumName = constEnum ? 'const enum' : 'enum'
s += `${exportDeclare(ambient)} ${enumName} ${line.name} {\n${line.def}\n}`
@ -215,13 +220,20 @@ export function correctStringIdent(src: string, ident: number): string {
const isInMultilineComment = line.startsWith('*')
const isClosingBracket = line.endsWith('}')
const isOpeningBracket = line.endsWith('{')
const isTypeDeclaration = line.endsWith('=')
const isTypeVariant = line.startsWith('|')
let rightIndent = ident
if (isOpeningBracket && !isInMultilineComment) {
if ((isOpeningBracket || isTypeDeclaration) && !isInMultilineComment) {
bracketDepth += 1
rightIndent += (bracketDepth - 1) * 2
} else {
if (isClosingBracket && bracketDepth > 0 && !isInMultilineComment) {
if (
isClosingBracket &&
bracketDepth > 0 &&
!isInMultilineComment &&
!isTypeVariant
) {
bracketDepth -= 1
}
rightIndent += bracketDepth * 2

View File

@ -77,25 +77,50 @@ pub enum FnSelf {
pub struct NapiStruct {
pub name: Ident,
pub js_name: String,
pub vis: syn::Visibility,
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,
pub use_custom_finalize: bool,
pub register_name: Ident,
pub js_mod: Option<String>,
pub use_nullable: bool,
pub register_name: Ident,
pub kind: NapiStructKind,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[derive(Debug, Clone)]
pub enum NapiStructKind {
None,
Constructor,
Object,
Class(NapiClass),
Object(NapiObject),
StructuredEnum(NapiStructuredEnum),
}
#[derive(Debug, Clone)]
pub struct NapiClass {
pub fields: Vec<NapiStructField>,
pub ctor: bool,
pub implement_iterator: bool,
pub is_tuple: bool,
pub use_custom_finalize: bool,
}
#[derive(Debug, Clone)]
pub struct NapiObject {
pub fields: Vec<NapiStructField>,
pub object_from_js: bool,
pub object_to_js: bool,
pub is_tuple: bool,
}
#[derive(Debug, Clone)]
pub struct NapiStructuredEnum {
pub variants: Vec<NapiStructuredEnumVariant>,
pub object_from_js: bool,
pub object_to_js: bool,
pub discriminant: String,
}
#[derive(Debug, Clone)]
pub struct NapiStructuredEnumVariant {
pub name: Ident,
pub fields: Vec<NapiStructField>,
pub is_tuple: bool,
}
#[derive(Debug, Clone)]

View File

@ -8,6 +8,7 @@ use crate::{
codegen::{get_intermediate_ident, js_mod_to_token_stream},
BindgenResult, FnKind, NapiImpl, NapiStruct, NapiStructKind, TryToTokens,
};
use crate::{NapiClass, NapiObject, NapiStructuredEnum};
static NAPI_IMPL_ID: AtomicU32 = AtomicU32::new(0);
const TYPED_ARRAY_TYPE: &[&str] = &[
@ -158,10 +159,9 @@ impl TryToTokens for NapiStruct {
fn try_to_tokens(&self, tokens: &mut TokenStream) -> BindgenResult<()> {
let napi_value_map_impl = self.gen_napi_value_map_impl();
let class_helper_mod = if self.kind == NapiStructKind::Object {
quote! {}
} else {
self.gen_helper_mod()
let class_helper_mod = match &self.kind {
NapiStructKind::Class(class) => self.gen_helper_mod(class),
_ => quote! {},
};
(quote! {
@ -175,18 +175,18 @@ impl TryToTokens for NapiStruct {
}
impl NapiStruct {
fn gen_helper_mod(&self) -> TokenStream {
fn gen_helper_mod(&self, class: &NapiClass) -> TokenStream {
let mod_name = Ident::new(&format!("__napi_helper__{}", self.name), Span::call_site());
let ctor = if self.kind == NapiStructKind::Constructor {
self.gen_default_ctor()
let ctor = if class.ctor {
self.gen_default_ctor(class)
} else {
quote! {}
};
let mut getters_setters = self.gen_default_getters_setters();
let mut getters_setters = self.gen_default_getters_setters(class);
getters_setters.sort_by(|a, b| a.0.cmp(&b.0));
let register = self.gen_register();
let register = self.gen_register(class);
let getters_setters_token = getters_setters.into_iter().map(|(_, token)| token);
@ -204,13 +204,13 @@ impl NapiStruct {
}
}
fn gen_default_ctor(&self) -> TokenStream {
fn gen_default_ctor(&self, class: &NapiClass) -> TokenStream {
let name = &self.name;
let js_name_str = &self.js_name;
let fields_len = self.fields.len();
let fields_len = class.fields.len();
let mut fields = vec![];
for (i, field) in self.fields.iter().enumerate() {
for (i, field) in class.fields.iter().enumerate() {
let ty = &field.ty;
match &field.name {
syn::Member::Named(ident) => fields
@ -221,7 +221,7 @@ impl NapiStruct {
}
}
let construct = if self.is_tuple {
let construct = if class.is_tuple {
quote! { #name (#(#fields),*) }
} else {
quote! { #name {#(#fields),*} }
@ -229,7 +229,7 @@ impl NapiStruct {
let is_empty_struct_hint = fields_len == 0;
let constructor = if self.implement_iterator {
let constructor = if class.implement_iterator {
quote! { unsafe { cb.construct_generator::<#is_empty_struct_hint, #name>(#js_name_str, #construct) } }
} else {
quote! { unsafe { cb.construct::<#is_empty_struct_hint, #name>(#js_name_str, #construct) } }
@ -251,24 +251,30 @@ impl NapiStruct {
}
fn gen_napi_value_map_impl(&self) -> TokenStream {
match self.kind {
NapiStructKind::None => gen_napi_value_map_impl(
match &self.kind {
NapiStructKind::Class(class) if !class.ctor => gen_napi_value_map_impl(
&self.name,
self.gen_to_napi_value_ctor_impl_for_non_default_constructor_struct(),
self.gen_to_napi_value_ctor_impl_for_non_default_constructor_struct(class),
),
NapiStructKind::Constructor => {
gen_napi_value_map_impl(&self.name, self.gen_to_napi_value_ctor_impl())
NapiStructKind::Class(class) => {
gen_napi_value_map_impl(&self.name, self.gen_to_napi_value_ctor_impl(class))
}
NapiStructKind::Object(obj) => self.gen_to_napi_value_obj_impl(obj),
NapiStructKind::StructuredEnum(structured_enum) => {
self.gen_to_napi_value_structured_enum_impl(structured_enum)
}
NapiStructKind::Object => self.gen_to_napi_value_obj_impl(),
}
}
fn gen_to_napi_value_ctor_impl_for_non_default_constructor_struct(&self) -> TokenStream {
fn gen_to_napi_value_ctor_impl_for_non_default_constructor_struct(
&self,
class: &NapiClass,
) -> TokenStream {
let name = &self.name;
let js_name_raw = &self.js_name;
let js_name_str = format!("{}\0", js_name_raw);
let iterator_implementation = self.gen_iterator_property(name);
let finalize_trait = if self.use_custom_finalize {
let iterator_implementation = self.gen_iterator_property(class, name);
let finalize_trait = if class.use_custom_finalize {
quote! {}
} else {
quote! { impl napi::bindgen_prelude::ObjectFinalize for #name {} }
@ -377,8 +383,8 @@ impl NapiStruct {
}
}
fn gen_iterator_property(&self, name: &Ident) -> TokenStream {
if !self.implement_iterator {
fn gen_iterator_property(&self, class: &NapiClass, name: &Ident) -> TokenStream {
if !class.implement_iterator {
return quote! {};
}
quote! {
@ -386,7 +392,7 @@ impl NapiStruct {
}
}
fn gen_to_napi_value_ctor_impl(&self) -> TokenStream {
fn gen_to_napi_value_ctor_impl(&self, class: &NapiClass) -> TokenStream {
let name = &self.name;
let js_name_without_null = &self.js_name;
let js_name_str = format!("{}\0", &self.js_name);
@ -395,7 +401,7 @@ impl NapiStruct {
let mut field_conversions = vec![];
let mut field_destructions = vec![];
for field in self.fields.iter() {
for field in class.fields.iter() {
let ty = &field.ty;
match &field.name {
@ -416,7 +422,7 @@ impl NapiStruct {
}
}
let destructed_fields = if self.is_tuple {
let destructed_fields = if class.is_tuple {
quote! {
Self (#(#field_destructions),*)
}
@ -426,7 +432,7 @@ impl NapiStruct {
}
};
let finalize_trait = if self.use_custom_finalize {
let finalize_trait = if class.use_custom_finalize {
quote! {}
} else {
quote! { impl napi::bindgen_prelude::ObjectFinalize for #name {} }
@ -470,7 +476,7 @@ impl NapiStruct {
}
}
fn gen_to_napi_value_obj_impl(&self) -> TokenStream {
fn gen_to_napi_value_obj_impl(&self, obj: &NapiObject) -> TokenStream {
let name = &self.name;
let name_str = self.name.to_string();
@ -478,7 +484,7 @@ impl NapiStruct {
let mut obj_field_getters = vec![];
let mut field_destructions = vec![];
for field in self.fields.iter() {
for field in obj.fields.iter() {
let field_js_name = &field.js_name;
let ty = &field.ty;
let is_optional_field = if let syn::Type::Path(syn::TypePath {
@ -569,7 +575,7 @@ impl NapiStruct {
}
}
let destructed_fields = if self.is_tuple {
let destructed_fields = if obj.is_tuple {
quote! {
Self (#(#field_destructions),*)
}
@ -579,7 +585,7 @@ impl NapiStruct {
}
};
let to_napi_value = if self.object_to_js {
let to_napi_value = if obj.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> {
@ -597,7 +603,7 @@ impl NapiStruct {
quote! {}
};
let from_napi_value = if self.object_from_js {
let from_napi_value = if obj.object_from_js {
quote! {
impl napi::bindgen_prelude::FromNapiValue for #name {
unsafe fn from_napi_value(
@ -638,11 +644,11 @@ impl NapiStruct {
}
}
fn gen_default_getters_setters(&self) -> Vec<(String, TokenStream)> {
fn gen_default_getters_setters(&self, class: &NapiClass) -> Vec<(String, TokenStream)> {
let mut getters_setters = vec![];
let struct_name = &self.name;
for field in self.fields.iter() {
for field in class.fields.iter() {
let field_ident = &field.name;
let field_name = match &field.name {
syn::Member::Named(ident) => ident.to_string(),
@ -737,17 +743,17 @@ impl NapiStruct {
getters_setters
}
fn gen_register(&self) -> TokenStream {
fn gen_register(&self, class: &NapiClass) -> TokenStream {
let name_str = self.name.to_string();
let struct_register_name = &self.register_name;
let js_name = format!("{}\0", self.js_name);
let mut props = vec![];
if self.kind == NapiStructKind::Constructor {
if class.ctor {
props.push(quote! { napi::bindgen_prelude::Property::new("constructor").unwrap().with_ctor(constructor) });
}
for field in self.fields.iter() {
for field in class.fields.iter() {
let field_name = match &field.name {
syn::Member::Named(ident) => ident.to_string(),
syn::Member::Unnamed(i) => format!("field{}", i.index),
@ -838,6 +844,209 @@ impl NapiStruct {
}
}
}
fn gen_to_napi_value_structured_enum_impl(
&self,
structured_enum: &NapiStructuredEnum,
) -> TokenStream {
let name = &self.name;
let name_str = self.name.to_string();
let discriminant = structured_enum.discriminant.as_str();
let mut variant_arm_setters = vec![];
let mut variant_arm_getters = vec![];
for variant in structured_enum.variants.iter() {
let variant_name = &variant.name;
let variant_name_str = variant_name.to_string();
let mut obj_field_setters = vec![quote! {
obj.set(#discriminant, #variant_name_str)?;
}];
let mut obj_field_getters = vec![];
let mut field_destructions = vec![];
for field in variant.fields.iter() {
let field_js_name = &field.js_name;
let ty = &field.ty;
let is_optional_field = if let syn::Type::Path(syn::TypePath {
path: syn::Path { segments, .. },
..
}) = &ty
{
if let Some(last_path) = segments.last() {
last_path.ident == "Option"
} else {
false
}
} else {
false
};
match &field.name {
syn::Member::Named(ident) => {
let alias_ident = format_ident!("{}_", ident);
field_destructions.push(quote! { #ident: #alias_ident });
if is_optional_field {
obj_field_setters.push(match self.use_nullable {
false => quote! {
if #alias_ident.is_some() {
obj.set(#field_js_name, #alias_ident)?;
}
},
true => quote! {
if let Some(#alias_ident) = #alias_ident {
obj.set(#field_js_name, #alias_ident)?;
} else {
obj.set(#field_js_name, napi::bindgen_prelude::Null)?;
}
},
});
} else {
obj_field_setters.push(quote! { obj.set(#field_js_name, #alias_ident)?; });
}
if is_optional_field && !self.use_nullable {
obj_field_getters.push(quote! {
let #alias_ident: #ty = obj.get(#field_js_name).map_err(|mut err| {
err.reason = format!("{} on {}.{}", err.reason, #name_str, #field_js_name);
err
})?;
});
} else {
obj_field_getters.push(quote! {
let #alias_ident: #ty = obj.get(#field_js_name).map_err(|mut err| {
err.reason = format!("{} on {}.{}", err.reason, #name_str, #field_js_name);
err
})?.ok_or_else(|| napi::bindgen_prelude::Error::new(
napi::bindgen_prelude::Status::InvalidArg,
format!("Missing field `{}`", #field_js_name),
))?;
});
}
}
syn::Member::Unnamed(i) => {
field_destructions.push(quote! { arg #i });
if is_optional_field {
obj_field_setters.push(match self.use_nullable {
false => quote! {
if arg #1.is_some() {
obj.set(#field_js_name, arg #i)?;
}
},
true => quote! {
if let Some(arg #i) = arg #i {
obj.set(#field_js_name, arg #i)?;
} else {
obj.set(#field_js_name, napi::bindgen_prelude::Null)?;
}
},
});
} else {
obj_field_setters.push(quote! { obj.set(#field_js_name, arg #1)?; });
}
if is_optional_field && !self.use_nullable {
obj_field_getters.push(quote! { let arg #i: #ty = obj.get(#field_js_name)?; });
} else {
obj_field_getters.push(quote! {
let arg #i: #ty = obj.get(#field_js_name)?.ok_or_else(|| napi::bindgen_prelude::Error::new(
napi::bindgen_prelude::Status::InvalidArg,
format!("Missing field `{}`", #field_js_name),
))?;
});
}
}
}
}
let destructed_fields = if variant.is_tuple {
quote! {
Self::#variant_name (#(#field_destructions),*)
}
} else {
quote! {
Self::#variant_name {#(#field_destructions),*}
}
};
variant_arm_setters.push(quote! {
#destructed_fields => {
#(#obj_field_setters)*
},
});
variant_arm_getters.push(quote! {
#variant_name_str => {
#(#obj_field_getters)*
#destructed_fields
},
})
}
let to_napi_value = if structured_enum.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()?;
match val {
#(#variant_arm_setters)*
};
napi::bindgen_prelude::Object::to_napi_value(env, obj)
}
}
}
} else {
quote! {}
};
let from_napi_value = if structured_enum.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)?;
let type_: String = obj.get(#discriminant).map_err(|mut err| {
err.reason = format!("{} on {}.{}", err.reason, #name_str, #discriminant);
err
})?.ok_or_else(|| napi::bindgen_prelude::Error::new(
napi::bindgen_prelude::Status::InvalidArg,
format!("Missing field `{}`", #discriminant),
))?;
let val = match type_.as_str() {
#(#variant_arm_getters)*
_ => return Err(napi::bindgen_prelude::Error::new(
napi::bindgen_prelude::Status::InvalidArg,
format!("Unknown variant `{}`", type_),
)),
};
Ok(val)
}
}
impl napi::bindgen_prelude::ValidateNapiValue for #name {}
}
} else {
quote! {}
};
quote! {
impl napi::bindgen_prelude::TypeName for #name {
fn type_name() -> &'static str {
#name_str
}
fn value_type() -> napi::ValueType {
napi::ValueType::Object
}
}
#to_napi_value
#from_napi_value
}
}
}
impl TryToTokens for NapiImpl {

View File

@ -1,8 +1,10 @@
use std::cell::RefCell;
use std::collections::HashMap;
use std::{cell::RefCell, iter};
use super::{add_alias, ToTypeDef, TypeDef};
use crate::{js_doc_from_comments, ty_to_ts_type, NapiImpl, NapiStruct, NapiStructKind};
use crate::{
js_doc_from_comments, ty_to_ts_type, NapiImpl, NapiStruct, NapiStructField, NapiStructKind,
};
thread_local! {
pub(crate) static TASK_STRUCTS: RefCell<HashMap<String, String>> = Default::default();
@ -18,10 +20,10 @@ impl ToTypeDef for NapiStruct {
add_alias(self.name.to_string(), self.js_name.to_string());
Some(TypeDef {
kind: String::from(if self.kind == NapiStructKind::Object {
"interface"
} else {
"struct"
kind: String::from(match self.kind {
NapiStructKind::Class(_) => "struct",
NapiStructKind::Object(_) => "interface",
NapiStructKind::StructuredEnum(_) => "type",
}),
name: self.js_name.to_owned(),
original_name: Some(self.name.to_string()),
@ -104,51 +106,85 @@ impl ToTypeDef for NapiImpl {
}
impl NapiStruct {
fn gen_field(&self, f: &NapiStructField) -> Option<(String, String)> {
if f.skip_typescript {
return None;
}
let mut field_str = String::from("");
if !f.comments.is_empty() {
field_str.push_str(&js_doc_from_comments(&f.comments))
}
if !f.setter {
field_str.push_str("readonly ")
}
let (arg, is_optional) = ty_to_ts_type(&f.ty, false, true, false);
let arg = f.ts_type.as_ref().map(|ty| ty.to_string()).unwrap_or(arg);
let arg = match is_optional {
false => format!("{}: {}", &f.js_name, arg),
true => match self.use_nullable {
false => format!("{}?: {}", &f.js_name, arg),
true => format!("{}: {} | null", &f.js_name, arg),
},
};
field_str.push_str(&arg);
Some((field_str, arg))
}
fn gen_ts_class(&self) -> String {
let mut ctor_args = vec![];
let def = self
.fields
.iter()
.filter(|f| f.getter)
.filter_map(|f| {
if f.skip_typescript {
return None;
match &self.kind {
NapiStructKind::Class(class) => {
let mut ctor_args = vec![];
let def = class
.fields
.iter()
.filter(|f| f.getter)
.filter_map(|f| {
self.gen_field(f).map(|(field, arg)| {
ctor_args.push(arg);
field
})
})
.collect::<Vec<_>>()
.join("\\n");
if class.ctor {
format!("{}\\nconstructor({})", def, ctor_args.join(", "))
} else {
def
}
let mut field_str = String::from("");
if !f.comments.is_empty() {
field_str.push_str(&js_doc_from_comments(&f.comments))
}
if !f.setter {
field_str.push_str("readonly ")
}
let (arg, is_optional) = ty_to_ts_type(&f.ty, false, true, false);
let arg = f.ts_type.as_ref().map(|ty| ty.to_string()).unwrap_or(arg);
let arg = match is_optional {
false => format!("{}: {}", &f.js_name, arg),
true => match self.use_nullable {
false => format!("{}?: {}", &f.js_name, arg),
true => format!("{}: {} | null", &f.js_name, arg),
},
};
if self.kind == NapiStructKind::Constructor {
ctor_args.push(arg.clone());
}
field_str.push_str(&arg);
Some(field_str)
})
.collect::<Vec<_>>()
.join("\\n");
if self.kind == NapiStructKind::Constructor {
format!("{}\\nconstructor({})", def, ctor_args.join(", "))
} else {
def
}
NapiStructKind::Object(object) => object
.fields
.iter()
.filter(|f| f.getter)
.filter_map(|f| self.gen_field(f).map(|(field, _)| field))
.collect::<Vec<_>>()
.join("\\n"),
NapiStructKind::StructuredEnum(structured_enum) => structured_enum
.variants
.iter()
.map(|variant| {
let def = iter::once(format!(
"{}: '{}'",
structured_enum.discriminant, variant.name
))
.chain(
variant
.fields
.iter()
.filter(|f| f.getter)
.filter_map(|f| self.gen_field(f).map(|(field, _)| field)),
)
.collect::<Vec<_>>()
.join(", ");
format!(" | {{ {} }} ", def)
})
.collect::<Vec<_>>()
.join("\\n"),
}
}
}

View File

@ -73,6 +73,7 @@ macro_rules! attrgen {
(ts_generic_types, TsGenericTypes(Span, String, Span)),
(string_enum, StringEnum(Span, Option<(String, Span)>)),
(use_nullable, UseNullable(Span, Option<bool>), false),
(discriminant, Discriminant(Span, String, Span)),
// impl later
// (inspectable, Inspectable(Span)),

View File

@ -10,9 +10,10 @@ use attrs::BindgenAttrs;
use convert_case::{Case, Casing};
use napi_derive_backend::{
rm_raw_prefix, BindgenResult, CallbackArg, Diagnostic, FnKind, FnSelf, Napi, NapiConst, NapiEnum,
NapiEnumValue, NapiEnumVariant, NapiFn, NapiFnArg, NapiFnArgKind, NapiImpl, NapiItem, NapiStruct,
NapiStructField, NapiStructKind,
rm_raw_prefix, BindgenResult, CallbackArg, Diagnostic, FnKind, FnSelf, Napi, NapiClass,
NapiConst, NapiEnum, NapiEnumValue, NapiEnumVariant, NapiFn, NapiFnArg, NapiFnArgKind, NapiImpl,
NapiItem, NapiObject, NapiStruct, NapiStructField, NapiStructKind, NapiStructuredEnum,
NapiStructuredEnumVariant,
};
use proc_macro2::{Ident, Span, TokenStream};
use quote::ToTokens;
@ -921,79 +922,70 @@ impl ConvertToAST for syn::ItemFn {
}
}
fn convert_fields(
fields: &mut syn::Fields,
check_vis: bool,
) -> BindgenResult<(Vec<NapiStructField>, bool)> {
let mut napi_fields = vec![];
let mut is_tuple = false;
for (i, field) in fields.iter_mut().enumerate() {
if check_vis && !matches!(field.vis, syn::Visibility::Public(_)) {
continue;
}
let field_opts = BindgenAttrs::find(&mut field.attrs)?;
let (js_name, name) = match &field.ident {
Some(ident) => (
field_opts.js_name().map_or_else(
|| ident.unraw().to_string().to_case(Case::Camel),
|(js_name, _)| js_name.to_owned(),
),
syn::Member::Named(ident.clone()),
),
None => {
is_tuple = true;
(format!("field{}", i), syn::Member::Unnamed(i.into()))
}
};
let ignored = field_opts.skip().is_some();
let readonly = field_opts.readonly().is_some();
let writable = field_opts.writable();
let enumerable = field_opts.enumerable();
let configurable = field_opts.configurable();
let skip_typescript = field_opts.skip_typescript().is_some();
let ts_type = field_opts.ts_type().map(|e| e.0.to_string());
napi_fields.push(NapiStructField {
name,
js_name,
ty: field.ty.clone(),
getter: !ignored,
setter: !(ignored || readonly),
writable,
enumerable,
configurable,
comments: extract_doc_comments(&field.attrs),
skip_typescript,
ts_type,
})
}
Ok((napi_fields, is_tuple))
}
impl ConvertToAST for syn::ItemStruct {
fn convert_to_ast(&mut self, opts: &BindgenAttrs) -> BindgenResult<Napi> {
let mut errors = vec![];
let vis = self.vis.clone();
let struct_name = self.ident.clone();
let js_name = opts.js_name().map_or_else(
|| self.ident.to_string().to_case(Case::Pascal),
|(js_name, _)| js_name.to_owned(),
);
let mut fields = vec![];
let mut is_tuple = false;
let struct_kind = if opts.constructor().is_some() {
NapiStructKind::Constructor
} else if opts.object().is_some() {
NapiStructKind::Object
} else {
NapiStructKind::None
};
let use_nullable = opts.use_nullable();
for (i, field) in self.fields.iter_mut().enumerate() {
match field.vis {
syn::Visibility::Public(..) => {}
_ => {
if struct_kind != NapiStructKind::None {
errors.push(err_span!(
field,
"#[napi] requires all struct fields to be public to mark struct as constructor or object shape\nthis field is not public."
));
}
continue;
}
}
let field_opts = BindgenAttrs::find(&mut field.attrs)?;
let (js_name, name) = match &field.ident {
Some(ident) => (
field_opts.js_name().map_or_else(
|| ident.unraw().to_string().to_case(Case::Camel),
|(js_name, _)| js_name.to_owned(),
),
syn::Member::Named(ident.clone()),
),
None => {
is_tuple = true;
(format!("field{}", i), syn::Member::Unnamed(i.into()))
}
};
let ignored = field_opts.skip().is_some();
let readonly = field_opts.readonly().is_some();
let writable = field_opts.writable();
let enumerable = field_opts.enumerable();
let configurable = field_opts.configurable();
let skip_typescript = field_opts.skip_typescript().is_some();
let ts_type = field_opts.ts_type().map(|e| e.0.to_string());
fields.push(NapiStructField {
name,
js_name,
ty: field.ty.clone(),
getter: !ignored,
setter: !(ignored || readonly),
writable,
enumerable,
configurable,
comments: extract_doc_comments(&field.attrs),
skip_typescript,
ts_type,
})
}
let (fields, is_tuple) = convert_fields(&mut self.fields, true)?;
record_struct(&struct_name, js_name.clone(), opts);
let namespace = opts.namespace().map(|(m, _)| m.to_owned());
@ -1007,22 +999,46 @@ impl ConvertToAST for syn::ItemStruct {
inner.insert(key, implement_iterator);
});
let struct_kind = if opts.object().is_some() {
NapiStructKind::Object(NapiObject {
fields,
object_from_js: opts.object_from_js(),
object_to_js: opts.object_to_js(),
is_tuple,
})
} else {
NapiStructKind::Class(NapiClass {
fields,
ctor: opts.constructor().is_some(),
implement_iterator,
is_tuple,
use_custom_finalize: opts.custom_finalize().is_some(),
})
};
match &struct_kind {
NapiStructKind::Class(class) if !class.ctor => {}
_ => {
for field in self.fields.iter() {
if !matches!(field.vis, syn::Visibility::Public(_)) {
errors.push(err_span!(
field,
"#[napi] requires all struct fields to be public to mark struct as constructor or object shape\nthis field is not public."
));
}
}
}
};
Diagnostic::from_vec(errors).map(|()| Napi {
item: NapiItem::Struct(NapiStruct {
js_name,
name: struct_name.clone(),
vis,
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,
use_custom_finalize: opts.custom_finalize().is_some(),
register_name: get_register_ident(format!("{struct_name}_struct").as_str()),
use_nullable,
register_name: get_register_ident(format!("{struct_name}_struct").as_str()),
comments: extract_doc_comments(&self.attrs),
}),
})
}
@ -1133,13 +1149,58 @@ impl ConvertToAST for syn::ItemEnum {
_ => bail_span!(self, "only public enum allowed"),
}
self.attrs.push(parse_quote!(#[derive(Copy, Clone)]));
let js_name = opts
.js_name()
.map_or_else(|| self.ident.to_string(), |(s, _)| s.to_string());
let is_string_enum = opts.string_enum().is_some();
if self
.variants
.iter()
.any(|v| !matches!(v.fields, syn::Fields::Unit))
{
let discriminant = opts.discriminant().map_or("type", |(s, _)| s);
let mut errors = vec![];
let mut variants = vec![];
for variant in self.variants.iter_mut() {
let (fields, is_tuple) = convert_fields(&mut variant.fields, false)?;
for field in fields.iter() {
if field.js_name == discriminant {
errors.push(err_span!(
field.name,
r#"field's js_name("{}") and discriminator("{}") conflict"#,
field.js_name,
discriminant,
));
}
}
variants.push(NapiStructuredEnumVariant {
name: variant.ident.clone(),
fields,
is_tuple,
});
}
let struct_name = self.ident.clone();
return Diagnostic::from_vec(errors).map(|()| Napi {
item: NapiItem::Struct(NapiStruct {
name: struct_name.clone(),
js_name,
comments: extract_doc_comments(&self.attrs),
js_mod: opts.namespace().map(|(m, _)| m.to_owned()),
use_nullable: opts.use_nullable(),
register_name: get_register_ident(format!("{struct_name}_struct").as_str()),
kind: NapiStructKind::StructuredEnum(NapiStructuredEnum {
variants,
discriminant: discriminant.to_owned(),
object_from_js: opts.object_from_js(),
object_to_js: opts.object_to_js(),
}),
}),
});
}
self.attrs.push(parse_quote!(#[derive(Copy, Clone)]));
let variants = match opts.string_enum() {
Some(case) => {
let case = case.map(|c| Ok::<Case, Diagnostic>(match c.0.as_str() {
@ -1161,7 +1222,10 @@ impl ConvertToAST for syn::ItemEnum {
.iter_mut()
.map(|v| {
if !matches!(v.fields, syn::Fields::Unit) {
bail_span!(v.fields, "Structured enum is not supported in #[napi]")
bail_span!(
v.fields,
"Structured enum is not supported with string enum in #[napi]"
)
}
if matches!(&v.discriminant, Some((_, _))) {
bail_span!(
@ -1193,10 +1257,6 @@ impl ConvertToAST for syn::ItemEnum {
.variants
.iter()
.map(|v| {
if !matches!(v.fields, syn::Fields::Unit) {
bail_span!(v.fields, "Structured enum is not supported in #[napi]")
}
let val = match &v.discriminant {
Some((_, expr)) => {
let mut symbol = 1;

View File

@ -700,6 +700,11 @@ Generated by [AVA](https://avajs.dev).
VariantThree = 'variantthree'␊
}␊
export type StructuredKind =␊
| { type2: 'Hello' }␊
| { type2: 'Greeting', name: string }␊
| { type2: 'Birthday', name: string, age: number }␊
export declare function sumBtreeMapping(nums: Record<string, number>): number␊
export declare function sumIndexMapping(nums: Record<string, number>): number␊
@ -805,6 +810,8 @@ Generated by [AVA](https://avajs.dev).
export declare function validateStringEnum(input: StatusInValidate): string␊
export declare function validateStructuredEnum(kind: StructuredKind): StructuredKind␊
export declare function validateSymbol(s: symbol): boolean␊
export declare function validateTypedArray(input: Uint8Array): number␊

View File

@ -186,6 +186,8 @@ import {
callThenOnPromise,
callCatchOnPromise,
callFinallyOnPromise,
StructuredKind,
validateStructuredEnum,
} from '../index.cjs'
import { test } from './test.framework.js'
@ -250,6 +252,26 @@ test('enum', (t) => {
t.is(enumToI32(CustomNumEnum.Eight), 8)
})
test('structured enum', (t) => {
const hello: StructuredKind = {
type2: 'Hello',
}
const greeting: StructuredKind = {
type2: 'Greeting',
name: 'Napi-rs',
}
const birthday: StructuredKind = {
type2: 'Birthday',
name: 'Napi-rs',
age: 10,
}
t.deepEqual(hello, validateStructuredEnum(hello))
t.deepEqual(greeting, validateStructuredEnum(greeting))
t.deepEqual(birthday, validateStructuredEnum(birthday))
t.throws(() => validateStructuredEnum({ type2: 'unknown' } as any))
t.throws(() => validateStructuredEnum({ type2: 'Greeting' } as any))
})
test('function call', async (t) => {
t.is(
call0(() => 42),

View File

@ -167,201 +167,203 @@ function __napi_rs_initialize_modules(__napiInstance) {
__napiInstance.exports['__napi_register__enum_to_i32_151']?.()
__napiInstance.exports['__napi_register__SkippedEnums_152']?.()
__napiInstance.exports['__napi_register__CustomStringEnum_153']?.()
__napiInstance.exports['__napi_register__run_script_154']?.()
__napiInstance.exports['__napi_register__get_module_file_name_155']?.()
__napiInstance.exports['__napi_register__throw_syntax_error_156']?.()
__napiInstance.exports['__napi_register__throw_error_157']?.()
__napiInstance.exports['__napi_register__panic_158']?.()
__napiInstance.exports['__napi_register__receive_string_159']?.()
__napiInstance.exports['__napi_register__custom_status_code_160']?.()
__napiInstance.exports['__napi_register__throw_async_error_161']?.()
__napiInstance.exports['__napi_register__CustomStruct_struct_162']?.()
__napiInstance.exports['__napi_register__CustomStruct_impl_165']?.()
__napiInstance.exports['__napi_register__create_external_166']?.()
__napiInstance.exports['__napi_register__create_external_string_167']?.()
__napiInstance.exports['__napi_register__get_external_168']?.()
__napiInstance.exports['__napi_register__mutate_external_169']?.()
__napiInstance.exports['__napi_register__create_optional_external_170']?.()
__napiInstance.exports['__napi_register__get_optional_external_171']?.()
__napiInstance.exports['__napi_register__mutate_optional_external_172']?.()
__napiInstance.exports['__napi_register__validate_array_173']?.()
__napiInstance.exports['__napi_register__validate_buffer_174']?.()
__napiInstance.exports['__napi_register__validate_typed_array_175']?.()
__napiInstance.exports['__napi_register__validate_typed_array_slice_176']?.()
__napiInstance.exports['__napi_register__validate_uint8_clamped_slice_177']?.()
__napiInstance.exports['__napi_register__validate_buffer_slice_178']?.()
__napiInstance.exports['__napi_register__validate_bigint_179']?.()
__napiInstance.exports['__napi_register__validate_boolean_180']?.()
__napiInstance.exports['__napi_register__validate_date_181']?.()
__napiInstance.exports['__napi_register__validate_date_time_182']?.()
__napiInstance.exports['__napi_register__validate_external_183']?.()
__napiInstance.exports['__napi_register__validate_function_184']?.()
__napiInstance.exports['__napi_register__validate_hash_map_185']?.()
__napiInstance.exports['__napi_register__validate_null_186']?.()
__napiInstance.exports['__napi_register__validate_undefined_187']?.()
__napiInstance.exports['__napi_register__validate_number_188']?.()
__napiInstance.exports['__napi_register__validate_promise_189']?.()
__napiInstance.exports['__napi_register__validate_string_190']?.()
__napiInstance.exports['__napi_register__validate_symbol_191']?.()
__napiInstance.exports['__napi_register__validate_optional_192']?.()
__napiInstance.exports['__napi_register__KindInValidate_193']?.()
__napiInstance.exports['__napi_register__validate_enum_194']?.()
__napiInstance.exports['__napi_register__StatusInValidate_195']?.()
__napiInstance.exports['__napi_register__validate_string_enum_196']?.()
__napiInstance.exports['__napi_register__return_undefined_if_invalid_197']?.()
__napiInstance.exports['__napi_register__return_undefined_if_invalid_promise_198']?.()
__napiInstance.exports['__napi_register__ts_rename_199']?.()
__napiInstance.exports['__napi_register__override_individual_arg_on_function_200']?.()
__napiInstance.exports['__napi_register__override_individual_arg_on_function_with_cb_arg_201']?.()
__napiInstance.exports['__napi_register__call0_202']?.()
__napiInstance.exports['__napi_register__call1_203']?.()
__napiInstance.exports['__napi_register__call2_204']?.()
__napiInstance.exports['__napi_register__apply0_205']?.()
__napiInstance.exports['__napi_register__apply1_206']?.()
__napiInstance.exports['__napi_register__call_function_207']?.()
__napiInstance.exports['__napi_register__call_function_with_arg_208']?.()
__napiInstance.exports['__napi_register__create_reference_on_function_209']?.()
__napiInstance.exports['__napi_register__call_function_with_arg_and_ctx_210']?.()
__napiInstance.exports['__napi_register__reference_as_callback_211']?.()
__napiInstance.exports['__napi_register__build_threadsafe_function_from_function_212']?.()
__napiInstance.exports['__napi_register__build_threadsafe_function_from_function_callee_handle_213']?.()
__napiInstance.exports['__napi_register__Fib_struct_214']?.()
__napiInstance.exports['__napi_register__Fib_impl_215']?.()
__napiInstance.exports['__napi_register__StructuredKind_struct_154']?.()
__napiInstance.exports['__napi_register__validate_structured_enum_155']?.()
__napiInstance.exports['__napi_register__run_script_156']?.()
__napiInstance.exports['__napi_register__get_module_file_name_157']?.()
__napiInstance.exports['__napi_register__throw_syntax_error_158']?.()
__napiInstance.exports['__napi_register__throw_error_159']?.()
__napiInstance.exports['__napi_register__panic_160']?.()
__napiInstance.exports['__napi_register__receive_string_161']?.()
__napiInstance.exports['__napi_register__custom_status_code_162']?.()
__napiInstance.exports['__napi_register__throw_async_error_163']?.()
__napiInstance.exports['__napi_register__CustomStruct_struct_164']?.()
__napiInstance.exports['__napi_register__CustomStruct_impl_167']?.()
__napiInstance.exports['__napi_register__create_external_168']?.()
__napiInstance.exports['__napi_register__create_external_string_169']?.()
__napiInstance.exports['__napi_register__get_external_170']?.()
__napiInstance.exports['__napi_register__mutate_external_171']?.()
__napiInstance.exports['__napi_register__create_optional_external_172']?.()
__napiInstance.exports['__napi_register__get_optional_external_173']?.()
__napiInstance.exports['__napi_register__mutate_optional_external_174']?.()
__napiInstance.exports['__napi_register__validate_array_175']?.()
__napiInstance.exports['__napi_register__validate_buffer_176']?.()
__napiInstance.exports['__napi_register__validate_typed_array_177']?.()
__napiInstance.exports['__napi_register__validate_typed_array_slice_178']?.()
__napiInstance.exports['__napi_register__validate_uint8_clamped_slice_179']?.()
__napiInstance.exports['__napi_register__validate_buffer_slice_180']?.()
__napiInstance.exports['__napi_register__validate_bigint_181']?.()
__napiInstance.exports['__napi_register__validate_boolean_182']?.()
__napiInstance.exports['__napi_register__validate_date_183']?.()
__napiInstance.exports['__napi_register__validate_date_time_184']?.()
__napiInstance.exports['__napi_register__validate_external_185']?.()
__napiInstance.exports['__napi_register__validate_function_186']?.()
__napiInstance.exports['__napi_register__validate_hash_map_187']?.()
__napiInstance.exports['__napi_register__validate_null_188']?.()
__napiInstance.exports['__napi_register__validate_undefined_189']?.()
__napiInstance.exports['__napi_register__validate_number_190']?.()
__napiInstance.exports['__napi_register__validate_promise_191']?.()
__napiInstance.exports['__napi_register__validate_string_192']?.()
__napiInstance.exports['__napi_register__validate_symbol_193']?.()
__napiInstance.exports['__napi_register__validate_optional_194']?.()
__napiInstance.exports['__napi_register__KindInValidate_195']?.()
__napiInstance.exports['__napi_register__validate_enum_196']?.()
__napiInstance.exports['__napi_register__StatusInValidate_197']?.()
__napiInstance.exports['__napi_register__validate_string_enum_198']?.()
__napiInstance.exports['__napi_register__return_undefined_if_invalid_199']?.()
__napiInstance.exports['__napi_register__return_undefined_if_invalid_promise_200']?.()
__napiInstance.exports['__napi_register__ts_rename_201']?.()
__napiInstance.exports['__napi_register__override_individual_arg_on_function_202']?.()
__napiInstance.exports['__napi_register__override_individual_arg_on_function_with_cb_arg_203']?.()
__napiInstance.exports['__napi_register__call0_204']?.()
__napiInstance.exports['__napi_register__call1_205']?.()
__napiInstance.exports['__napi_register__call2_206']?.()
__napiInstance.exports['__napi_register__apply0_207']?.()
__napiInstance.exports['__napi_register__apply1_208']?.()
__napiInstance.exports['__napi_register__call_function_209']?.()
__napiInstance.exports['__napi_register__call_function_with_arg_210']?.()
__napiInstance.exports['__napi_register__create_reference_on_function_211']?.()
__napiInstance.exports['__napi_register__call_function_with_arg_and_ctx_212']?.()
__napiInstance.exports['__napi_register__reference_as_callback_213']?.()
__napiInstance.exports['__napi_register__build_threadsafe_function_from_function_214']?.()
__napiInstance.exports['__napi_register__build_threadsafe_function_from_function_callee_handle_215']?.()
__napiInstance.exports['__napi_register__Fib_struct_216']?.()
__napiInstance.exports['__napi_register__Fib_impl_217']?.()
__napiInstance.exports['__napi_register__Fib2_struct_218']?.()
__napiInstance.exports['__napi_register__Fib2_impl_219']?.()
__napiInstance.exports['__napi_register__Fib_impl_219']?.()
__napiInstance.exports['__napi_register__Fib2_struct_220']?.()
__napiInstance.exports['__napi_register__Fib2_impl_221']?.()
__napiInstance.exports['__napi_register__Fib3_struct_222']?.()
__napiInstance.exports['__napi_register__Fib3_impl_223']?.()
__napiInstance.exports['__napi_register__ALIGNMENT_224']?.()
__napiInstance.exports['__napi_register__xxh64_225']?.()
__napiInstance.exports['__napi_register__xxh128_226']?.()
__napiInstance.exports['__napi_register__Xxh3_struct_227']?.()
__napiInstance.exports['__napi_register__Xxh3_impl_231']?.()
__napiInstance.exports['__napi_register__xxh2_plus_232']?.()
__napiInstance.exports['__napi_register__xxh3_xxh64_alias_233']?.()
__napiInstance.exports['__napi_register__xxh64_alias_234']?.()
__napiInstance.exports['__napi_register__get_mapping_235']?.()
__napiInstance.exports['__napi_register__sum_mapping_236']?.()
__napiInstance.exports['__napi_register__get_btree_mapping_237']?.()
__napiInstance.exports['__napi_register__sum_btree_mapping_238']?.()
__napiInstance.exports['__napi_register__get_index_mapping_239']?.()
__napiInstance.exports['__napi_register__sum_index_mapping_240']?.()
__napiInstance.exports['__napi_register__indexmap_passthrough_241']?.()
__napiInstance.exports['__napi_register__map_option_242']?.()
__napiInstance.exports['__napi_register__return_null_243']?.()
__napiInstance.exports['__napi_register__return_undefined_244']?.()
__napiInstance.exports['__napi_register__UseNullableStruct_struct_245']?.()
__napiInstance.exports['__napi_register__NotUseNullableStruct_struct_246']?.()
__napiInstance.exports['__napi_register__DefaultUseNullableStruct_struct_247']?.()
__napiInstance.exports['__napi_register__UseNullableClass_struct_248']?.()
__napiInstance.exports['__napi_register__NotUseNullableClass_struct_249']?.()
__napiInstance.exports['__napi_register__DefaultUseNullableClass_struct_250']?.()
__napiInstance.exports['__napi_register__add_251']?.()
__napiInstance.exports['__napi_register__fibonacci_252']?.()
__napiInstance.exports['__napi_register__list_obj_keys_253']?.()
__napiInstance.exports['__napi_register__create_obj_254']?.()
__napiInstance.exports['__napi_register__get_global_255']?.()
__napiInstance.exports['__napi_register__get_undefined_256']?.()
__napiInstance.exports['__napi_register__get_null_257']?.()
__napiInstance.exports['__napi_register__AllOptionalObject_struct_258']?.()
__napiInstance.exports['__napi_register__receive_all_optional_object_259']?.()
__napiInstance.exports['__napi_register__AliasedEnum_260']?.()
__napiInstance.exports['__napi_register__StructContainsAliasedEnum_struct_261']?.()
__napiInstance.exports['__napi_register__fn_received_aliased_262']?.()
__napiInstance.exports['__napi_register__StrictObject_struct_263']?.()
__napiInstance.exports['__napi_register__receive_strict_object_264']?.()
__napiInstance.exports['__napi_register__get_str_from_object_265']?.()
__napiInstance.exports['__napi_register__TsTypeChanged_struct_266']?.()
__napiInstance.exports['__napi_register__create_obj_with_property_267']?.()
__napiInstance.exports['__napi_register__getter_from_obj_268']?.()
__napiInstance.exports['__napi_register__ObjectOnlyFromJs_struct_269']?.()
__napiInstance.exports['__napi_register__receive_object_only_from_js_270']?.()
__napiInstance.exports['__napi_register__object_get_named_property_should_perform_typecheck_271']?.()
__napiInstance.exports['__napi_register__ObjectOnlyToJs_struct_272']?.()
__napiInstance.exports['__napi_register__return_object_only_to_js_273']?.()
__napiInstance.exports['__napi_register__async_plus_100_274']?.()
__napiInstance.exports['__napi_register__call_then_on_promise_275']?.()
__napiInstance.exports['__napi_register__call_catch_on_promise_276']?.()
__napiInstance.exports['__napi_register__call_finally_on_promise_277']?.()
__napiInstance.exports['__napi_register__JsRepo_struct_278']?.()
__napiInstance.exports['__napi_register__JsRepo_impl_281']?.()
__napiInstance.exports['__napi_register__JsRemote_struct_282']?.()
__napiInstance.exports['__napi_register__JsRemote_impl_285']?.()
__napiInstance.exports['__napi_register__CSSRuleList_struct_286']?.()
__napiInstance.exports['__napi_register__CSSRuleList_impl_290']?.()
__napiInstance.exports['__napi_register__CSSStyleSheet_struct_291']?.()
__napiInstance.exports['__napi_register__AnotherCSSStyleSheet_struct_292']?.()
__napiInstance.exports['__napi_register__AnotherCSSStyleSheet_impl_294']?.()
__napiInstance.exports['__napi_register__CSSStyleSheet_impl_298']?.()
__napiInstance.exports['__napi_register__PackageJson_struct_299']?.()
__napiInstance.exports['__napi_register__read_package_json_300']?.()
__napiInstance.exports['__napi_register__get_package_json_name_301']?.()
__napiInstance.exports['__napi_register__test_serde_roundtrip_302']?.()
__napiInstance.exports['__napi_register__test_serde_big_number_precision_303']?.()
__napiInstance.exports['__napi_register__test_serde_buffer_bytes_304']?.()
__napiInstance.exports['__napi_register__return_from_shared_crate_305']?.()
__napiInstance.exports['__napi_register__contains_306']?.()
__napiInstance.exports['__napi_register__concat_str_307']?.()
__napiInstance.exports['__napi_register__concat_utf16_308']?.()
__napiInstance.exports['__napi_register__concat_latin1_309']?.()
__napiInstance.exports['__napi_register__roundtrip_str_310']?.()
__napiInstance.exports['__napi_register__set_symbol_in_obj_311']?.()
__napiInstance.exports['__napi_register__create_symbol_312']?.()
__napiInstance.exports['__napi_register__create_symbol_for_313']?.()
__napiInstance.exports['__napi_register__DelaySum_impl_314']?.()
__napiInstance.exports['__napi_register__without_abort_controller_315']?.()
__napiInstance.exports['__napi_register__with_abort_controller_316']?.()
__napiInstance.exports['__napi_register__AsyncTaskVoidReturn_impl_317']?.()
__napiInstance.exports['__napi_register__async_task_void_return_318']?.()
__napiInstance.exports['__napi_register__AsyncTaskOptionalReturn_impl_319']?.()
__napiInstance.exports['__napi_register__async_task_optional_return_320']?.()
__napiInstance.exports['__napi_register__AsyncTaskReadFile_impl_321']?.()
__napiInstance.exports['__napi_register__async_task_read_file_322']?.()
__napiInstance.exports['__napi_register__call_threadsafe_function_323']?.()
__napiInstance.exports['__napi_register__call_long_threadsafe_function_324']?.()
__napiInstance.exports['__napi_register__threadsafe_function_throw_error_325']?.()
__napiInstance.exports['__napi_register__threadsafe_function_fatal_mode_326']?.()
__napiInstance.exports['__napi_register__threadsafe_function_fatal_mode_error_327']?.()
__napiInstance.exports['__napi_register__threadsafe_function_closure_capture_328']?.()
__napiInstance.exports['__napi_register__tsfn_call_with_callback_329']?.()
__napiInstance.exports['__napi_register__tsfn_async_call_330']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_331']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_fatal_332']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_tuple_args_333']?.()
__napiInstance.exports['__napi_register__tsfn_return_promise_334']?.()
__napiInstance.exports['__napi_register__tsfn_return_promise_timeout_335']?.()
__napiInstance.exports['__napi_register__tsfn_throw_from_js_336']?.()
__napiInstance.exports['__napi_register__spawn_thread_in_thread_337']?.()
__napiInstance.exports['__napi_register__Pet_struct_338']?.()
__napiInstance.exports['__napi_register__tsfn_in_either_339']?.()
__napiInstance.exports['__napi_register__get_buffer_340']?.()
__napiInstance.exports['__napi_register__append_buffer_341']?.()
__napiInstance.exports['__napi_register__get_empty_buffer_342']?.()
__napiInstance.exports['__napi_register__convert_u32_array_343']?.()
__napiInstance.exports['__napi_register__create_external_typed_array_344']?.()
__napiInstance.exports['__napi_register__mutate_typed_array_345']?.()
__napiInstance.exports['__napi_register__deref_uint8_array_346']?.()
__napiInstance.exports['__napi_register__buffer_pass_through_347']?.()
__napiInstance.exports['__napi_register__array_buffer_pass_through_348']?.()
__napiInstance.exports['__napi_register__accept_slice_349']?.()
__napiInstance.exports['__napi_register__accept_arraybuffer_350']?.()
__napiInstance.exports['__napi_register__u8_array_to_array_351']?.()
__napiInstance.exports['__napi_register__i8_array_to_array_352']?.()
__napiInstance.exports['__napi_register__u16_array_to_array_353']?.()
__napiInstance.exports['__napi_register__i16_array_to_array_354']?.()
__napiInstance.exports['__napi_register__u32_array_to_array_355']?.()
__napiInstance.exports['__napi_register__i32_array_to_array_356']?.()
__napiInstance.exports['__napi_register__f32_array_to_array_357']?.()
__napiInstance.exports['__napi_register__f64_array_to_array_358']?.()
__napiInstance.exports['__napi_register__u64_array_to_array_359']?.()
__napiInstance.exports['__napi_register__i64_array_to_array_360']?.()
__napiInstance.exports['__napi_register__accept_uint8_clamped_slice_361']?.()
__napiInstance.exports['__napi_register__accept_uint8_clamped_slice_and_buffer_slice_362']?.()
__napiInstance.exports['__napi_register__AsyncBuffer_impl_363']?.()
__napiInstance.exports['__napi_register__async_reduce_buffer_364']?.()
__napiInstance.exports['__napi_register__async_buffer_to_array_365']?.()
__napiInstance.exports['__napi_register__u_init8_array_from_string_366']?.()
__napiInstance.exports['__napi_register__Fib2_impl_223']?.()
__napiInstance.exports['__napi_register__Fib3_struct_224']?.()
__napiInstance.exports['__napi_register__Fib3_impl_225']?.()
__napiInstance.exports['__napi_register__ALIGNMENT_226']?.()
__napiInstance.exports['__napi_register__xxh64_227']?.()
__napiInstance.exports['__napi_register__xxh128_228']?.()
__napiInstance.exports['__napi_register__Xxh3_struct_229']?.()
__napiInstance.exports['__napi_register__Xxh3_impl_233']?.()
__napiInstance.exports['__napi_register__xxh2_plus_234']?.()
__napiInstance.exports['__napi_register__xxh3_xxh64_alias_235']?.()
__napiInstance.exports['__napi_register__xxh64_alias_236']?.()
__napiInstance.exports['__napi_register__get_mapping_237']?.()
__napiInstance.exports['__napi_register__sum_mapping_238']?.()
__napiInstance.exports['__napi_register__get_btree_mapping_239']?.()
__napiInstance.exports['__napi_register__sum_btree_mapping_240']?.()
__napiInstance.exports['__napi_register__get_index_mapping_241']?.()
__napiInstance.exports['__napi_register__sum_index_mapping_242']?.()
__napiInstance.exports['__napi_register__indexmap_passthrough_243']?.()
__napiInstance.exports['__napi_register__map_option_244']?.()
__napiInstance.exports['__napi_register__return_null_245']?.()
__napiInstance.exports['__napi_register__return_undefined_246']?.()
__napiInstance.exports['__napi_register__UseNullableStruct_struct_247']?.()
__napiInstance.exports['__napi_register__NotUseNullableStruct_struct_248']?.()
__napiInstance.exports['__napi_register__DefaultUseNullableStruct_struct_249']?.()
__napiInstance.exports['__napi_register__UseNullableClass_struct_250']?.()
__napiInstance.exports['__napi_register__NotUseNullableClass_struct_251']?.()
__napiInstance.exports['__napi_register__DefaultUseNullableClass_struct_252']?.()
__napiInstance.exports['__napi_register__add_253']?.()
__napiInstance.exports['__napi_register__fibonacci_254']?.()
__napiInstance.exports['__napi_register__list_obj_keys_255']?.()
__napiInstance.exports['__napi_register__create_obj_256']?.()
__napiInstance.exports['__napi_register__get_global_257']?.()
__napiInstance.exports['__napi_register__get_undefined_258']?.()
__napiInstance.exports['__napi_register__get_null_259']?.()
__napiInstance.exports['__napi_register__AllOptionalObject_struct_260']?.()
__napiInstance.exports['__napi_register__receive_all_optional_object_261']?.()
__napiInstance.exports['__napi_register__AliasedEnum_262']?.()
__napiInstance.exports['__napi_register__StructContainsAliasedEnum_struct_263']?.()
__napiInstance.exports['__napi_register__fn_received_aliased_264']?.()
__napiInstance.exports['__napi_register__StrictObject_struct_265']?.()
__napiInstance.exports['__napi_register__receive_strict_object_266']?.()
__napiInstance.exports['__napi_register__get_str_from_object_267']?.()
__napiInstance.exports['__napi_register__TsTypeChanged_struct_268']?.()
__napiInstance.exports['__napi_register__create_obj_with_property_269']?.()
__napiInstance.exports['__napi_register__getter_from_obj_270']?.()
__napiInstance.exports['__napi_register__ObjectOnlyFromJs_struct_271']?.()
__napiInstance.exports['__napi_register__receive_object_only_from_js_272']?.()
__napiInstance.exports['__napi_register__object_get_named_property_should_perform_typecheck_273']?.()
__napiInstance.exports['__napi_register__ObjectOnlyToJs_struct_274']?.()
__napiInstance.exports['__napi_register__return_object_only_to_js_275']?.()
__napiInstance.exports['__napi_register__async_plus_100_276']?.()
__napiInstance.exports['__napi_register__call_then_on_promise_277']?.()
__napiInstance.exports['__napi_register__call_catch_on_promise_278']?.()
__napiInstance.exports['__napi_register__call_finally_on_promise_279']?.()
__napiInstance.exports['__napi_register__JsRepo_struct_280']?.()
__napiInstance.exports['__napi_register__JsRepo_impl_283']?.()
__napiInstance.exports['__napi_register__JsRemote_struct_284']?.()
__napiInstance.exports['__napi_register__JsRemote_impl_287']?.()
__napiInstance.exports['__napi_register__CSSRuleList_struct_288']?.()
__napiInstance.exports['__napi_register__CSSRuleList_impl_292']?.()
__napiInstance.exports['__napi_register__CSSStyleSheet_struct_293']?.()
__napiInstance.exports['__napi_register__AnotherCSSStyleSheet_struct_294']?.()
__napiInstance.exports['__napi_register__AnotherCSSStyleSheet_impl_296']?.()
__napiInstance.exports['__napi_register__CSSStyleSheet_impl_300']?.()
__napiInstance.exports['__napi_register__PackageJson_struct_301']?.()
__napiInstance.exports['__napi_register__read_package_json_302']?.()
__napiInstance.exports['__napi_register__get_package_json_name_303']?.()
__napiInstance.exports['__napi_register__test_serde_roundtrip_304']?.()
__napiInstance.exports['__napi_register__test_serde_big_number_precision_305']?.()
__napiInstance.exports['__napi_register__test_serde_buffer_bytes_306']?.()
__napiInstance.exports['__napi_register__return_from_shared_crate_307']?.()
__napiInstance.exports['__napi_register__contains_308']?.()
__napiInstance.exports['__napi_register__concat_str_309']?.()
__napiInstance.exports['__napi_register__concat_utf16_310']?.()
__napiInstance.exports['__napi_register__concat_latin1_311']?.()
__napiInstance.exports['__napi_register__roundtrip_str_312']?.()
__napiInstance.exports['__napi_register__set_symbol_in_obj_313']?.()
__napiInstance.exports['__napi_register__create_symbol_314']?.()
__napiInstance.exports['__napi_register__create_symbol_for_315']?.()
__napiInstance.exports['__napi_register__DelaySum_impl_316']?.()
__napiInstance.exports['__napi_register__without_abort_controller_317']?.()
__napiInstance.exports['__napi_register__with_abort_controller_318']?.()
__napiInstance.exports['__napi_register__AsyncTaskVoidReturn_impl_319']?.()
__napiInstance.exports['__napi_register__async_task_void_return_320']?.()
__napiInstance.exports['__napi_register__AsyncTaskOptionalReturn_impl_321']?.()
__napiInstance.exports['__napi_register__async_task_optional_return_322']?.()
__napiInstance.exports['__napi_register__AsyncTaskReadFile_impl_323']?.()
__napiInstance.exports['__napi_register__async_task_read_file_324']?.()
__napiInstance.exports['__napi_register__call_threadsafe_function_325']?.()
__napiInstance.exports['__napi_register__call_long_threadsafe_function_326']?.()
__napiInstance.exports['__napi_register__threadsafe_function_throw_error_327']?.()
__napiInstance.exports['__napi_register__threadsafe_function_fatal_mode_328']?.()
__napiInstance.exports['__napi_register__threadsafe_function_fatal_mode_error_329']?.()
__napiInstance.exports['__napi_register__threadsafe_function_closure_capture_330']?.()
__napiInstance.exports['__napi_register__tsfn_call_with_callback_331']?.()
__napiInstance.exports['__napi_register__tsfn_async_call_332']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_333']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_fatal_334']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_tuple_args_335']?.()
__napiInstance.exports['__napi_register__tsfn_return_promise_336']?.()
__napiInstance.exports['__napi_register__tsfn_return_promise_timeout_337']?.()
__napiInstance.exports['__napi_register__tsfn_throw_from_js_338']?.()
__napiInstance.exports['__napi_register__spawn_thread_in_thread_339']?.()
__napiInstance.exports['__napi_register__Pet_struct_340']?.()
__napiInstance.exports['__napi_register__tsfn_in_either_341']?.()
__napiInstance.exports['__napi_register__get_buffer_342']?.()
__napiInstance.exports['__napi_register__append_buffer_343']?.()
__napiInstance.exports['__napi_register__get_empty_buffer_344']?.()
__napiInstance.exports['__napi_register__convert_u32_array_345']?.()
__napiInstance.exports['__napi_register__create_external_typed_array_346']?.()
__napiInstance.exports['__napi_register__mutate_typed_array_347']?.()
__napiInstance.exports['__napi_register__deref_uint8_array_348']?.()
__napiInstance.exports['__napi_register__buffer_pass_through_349']?.()
__napiInstance.exports['__napi_register__array_buffer_pass_through_350']?.()
__napiInstance.exports['__napi_register__accept_slice_351']?.()
__napiInstance.exports['__napi_register__accept_arraybuffer_352']?.()
__napiInstance.exports['__napi_register__u8_array_to_array_353']?.()
__napiInstance.exports['__napi_register__i8_array_to_array_354']?.()
__napiInstance.exports['__napi_register__u16_array_to_array_355']?.()
__napiInstance.exports['__napi_register__i16_array_to_array_356']?.()
__napiInstance.exports['__napi_register__u32_array_to_array_357']?.()
__napiInstance.exports['__napi_register__i32_array_to_array_358']?.()
__napiInstance.exports['__napi_register__f32_array_to_array_359']?.()
__napiInstance.exports['__napi_register__f64_array_to_array_360']?.()
__napiInstance.exports['__napi_register__u64_array_to_array_361']?.()
__napiInstance.exports['__napi_register__i64_array_to_array_362']?.()
__napiInstance.exports['__napi_register__accept_uint8_clamped_slice_363']?.()
__napiInstance.exports['__napi_register__accept_uint8_clamped_slice_and_buffer_slice_364']?.()
__napiInstance.exports['__napi_register__AsyncBuffer_impl_365']?.()
__napiInstance.exports['__napi_register__async_reduce_buffer_366']?.()
__napiInstance.exports['__napi_register__async_buffer_to_array_367']?.()
__napiInstance.exports['__napi_register__u_init8_array_from_string_368']?.()
}
export const Animal = __napiModule.exports.Animal
export const AnimalWithDefaultConstructor = __napiModule.exports.AnimalWithDefaultConstructor
@ -605,6 +607,7 @@ export const validateOptional = __napiModule.exports.validateOptional
export const validatePromise = __napiModule.exports.validatePromise
export const validateString = __napiModule.exports.validateString
export const validateStringEnum = __napiModule.exports.validateStringEnum
export const validateStructuredEnum = __napiModule.exports.validateStructuredEnum
export const validateSymbol = __napiModule.exports.validateSymbol
export const validateTypedArray = __napiModule.exports.validateTypedArray
export const validateTypedArraySlice = __napiModule.exports.validateTypedArraySlice

View File

@ -191,201 +191,203 @@ function __napi_rs_initialize_modules(__napiInstance) {
__napiInstance.exports['__napi_register__enum_to_i32_151']?.()
__napiInstance.exports['__napi_register__SkippedEnums_152']?.()
__napiInstance.exports['__napi_register__CustomStringEnum_153']?.()
__napiInstance.exports['__napi_register__run_script_154']?.()
__napiInstance.exports['__napi_register__get_module_file_name_155']?.()
__napiInstance.exports['__napi_register__throw_syntax_error_156']?.()
__napiInstance.exports['__napi_register__throw_error_157']?.()
__napiInstance.exports['__napi_register__panic_158']?.()
__napiInstance.exports['__napi_register__receive_string_159']?.()
__napiInstance.exports['__napi_register__custom_status_code_160']?.()
__napiInstance.exports['__napi_register__throw_async_error_161']?.()
__napiInstance.exports['__napi_register__CustomStruct_struct_162']?.()
__napiInstance.exports['__napi_register__CustomStruct_impl_165']?.()
__napiInstance.exports['__napi_register__create_external_166']?.()
__napiInstance.exports['__napi_register__create_external_string_167']?.()
__napiInstance.exports['__napi_register__get_external_168']?.()
__napiInstance.exports['__napi_register__mutate_external_169']?.()
__napiInstance.exports['__napi_register__create_optional_external_170']?.()
__napiInstance.exports['__napi_register__get_optional_external_171']?.()
__napiInstance.exports['__napi_register__mutate_optional_external_172']?.()
__napiInstance.exports['__napi_register__validate_array_173']?.()
__napiInstance.exports['__napi_register__validate_buffer_174']?.()
__napiInstance.exports['__napi_register__validate_typed_array_175']?.()
__napiInstance.exports['__napi_register__validate_typed_array_slice_176']?.()
__napiInstance.exports['__napi_register__validate_uint8_clamped_slice_177']?.()
__napiInstance.exports['__napi_register__validate_buffer_slice_178']?.()
__napiInstance.exports['__napi_register__validate_bigint_179']?.()
__napiInstance.exports['__napi_register__validate_boolean_180']?.()
__napiInstance.exports['__napi_register__validate_date_181']?.()
__napiInstance.exports['__napi_register__validate_date_time_182']?.()
__napiInstance.exports['__napi_register__validate_external_183']?.()
__napiInstance.exports['__napi_register__validate_function_184']?.()
__napiInstance.exports['__napi_register__validate_hash_map_185']?.()
__napiInstance.exports['__napi_register__validate_null_186']?.()
__napiInstance.exports['__napi_register__validate_undefined_187']?.()
__napiInstance.exports['__napi_register__validate_number_188']?.()
__napiInstance.exports['__napi_register__validate_promise_189']?.()
__napiInstance.exports['__napi_register__validate_string_190']?.()
__napiInstance.exports['__napi_register__validate_symbol_191']?.()
__napiInstance.exports['__napi_register__validate_optional_192']?.()
__napiInstance.exports['__napi_register__KindInValidate_193']?.()
__napiInstance.exports['__napi_register__validate_enum_194']?.()
__napiInstance.exports['__napi_register__StatusInValidate_195']?.()
__napiInstance.exports['__napi_register__validate_string_enum_196']?.()
__napiInstance.exports['__napi_register__return_undefined_if_invalid_197']?.()
__napiInstance.exports['__napi_register__return_undefined_if_invalid_promise_198']?.()
__napiInstance.exports['__napi_register__ts_rename_199']?.()
__napiInstance.exports['__napi_register__override_individual_arg_on_function_200']?.()
__napiInstance.exports['__napi_register__override_individual_arg_on_function_with_cb_arg_201']?.()
__napiInstance.exports['__napi_register__call0_202']?.()
__napiInstance.exports['__napi_register__call1_203']?.()
__napiInstance.exports['__napi_register__call2_204']?.()
__napiInstance.exports['__napi_register__apply0_205']?.()
__napiInstance.exports['__napi_register__apply1_206']?.()
__napiInstance.exports['__napi_register__call_function_207']?.()
__napiInstance.exports['__napi_register__call_function_with_arg_208']?.()
__napiInstance.exports['__napi_register__create_reference_on_function_209']?.()
__napiInstance.exports['__napi_register__call_function_with_arg_and_ctx_210']?.()
__napiInstance.exports['__napi_register__reference_as_callback_211']?.()
__napiInstance.exports['__napi_register__build_threadsafe_function_from_function_212']?.()
__napiInstance.exports['__napi_register__build_threadsafe_function_from_function_callee_handle_213']?.()
__napiInstance.exports['__napi_register__Fib_struct_214']?.()
__napiInstance.exports['__napi_register__Fib_impl_215']?.()
__napiInstance.exports['__napi_register__StructuredKind_struct_154']?.()
__napiInstance.exports['__napi_register__validate_structured_enum_155']?.()
__napiInstance.exports['__napi_register__run_script_156']?.()
__napiInstance.exports['__napi_register__get_module_file_name_157']?.()
__napiInstance.exports['__napi_register__throw_syntax_error_158']?.()
__napiInstance.exports['__napi_register__throw_error_159']?.()
__napiInstance.exports['__napi_register__panic_160']?.()
__napiInstance.exports['__napi_register__receive_string_161']?.()
__napiInstance.exports['__napi_register__custom_status_code_162']?.()
__napiInstance.exports['__napi_register__throw_async_error_163']?.()
__napiInstance.exports['__napi_register__CustomStruct_struct_164']?.()
__napiInstance.exports['__napi_register__CustomStruct_impl_167']?.()
__napiInstance.exports['__napi_register__create_external_168']?.()
__napiInstance.exports['__napi_register__create_external_string_169']?.()
__napiInstance.exports['__napi_register__get_external_170']?.()
__napiInstance.exports['__napi_register__mutate_external_171']?.()
__napiInstance.exports['__napi_register__create_optional_external_172']?.()
__napiInstance.exports['__napi_register__get_optional_external_173']?.()
__napiInstance.exports['__napi_register__mutate_optional_external_174']?.()
__napiInstance.exports['__napi_register__validate_array_175']?.()
__napiInstance.exports['__napi_register__validate_buffer_176']?.()
__napiInstance.exports['__napi_register__validate_typed_array_177']?.()
__napiInstance.exports['__napi_register__validate_typed_array_slice_178']?.()
__napiInstance.exports['__napi_register__validate_uint8_clamped_slice_179']?.()
__napiInstance.exports['__napi_register__validate_buffer_slice_180']?.()
__napiInstance.exports['__napi_register__validate_bigint_181']?.()
__napiInstance.exports['__napi_register__validate_boolean_182']?.()
__napiInstance.exports['__napi_register__validate_date_183']?.()
__napiInstance.exports['__napi_register__validate_date_time_184']?.()
__napiInstance.exports['__napi_register__validate_external_185']?.()
__napiInstance.exports['__napi_register__validate_function_186']?.()
__napiInstance.exports['__napi_register__validate_hash_map_187']?.()
__napiInstance.exports['__napi_register__validate_null_188']?.()
__napiInstance.exports['__napi_register__validate_undefined_189']?.()
__napiInstance.exports['__napi_register__validate_number_190']?.()
__napiInstance.exports['__napi_register__validate_promise_191']?.()
__napiInstance.exports['__napi_register__validate_string_192']?.()
__napiInstance.exports['__napi_register__validate_symbol_193']?.()
__napiInstance.exports['__napi_register__validate_optional_194']?.()
__napiInstance.exports['__napi_register__KindInValidate_195']?.()
__napiInstance.exports['__napi_register__validate_enum_196']?.()
__napiInstance.exports['__napi_register__StatusInValidate_197']?.()
__napiInstance.exports['__napi_register__validate_string_enum_198']?.()
__napiInstance.exports['__napi_register__return_undefined_if_invalid_199']?.()
__napiInstance.exports['__napi_register__return_undefined_if_invalid_promise_200']?.()
__napiInstance.exports['__napi_register__ts_rename_201']?.()
__napiInstance.exports['__napi_register__override_individual_arg_on_function_202']?.()
__napiInstance.exports['__napi_register__override_individual_arg_on_function_with_cb_arg_203']?.()
__napiInstance.exports['__napi_register__call0_204']?.()
__napiInstance.exports['__napi_register__call1_205']?.()
__napiInstance.exports['__napi_register__call2_206']?.()
__napiInstance.exports['__napi_register__apply0_207']?.()
__napiInstance.exports['__napi_register__apply1_208']?.()
__napiInstance.exports['__napi_register__call_function_209']?.()
__napiInstance.exports['__napi_register__call_function_with_arg_210']?.()
__napiInstance.exports['__napi_register__create_reference_on_function_211']?.()
__napiInstance.exports['__napi_register__call_function_with_arg_and_ctx_212']?.()
__napiInstance.exports['__napi_register__reference_as_callback_213']?.()
__napiInstance.exports['__napi_register__build_threadsafe_function_from_function_214']?.()
__napiInstance.exports['__napi_register__build_threadsafe_function_from_function_callee_handle_215']?.()
__napiInstance.exports['__napi_register__Fib_struct_216']?.()
__napiInstance.exports['__napi_register__Fib_impl_217']?.()
__napiInstance.exports['__napi_register__Fib2_struct_218']?.()
__napiInstance.exports['__napi_register__Fib2_impl_219']?.()
__napiInstance.exports['__napi_register__Fib_impl_219']?.()
__napiInstance.exports['__napi_register__Fib2_struct_220']?.()
__napiInstance.exports['__napi_register__Fib2_impl_221']?.()
__napiInstance.exports['__napi_register__Fib3_struct_222']?.()
__napiInstance.exports['__napi_register__Fib3_impl_223']?.()
__napiInstance.exports['__napi_register__ALIGNMENT_224']?.()
__napiInstance.exports['__napi_register__xxh64_225']?.()
__napiInstance.exports['__napi_register__xxh128_226']?.()
__napiInstance.exports['__napi_register__Xxh3_struct_227']?.()
__napiInstance.exports['__napi_register__Xxh3_impl_231']?.()
__napiInstance.exports['__napi_register__xxh2_plus_232']?.()
__napiInstance.exports['__napi_register__xxh3_xxh64_alias_233']?.()
__napiInstance.exports['__napi_register__xxh64_alias_234']?.()
__napiInstance.exports['__napi_register__get_mapping_235']?.()
__napiInstance.exports['__napi_register__sum_mapping_236']?.()
__napiInstance.exports['__napi_register__get_btree_mapping_237']?.()
__napiInstance.exports['__napi_register__sum_btree_mapping_238']?.()
__napiInstance.exports['__napi_register__get_index_mapping_239']?.()
__napiInstance.exports['__napi_register__sum_index_mapping_240']?.()
__napiInstance.exports['__napi_register__indexmap_passthrough_241']?.()
__napiInstance.exports['__napi_register__map_option_242']?.()
__napiInstance.exports['__napi_register__return_null_243']?.()
__napiInstance.exports['__napi_register__return_undefined_244']?.()
__napiInstance.exports['__napi_register__UseNullableStruct_struct_245']?.()
__napiInstance.exports['__napi_register__NotUseNullableStruct_struct_246']?.()
__napiInstance.exports['__napi_register__DefaultUseNullableStruct_struct_247']?.()
__napiInstance.exports['__napi_register__UseNullableClass_struct_248']?.()
__napiInstance.exports['__napi_register__NotUseNullableClass_struct_249']?.()
__napiInstance.exports['__napi_register__DefaultUseNullableClass_struct_250']?.()
__napiInstance.exports['__napi_register__add_251']?.()
__napiInstance.exports['__napi_register__fibonacci_252']?.()
__napiInstance.exports['__napi_register__list_obj_keys_253']?.()
__napiInstance.exports['__napi_register__create_obj_254']?.()
__napiInstance.exports['__napi_register__get_global_255']?.()
__napiInstance.exports['__napi_register__get_undefined_256']?.()
__napiInstance.exports['__napi_register__get_null_257']?.()
__napiInstance.exports['__napi_register__AllOptionalObject_struct_258']?.()
__napiInstance.exports['__napi_register__receive_all_optional_object_259']?.()
__napiInstance.exports['__napi_register__AliasedEnum_260']?.()
__napiInstance.exports['__napi_register__StructContainsAliasedEnum_struct_261']?.()
__napiInstance.exports['__napi_register__fn_received_aliased_262']?.()
__napiInstance.exports['__napi_register__StrictObject_struct_263']?.()
__napiInstance.exports['__napi_register__receive_strict_object_264']?.()
__napiInstance.exports['__napi_register__get_str_from_object_265']?.()
__napiInstance.exports['__napi_register__TsTypeChanged_struct_266']?.()
__napiInstance.exports['__napi_register__create_obj_with_property_267']?.()
__napiInstance.exports['__napi_register__getter_from_obj_268']?.()
__napiInstance.exports['__napi_register__ObjectOnlyFromJs_struct_269']?.()
__napiInstance.exports['__napi_register__receive_object_only_from_js_270']?.()
__napiInstance.exports['__napi_register__object_get_named_property_should_perform_typecheck_271']?.()
__napiInstance.exports['__napi_register__ObjectOnlyToJs_struct_272']?.()
__napiInstance.exports['__napi_register__return_object_only_to_js_273']?.()
__napiInstance.exports['__napi_register__async_plus_100_274']?.()
__napiInstance.exports['__napi_register__call_then_on_promise_275']?.()
__napiInstance.exports['__napi_register__call_catch_on_promise_276']?.()
__napiInstance.exports['__napi_register__call_finally_on_promise_277']?.()
__napiInstance.exports['__napi_register__JsRepo_struct_278']?.()
__napiInstance.exports['__napi_register__JsRepo_impl_281']?.()
__napiInstance.exports['__napi_register__JsRemote_struct_282']?.()
__napiInstance.exports['__napi_register__JsRemote_impl_285']?.()
__napiInstance.exports['__napi_register__CSSRuleList_struct_286']?.()
__napiInstance.exports['__napi_register__CSSRuleList_impl_290']?.()
__napiInstance.exports['__napi_register__CSSStyleSheet_struct_291']?.()
__napiInstance.exports['__napi_register__AnotherCSSStyleSheet_struct_292']?.()
__napiInstance.exports['__napi_register__AnotherCSSStyleSheet_impl_294']?.()
__napiInstance.exports['__napi_register__CSSStyleSheet_impl_298']?.()
__napiInstance.exports['__napi_register__PackageJson_struct_299']?.()
__napiInstance.exports['__napi_register__read_package_json_300']?.()
__napiInstance.exports['__napi_register__get_package_json_name_301']?.()
__napiInstance.exports['__napi_register__test_serde_roundtrip_302']?.()
__napiInstance.exports['__napi_register__test_serde_big_number_precision_303']?.()
__napiInstance.exports['__napi_register__test_serde_buffer_bytes_304']?.()
__napiInstance.exports['__napi_register__return_from_shared_crate_305']?.()
__napiInstance.exports['__napi_register__contains_306']?.()
__napiInstance.exports['__napi_register__concat_str_307']?.()
__napiInstance.exports['__napi_register__concat_utf16_308']?.()
__napiInstance.exports['__napi_register__concat_latin1_309']?.()
__napiInstance.exports['__napi_register__roundtrip_str_310']?.()
__napiInstance.exports['__napi_register__set_symbol_in_obj_311']?.()
__napiInstance.exports['__napi_register__create_symbol_312']?.()
__napiInstance.exports['__napi_register__create_symbol_for_313']?.()
__napiInstance.exports['__napi_register__DelaySum_impl_314']?.()
__napiInstance.exports['__napi_register__without_abort_controller_315']?.()
__napiInstance.exports['__napi_register__with_abort_controller_316']?.()
__napiInstance.exports['__napi_register__AsyncTaskVoidReturn_impl_317']?.()
__napiInstance.exports['__napi_register__async_task_void_return_318']?.()
__napiInstance.exports['__napi_register__AsyncTaskOptionalReturn_impl_319']?.()
__napiInstance.exports['__napi_register__async_task_optional_return_320']?.()
__napiInstance.exports['__napi_register__AsyncTaskReadFile_impl_321']?.()
__napiInstance.exports['__napi_register__async_task_read_file_322']?.()
__napiInstance.exports['__napi_register__call_threadsafe_function_323']?.()
__napiInstance.exports['__napi_register__call_long_threadsafe_function_324']?.()
__napiInstance.exports['__napi_register__threadsafe_function_throw_error_325']?.()
__napiInstance.exports['__napi_register__threadsafe_function_fatal_mode_326']?.()
__napiInstance.exports['__napi_register__threadsafe_function_fatal_mode_error_327']?.()
__napiInstance.exports['__napi_register__threadsafe_function_closure_capture_328']?.()
__napiInstance.exports['__napi_register__tsfn_call_with_callback_329']?.()
__napiInstance.exports['__napi_register__tsfn_async_call_330']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_331']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_fatal_332']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_tuple_args_333']?.()
__napiInstance.exports['__napi_register__tsfn_return_promise_334']?.()
__napiInstance.exports['__napi_register__tsfn_return_promise_timeout_335']?.()
__napiInstance.exports['__napi_register__tsfn_throw_from_js_336']?.()
__napiInstance.exports['__napi_register__spawn_thread_in_thread_337']?.()
__napiInstance.exports['__napi_register__Pet_struct_338']?.()
__napiInstance.exports['__napi_register__tsfn_in_either_339']?.()
__napiInstance.exports['__napi_register__get_buffer_340']?.()
__napiInstance.exports['__napi_register__append_buffer_341']?.()
__napiInstance.exports['__napi_register__get_empty_buffer_342']?.()
__napiInstance.exports['__napi_register__convert_u32_array_343']?.()
__napiInstance.exports['__napi_register__create_external_typed_array_344']?.()
__napiInstance.exports['__napi_register__mutate_typed_array_345']?.()
__napiInstance.exports['__napi_register__deref_uint8_array_346']?.()
__napiInstance.exports['__napi_register__buffer_pass_through_347']?.()
__napiInstance.exports['__napi_register__array_buffer_pass_through_348']?.()
__napiInstance.exports['__napi_register__accept_slice_349']?.()
__napiInstance.exports['__napi_register__accept_arraybuffer_350']?.()
__napiInstance.exports['__napi_register__u8_array_to_array_351']?.()
__napiInstance.exports['__napi_register__i8_array_to_array_352']?.()
__napiInstance.exports['__napi_register__u16_array_to_array_353']?.()
__napiInstance.exports['__napi_register__i16_array_to_array_354']?.()
__napiInstance.exports['__napi_register__u32_array_to_array_355']?.()
__napiInstance.exports['__napi_register__i32_array_to_array_356']?.()
__napiInstance.exports['__napi_register__f32_array_to_array_357']?.()
__napiInstance.exports['__napi_register__f64_array_to_array_358']?.()
__napiInstance.exports['__napi_register__u64_array_to_array_359']?.()
__napiInstance.exports['__napi_register__i64_array_to_array_360']?.()
__napiInstance.exports['__napi_register__accept_uint8_clamped_slice_361']?.()
__napiInstance.exports['__napi_register__accept_uint8_clamped_slice_and_buffer_slice_362']?.()
__napiInstance.exports['__napi_register__AsyncBuffer_impl_363']?.()
__napiInstance.exports['__napi_register__async_reduce_buffer_364']?.()
__napiInstance.exports['__napi_register__async_buffer_to_array_365']?.()
__napiInstance.exports['__napi_register__u_init8_array_from_string_366']?.()
__napiInstance.exports['__napi_register__Fib2_impl_223']?.()
__napiInstance.exports['__napi_register__Fib3_struct_224']?.()
__napiInstance.exports['__napi_register__Fib3_impl_225']?.()
__napiInstance.exports['__napi_register__ALIGNMENT_226']?.()
__napiInstance.exports['__napi_register__xxh64_227']?.()
__napiInstance.exports['__napi_register__xxh128_228']?.()
__napiInstance.exports['__napi_register__Xxh3_struct_229']?.()
__napiInstance.exports['__napi_register__Xxh3_impl_233']?.()
__napiInstance.exports['__napi_register__xxh2_plus_234']?.()
__napiInstance.exports['__napi_register__xxh3_xxh64_alias_235']?.()
__napiInstance.exports['__napi_register__xxh64_alias_236']?.()
__napiInstance.exports['__napi_register__get_mapping_237']?.()
__napiInstance.exports['__napi_register__sum_mapping_238']?.()
__napiInstance.exports['__napi_register__get_btree_mapping_239']?.()
__napiInstance.exports['__napi_register__sum_btree_mapping_240']?.()
__napiInstance.exports['__napi_register__get_index_mapping_241']?.()
__napiInstance.exports['__napi_register__sum_index_mapping_242']?.()
__napiInstance.exports['__napi_register__indexmap_passthrough_243']?.()
__napiInstance.exports['__napi_register__map_option_244']?.()
__napiInstance.exports['__napi_register__return_null_245']?.()
__napiInstance.exports['__napi_register__return_undefined_246']?.()
__napiInstance.exports['__napi_register__UseNullableStruct_struct_247']?.()
__napiInstance.exports['__napi_register__NotUseNullableStruct_struct_248']?.()
__napiInstance.exports['__napi_register__DefaultUseNullableStruct_struct_249']?.()
__napiInstance.exports['__napi_register__UseNullableClass_struct_250']?.()
__napiInstance.exports['__napi_register__NotUseNullableClass_struct_251']?.()
__napiInstance.exports['__napi_register__DefaultUseNullableClass_struct_252']?.()
__napiInstance.exports['__napi_register__add_253']?.()
__napiInstance.exports['__napi_register__fibonacci_254']?.()
__napiInstance.exports['__napi_register__list_obj_keys_255']?.()
__napiInstance.exports['__napi_register__create_obj_256']?.()
__napiInstance.exports['__napi_register__get_global_257']?.()
__napiInstance.exports['__napi_register__get_undefined_258']?.()
__napiInstance.exports['__napi_register__get_null_259']?.()
__napiInstance.exports['__napi_register__AllOptionalObject_struct_260']?.()
__napiInstance.exports['__napi_register__receive_all_optional_object_261']?.()
__napiInstance.exports['__napi_register__AliasedEnum_262']?.()
__napiInstance.exports['__napi_register__StructContainsAliasedEnum_struct_263']?.()
__napiInstance.exports['__napi_register__fn_received_aliased_264']?.()
__napiInstance.exports['__napi_register__StrictObject_struct_265']?.()
__napiInstance.exports['__napi_register__receive_strict_object_266']?.()
__napiInstance.exports['__napi_register__get_str_from_object_267']?.()
__napiInstance.exports['__napi_register__TsTypeChanged_struct_268']?.()
__napiInstance.exports['__napi_register__create_obj_with_property_269']?.()
__napiInstance.exports['__napi_register__getter_from_obj_270']?.()
__napiInstance.exports['__napi_register__ObjectOnlyFromJs_struct_271']?.()
__napiInstance.exports['__napi_register__receive_object_only_from_js_272']?.()
__napiInstance.exports['__napi_register__object_get_named_property_should_perform_typecheck_273']?.()
__napiInstance.exports['__napi_register__ObjectOnlyToJs_struct_274']?.()
__napiInstance.exports['__napi_register__return_object_only_to_js_275']?.()
__napiInstance.exports['__napi_register__async_plus_100_276']?.()
__napiInstance.exports['__napi_register__call_then_on_promise_277']?.()
__napiInstance.exports['__napi_register__call_catch_on_promise_278']?.()
__napiInstance.exports['__napi_register__call_finally_on_promise_279']?.()
__napiInstance.exports['__napi_register__JsRepo_struct_280']?.()
__napiInstance.exports['__napi_register__JsRepo_impl_283']?.()
__napiInstance.exports['__napi_register__JsRemote_struct_284']?.()
__napiInstance.exports['__napi_register__JsRemote_impl_287']?.()
__napiInstance.exports['__napi_register__CSSRuleList_struct_288']?.()
__napiInstance.exports['__napi_register__CSSRuleList_impl_292']?.()
__napiInstance.exports['__napi_register__CSSStyleSheet_struct_293']?.()
__napiInstance.exports['__napi_register__AnotherCSSStyleSheet_struct_294']?.()
__napiInstance.exports['__napi_register__AnotherCSSStyleSheet_impl_296']?.()
__napiInstance.exports['__napi_register__CSSStyleSheet_impl_300']?.()
__napiInstance.exports['__napi_register__PackageJson_struct_301']?.()
__napiInstance.exports['__napi_register__read_package_json_302']?.()
__napiInstance.exports['__napi_register__get_package_json_name_303']?.()
__napiInstance.exports['__napi_register__test_serde_roundtrip_304']?.()
__napiInstance.exports['__napi_register__test_serde_big_number_precision_305']?.()
__napiInstance.exports['__napi_register__test_serde_buffer_bytes_306']?.()
__napiInstance.exports['__napi_register__return_from_shared_crate_307']?.()
__napiInstance.exports['__napi_register__contains_308']?.()
__napiInstance.exports['__napi_register__concat_str_309']?.()
__napiInstance.exports['__napi_register__concat_utf16_310']?.()
__napiInstance.exports['__napi_register__concat_latin1_311']?.()
__napiInstance.exports['__napi_register__roundtrip_str_312']?.()
__napiInstance.exports['__napi_register__set_symbol_in_obj_313']?.()
__napiInstance.exports['__napi_register__create_symbol_314']?.()
__napiInstance.exports['__napi_register__create_symbol_for_315']?.()
__napiInstance.exports['__napi_register__DelaySum_impl_316']?.()
__napiInstance.exports['__napi_register__without_abort_controller_317']?.()
__napiInstance.exports['__napi_register__with_abort_controller_318']?.()
__napiInstance.exports['__napi_register__AsyncTaskVoidReturn_impl_319']?.()
__napiInstance.exports['__napi_register__async_task_void_return_320']?.()
__napiInstance.exports['__napi_register__AsyncTaskOptionalReturn_impl_321']?.()
__napiInstance.exports['__napi_register__async_task_optional_return_322']?.()
__napiInstance.exports['__napi_register__AsyncTaskReadFile_impl_323']?.()
__napiInstance.exports['__napi_register__async_task_read_file_324']?.()
__napiInstance.exports['__napi_register__call_threadsafe_function_325']?.()
__napiInstance.exports['__napi_register__call_long_threadsafe_function_326']?.()
__napiInstance.exports['__napi_register__threadsafe_function_throw_error_327']?.()
__napiInstance.exports['__napi_register__threadsafe_function_fatal_mode_328']?.()
__napiInstance.exports['__napi_register__threadsafe_function_fatal_mode_error_329']?.()
__napiInstance.exports['__napi_register__threadsafe_function_closure_capture_330']?.()
__napiInstance.exports['__napi_register__tsfn_call_with_callback_331']?.()
__napiInstance.exports['__napi_register__tsfn_async_call_332']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_333']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_fatal_334']?.()
__napiInstance.exports['__napi_register__accept_threadsafe_function_tuple_args_335']?.()
__napiInstance.exports['__napi_register__tsfn_return_promise_336']?.()
__napiInstance.exports['__napi_register__tsfn_return_promise_timeout_337']?.()
__napiInstance.exports['__napi_register__tsfn_throw_from_js_338']?.()
__napiInstance.exports['__napi_register__spawn_thread_in_thread_339']?.()
__napiInstance.exports['__napi_register__Pet_struct_340']?.()
__napiInstance.exports['__napi_register__tsfn_in_either_341']?.()
__napiInstance.exports['__napi_register__get_buffer_342']?.()
__napiInstance.exports['__napi_register__append_buffer_343']?.()
__napiInstance.exports['__napi_register__get_empty_buffer_344']?.()
__napiInstance.exports['__napi_register__convert_u32_array_345']?.()
__napiInstance.exports['__napi_register__create_external_typed_array_346']?.()
__napiInstance.exports['__napi_register__mutate_typed_array_347']?.()
__napiInstance.exports['__napi_register__deref_uint8_array_348']?.()
__napiInstance.exports['__napi_register__buffer_pass_through_349']?.()
__napiInstance.exports['__napi_register__array_buffer_pass_through_350']?.()
__napiInstance.exports['__napi_register__accept_slice_351']?.()
__napiInstance.exports['__napi_register__accept_arraybuffer_352']?.()
__napiInstance.exports['__napi_register__u8_array_to_array_353']?.()
__napiInstance.exports['__napi_register__i8_array_to_array_354']?.()
__napiInstance.exports['__napi_register__u16_array_to_array_355']?.()
__napiInstance.exports['__napi_register__i16_array_to_array_356']?.()
__napiInstance.exports['__napi_register__u32_array_to_array_357']?.()
__napiInstance.exports['__napi_register__i32_array_to_array_358']?.()
__napiInstance.exports['__napi_register__f32_array_to_array_359']?.()
__napiInstance.exports['__napi_register__f64_array_to_array_360']?.()
__napiInstance.exports['__napi_register__u64_array_to_array_361']?.()
__napiInstance.exports['__napi_register__i64_array_to_array_362']?.()
__napiInstance.exports['__napi_register__accept_uint8_clamped_slice_363']?.()
__napiInstance.exports['__napi_register__accept_uint8_clamped_slice_and_buffer_slice_364']?.()
__napiInstance.exports['__napi_register__AsyncBuffer_impl_365']?.()
__napiInstance.exports['__napi_register__async_reduce_buffer_366']?.()
__napiInstance.exports['__napi_register__async_buffer_to_array_367']?.()
__napiInstance.exports['__napi_register__u_init8_array_from_string_368']?.()
}
module.exports.Animal = __napiModule.exports.Animal
module.exports.AnimalWithDefaultConstructor = __napiModule.exports.AnimalWithDefaultConstructor
@ -629,6 +631,7 @@ module.exports.validateOptional = __napiModule.exports.validateOptional
module.exports.validatePromise = __napiModule.exports.validatePromise
module.exports.validateString = __napiModule.exports.validateString
module.exports.validateStringEnum = __napiModule.exports.validateStringEnum
module.exports.validateStructuredEnum = __napiModule.exports.validateStructuredEnum
module.exports.validateSymbol = __napiModule.exports.validateSymbol
module.exports.validateTypedArray = __napiModule.exports.validateTypedArray
module.exports.validateTypedArraySlice = __napiModule.exports.validateTypedArraySlice

View File

@ -603,6 +603,7 @@ module.exports.validateOptional = nativeBinding.validateOptional
module.exports.validatePromise = nativeBinding.validatePromise
module.exports.validateString = nativeBinding.validateString
module.exports.validateStringEnum = nativeBinding.validateStringEnum
module.exports.validateStructuredEnum = nativeBinding.validateStructuredEnum
module.exports.validateSymbol = nativeBinding.validateSymbol
module.exports.validateTypedArray = nativeBinding.validateTypedArray
module.exports.validateTypedArraySlice = nativeBinding.validateTypedArraySlice

View File

@ -690,6 +690,11 @@ export declare const enum StringEnum {
VariantThree = 'variantthree'
}
export type StructuredKind =
| { type2: 'Hello' }
| { type2: 'Greeting', name: string }
| { type2: 'Birthday', name: string, age: number }
export declare function sumBtreeMapping(nums: Record<string, number>): number
export declare function sumIndexMapping(nums: Record<string, number>): number
@ -795,6 +800,8 @@ export declare function validateString(s: string): string
export declare function validateStringEnum(input: StatusInValidate): string
export declare function validateStructuredEnum(kind: StructuredKind): StructuredKind
export declare function validateSymbol(s: symbol): boolean
export declare function validateTypedArray(input: Uint8Array): number

View File

@ -60,3 +60,15 @@ pub enum CustomStringEnum {
Bar,
Baz,
}
#[napi(discriminant = "type2")]
pub enum StructuredKind {
Hello,
Greeting { name: String },
Birthday { name: String, age: u8 },
}
#[napi]
pub fn validate_structured_enum(kind: StructuredKind) -> StructuredKind {
kind
}