grit_pattern_matcher/pattern/
function_definition.rs1use 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}