weavatrix_memory/snapshot/
in_memory.rs1use 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}