mirror of
https://github.com/slint-ui/slint.git
synced 2025-08-04 18:58:36 +00:00
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:
parent
68a4e15cff
commit
4b880a7b49
5 changed files with 171 additions and 17 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()))
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue