grit_pattern_matcher/pattern/
equal.rs

1use super::{
2    functions::{Evaluator, FuncEvaluation},
3    patterns::{Pattern, PatternName},
4    variable::Variable,
5    State,
6};
7use crate::context::{ExecContext, QueryContext};
8use grit_util::{error::GritResult, AnalysisLogs};
9
10#[derive(Debug, Clone)]
11pub struct Equal<Q: QueryContext> {
12    pub var: Variable,
13    pub pattern: Pattern<Q>,
14}
15
16impl<Q: QueryContext> Equal<Q> {
17    pub fn new(var: Variable, pattern: Pattern<Q>) -> Self {
18        Self { var, pattern }
19    }
20}
21
22impl<Q: QueryContext> PatternName for Equal<Q> {
23    fn name(&self) -> &'static str {
24        "EQUAL"
25    }
26}
27
28impl<Q: QueryContext> Evaluator<Q> for Equal<Q> {
29    fn execute_func<'a>(
30        &'a self,
31        state: &mut State<'a, Q>,
32        context: &'a Q::ExecContext<'a>,
33        logs: &mut AnalysisLogs,
34    ) -> GritResult<FuncEvaluation<Q>> {
35        let lhs_text = self.var.text(state, context.language())?;
36        let rhs_text = self.pattern.text(state, context, logs)?;
37        Ok(FuncEvaluation {
38            predicator: lhs_text == rhs_text,
39            ret_val: None,
40        })
41    }
42}