1use std::sync::Arc;
20
21use async_trait::async_trait;
22use chrono::Utc;
23
24use crate::{MemoryService, SearchRequest};
25
26pub struct MemoryServiceAdapter {
31 inner: Arc<dyn MemoryService>,
32 app_name: String,
33 user_id: String,
34}
35
36impl MemoryServiceAdapter {
37 pub fn new(
39 inner: Arc<dyn MemoryService>,
40 app_name: impl Into<String>,
41 user_id: impl Into<String>,
42 ) -> Self {
43 Self { inner, app_name: app_name.into(), user_id: user_id.into() }
44 }
45}
46
47#[async_trait]
48impl adk_core::Memory for MemoryServiceAdapter {
49 async fn search(&self, query: &str) -> adk_core::Result<Vec<adk_core::MemoryEntry>> {
50 let inner = self.inner.clone();
51 let resp = inner
52 .search(SearchRequest {
53 query: query.to_string(),
54 app_name: self.app_name.clone(),
55 user_id: self.user_id.clone(),
56 limit: None,
57 min_score: None,
58 })
59 .await?;
60
61 Ok(resp
62 .memories
63 .into_iter()
64 .map(|m| adk_core::MemoryEntry { content: m.content, author: m.author })
65 .collect())
66 }
67
68 async fn add(&self, entry: adk_core::MemoryEntry) -> adk_core::Result<()> {
69 let inner = self.inner.clone();
70 let mem_entry = crate::MemoryEntry {
71 content: entry.content,
72 author: entry.author,
73 timestamp: Utc::now(),
74 };
75 inner.add_entry(&self.app_name, &self.user_id, mem_entry).await
76 }
77
78 async fn delete(&self, query: &str) -> adk_core::Result<u64> {
79 let inner = self.inner.clone();
80 inner.delete_entries(&self.app_name, &self.user_id, query).await
81 }
82
83 async fn health_check(&self) -> adk_core::Result<()> {
84 let inner = self.inner.clone();
85 inner.health_check().await
86 }
87}