use super::{Expr, ExprEvaluator};
use crate::err::*;
use crate::eval::*;
use crate::value::*;
#[derive(Debug, Clone)]
pub struct ConditionalExpr {
pub condition: Index,
pub true_expr: Index,
pub false_expr: Index,
}
impl Expr for ConditionalExpr {
fn resolve(
&self,
index: Index,
evaluation: &mut dyn ExprEvaluator,
) -> Result<ValueOrReference, ErrorKind> {
evaluation.ensure_resolved(vec![self.condition])?;
let value = evaluation.get_value(self.condition)?;
let Value::Boolean(cond) = value else {
return Err(ErrorKind::TypeNotAllowed {
item: index,
expr: self.condition,
expected: ValueKind::Boolean,
actual: value.kind(),
})?;
};
if cond {
Ok(self.true_expr.into())
} else {
Ok(self.false_expr.into())
}
}
fn traverse(
&self,
_evaluation: &dyn ExprEvaluator,
expression: Index,
_name: &Indexer,
) -> Result<Option<ValueOrReference>, ErrorKind> {
Err(ErrorKind::DependenciesNotSatisfied {
indices: vec![expression],
})
}
}