use crate::{
error::Error,
event_message::SignedEventMessage,
state::{EventSemantics, IdentifierState, Verifiable},
};
pub struct EventLog(Vec<SignedEventMessage>);
impl EventLog {
pub fn new() -> Self {
EventLog(Vec::<SignedEventMessage>::new())
}
pub fn replay(&self) -> Result<IdentifierState, Error> {
replay(&self.0)
}
pub fn apply(&self, event: &SignedEventMessage) -> Result<IdentifierState, Error> {
event.apply_to(self.replay()?)
}
pub fn commit(&mut self, event: SignedEventMessage) -> Result<IdentifierState, Error> {
let result = self.apply(&event)?;
self.0.push(event);
Ok(result)
}
}
pub fn replay<T: EventSemantics + Verifiable>(kel: &[T]) -> Result<IdentifierState, Error> {
kel.iter()
.fold(Ok(IdentifierState::default()), |state, event| {
state?.verify_and_apply(event)
})
}