grit_pattern_matcher/pattern/
function_definition.rs

1use super::{
2    functions::{Evaluator, FuncEvaluation},
3    patterns::Pattern,
4    predicates::Predicate,
5    state::State,
6    variable::Variable,
7};
8use crate::context::QueryContext;
9use grit_util::{error::GritResult, AnalysisLogs};
10
11pub trait FunctionDefinition<Q: QueryContext> {
12    fn call<'a>(
13        &'a self,
14        state: &mut State<'a, Q>,
15        context: &'a Q::ExecContext<'a>,
16        args: &'a [Option<Pattern<Q>>],
17        logs: &mut AnalysisLogs,
18    ) -> GritResult<FuncEvaluation<Q>>;
19}
20
21#[derive(Clone, Debug)]
22pub struct GritFunctionDefinition<Q: QueryContext> {
23    pub name: String,
24    pub scope: usize,
25    pub params: Vec<(String, Variable)>,
26    pub local_vars: Vec<usize>,
27    pub function: Predicate<Q>,
28}
29
30impl<Q: QueryContext> GritFunctionDefinition<Q> {
31    pub fn new(
32        name: String,
33        scope: usize,
34        params: Vec<(String, Variable)>,
35        local_vars: Vec<usize>,
36        function: Predicate<Q>,
37    ) -> Self {
38        Self {
39            name,
40            scope,
41            params,
42            local_vars,
43            function,
44        }
45    }
46}
47
48impl<Q: QueryContext> FunctionDefinition<Q> for GritFunctionDefinition<Q> {
49    fn call<'a>(
50        &'a self,
51        state: &mut State<'a, Q>,
52        context: &'a Q::ExecContext<'a>,
53        args: &'a [Option<Pattern<Q>>],
54        logs: &mut AnalysisLogs,
55    ) -> GritResult<FuncEvaluation<Q>> {
56        let tracker = state.enter_scope(self.scope, args);
57        let res = self.function.execute_func(state, context, logs);
58        state.exit_scope(tracker);
59        res
60    }
61}