weavatrix_memory/snapshot/
in_memory.rs1use super::SnapshotStore;
2use crate::{
3 error::{MemoryError, Result},
4 projection::ProjectionSnapshot,
5};
6use std::collections::BTreeMap;
7
8#[derive(Debug, Clone, Default)]
9pub struct InMemorySnapshotStore<P> {
10 snapshots: BTreeMap<u64, ProjectionSnapshot<P>>,
11}
12
13impl<P> SnapshotStore<P> for InMemorySnapshotStore<P>
14where
15 P: Clone + PartialEq,
16{
17 fn save(&mut self, snapshot: &ProjectionSnapshot<P>) -> Result<()> {
18 let position = snapshot
19 .cursor
20 .global_position
21 .ok_or(MemoryError::InvalidValue {
22 field: "snapshot.cursor",
23 reason: "cannot persist an empty replay cursor",
24 })?;
25 if let Some(existing) = self.snapshots.get(&position) {
26 if existing == snapshot {
27 return Ok(());
28 }
29 return Err(MemoryError::InvalidValue {
30 field: "snapshot",
31 reason: "different snapshot already exists at this position",
32 });
33 }
34 self.snapshots.insert(position, snapshot.clone());
35 Ok(())
36 }
37
38 fn load_latest(&self) -> Result<Option<ProjectionSnapshot<P>>> {
39 Ok(self
40 .snapshots
41 .last_key_value()
42 .map(|(_, snapshot)| snapshot.clone()))
43 }
44}