Skip to main content

synaptic_eval/
regex_match.rs

1use async_trait::async_trait;
2use regex::Regex;
3use synaptic_core::SynapticError;
4
5use crate::evaluator::{EvalResult, Evaluator};
6
7/// Evaluator that checks whether the prediction matches a regex pattern.
8pub struct RegexMatchEvaluator {
9    pattern: Regex,
10}
11
12impl RegexMatchEvaluator {
13    /// Create a new regex match evaluator with the given pattern.
14    ///
15    /// Returns an error if the pattern is not a valid regex.
16    pub fn new(pattern: &str) -> Result<Self, SynapticError> {
17        let pattern = Regex::new(pattern)
18            .map_err(|e| SynapticError::Validation(format!("Invalid regex pattern: {}", e)))?;
19        Ok(Self { pattern })
20    }
21}
22
23#[async_trait]
24impl Evaluator for RegexMatchEvaluator {
25    async fn evaluate(
26        &self,
27        prediction: &str,
28        _reference: &str,
29        _input: &str,
30    ) -> Result<EvalResult, SynapticError> {
31        if self.pattern.is_match(prediction) {
32            Ok(EvalResult::pass())
33        } else {
34            Ok(EvalResult::fail().with_reasoning(format!(
35                "Prediction {:?} does not match pattern {:?}",
36                prediction,
37                self.pattern.as_str()
38            )))
39        }
40    }
41}