1use crate::values::Value;
4use crate::{Evaluator, FeelScope};
5use std::fmt;
6use std::fmt::Debug;
7use std::sync::Arc;
8
9pub type FunctionBodyEvaluator = Arc<Evaluator>;
11
12#[derive(Clone)]
15pub enum FunctionBody {
16 Conditional(FunctionBodyEvaluator),
18 Context(FunctionBodyEvaluator),
20 DecisionService(FunctionBodyEvaluator),
22 DecisionTable(FunctionBodyEvaluator),
24 Every(FunctionBodyEvaluator),
26 External(FunctionBodyEvaluator),
28 Filter(FunctionBodyEvaluator),
30 For(FunctionBodyEvaluator),
32 FunctionDefinition(FunctionBodyEvaluator),
34 Invocation(FunctionBodyEvaluator),
36 List(FunctionBodyEvaluator),
38 LiteralExpression(FunctionBodyEvaluator),
40 Relation(FunctionBodyEvaluator),
42 Some(FunctionBodyEvaluator),
44}
45
46impl FunctionBody {
47 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}