use crate::core::environment::{expr_desc, RunSignal};
use crate::core::eval::eval;
use crate::core::exec::ExecOutcome;
use crate::core::{Element, Expr};
use crate::error::{Result, TemplateError};
use std::collections::HashMap;
pub struct TransformBlock {
pub expr: Expr,
pub body: Vec<Element>,
}
impl TransformBlock {
pub fn new(expr: Expr, body: Vec<Element>) -> Self {
TransformBlock { expr, body }
}
pub(crate) fn exec(&self, env: &mut crate::core::Environment) -> Result<ExecOutcome> {
let m = eval(env, &self.expr)?;
if m.is_nothing() {
return Err(TemplateError::invalid_reference(expr_desc(&self.expr)));
}
let Some(ttm) = env.as_transform(&m) else {
return Err(TemplateError::type_mismatch("transform", m.type_name));
};
let signal = ttm.transform_with_body(env, &HashMap::new(), &self.body)?;
match signal {
RunSignal::Returned(v) => Ok(ExecOutcome::ReturnValue(v)),
_ => Ok(ExecOutcome::Done),
}
}
}