use serde::{Deserialize, Serialize};
use crate::session::SessionId;
pub trait PersistenceModel {
type PState: Clone;
type Delta: Clone;
fn apply(state: &mut Self::PState, delta: &Self::Delta) -> Result<(), String>;
fn derive(before: &Self::PState, after: &Self::PState) -> Result<Self::Delta, String>;
#[must_use]
fn open_delta(session: SessionId) -> Self::Delta;
#[must_use]
fn close_delta(session: SessionId) -> Self::Delta;
#[must_use]
fn invoke_delta(_session: SessionId, _action: &str) -> Option<Self::Delta> {
None
}
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
pub struct NoopPersistence;
impl PersistenceModel for NoopPersistence {
type PState = ();
type Delta = ();
fn apply(_state: &mut Self::PState, _delta: &Self::Delta) -> Result<(), String> {
Ok(())
}
fn derive(_before: &Self::PState, _after: &Self::PState) -> Result<Self::Delta, String> {
Ok(())
}
fn open_delta(_session: SessionId) -> Self::Delta {}
fn close_delta(_session: SessionId) -> Self::Delta {}
}