pub(super) fn napi_variant_wrapper_constructor(
typ: &crate::core::ir::TypeDef,
mapper: &crate::backends::napi::type_map::NapiMapper,
core_import: &str,
prefix: &str,
) -> Option<String> {
use crate::codegen::type_mapper::TypeMapper as _;
let ctor = typ.methods.iter().find(|m| m.name == "new" && m.receiver.is_none())?;
let map_fn = |t: &crate::core::ir::TypeRef| mapper.map_type(t);
let sig_params = crate::codegen::shared::function_params(&ctor.params, &map_fn);
let call_args = ctor
.params
.iter()
.map(|p| {
let mapped_type = map_fn(&p.ty);
let core_type_name = match &p.ty {
crate::core::ir::TypeRef::Named(name) => name.as_str(),
_ => "",
};
let needs_conversion =
!core_type_name.is_empty() && mapped_type.starts_with(&mapper.prefix) && !mapped_type.contains("::");
if needs_conversion {
format!("{}.into()", p.name)
} else {
p.name.to_string()
}
})
.collect::<Vec<_>>()
.join(", ");
let struct_name = format!("{prefix}{}", typ.name);
let core_path = crate::codegen::conversions::core_type_path(typ, core_import);
let body = if call_args.is_empty() {
format!("Self {{ inner: std::sync::Arc::new({core_path}::new()) }}")
} else {
format!("Self {{ inner: std::sync::Arc::new({core_path}::new({call_args})) }}")
};
let fn_sig = if sig_params.is_empty() {
"pub fn new_constructor() -> Self".to_string()
} else {
format!("pub fn new_constructor({sig_params}) -> Self")
};
Some(format!(
"#[napi]\nimpl {struct_name} {{\n #[napi(constructor)]\n {fn_sig} {{\n {body}\n }}\n}}\n",
))
}
pub(super) fn napi_default_constructor(
typ: &crate::core::ir::TypeDef,
_mapper: &crate::backends::napi::type_map::NapiMapper,
core_import: &str,
prefix: &str,
) -> Option<String> {
typ.methods
.iter()
.find(|m| m.name == "new" && m.receiver.is_none() && m.params.is_empty())?;
let struct_name = format!("{prefix}{}", typ.name);
let core_path = crate::codegen::conversions::core_type_path(typ, core_import);
let constructor = format!(
"#[napi]\nimpl {struct_name} {{\n #[napi(constructor)]\n pub fn new() -> Self {{\n Self {{ inner: std::sync::Arc::new({core_path}::new()) }}\n }}\n}}\n"
);
Some(constructor)
}