1use crate::message::Message;
2use crate::error::Result;
3use async_trait::async_trait;
4use std::sync::Arc;
5use tokio::sync::RwLock;
6
7#[async_trait]
8pub trait Memory: Send + Sync {
9 async fn add(&mut self, message: Message) -> Result<()>;
10 async fn get_all(&self) -> Result<Vec<Message>>;
11 async fn get_recent(&self, count: usize) -> Result<Vec<Message>>;
12 async fn clear(&mut self) -> Result<()>;
13}
14
15#[derive(Debug, Clone)]
16pub struct MemoryStore {
17 messages: Arc<RwLock<Vec<Message>>>,
18 max_size: Option<usize>,
19}
20
21impl MemoryStore {
22 pub fn new() -> Self {
23 Self {
24 messages: Arc::new(RwLock::new(Vec::new())),
25 max_size: None,
26 }
27 }
28
29 pub fn with_max_size(max_size: usize) -> Self {
30 Self {
31 messages: Arc::new(RwLock::new(Vec::new())),
32 max_size: Some(max_size),
33 }
34 }
35}
36
37impl Default for MemoryStore {
38 fn default() -> Self {
39 Self::new()
40 }
41}
42
43#[async_trait]
44impl Memory for MemoryStore {
45 async fn add(&mut self, message: Message) -> Result<()> {
46 let mut messages = self.messages.write().await;
47 messages.push(message);
48
49 if let Some(max_size) = self.max_size {
50 if messages.len() > max_size {
51 let excess = messages.len() - max_size;
52 messages.drain(0..excess);
53 }
54 }
55
56 Ok(())
57 }
58
59 async fn get_all(&self) -> Result<Vec<Message>> {
60 let messages = self.messages.read().await;
61 Ok(messages.clone())
62 }
63
64 async fn get_recent(&self, count: usize) -> Result<Vec<Message>> {
65 let messages = self.messages.read().await;
66 let start = messages.len().saturating_sub(count);
67 Ok(messages[start..].to_vec())
68 }
69
70 async fn clear(&mut self) -> Result<()> {
71 let mut messages = self.messages.write().await;
72 messages.clear();
73 Ok(())
74 }
75}