use std::sync::Arc;
use async_trait::async_trait;
use chrono::Utc;
use crate::{MemoryService, SearchRequest};
pub struct MemoryServiceAdapter {
inner: Arc<dyn MemoryService>,
app_name: String,
user_id: String,
}
impl MemoryServiceAdapter {
pub fn new(
inner: Arc<dyn MemoryService>,
app_name: impl Into<String>,
user_id: impl Into<String>,
) -> Self {
Self { inner, app_name: app_name.into(), user_id: user_id.into() }
}
}
#[async_trait]
impl adk_core::Memory for MemoryServiceAdapter {
async fn search(&self, query: &str) -> adk_core::Result<Vec<adk_core::MemoryEntry>> {
let inner = self.inner.clone();
let resp = inner
.search(SearchRequest {
query: query.to_string(),
app_name: self.app_name.clone(),
user_id: self.user_id.clone(),
limit: None,
min_score: None,
})
.await?;
Ok(resp
.memories
.into_iter()
.map(|m| adk_core::MemoryEntry { content: m.content, author: m.author })
.collect())
}
async fn add(&self, entry: adk_core::MemoryEntry) -> adk_core::Result<()> {
let inner = self.inner.clone();
let mem_entry = crate::MemoryEntry {
content: entry.content,
author: entry.author,
timestamp: Utc::now(),
};
inner.add_entry(&self.app_name, &self.user_id, mem_entry).await
}
async fn delete(&self, query: &str) -> adk_core::Result<u64> {
let inner = self.inner.clone();
inner.delete_entries(&self.app_name, &self.user_id, query).await
}
async fn health_check(&self) -> adk_core::Result<()> {
let inner = self.inner.clone();
inner.health_check().await
}
}