Skip to main content

weavatrix_memory/snapshot/
in_memory.rs

1use 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}