use crate::{
commands,
error::Result,
slice::{StateRegistry, SyncState},
};
use tauri::{plugin::TauriPlugin, Manager, Runtime};
type Init = Box<dyn FnOnce(&StateRegistry) -> Result<()> + Send + 'static>;
#[derive(Default)]
pub struct Builder {
inits: Vec<Init>,
}
impl Builder {
pub fn new() -> Self {
Self::default()
}
pub fn register<S: SyncState>(mut self, initial: S) -> Self {
self.inits.push(Box::new(move |reg| reg.insert(initial)));
self
}
pub fn build<R: Runtime>(self) -> TauriPlugin<R> {
tauri::plugin::Builder::new("sync-state")
.invoke_handler(tauri::generate_handler![
commands::get_state,
commands::set_state
])
.setup(move |app, _api| {
let registry = StateRegistry::new();
for init in self.inits {
init(®istry)?;
}
app.manage(registry);
Ok(())
})
.build()
}
}