use std::collections::BTreeMap;
use super::EventBody;
use crate::event::Event;
use crate::projection::Projection;
#[derive(Debug, Default)]
pub struct KvProjection {
state: BTreeMap<String, Vec<u8>>,
cursor: u64,
}
impl Projection for KvProjection {
type Body = EventBody;
type State = BTreeMap<String, Vec<u8>>;
fn apply(&mut self, event: &Event<EventBody>) {
match &event.body {
EventBody::Put { key, value } => {
self.state.insert(key.clone(), value.clone());
}
EventBody::Delete { key } => {
self.state.remove(key);
}
_ => {}
}
self.cursor = event.offset + 1;
}
fn cursor(&self) -> u64 {
self.cursor
}
fn state(&self) -> &Self::State {
&self.state
}
}