1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use std::borrow::Borrow;
use std::collections::HashMap;
use crate::error::RuleError;
use crate::rule::Rule;
pub struct RuleEngine {
pub knowledge: HashMap<String, String>,
pub rules: Vec<Rule>
}
impl RuleEngine {
pub fn new(knowledge: HashMap<String, String>, rules: Vec<Rule>) -> RuleEngine {
RuleEngine {
knowledge,
rules
}
}
pub fn run(&mut self) -> Result<bool, RuleError> {
self.rules.sort_by(|a, b| b.priority.cmp(&a.priority));
for rule in &self.rules {
return match rule.borrow().evaluate(&mut self.knowledge) {
Ok(_) => rule.borrow().execute(&mut self.knowledge),
Err(msg) => Err(msg)
};
}
Ok(true)
}
}