cco 0.2.0

cascading configuration
Documentation
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],
        })
    }
}