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)
}
}
}