langchain-rust 6.0.0

LangChain for Rust, the easiest way to write LLM-based programs in Rust
Documentation
use std::sync::Arc;

use async_trait::async_trait;
use tokio::sync::Mutex;

use crate::schemas::{
    memory::{BaseMemory, MemoryError},
    messages::Message,
};

pub struct DummyMemory {}

impl DummyMemory {
    pub fn new() -> Self {
        Self {}
    }
}

impl Default for DummyMemory {
    fn default() -> Self {
        Self::new()
    }
}

impl Into<Arc<dyn BaseMemory>> for DummyMemory {
    fn into(self) -> Arc<dyn BaseMemory> {
        Arc::new(self)
    }
}

impl Into<Arc<Mutex<dyn BaseMemory>>> for DummyMemory {
    fn into(self) -> Arc<Mutex<dyn BaseMemory>> {
        Arc::new(Mutex::new(self))
    }
}

#[async_trait]
impl BaseMemory for DummyMemory {
    async fn messages(&self) -> Result<Vec<Message>, MemoryError> {
        Ok(vec![])
    }

    async fn add_message(&mut self, _message: Message) -> Result<(), MemoryError> {
        Ok(())
    }

    async fn clear(&mut self) -> Result<(), MemoryError> {
        Ok(())
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[tokio::test]
    async fn never_stores_messages() {
        let mut memory = DummyMemory::new();
        memory.add_user_message(&"ignored").await.unwrap();
        memory.add_ai_message(&"ignored").await.unwrap();
        assert!(memory.messages().await.unwrap().is_empty());
        assert_eq!(memory.to_string().await.unwrap(), "");
    }
}