1use std::collections::HashMap;
4use crate::{Rule, Result, RulesError};
5
6#[async_trait::async_trait]
8pub trait RuleStorage: Send + Sync {
9 async fn store_rule(&mut self, rule: Rule) -> Result<()>;
11
12 async fn get_rule(&self, rule_id: &str) -> Result<Option<Rule>>;
14
15 async fn get_all_rules(&self) -> Result<Vec<Rule>>;
17
18 async fn delete_rule(&mut self, rule_id: &str) -> Result<()>;
20
21 async fn update_rule(&mut self, rule: Rule) -> Result<()>;
23}
24
25pub struct InMemoryStorage {
27 rules: HashMap<String, Rule>,
28}
29
30impl InMemoryStorage {
31 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}