use crate::application::app;
use crate::result::Result;
use nw_sys::prelude::*;
use wasm_bindgen::prelude::*;
use workflow_wasm::prelude::*;
pub struct ShortcutInfo {
pub shortcut: nw_sys::Shortcut,
pub active_callback: Option<Callback<CallbackClosure<JsValue>>>,
pub failed_callback: Option<Callback<CallbackClosure<JsValue>>>,
}
pub struct ShortcutBuilder {
pub options: nw_sys::shortcut::Options,
pub active_callback: Option<Callback<CallbackClosure<JsValue>>>,
pub failed_callback: Option<Callback<CallbackClosure<JsValue>>>,
}
impl Default for ShortcutBuilder {
fn default() -> Self {
Self::new()
}
}
impl ShortcutBuilder {
pub fn new() -> Self {
Self {
options: nw_sys::shortcut::Options::new(),
active_callback: None,
failed_callback: None,
}
}
fn set(mut self, key: &str, value: JsValue) -> Self {
self.options = self.options.set(key, value);
self
}
pub fn key(self, key: &str) -> Self {
self.set("key", JsValue::from(key))
}
pub fn active<F>(mut self, callback: F) -> Self
where
F: FnMut(JsValue) -> std::result::Result<(), JsValue> + 'static,
{
let callback = Callback::new(callback);
self = self.set("active", callback.clone().into());
self.active_callback = Some(callback);
self
}
pub fn failed<F>(mut self, callback: F) -> Self
where
F: FnMut(JsValue) -> std::result::Result<(), JsValue> + 'static,
{
let callback = Callback::new(callback);
self = self.set("failed", callback.clone().into());
self.failed_callback = Some(callback);
self
}
pub fn build(self) -> Result<nw_sys::Shortcut> {
if let Some(callback) = self.active_callback {
let app = match app() {
Some(app) => app,
None => return Err("app is not initialized".to_string().into()),
};
app.callbacks.retain(callback)?;
}
if let Some(callback) = self.failed_callback {
let app = match app() {
Some(app) => app,
None => return Err("app is not initialized".to_string().into()),
};
app.callbacks.retain(callback)?;
}
let shortcut = nw_sys::Shortcut::new(&self.options);
Ok(shortcut)
}
pub fn finalize(self) -> Result<ShortcutInfo> {
let shortcut = nw_sys::Shortcut::new(&self.options);
Ok(ShortcutInfo {
shortcut,
active_callback: self.active_callback,
failed_callback: self.failed_callback,
})
}
}