dsntk_feel/
function.rs

1//! `FEEL` or `DMN` function body definition.
2
3use crate::values::Value;
4use crate::{Evaluator, FeelScope};
5use std::fmt;
6use std::fmt::Debug;
7use std::sync::Arc;
8
9/// Type alias of the closure that evaluates FEEL or DMN function body into [Value].
10pub type FunctionBodyEvaluator = Arc<Evaluator>;
11
12/// Function body may be defined multiple ways using FEEL or DMN.
13/// This enum is the representation of all of these cases.
14#[derive(Clone)]
15pub enum FunctionBody {
16  /// Function body created from boxed conditional (`if`) expression defined in DMN model.
17  Conditional(FunctionBodyEvaluator),
18  /// Function body created from context defined in DMN model.
19  Context(FunctionBodyEvaluator),
20  /// Function body created from decision service defined in DMN model.
21  DecisionService(FunctionBodyEvaluator),
22  /// Function body created from decision table defined in DMN model.
23  DecisionTable(FunctionBodyEvaluator),
24  /// Function body created from boxed `every` expression defined in DMN model.
25  Every(FunctionBodyEvaluator),
26  /// Function body created from externally defined function in Java or PMML.
27  External(FunctionBodyEvaluator),
28  /// Function body created from boxed `filter` expression defined in DMN model.
29  Filter(FunctionBodyEvaluator),
30  /// Function body created from boxed `for` loop defined in DMN model.
31  For(FunctionBodyEvaluator),
32  /// Function body created from function definition defined in DMN model.
33  FunctionDefinition(FunctionBodyEvaluator),
34  /// Function body created from invocation defined in DMN model.
35  Invocation(FunctionBodyEvaluator),
36  /// Function body created from list defined in DMN model.
37  List(FunctionBodyEvaluator),
38  /// Function body created from `FEEL` textual expression defined in DMN model.
39  LiteralExpression(FunctionBodyEvaluator),
40  /// Function body created from relation defined in DMN model.
41  Relation(FunctionBodyEvaluator),
42  /// Function body created from boxed `some` expression defined in DMN model.
43  Some(FunctionBodyEvaluator),
44}
45
46impl FunctionBody {
47  /// Evaluates function body, takes a [FeelScope] as input and returns evaluated [Value].
48  pub fn evaluate(&self, scope: &FeelScope) -> Value {
49    match self {
50      FunctionBody::Conditional(evaluator) => evaluator(scope),
51      FunctionBody::Context(evaluator) => evaluator(scope),
52      FunctionBody::DecisionService(evaluator) => evaluator(scope),
53      FunctionBody::DecisionTable(evaluator) => evaluator(scope),
54      FunctionBody::Every(evaluator) => evaluator(scope),
55      FunctionBody::External(evaluator) => evaluator(scope),
56      FunctionBody::Filter(evaluator) => evaluator(scope),
57      FunctionBody::For(evaluator) => evaluator(scope),
58      FunctionBody::FunctionDefinition(evaluator) => evaluator(scope),
59      FunctionBody::Invocation(evaluator) => evaluator(scope),
60      FunctionBody::List(evaluator) => evaluator(scope),
61      FunctionBody::LiteralExpression(evaluator) => evaluator(scope),
62      FunctionBody::Relation(evaluator) => evaluator(scope),
63      FunctionBody::Some(evaluator) => evaluator(scope),
64    }
65  }
66}
67
68impl Debug for FunctionBody {
69  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
70    match self {
71      FunctionBody::Conditional(_) => write!(f, "FunctionBodyConditional"),
72      FunctionBody::Context(_) => write!(f, "FunctionBodyContext"),
73      FunctionBody::DecisionService(_) => write!(f, "FunctionBodyDecisionService"),
74      FunctionBody::DecisionTable(_) => write!(f, "FunctionBodyDecisionTable"),
75      FunctionBody::Every(_) => write!(f, "FunctionBodyEvery"),
76      FunctionBody::External(_) => write!(f, "FunctionBodyExternal"),
77      FunctionBody::Filter(_) => write!(f, "FunctionBodyFilter"),
78      FunctionBody::For(_) => write!(f, "FunctionBodyFor"),
79      FunctionBody::FunctionDefinition(_) => write!(f, "FunctionBodyFunctionDefinition"),
80      FunctionBody::Invocation(_) => write!(f, "FunctionBodyInvocation"),
81      FunctionBody::List(_) => write!(f, "FunctionBodyList"),
82      FunctionBody::LiteralExpression(_) => write!(f, "FunctionBodyLiteralExpression"),
83      FunctionBody::Relation(_) => write!(f, "FunctionBodyRelation"),
84      FunctionBody::Some(_) => write!(f, "FunctionBodySome"),
85    }
86  }
87}
88
89impl PartialEq for FunctionBody {
90  fn eq(&self, other: &Self) -> bool {
91    match self {
92      FunctionBody::Conditional(_) => matches!(other, FunctionBody::Conditional(_)),
93      FunctionBody::Context(_) => matches!(other, FunctionBody::Context(_)),
94      FunctionBody::DecisionService(_) => matches!(other, FunctionBody::DecisionService(_)),
95      FunctionBody::DecisionTable(_) => matches!(other, FunctionBody::DecisionTable(_)),
96      FunctionBody::Every(_) => matches!(other, FunctionBody::Every(_)),
97      FunctionBody::External(_) => matches!(other, FunctionBody::External(_)),
98      FunctionBody::Filter(_) => matches!(other, FunctionBody::Filter(_)),
99      FunctionBody::For(_) => matches!(other, FunctionBody::For(_)),
100      FunctionBody::FunctionDefinition(_) => matches!(other, FunctionBody::FunctionDefinition(_)),
101      FunctionBody::Invocation(_) => matches!(other, FunctionBody::Invocation(_)),
102      FunctionBody::List(_) => matches!(other, FunctionBody::List(_)),
103      FunctionBody::LiteralExpression(_) => matches!(other, FunctionBody::LiteralExpression(_)),
104      FunctionBody::Relation(_) => matches!(other, FunctionBody::Relation(_)),
105      FunctionBody::Some(_) => matches!(other, FunctionBody::Some(_)),
106    }
107  }
108}