use serde::de::DeserializeOwned;
use crate::kernel::event::{Event, SequencedEvent};
use crate::kernel::state::KernelState;
use crate::kernel::KernelError;
pub trait Reducer<S: KernelState>: Send + Sync {
fn apply(&self, state: &mut S, event: &SequencedEvent) -> Result<(), KernelError>;
}
pub struct StateUpdatedOnlyReducer;
impl<S> Reducer<S> for StateUpdatedOnlyReducer
where
S: KernelState + DeserializeOwned,
{
fn apply(&self, state: &mut S, event: &SequencedEvent) -> Result<(), KernelError> {
if let Event::StateUpdated { payload, .. } = &event.event {
let s: S = serde_json::from_value(payload.clone())
.map_err(|e| KernelError::EventStore(e.to_string()))?;
*state = s;
}
Ok(())
}
}