freemarker 0.1.1

Apache FreeMarker 语义兼容的 Rust 模板引擎(freemarker-core 迁移)
Documentation
//! 模板加载器接口 —— 对应 Java `freemarker.cache.TemplateLoader`
//! (findTemplateSource/getLastModified/getReader/closeTemplateSource 语义)
//! `as_stateful` 是 Java `instanceof StatefulTemplateLoader` 检查的等价物
//! (TemplateCache.clear :645-657;见 stateful_template_loader.rs)

use crate::cache::stateful_template_loader::StatefulTemplateLoader;
use crate::cache::TemplateSource;
use crate::error::Result;

/// 模板加载器(对应 TemplateLoader 接口)
pub trait TemplateLoader: Send + Sync {
    fn find(&self, name: &str) -> Result<Option<Box<dyn TemplateSource>>>;
    fn read(&self, src: &dyn TemplateSource) -> Result<String>;

    /// 按指定字符集读取 —— 对应 Java `TemplateLoader.getReader(source, encoding)`
    /// (TemplateCache.loadTemplate :524-581 的 parseAsFTL 分支)。默认实现退回
    /// `read`(UTF-8 假定),需要 encoding 语义的实现者覆写。
    fn read_encoded(&self, src: &dyn TemplateSource, encoding: &str) -> Result<String> {
        let _ = encoding;
        self.read(src)
    }

    fn last_modified(&self, src: &dyn TemplateSource) -> Result<i64> {
        let _ = src;
        Ok(0)
    }

    /// 有状态加载器下转型(对应 Java `instanceof StatefulTemplateLoader`,
    /// TemplateCache.clear :648-649):实现 StatefulTemplateLoader 的加载器
    /// 覆写为 `Some(self)`(trait 上转型),其余保持默认 None —— 与 Java
    /// 可选接口语义一致
    fn as_stateful(&self) -> Option<&dyn StatefulTemplateLoader> {
        None
    }
}