edgechain_memory/
session.rs1use std::collections::HashMap;
2use std::sync::RwLock;
3use async_trait::async_trait;
4use chrono::Utc;
5use crate::{
6 error::MemoryError,
7 store::{MemoryEntry, MemoryStore},
8};
9
10pub struct SessionMemory {
13 store: RwLock<HashMap<String, MemoryEntry>>,
14}
15
16impl SessionMemory {
17 pub fn new() -> Self {
18 Self {
19 store: RwLock::new(HashMap::new()),
20 }
21 }
22
23 pub fn clear(&self) {
24 self.store.write().unwrap().clear();
25 }
26
27 pub fn len(&self) -> usize {
28 self.store.read().unwrap().len()
29 }
30
31 pub fn is_empty(&self) -> bool {
32 self.len() == 0
33 }
34}
35
36impl Default for SessionMemory {
37 fn default() -> Self {
38 Self::new()
39 }
40}
41
42#[async_trait]
43impl MemoryStore for SessionMemory {
44 async fn set(&self, key: &str, value: serde_json::Value) -> Result<(), MemoryError> {
45 let mut store = self.store.write().unwrap();
46 let entry = store.entry(key.to_string()).or_insert_with(|| MemoryEntry::new(key, value.clone()));
47 entry.value = value;
48 entry.updated_at = Utc::now();
49 Ok(())
50 }
51
52 async fn get(&self, key: &str) -> Result<Option<MemoryEntry>, MemoryError> {
53 Ok(self.store.read().unwrap().get(key).cloned())
54 }
55
56 async fn delete(&self, key: &str) -> Result<(), MemoryError> {
57 self.store.write().unwrap().remove(key);
58 Ok(())
59 }
60
61 async fn list_keys(&self, prefix: Option<&str>) -> Result<Vec<String>, MemoryError> {
62 let store = self.store.read().unwrap();
63 let keys = store
64 .keys()
65 .filter(|k| prefix.is_none_or(|p| k.starts_with(p)))
66 .cloned()
67 .collect();
68 Ok(keys)
69 }
70
71 async fn search_by_tag(&self, tag: &str) -> Result<Vec<MemoryEntry>, MemoryError> {
72 let store = self.store.read().unwrap();
73 let results = store
74 .values()
75 .filter(|e| e.tags.iter().any(|t| t == tag))
76 .cloned()
77 .collect();
78 Ok(results)
79 }
80
81 async fn set_tagged(
82 &self,
83 key: &str,
84 value: serde_json::Value,
85 tags: Vec<String>,
86 ) -> Result<(), MemoryError> {
87 let mut store = self.store.write().unwrap();
88 let entry = store.entry(key.to_string()).or_insert_with(|| MemoryEntry::new(key, value.clone()));
89 entry.value = value;
90 entry.tags = tags;
91 entry.updated_at = Utc::now();
92 Ok(())
93 }
94}