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::event_name,
    error::{Error, Result},
    slice::{StateRegistry, SyncState},
};
use tauri::{Emitter, Manager, Runtime};

pub trait SyncStateExt<R: Runtime> {
    fn sync_read<S: SyncState>(&self) -> Result<S>;
    fn sync_mutate<S: SyncState>(&self, f: impl FnOnce(&mut S)) -> Result<()>;
}

impl<R: Runtime, T: Manager<R> + Emitter<R>> SyncStateExt<R> for T {
    fn sync_read<S: SyncState>(&self) -> Result<S> {
        self.state::<StateRegistry>().read::<S>()
    }
    fn sync_mutate<S: SyncState>(&self, f: impl FnOnce(&mut S)) -> Result<()> {
        let next = self.state::<StateRegistry>().mutate::<S>(f)?;
        self.emit(&event_name(S::NAME), next)
            .map_err(|e| Error::Emit(e.to_string()))
    }
}