use crate::values::Value;
use crate::{Evaluator, FeelScope};
use std::fmt;
use std::fmt::Debug;
use std::sync::Arc;
pub type FunctionBodyEvaluator = Arc<Evaluator>;
#[derive(Clone)]
pub enum FunctionBody {
Conditional(FunctionBodyEvaluator),
Context(FunctionBodyEvaluator),
DecisionService(FunctionBodyEvaluator),
DecisionTable(FunctionBodyEvaluator),
Every(FunctionBodyEvaluator),
External(FunctionBodyEvaluator),
Filter(FunctionBodyEvaluator),
For(FunctionBodyEvaluator),
FunctionDefinition(FunctionBodyEvaluator),
Invocation(FunctionBodyEvaluator),
List(FunctionBodyEvaluator),
LiteralExpression(FunctionBodyEvaluator),
Relation(FunctionBodyEvaluator),
Some(FunctionBodyEvaluator),
}
impl FunctionBody {
pub fn evaluate(&self, scope: &FeelScope) -> Value {
match self {
FunctionBody::Conditional(evaluator) => evaluator(scope),
FunctionBody::Context(evaluator) => evaluator(scope),
FunctionBody::DecisionService(evaluator) => evaluator(scope),
FunctionBody::DecisionTable(evaluator) => evaluator(scope),
FunctionBody::Every(evaluator) => evaluator(scope),
FunctionBody::External(evaluator) => evaluator(scope),
FunctionBody::Filter(evaluator) => evaluator(scope),
FunctionBody::For(evaluator) => evaluator(scope),
FunctionBody::FunctionDefinition(evaluator) => evaluator(scope),
FunctionBody::Invocation(evaluator) => evaluator(scope),
FunctionBody::List(evaluator) => evaluator(scope),
FunctionBody::LiteralExpression(evaluator) => evaluator(scope),
FunctionBody::Relation(evaluator) => evaluator(scope),
FunctionBody::Some(evaluator) => evaluator(scope),
}
}
}
impl Debug for FunctionBody {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FunctionBody::Conditional(_) => write!(f, "FunctionBodyConditional"),
FunctionBody::Context(_) => write!(f, "FunctionBodyContext"),
FunctionBody::DecisionService(_) => write!(f, "FunctionBodyDecisionService"),
FunctionBody::DecisionTable(_) => write!(f, "FunctionBodyDecisionTable"),
FunctionBody::Every(_) => write!(f, "FunctionBodyEvery"),
FunctionBody::External(_) => write!(f, "FunctionBodyExternal"),
FunctionBody::Filter(_) => write!(f, "FunctionBodyFilter"),
FunctionBody::For(_) => write!(f, "FunctionBodyFor"),
FunctionBody::FunctionDefinition(_) => write!(f, "FunctionBodyFunctionDefinition"),
FunctionBody::Invocation(_) => write!(f, "FunctionBodyInvocation"),
FunctionBody::List(_) => write!(f, "FunctionBodyList"),
FunctionBody::LiteralExpression(_) => write!(f, "FunctionBodyLiteralExpression"),
FunctionBody::Relation(_) => write!(f, "FunctionBodyRelation"),
FunctionBody::Some(_) => write!(f, "FunctionBodySome"),
}
}
}
impl PartialEq for FunctionBody {
fn eq(&self, other: &Self) -> bool {
match self {
FunctionBody::Conditional(_) => matches!(other, FunctionBody::Conditional(_)),
FunctionBody::Context(_) => matches!(other, FunctionBody::Context(_)),
FunctionBody::DecisionService(_) => matches!(other, FunctionBody::DecisionService(_)),
FunctionBody::DecisionTable(_) => matches!(other, FunctionBody::DecisionTable(_)),
FunctionBody::Every(_) => matches!(other, FunctionBody::Every(_)),
FunctionBody::External(_) => matches!(other, FunctionBody::External(_)),
FunctionBody::Filter(_) => matches!(other, FunctionBody::Filter(_)),
FunctionBody::For(_) => matches!(other, FunctionBody::For(_)),
FunctionBody::FunctionDefinition(_) => matches!(other, FunctionBody::FunctionDefinition(_)),
FunctionBody::Invocation(_) => matches!(other, FunctionBody::Invocation(_)),
FunctionBody::List(_) => matches!(other, FunctionBody::List(_)),
FunctionBody::LiteralExpression(_) => matches!(other, FunctionBody::LiteralExpression(_)),
FunctionBody::Relation(_) => matches!(other, FunctionBody::Relation(_)),
FunctionBody::Some(_) => matches!(other, FunctionBody::Some(_)),
}
}
}