daa_rules/
storage.rs

1//! Storage interface for rules
2
3use std::collections::HashMap;
4use crate::{Rule, Result, RulesError};
5
6/// Storage interface for rules
7#[async_trait::async_trait]
8pub trait RuleStorage: Send + Sync {
9    /// Store a rule
10    async fn store_rule(&mut self, rule: Rule) -> Result<()>;
11    
12    /// Retrieve a rule by ID
13    async fn get_rule(&self, rule_id: &str) -> Result<Option<Rule>>;
14    
15    /// Get all rules
16    async fn get_all_rules(&self) -> Result<Vec<Rule>>;
17    
18    /// Delete a rule
19    async fn delete_rule(&mut self, rule_id: &str) -> Result<()>;
20    
21    /// Update a rule
22    async fn update_rule(&mut self, rule: Rule) -> Result<()>;
23}
24
25/// In-memory storage implementation
26pub struct InMemoryStorage {
27    rules: HashMap<String, Rule>,
28}
29
30impl InMemoryStorage {
31    /// Create a new in-memory storage
32    pub fn new() -> Self {
33        Self {
34            rules: HashMap::new(),
35        }
36    }
37}
38
39impl Default for InMemoryStorage {
40    fn default() -> Self {
41        Self::new()
42    }
43}
44
45#[async_trait::async_trait]
46impl RuleStorage for InMemoryStorage {
47    async fn store_rule(&mut self, rule: Rule) -> Result<()> {
48        self.rules.insert(rule.id.clone(), rule);
49        Ok(())
50    }
51    
52    async fn get_rule(&self, rule_id: &str) -> Result<Option<Rule>> {
53        Ok(self.rules.get(rule_id).cloned())
54    }
55    
56    async fn get_all_rules(&self) -> Result<Vec<Rule>> {
57        Ok(self.rules.values().cloned().collect())
58    }
59    
60    async fn delete_rule(&mut self, rule_id: &str) -> Result<()> {
61        self.rules.remove(rule_id);
62        Ok(())
63    }
64    
65    async fn update_rule(&mut self, rule: Rule) -> Result<()> {
66        self.rules.insert(rule.id.clone(), rule);
67        Ok(())
68    }
69}