use crate::error::Result;
use async_trait::async_trait;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
pub trait SummaryMemoryProvider: Send + Sync {
async fn update_summary(&self, session_id: &str, new_summary: &str) -> Result<()>;
async fn get_summary(&self, session_id: &str) -> Result<Option<String>>;
}
#[derive(Clone, Default)]
pub struct InMemorySummaryProvider {
store: Arc<RwLock<HashMap<String, String>>>,
}
impl InMemorySummaryProvider {
pub fn new() -> Self {
Self {
store: Arc::new(RwLock::new(HashMap::new())),
}
}
}
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
impl SummaryMemoryProvider for InMemorySummaryProvider {
async fn update_summary(&self, session_id: &str, new_summary: &str) -> Result<()> {
self.store
.write()
.await
.insert(session_id.to_string(), new_summary.to_string());
Ok(())
}
async fn get_summary(&self, session_id: &str) -> Result<Option<String>> {
Ok(self.store.read().await.get(session_id).cloned())
}
}