use js_sys::{JsString, RegExp};
use serde::de::DeserializeOwned;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(catch, js_namespace = ["window", "__TAURI__", "core"])]
pub async fn invoke(cmd: &str, args: JsValue) -> Result<JsValue, JsValue>;
#[cfg(feature = "event")]
#[doc(cfg(feature = "event"))]
#[allow(unused_doc_comments)]
#[wasm_bindgen(catch, js_namespace = ["window", "__TAURI__", "event"])]
pub async fn listen(
event: &str,
closure: &Closure<dyn Fn(JsValue)>,
) -> Result<JsValue, JsValue>;
}
enum InvokeResult {
Ok(JsValue),
Err(JsValue),
NotRegistered,
}
async fn wrapped_invoke(command: &str, args: JsValue) -> InvokeResult {
match invoke(command, args).await {
Ok(value) => InvokeResult::Ok(value),
Err(value) => {
if let Some(string) = value.dyn_ref::<JsString>() {
let regex = RegExp::new("command (\\w+) not found", "g");
if string.match_(®ex).is_some() {
log::error!("Error: {string}");
return InvokeResult::NotRegistered;
}
}
InvokeResult::Err(value)
}
}
}
pub fn fire_and_forget_invoke(command: &'static str, args: JsValue) {
wasm_bindgen_futures::spawn_local(wait_invoke(command, args))
}
pub async fn wait_invoke(command: &'static str, args: JsValue) {
wrapped_invoke(command, args).await;
}
pub async fn return_invoke<T>(command: &str, args: JsValue) -> T
where
T: Default + DeserializeOwned,
{
match wrapped_invoke(command, args).await {
InvokeResult::Ok(value) => serde_wasm_bindgen::from_value(value).unwrap_or_else(|why| {
log::error!("Conversion failed: {why}");
Default::default()
}),
_ => Default::default(),
}
}
pub async fn catch_invoke<T, E>(command: &str, args: JsValue) -> Result<T, E>
where
T: Default + DeserializeOwned,
E: DeserializeOwned,
{
match wrapped_invoke(command, args).await {
InvokeResult::Ok(value) => {
Ok(serde_wasm_bindgen::from_value(value).unwrap_or_else(|why| {
log::error!("Conversion failed: {why}");
Default::default()
}))
}
InvokeResult::Err(value) => Err(serde_wasm_bindgen::from_value(value).unwrap()),
InvokeResult::NotRegistered => Ok(Default::default()),
}
}