mesozoa/src/policy.rs
2025-04-06 00:03:47 +02:00

41 lines
830 B
Rust

use regex::bytes::RegexSet;
#[derive(Clone, Copy, Debug)]
pub enum Action {
Allow,
Challenge,
Drop,
}
#[derive(Clone, Debug)]
pub struct Policy {
pub name: String,
pub first_line_regex: String,
pub action: Action,
}
pub struct CompiledPolicies {
pub first_line_regex_set: RegexSet,
pub policies: Vec<Policy>,
}
impl CompiledPolicies {
pub fn new(policies: Vec<Policy>) -> Self {
let mut first_line_regexes = Vec::new();
for policy in policies.iter() {
first_line_regexes.push(&policy.first_line_regex);
}
CompiledPolicies {
first_line_regex_set: RegexSet::new(&first_line_regexes).unwrap(),
policies,
}
}
pub fn evaluate(&self, first_line: &[u8]) -> Option<&Policy> {
let matches = self.first_line_regex_set.matches(first_line);
matches.into_iter().next().map(|i| &self.policies[i])
}
}