FIX: Don not clone Locales and Languages, pass them by reference

This commit is contained in:
Nicolás Hatcher
2025-12-14 16:55:14 +01:00
parent ffe5d1a158
commit 96a5482e01
84 changed files with 308 additions and 251 deletions

View File

@@ -28,17 +28,24 @@ fn to_node_error(error: XlsxError) -> Error {
Error::new(Status::Unknown, error.to_string())
}
fn leak_str(s: &str) -> &'static str {
Box::leak(s.to_owned().into_boxed_str())
}
#[napi]
pub struct Model {
model: BaseModel,
model: BaseModel<'static>,
}
#[napi]
impl Model {
#[napi(constructor)]
pub fn new(name: String, locale: String, timezone: String, language_id: String) -> Result<Self> {
let model =
BaseModel::new_empty(&name, &locale, &timezone, &language_id).map_err(to_js_error)?;
let name = leak_str(&name);
let locale = leak_str(&locale);
let timezone = leak_str(&timezone);
let language_id = leak_str(&language_id);
let model = BaseModel::new_empty(name, locale, timezone, language_id).map_err(to_js_error)?;
Ok(Self { model })
}
@@ -49,14 +56,16 @@ impl Model {
tz: String,
language_id: String,
) -> Result<Model> {
let model = load_from_xlsx(&file_path, &locale, &tz, &language_id)
let language_id = leak_str(&language_id);
let model = load_from_xlsx(&file_path, &locale, &tz, language_id)
.map_err(|error| Error::new(Status::Unknown, error.to_string()))?;
Ok(Self { model })
}
#[napi(factory)]
pub fn from_icalc(file_name: String, language_id: String) -> Result<Model> {
let model = load_from_icalc(&file_name, &language_id)
let language_id = leak_str(&language_id);
let model = load_from_icalc(&file_name, language_id)
.map_err(|error| Error::new(Status::Unknown, error.to_string()))?;
Ok(Self { model })
}

View File

@@ -21,23 +21,31 @@ fn to_js_error(error: String) -> Error {
Error::new(Status::Unknown, error)
}
fn leak_str(s: &str) -> &'static str {
Box::leak(s.to_owned().into_boxed_str())
}
#[napi]
pub struct UserModel {
model: BaseModel,
model: BaseModel<'static>,
}
#[napi]
impl UserModel {
#[napi(constructor)]
pub fn new(name: String, locale: String, timezone: String, language_id: String) -> Result<Self> {
let model =
BaseModel::new_empty(&name, &locale, &timezone, &language_id).map_err(to_js_error)?;
let name = leak_str(&name);
let locale = leak_str(&locale);
let timezone = leak_str(&timezone);
let language_id = leak_str(&language_id);
let model = BaseModel::new_empty(name, locale, timezone, language_id).map_err(to_js_error)?;
Ok(Self { model })
}
#[napi(factory)]
pub fn from_bytes(bytes: &[u8], language_id: String) -> Result<UserModel> {
let model = BaseModel::from_bytes(bytes, &language_id).map_err(to_js_error)?;
let language_id = leak_str(&language_id);
let model = BaseModel::from_bytes(bytes, language_id).map_err(to_js_error)?;
Ok(UserModel { model })
}