nargo-template 0.0.1

Nargo template engine management
Documentation
# 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