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 {
Context(FunctionBodyEvaluator),
LiteralExpression(FunctionBodyEvaluator),
DecisionTable(FunctionBodyEvaluator),
FunctionDefinition(FunctionBodyEvaluator),
Invocation(FunctionBodyEvaluator),
Relation(FunctionBodyEvaluator),
DecisionService(FunctionBodyEvaluator),
External(FunctionBodyEvaluator),
}
impl FunctionBody {
pub fn evaluate(&self, scope: &FeelScope) -> Value {
match self {
FunctionBody::Context(evaluator) => evaluator(scope),
FunctionBody::LiteralExpression(evaluator) => evaluator(scope),
FunctionBody::DecisionTable(evaluator) => evaluator(scope),
FunctionBody::FunctionDefinition(evaluator) => evaluator(scope),
FunctionBody::Invocation(evaluator) => evaluator(scope),
FunctionBody::Relation(evaluator) => evaluator(scope),
FunctionBody::DecisionService(evaluator) => evaluator(scope),
FunctionBody::External(evaluator) => evaluator(scope),
}
}
}
impl Debug for FunctionBody {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FunctionBody::Context(_) => write!(f, "FunctionBodyContext"),
FunctionBody::LiteralExpression(_) => write!(f, "FunctionBodyLiteralExpression"),
FunctionBody::DecisionTable(_) => write!(f, "FunctionBodyDecisionTable"),
FunctionBody::FunctionDefinition(_) => write!(f, "FunctionBodyFunctionDefinition"),
FunctionBody::Invocation(_) => write!(f, "FunctionBodyInvocation"),
FunctionBody::Relation(_) => write!(f, "FunctionBodyRelation"),
FunctionBody::DecisionService(_) => write!(f, "FunctionBodyDecisionService"),
FunctionBody::External(_) => write!(f, "FunctionBodyExternal"),
}
}
}
impl PartialEq for FunctionBody {
fn eq(&self, other: &Self) -> bool {
match self {
FunctionBody::Context(_) => matches!(other, FunctionBody::Context(_)),
FunctionBody::LiteralExpression(_) => {
matches!(other, FunctionBody::LiteralExpression(_))
}
FunctionBody::DecisionTable(_) => matches!(other, FunctionBody::DecisionTable(_)),
FunctionBody::FunctionDefinition(_) => {
matches!(other, FunctionBody::FunctionDefinition(_))
}
FunctionBody::Invocation(_) => matches!(other, FunctionBody::Invocation(_)),
FunctionBody::Relation(_) => matches!(other, FunctionBody::Relation(_)),
FunctionBody::DecisionService(_) => matches!(other, FunctionBody::DecisionService(_)),
FunctionBody::External(_) => matches!(other, FunctionBody::External(_)),
}
}
}