use async_trait::async_trait;
use regex::Regex;
use synaptic_core::SynapticError;
use crate::evaluator::{EvalResult, Evaluator};
pub struct RegexMatchEvaluator {
pattern: Regex,
}
impl RegexMatchEvaluator {
pub fn new(pattern: &str) -> Result<Self, SynapticError> {
let pattern = Regex::new(pattern)
.map_err(|e| SynapticError::Validation(format!("Invalid regex pattern: {}", e)))?;
Ok(Self { pattern })
}
}
#[async_trait]
impl Evaluator for RegexMatchEvaluator {
async fn evaluate(
&self,
prediction: &str,
_reference: &str,
_input: &str,
) -> Result<EvalResult, SynapticError> {
if self.pattern.is_match(prediction) {
Ok(EvalResult::pass())
} else {
Ok(EvalResult::fail().with_reasoning(format!(
"Prediction {:?} does not match pattern {:?}",
prediction,
self.pattern.as_str()
)))
}
}
}