node: less unwraps (#6388)

* Update api/node/rust/interpreter/value.rs

Co-authored-by: Simon Hausmann <simon.hausmann@slint.dev>

---------

Co-authored-by: Simon Hausmann <simon.hausmann@slint.dev>
This commit is contained in:
FloVanGH 2024-10-01 08:47:53 +00:00 committed by GitHub
parent 68a4e15cff
commit 4b880a7b49
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 171 additions and 17 deletions

View file

@ -137,21 +137,36 @@ impl JsComponentInstance {
self.inner
.set_callback(callback_name.as_str(), {
let return_type = return_type.clone();
let callback_name = callback_name.clone();
move |args| {
let callback: JsFunction = function_ref.get().unwrap();
let result = callback
let Ok(callback) = function_ref.get::<JsFunction>() else {
eprintln!("Node.js: cannot get reference of callback {} because it has the wrong type", callback_name);
return Value::Void;
};
let Ok(result) = callback
.call(
None,
args.iter()
.map(|v| super::value::to_js_unknown(&env, v).unwrap())
.collect::<Vec<JsUnknown>>()
.as_ref(),
)
.unwrap();
.as_ref()
) else {
eprintln!("Node.js: cannot call callback {}", callback_name);
return Value::Void;
};
if let Some(return_type) = &return_type {
super::to_value(&env, result, return_type).unwrap()
if let Ok(value) = super::to_value(&env, result, return_type) {
return value;
} else {
eprintln!(
"Node.js: cannot convert return type of callback {}",
callback_name
);
return slint_interpreter::default_value_for_type(return_type);
}
} else {
Value::Void
}
@ -192,21 +207,40 @@ impl JsComponentInstance {
self.inner
.set_global_callback(global_name.as_str(), callback_name.as_str(), {
let return_type = return_type.clone();
let global_name = global_name.clone();
let callback_name = callback_name.clone();
move |args| {
let callback: JsFunction = function_ref.get().unwrap();
let result = callback
let Ok(callback) = function_ref.get::<JsFunction>() else {
eprintln!(
"Node.js: cannot get reference of callback {} of global {} because it has the wrong type",
callback_name, global_name
);
return Value::Void;
};
let Ok(result) = callback
.call(
None,
args.iter()
.map(|v| super::value::to_js_unknown(&env, v).unwrap())
.collect::<Vec<JsUnknown>>()
.as_ref(),
)
.unwrap();
.as_ref()
) else {
eprintln!("Node.js: cannot call callback {} of global {}", callback_name, global_name);
return Value::Void;
};
if let Some(return_type) = &return_type {
super::to_value(&env, result, return_type).unwrap()
if let Ok(value) = super::to_value(&env, result, return_type) {
return value;
} else {
eprintln!(
"Node.js: cannot convert return type of callback {}",
callback_name
);
return slint_interpreter::default_value_for_type(return_type);
}
} else {
Value::Void
}

View file

@ -239,7 +239,14 @@ pub fn to_value(env: &Env, unknown: JsUnknown, typ: &Type) -> Result<Value> {
let mut vec = vec![];
for i in 0..array.len() {
vec.push(to_value(env, array.get(i)?.unwrap(), a)?);
vec.push(to_value(
env,
array.get(i)?.ok_or(napi::Error::from_reason(format!(
"Cannot access array element at index {}",
i
)))?,
a,
)?);
}
Ok(Value::Model(ModelRc::new(SharedVectorModel::from(SharedVector::from_slice(
&vec,

View file

@ -54,7 +54,10 @@ pub fn invoke_from_event_loop(env: Env, callback: JsFunction) -> napi::Result<na
let function_ref = send_wrapper::SendWrapper::new(function_ref);
i_slint_core::api::invoke_from_event_loop(move || {
let function_ref = function_ref.take();
let callback: JsFunction = function_ref.get().unwrap();
let Ok(callback) = function_ref.get::<JsFunction>() else {
eprintln!("Node.js: JavaScript invoke_from_event_loop throws an exception");
return;
};
callback.call_without_args(None).ok();
})
.map_err(|e| napi::Error::from_reason(e.to_string()))

View file

@ -90,7 +90,10 @@ impl Model for JsModel {
type Data = slint_interpreter::Value;
fn row_count(&self) -> usize {
let model: Object = self.js_impl.get().unwrap();
let Ok(model) = self.js_impl.get::<Object>() else {
eprintln!("Node.js: JavaScript Model<T>'s rowCount throws an exception");
return 0;
};
let Ok(row_count_property) = model.get::<&str, JsFunction>("rowCount") else {
eprintln!("Node.js: JavaScript Model<T> implementation is missing rowCount property");
@ -121,7 +124,11 @@ impl Model for JsModel {
}
fn row_data(&self, row: usize) -> Option<Self::Data> {
let model: Object = self.js_impl.get().unwrap();
let Ok(model) = self.js_impl.get::<Object>() else {
eprintln!("Node.js: JavaScript Model<T>'s rowData throws an exception");
return None;
};
let Ok(row_data_property) = model.get::<&str, JsFunction>("rowData") else {
eprintln!("Node.js: JavaScript Model<T> implementation is missing rowData property");
return None;
@ -152,7 +159,10 @@ impl Model for JsModel {
}
fn set_row_data(&self, row: usize, data: Self::Data) {
let model: Object = self.js_impl.get().unwrap();
let Ok(model) = self.js_impl.get::<Object>() else {
eprintln!("Node.js: JavaScript Model<T>'s setRowData throws an exception");
return;
};
let Ok(set_row_data_property) = model.get::<&str, JsFunction>("setRowData") else {
eprintln!("Node.js: JavaScript Model<T> implementation is missing setRowData property");