Skip to main content

prikk_store/
memory_store.rs

1//! In-memory object store for tests and early callers.
2
3use std::collections::BTreeMap;
4
5use prikk_error::{PrikkError, Result};
6use prikk_object::{ObjectEnvelope, ObjectId, ObjectType};
7
8use crate::object_store::{ObjectReader, ObjectWriter};
9
10/// In-memory test object store for fixtures and early callers.
11#[derive(Debug, Default)]
12pub struct MemoryObjectStore {
13    objects: BTreeMap<ObjectId, ObjectEnvelope>,
14}
15
16impl MemoryObjectStore {
17    /// Create an empty memory store.
18    #[must_use]
19    pub fn new() -> Self {
20        Self::default()
21    }
22
23    /// Return number of stored objects.
24    #[must_use]
25    pub fn len(&self) -> usize {
26        self.objects.len()
27    }
28
29    /// Return true when no objects are stored.
30    #[must_use]
31    pub fn is_empty(&self) -> bool {
32        self.objects.is_empty()
33    }
34
35    /// Read and require a specific object type.
36    pub fn read_typed(
37        &self,
38        id: ObjectId,
39        object_type: ObjectType,
40    ) -> Result<Option<ObjectEnvelope>> {
41        if let Some(object) = self.objects.get(&id) {
42            if object.object_type != object_type {
43                return Err(PrikkError::ObjectTypeMismatch {
44                    expected: object_type.to_string(),
45                    actual: object.object_type.to_string(),
46                });
47            }
48            return Ok(Some(object.clone()));
49        }
50        Ok(None)
51    }
52}
53
54impl ObjectReader for MemoryObjectStore {
55    fn read_object(&self, id: ObjectId) -> Result<Option<ObjectEnvelope>> {
56        Ok(self.objects.get(&id).cloned())
57    }
58}
59
60impl ObjectWriter for MemoryObjectStore {
61    fn write_object(&mut self, envelope: &ObjectEnvelope) -> Result<ObjectId> {
62        envelope.validate_strict()?;
63        let id = envelope.object_id();
64        self.objects.insert(id, envelope.clone());
65        Ok(id)
66    }
67}