dhttp_access/expr/
rule.rs1use crate::expr::{
2 eval::{BooleanOperator, EvalRuleError, Evaluable},
3 exprs::Exprs,
4};
5
6pub struct Rule<'e, Expr, Action> {
7 exprs: &'e Exprs<BooleanOperator, Expr>,
8 action: Action,
9}
10
11impl<'e, Expr, Action> Rule<'e, Expr, Action> {
12 pub fn new(exprs: &'e Exprs<BooleanOperator, Expr>, action: Action) -> Self {
13 Self { exprs, action }
14 }
15}
16
17impl<State, Expr, E, Action> Evaluable<State> for Rule<'_, Expr, Action>
18where
19 State: ?Sized,
20 Expr: Evaluable<State, Value = Result<bool, E>>,
21 E: EvalRuleError<Action> + Clone,
22 Action: Clone,
23{
24 type Value = Option<Action>;
25
26 fn eval(&self, state: &State) -> Self::Value {
27 match self.exprs.try_eval(state) {
28 Ok(Ok(matched)) => matched.then_some(self.action.clone()),
29 Ok(Err(eval_error)) => eval_error.fallback(self.action.clone()),
30 Err(_invalid_polish) => None,
31 }
32 }
33}