use super::{Expr, ExprEvaluator};
use crate::err::*;
use crate::eval::*;
use crate::value::*;
#[derive(Debug, Clone)]
pub struct LiteralExpr {
pub value: Value,
}
impl Expr for LiteralExpr {
fn resolve(
&self,
_index: Index,
_evaluation: &mut dyn ExprEvaluator,
) -> Result<ValueOrReference, ErrorKind> {
Ok(self.value.clone().into())
}
fn traverse(
&self,
_evaluation: &dyn ExprEvaluator,
_expression: Index,
name: &Indexer,
) -> Result<Option<ValueOrReference>, ErrorKind> {
match (&self.value, name) {
(Value::Map(map), Indexer::String(key)) => {
if let Some(value) = map.get(key) {
return Ok(Some(ValueOrReference::Value(value.clone())));
}
}
(Value::List(list), Indexer::Number(index)) => {
if let Some(value) = list.get(*index) {
return Ok(Some(ValueOrReference::Value(value.clone())));
}
}
_ => return Ok(None),
}
Ok(None)
}
}
impl From<Value> for LiteralExpr {
fn from(value: Value) -> Self {
LiteralExpr { value }
}
}