oris_kernel/kernel/
reducer.rs1use serde::de::DeserializeOwned;
6
7use crate::kernel::event::{Event, SequencedEvent};
8use crate::kernel::state::KernelState;
9use crate::kernel::KernelError;
10
11pub trait Reducer<S: KernelState>: Send + Sync {
13 fn apply(&self, state: &mut S, event: &SequencedEvent) -> Result<(), KernelError>;
15}
16
17pub struct StateUpdatedOnlyReducer;
20
21impl<S> Reducer<S> for StateUpdatedOnlyReducer
22where
23 S: KernelState + DeserializeOwned,
24{
25 fn apply(&self, state: &mut S, event: &SequencedEvent) -> Result<(), KernelError> {
26 if let Event::StateUpdated { payload, .. } = &event.event {
27 let s: S = serde_json::from_value(payload.clone())
28 .map_err(|e| KernelError::EventStore(e.to_string()))?;
29 *state = s;
30 }
31 Ok(())
32 }
33}