tauri-plugin-sync-state 0.1.0

Bidirectional, type-keyed state sync between a Tauri backend and a JS/React frontend.
Documentation
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(&registry)?;
                }
                app.manage(registry);
                Ok(())
            })
            .build()
    }
}