use async_trait::async_trait;
use parking_lot::Mutex;
use wabot_feature_chat_bot::{ChatItem, ChatMemory};
#[derive(Debug, Default)]
pub struct TestChatMemory {
items: Mutex<Vec<ChatItem>>,
}
impl TestChatMemory {
pub fn new() -> Self {
Self::default()
}
pub fn all(&self) -> Vec<ChatItem> {
self.items.lock().clone()
}
pub fn items_from(&self, index: usize) -> Vec<ChatItem> {
let items = self.items.lock();
items
.get(index..)
.map(<[ChatItem]>::to_vec)
.unwrap_or_default()
}
pub fn len(&self) -> usize {
self.items.lock().len()
}
pub fn is_empty(&self) -> bool {
self.items.lock().is_empty()
}
pub fn clear(&self) {
self.items.lock().clear();
}
}
#[async_trait]
impl ChatMemory for TestChatMemory {
async fn find_last_items(&self, n: usize) -> Vec<ChatItem> {
let items = self.items.lock();
let start = items.len().saturating_sub(n);
items[start..].to_vec()
}
async fn create(&self, item: ChatItem) {
self.items.lock().push(item);
}
}