use std::collections::HashMap;
use crate::{Rule, Result, RulesError};
#[async_trait::async_trait]
pub trait RuleStorage: Send + Sync {
async fn store_rule(&mut self, rule: Rule) -> Result<()>;
async fn get_rule(&self, rule_id: &str) -> Result<Option<Rule>>;
async fn get_all_rules(&self) -> Result<Vec<Rule>>;
async fn delete_rule(&mut self, rule_id: &str) -> Result<()>;
async fn update_rule(&mut self, rule: Rule) -> Result<()>;
}
pub struct InMemoryStorage {
rules: HashMap<String, Rule>,
}
impl InMemoryStorage {
pub fn new() -> Self {
Self {
rules: HashMap::new(),
}
}
}
impl Default for InMemoryStorage {
fn default() -> Self {
Self::new()
}
}
#[async_trait::async_trait]
impl RuleStorage for InMemoryStorage {
async fn store_rule(&mut self, rule: Rule) -> Result<()> {
self.rules.insert(rule.id.clone(), rule);
Ok(())
}
async fn get_rule(&self, rule_id: &str) -> Result<Option<Rule>> {
Ok(self.rules.get(rule_id).cloned())
}
async fn get_all_rules(&self) -> Result<Vec<Rule>> {
Ok(self.rules.values().cloned().collect())
}
async fn delete_rule(&mut self, rule_id: &str) -> Result<()> {
self.rules.remove(rule_id);
Ok(())
}
async fn update_rule(&mut self, rule: Rule) -> Result<()> {
self.rules.insert(rule.id.clone(), rule);
Ok(())
}
}