Skip to main content

weavatrix_memory/snapshot/
in_memory.rs

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