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 TrimStringExpr {
    pub expr: Index,
}

impl Expr for TrimStringExpr {
    fn resolve(
        &self,
        index: Index,
        evaluation: &mut dyn ExprEvaluator,
    ) -> Result<ValueOrReference, ErrorKind> {
        evaluation.ensure_resolved(vec![self.expr])?;

        let value = evaluation.get_value(self.expr)?;
        let value = &value.to_string().ok_or_else(|| ErrorKind::TypeNotAllowed {
            item: index,
            expr: self.expr,
            expected: ValueKind::String,
            actual: value.kind(),
        })?;
        Ok(Value::String(value.trim().to_string()).into())
    }
}