Skip to main content

macp_storage/storage/
memory.rs

1use crate::log_store::LogEntry;
2use macp_core::session::Session;
3use std::io;
4
5use super::StorageBackend;
6
7pub struct MemoryBackend;
8
9#[async_trait::async_trait]
10impl StorageBackend for MemoryBackend {
11    async fn save_session(&self, _session: &Session) -> io::Result<()> {
12        Ok(())
13    }
14
15    async fn load_session(&self, _session_id: &str) -> io::Result<Option<Session>> {
16        Ok(None)
17    }
18
19    async fn load_all_sessions(&self) -> io::Result<Vec<Session>> {
20        Ok(vec![])
21    }
22
23    async fn delete_session(&self, _session_id: &str) -> io::Result<()> {
24        Ok(())
25    }
26
27    async fn list_session_ids(&self) -> io::Result<Vec<String>> {
28        Ok(vec![])
29    }
30
31    async fn append_log_entry(&self, _session_id: &str, _entry: &LogEntry) -> io::Result<()> {
32        Ok(())
33    }
34
35    async fn load_log(&self, _session_id: &str) -> io::Result<Vec<LogEntry>> {
36        Ok(vec![])
37    }
38
39    async fn create_session_storage(&self, _session_id: &str) -> io::Result<()> {
40        Ok(())
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47
48    fn sample_session() -> Session {
49        use macp_core::session::SessionState;
50        use std::collections::HashSet;
51
52        Session {
53            session_id: "s1".into(),
54            state: SessionState::Open,
55            ttl_expiry: 61_000,
56            ttl_ms: 60_000,
57            started_at_unix_ms: 1_000,
58            resolution: None,
59            mode: "macp.mode.decision.v1".into(),
60            mode_state: vec![],
61            participants: vec!["alice".into()],
62            seen_message_ids: HashSet::new(),
63            intent: "".into(),
64            mode_version: "1.0.0".into(),
65            configuration_version: "cfg-1".into(),
66            policy_version: "pol-1".into(),
67            context_id: String::new(),
68            extensions: std::collections::HashMap::new(),
69            roots: vec![],
70            initiator_sender: "alice".into(),
71            participant_message_counts: std::collections::HashMap::new(),
72            participant_last_seen: std::collections::HashMap::new(),
73            policy_definition: None,
74            suspended_at_ms: None,
75            accumulated_suspended_ms: 0,
76        }
77    }
78
79    #[tokio::test]
80    async fn memory_backend_is_noop() {
81        let backend = MemoryBackend;
82        backend.create_session_storage("s1").await.unwrap();
83        backend.save_session(&sample_session()).await.unwrap();
84        assert!(backend.load_session("s1").await.unwrap().is_none());
85        assert!(backend.load_all_sessions().await.unwrap().is_empty());
86        assert!(backend.list_session_ids().await.unwrap().is_empty());
87        backend.delete_session("s1").await.unwrap();
88    }
89}