prikk_store/
memory_store.rs1use std::collections::BTreeMap;
4
5use prikk_error::{PrikkError, Result};
6use prikk_object::{ObjectEnvelope, ObjectId, ObjectType};
7
8use crate::object_store::{ObjectReader, ObjectWriter};
9
10#[derive(Debug, Default)]
12pub struct MemoryObjectStore {
13 objects: BTreeMap<ObjectId, ObjectEnvelope>,
14}
15
16impl MemoryObjectStore {
17 #[must_use]
19 pub fn new() -> Self {
20 Self::default()
21 }
22
23 #[must_use]
25 pub fn len(&self) -> usize {
26 self.objects.len()
27 }
28
29 #[must_use]
31 pub fn is_empty(&self) -> bool {
32 self.objects.is_empty()
33 }
34
35 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}