# Nargo Template
Nargo 模板引擎管理库,提供统一的模板渲染接口,支持多种模板引擎。
## 功能特性
- 统一的模板渲染接口
- 内置 Handlebars 模板引擎支持
- 可扩展的自定义模板引擎支持
- 模板目录自动扫描和加载
- 同步和异步渲染支持
## 支持的模板引擎
### Handlebars
- 文件扩展名: `.hbs`
- 流行的 JavaScript 模板语言
- 支持条件、循环、辅助函数等
### DejaVu
- 文件扩展名: `.dj`
- 编译期零成本抽象
- 高性能模板引擎
### 自定义
- 文件扩展名: `.tpl`
- 通过实现 `TemplateRenderer` trait 支持
## 快速开始
### 基本使用
```rust
use nargo_template::{TemplateManager, TemplateEngine};
use serde_json::json;
fn main() -> anyhow::Result<()> {
let mut manager = TemplateManager::new();
// 注册模板
let renderer = manager.get_renderer_mut(TemplateEngine::Handlebars).unwrap();
renderer.register_template("greeting", "Hello, {{name}}!")?;
// 渲染模板
let context = json!({"name": "World"});
let result = manager.render(TemplateEngine::Handlebars, "greeting", &context)?;
assert_eq!(result, "Hello, World!");
Ok(())
}
```
### 从目录加载模板
```rust
use nargo_template::{TemplateManager, TemplateEngine};
fn main() -> anyhow::Result<()> {
let mut manager = TemplateManager::new();
// 添加模板目录
manager.add_template_dir("./templates");
// 加载所有 Handlebars 模板
manager.load_templates(TemplateEngine::Handlebars)?;
Ok(())
}
```
### 实现自定义模板引擎
```rust
use async_trait::async_trait;
use nargo_template::TemplateRenderer;
use anyhow::Result;
use std::path::Path;
struct MyRenderer {
// 你的渲染器状态
}
#[async_trait]
impl TemplateRenderer for MyRenderer {
fn render(&self, template_name: &str, context: &serde_json::Value) -> Result<String> {
// 实现你的渲染逻辑
Ok("rendered content".to_string())
}
fn register_template(&mut self, name: &str, content: &str) -> Result<()> {
// 实现模板注册逻辑
Ok(())
}
fn register_template_file<P: AsRef<Path>>(&mut self, name: &str, path: P) -> Result<()> {
// 实现模板文件注册逻辑
Ok(())
}
fn register_templates_from_dir<P: AsRef<Path>>(
&mut self,
dir: P,
extension: Option<&str>,
) -> Result<()> {
// 实现从目录加载模板逻辑
Ok(())
}
}
// 注册自定义渲染器
let mut manager = TemplateManager::new();
manager.register_renderer(TemplateEngine::Custom, Box::new(MyRenderer {}));
```
## API 文档
### TemplateManager
模板管理器,负责管理多个模板引擎的渲染器。
#### 方法
- `new()` - 创建新的模板管理器
- `register_renderer(engine, renderer)` - 注册自定义渲染器
- `get_renderer(engine)` - 获取渲染器
- `get_renderer_mut(engine)` - 获取可变渲染器
- `add_template_dir(dir)` - 添加模板目录
- `load_templates(engine)` - 从已注册的目录加载模板
- `render(engine, template_name, context)` - 渲染模板
- `render_async(engine, template_name, context)` - 异步渲染模板
### TemplateRenderer trait
模板渲染器 trait,所有模板引擎都需要实现。
#### 必需方法
- `render(template_name, context)` - 渲染模板
- `register_template(name, content)` - 注册模板
- `register_template_file(name, path)` - 注册模板文件
- `register_templates_from_dir(dir, extension)` - 从目录加载模板
#### 可选方法
- `render_async(template_name, context)` - 异步渲染模板(默认调用同步版本)
## 许可证
MIT