use super::{Expr, ExprEvaluator};
use crate::err::*;
use crate::eval::*;
use crate::value::*;
#[derive(Debug, Clone)]
pub struct TypeGuardExpr {
pub expr: Index,
pub ty: ValueKind,
}
impl Expr for TypeGuardExpr {
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)?;
if value.kind() != self.ty {
return Err(ErrorKind::TypeNotAllowed {
item: index,
expr: self.expr,
expected: self.ty,
actual: value.kind(),
})?;
}
Ok(value.into())
}
fn traverse(
&self,
_evaluation: &dyn ExprEvaluator,
expression: Index,
_name: &Indexer,
) -> Result<Option<ValueOrReference>, ErrorKind> {
Err(ErrorKind::DependenciesNotSatisfied {
indices: vec![expression],
})
}
}