use crate::features::ChartFeatures;
use crate::rules::claim::Claim;
use thiserror::Error;
pub trait RuleEvaluator {
fn evaluate(&self, features: &ChartFeatures) -> Result<Vec<Claim>, RuleEvaluationError>;
}
#[derive(Default)]
pub struct RuleEngine {
evaluators: Vec<Box<dyn RuleEvaluator>>,
}
impl RuleEngine {
pub const fn new() -> Self {
Self {
evaluators: Vec::new(),
}
}
pub fn with_evaluator(mut self, evaluator: impl RuleEvaluator + 'static) -> Self {
self.evaluators.push(Box::new(evaluator));
self
}
}
impl RuleEvaluator for RuleEngine {
fn evaluate(&self, features: &ChartFeatures) -> Result<Vec<Claim>, RuleEvaluationError> {
let mut claims = Vec::new();
for evaluator in &self.evaluators {
claims.extend(evaluator.evaluate(features)?);
}
Ok(claims)
}
}
#[derive(Debug, Error, Eq, PartialEq)]
pub enum RuleEvaluationError {
#[error("rule evaluation is not implemented")]
NotImplemented,
}