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 ListExpr {
    pub items: Vec<Index>,
}

impl Expr for ListExpr {
    fn resolve(
        &self,
        _index: Index,
        evaluation: &mut dyn ExprEvaluator,
    ) -> Result<ValueOrReference, ErrorKind> {
        evaluation.ensure_resolved(self.items.to_vec())?;

        let mut list = vec![];
        for &item in &self.items {
            list.push(evaluation.get_value(item)?);
        }
        Ok(Value::List(list).into())
    }

    fn traverse(
        &self,
        _evaluation: &dyn ExprEvaluator,
        expression: Index,
        name: &Indexer,
    ) -> Result<Option<ValueOrReference>, ErrorKind> {
        if let Indexer::Number(index) = *name {
            if self.items.len() <= index {
                return Err(ErrorKind::IndexOutOfRange {
                    item: expression,
                    actual: index,
                    expected: 0..=(self.items.len() - 1),
                })?;
            }
            Ok(Some(ValueOrReference::Reference(self.items[index])))
        } else {
            Ok(None)
        }
    }
}