use regex::Regex;
use crate::classify::errors::Result;
use crate::classify::rules::Rule;
pub struct RegexMatcher {
compiled: Vec<(Regex, Rule)>,
}
impl RegexMatcher {
pub fn new(rules: &[Rule]) -> Result<Self> {
let mut compiled: Vec<(Regex, Rule)> = Vec::new();
for rule in rules {
for pat in &rule.patterns {
let re = Regex::new(pat)?;
compiled.push((re, rule.clone()));
}
}
compiled.sort_by_key(|c| std::cmp::Reverse(c.1.priority));
Ok(Self { compiled })
}
pub fn classify(&self, message: &str) -> Option<&Rule> {
for (re, rule) in &self.compiled {
if re.is_match(message) {
return Some(rule);
}
}
None
}
pub fn extract_ticket_id(message: &str) -> Option<String> {
let re = Regex::new(r"\b[A-Z][A-Z0-9]+-\d+\b").ok()?;
re.find(message).map(|m| m.as_str().to_string())
}
}