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()))
}
}