freemarker 0.1.1

Apache FreeMarker 语义兼容的 Rust 模板引擎(freemarker-core 迁移)
Documentation
//! 对应 Java `freemarker.template.TemplateTransformModel`
//! (一文件一 Java 对象拆分:原 template_model.rs 合并存放 → 独立文件)

use crate::core::Environment;
use crate::error::Result;
use crate::template::TModel;

/// 变换模型 —— 对应 Java `TemplateTransformModel`(`<#transform>` 旧式指令目标
/// 与 `<@transformModel/>` 调用)。Java 语义(Environment.visitAndTransform
/// :495-543):`getWriter(out, args)` 先产出变换自身输出(?interpret 即
/// env.include 解释模板),随后调用方把 body 写入变换 writer
/// (Interpret.TemplateProcessorModel.getWriter 返回透传 writer,body 原样输出;
/// StandardCompress 等在 close 时对 body 做压缩/转义)。
pub trait TemplateTransformModel {
    /// 变换自身输出(Java getWriter 阶段;v1 无 writer 对象,变换直接向 env 输出)
    fn transform(&self, env: &mut Environment) -> Result<()> {
        let _ = env;
        Ok(())
    }

    /// 带 body 的变换 —— 对应 Java `visitAndTransform` 的完整流程
    /// (Environment.java:495-543):getWriter(out, args) → body 写入变换 writer →
    /// close 时变换输出。v1:捕获 body 渲染文本 → 变换 → emit。
    /// 返回 body 渲染的流控信号(`<#return>` 值 / 完成)。
    fn transform_with_body(
        &self,
        env: &mut Environment,
        params: &std::collections::HashMap<String, TModel>,
        body: &[crate::core::Element],
    ) -> Result<crate::core::environment::RunSignal> {
        let _ = params;
        self.transform(env)?;
        env.run(body)
    }
}