pub mod conversation;
pub mod folder;
use async_trait::async_trait;
use crate::memory::config::MemoryConfig;
use crate::memory::error::MemoryEngineResult;
use super::types::{MemorySourceEntry, SourceContent, SourceItem, SourceKind};
#[async_trait]
pub trait SourceReader: Send + Sync {
fn kind(&self) -> SourceKind;
async fn list_items(
&self,
source: &MemorySourceEntry,
config: &MemoryConfig,
) -> MemoryEngineResult<Vec<SourceItem>>;
async fn read_item(
&self,
source: &MemorySourceEntry,
item_id: &str,
config: &MemoryConfig,
) -> MemoryEngineResult<SourceContent>;
}
pub fn is_locally_readable(kind: &SourceKind) -> bool {
matches!(kind, SourceKind::Folder | SourceKind::Conversation)
}
pub fn reader_for(kind: &SourceKind) -> Option<Box<dyn SourceReader>> {
match kind {
SourceKind::Folder => Some(Box::new(folder::FolderReader)),
SourceKind::Conversation => Some(Box::new(conversation::ConversationReader)),
SourceKind::Composio
| SourceKind::GithubRepo
| SourceKind::TwitterQuery
| SourceKind::RssFeed
| SourceKind::WebPage => None,
}
}