refactor rules so no more cartesian product

This commit is contained in:
kevin zhao
2025-11-10 15:20:50 -08:00
parent eea9bff1fb
commit 7e79c4dc5b
6 changed files with 198 additions and 77 deletions

View File

@@ -1,11 +1,12 @@
use crate::decision::Decision;
use crate::rule::Rule;
use multimap::MultiMap;
use serde::Deserialize;
use serde::Serialize;
#[derive(Clone, Debug)]
pub struct Policy {
rules: Vec<Rule>,
rules_by_program: MultiMap<String, Rule>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
@@ -15,18 +16,22 @@ pub struct Evaluation {
}
impl Policy {
pub fn new(rules: Vec<Rule>) -> Self {
Self { rules }
pub fn new(rules_by_program: MultiMap<String, Rule>) -> Self {
Self { rules_by_program }
}
pub fn rules(&self) -> &[Rule] {
&self.rules
pub fn rules(&self) -> &MultiMap<String, Rule> {
&self.rules_by_program
}
pub fn evaluate(&self, cmd: &[String]) -> Option<Evaluation> {
let first = cmd.first()?;
let Some(rules) = self.rules_by_program.get_vec(first) else {
return None;
};
let mut matched_rules: Vec<crate::rule::RuleMatch> = Vec::new();
let mut best_decision: Option<Decision> = None;
for rule in &self.rules {
for rule in rules {
if let Some(matched) = rule.matches(cmd) {
let decision = match best_decision {
None => matched.decision,