Skip to main content

stasis/infrastructure/persistence/
in_memory_agent_repository.rs

1use std::collections::HashMap;
2use std::sync::{Arc, RwLock};
3
4use async_trait::async_trait;
5
6use crate::domain::entities::agent::Agent;
7use crate::domain::errors::{Result, StasisError};
8use crate::ports::outbound::agent_repository::AgentRepository;
9
10#[derive(Clone, Default)]
11pub struct InMemoryAgentRepository {
12    agents: Arc<RwLock<HashMap<String, Agent>>>,
13}
14
15#[async_trait]
16impl AgentRepository for InMemoryAgentRepository {
17    async fn save(&self, agent: Agent) -> Result<()> {
18        let mut state = self
19            .agents
20            .write()
21            .map_err(|_| StasisError::PortFailure("repository lock poisoned".to_string()))?;
22
23        state.insert(agent.id.as_str().to_string(), agent);
24        Ok(())
25    }
26
27    async fn find_by_id(&self, id: &str) -> Result<Option<Agent>> {
28        let state = self
29            .agents
30            .read()
31            .map_err(|_| StasisError::PortFailure("repository lock poisoned".to_string()))?;
32
33        Ok(state.get(id).cloned())
34    }
35
36    async fn list(&self) -> Result<Vec<Agent>> {
37        let state = self
38            .agents
39            .read()
40            .map_err(|_| StasisError::PortFailure("repository lock poisoned".to_string()))?;
41
42        Ok(state.values().cloned().collect())
43    }
44}