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