stasis/infrastructure/persistence/
in_memory_agent_repository.rs1use 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}