Rust模板引擎gtmpl_value的使用:高效解析和渲染模板数据的工具库

Rust模板引擎gtmpl_value的使用:高效解析和渲染模板数据的工具库

gtmpl_value是gmtpl-rust的内部值类型实现。

当前状态

gtmpl_value是一个基本实现,用于在gtmpl-rust中表示内部值。它被用来表示从模板和上下文中解析的值。

使用方法

实现了From trait的类型包括:

  • String, &str
  • 大多数数字类型 u64, u32, ..., i64, i32, ..., f64, f32
  • bool
  • Vec<Value>, &[Value]
  • HashMap<String, Value>

gtmpl_derive为结构体提供了自定义的derive功能。

内容中提供的示例代码:

extern crate gtmpl_value;
use gtmpl_value::Value;

fn main() {
    let v: Value = "something".into();
    println!("{}", v);
}

完整示例demo

下面是一个更完整的示例,展示如何使用gtmpl_value进行模板数据处理:

extern crate gtmpl_value;
use gtmpl_value::Value;
use std::collections::HashMap;

fn main() {
    // 基本类型转换
    let string_val: Value = "Hello, World!".into();
    let num_val: Value = 42.into();
    let bool_val: Value = true.into();
    
    println!("String value: {}", string_val);
    println!("Number value: {}", num_val);
    println!("Boolean value: {}", bool_val);
    
    // 数组处理
    let array_val: Value = vec![
        Value::from("item1"),
        Value::from(2),
        Value::from(false)
    ].into();
    
    println!("Array value: {:?}", array_val);
    
    // 哈希表处理
    let mut map = HashMap::new();
    map.insert("name".to_string(), Value::from("Alice"));
    map.insert("age".to_string(), Value::from(30));
    map.insert("active".to_string(), Value::from(true));
    
    let map_val: Value = map.into();
    println!("Map value: {:?}", map_val);
}

安装

在Cargo.toml中添加以下依赖:

[dependencies]
gtmpl_value = "0.5"

或者运行以下命令:

cargo add gtmpl_value

许可证

MIT许可证


1 回复

Rust模板引擎gtmpl_value使用指南

介绍

gtmpl_value是一个高效的Rust模板引擎工具库,专注于模板数据的解析和渲染。它提供了简洁的API来处理模板变量和数据结构,特别适合需要动态生成内容的场景。

主要特性

  • 轻量级且高效
  • 支持复杂数据结构渲染
  • 类型安全的模板处理
  • 易于集成到现有项目中

安装

在Cargo.toml中添加依赖:

[dependencies]
gtmpl_value = "0.7"

基本使用方法

1. 创建和渲染简单值

use gtmpl_value::Value;

fn main() {
    // 创建简单值
    let name = Value::from("Alice");
    let age = Value::from(30);
    
    // 渲染为字符串
    println!("Name: {}", name.render().unwrap());
    println!("Age: {}", age.render().unwrap());
}

2. 处理复杂数据结构

use gtmpl_value::{Value, Object};

fn main() {
    // 创建对象
    let mut user = Object::new();
    user.insert("name".to_string(), Value::from("Bob"));
    user.insert("age".to_string(), Value::from(25));
    user.insert("is_active".to_string(), Value::from(true));
    
    // 转换为Value
    let user_value = Value::from(user);
    
    // 渲染整个对象
    println!("User: {}", user_value.render().unwrap());
}

3. 模板渲染示例

use gtmpl_value::{Value, Object};
use gtmpl::{template, Func};

fn main() {
    // 准备模板数据
    let mut data = Object::new();
    data.insert("title".to_string(), Value::from("Welcome Page"));
    data.insert("user".to_string(), Value::from("Charlie"));
    
    // 定义模板
    let tmpl = template!(
        "<html>
        <head><title>{{.title}}</title></head>
        <body>
            <h1>Hello, {{.user}}!</h1>
            <p>Welcome to our site.</p>
        </body>
        </html>"
    );
    
    // 渲染模板
    let output = tmpl(&Value::from(data)).unwrap();
    println!("{}", output);
}

高级用法

自定义函数

use gtmpl_value::{Value, Object};
use gtmpl::{Func, template};

fn uppercase(args: &[Value]) -> Result<Value, FuncError> {
    if let Some(val) = args.get(0) {
        Ok(Value::from(val.render()?.to_uppercase()))
    } else {
        Err(FuncError::new("missing argument"))
    }
}

fn main() {
    // 注册自定义函数
    let mut funcs = gtmpl::FuncMap::new();
    funcs.insert("upper", Func::new(uppercase));
    
    // 准备数据
    let mut data = Object::new();
    data.insert("name".to_string(), Value::from("david"));
    
    // 使用自定义函数的模板
    let tmpl = template!(
        "Hello, {{upper .name}}!",
        funcs
    );
    
    println!("{}", tmpl(&Value::from(data)).unwrap());
}

处理数组

use gtmpl_value::{Value, Array};

fn main() {
    // 创建数组
    let mut numbers = Array::new();
    numbers.push(Value::from(1));
    numbers.push(Value::from(2));
    numbers.push(Value::from(3));
    
    let numbers_value = Value::from(numbers);
    
    // 模板中使用range
    let tmpl = template!(
        "{{range .}}Number: {{.}}\n{{end}}"
    );
    
    println!("{}", tmpl(&numbers_value).unwrap());
}

完整示例Demo

以下是一个结合了基本使用和高级功能的完整示例:

use gtmpl_value::{Value, Object, Array};
use gtmpl::{template, Func, FuncMap, FuncError};

// 自定义函数:将字符串转换为大写
fn uppercase(args: &[Value]) -> Result<Value, FuncError> {
    if let Some(val) = args.get(0) {
        Ok(Value::from(val.render()?.to_uppercase()))
    } else {
        Err(FuncError::new("missing argument"))
    }
}

// 自定义函数:格式化日期
fn format_date(args: &[Value]) -> Result<Value, FuncError> {
    if let Some(val) = args.get(0) {
        let date = chrono::NaiveDate::parse_from_str(&val.render()?, "%Y-%m-%d")
            .map_err(|e| FuncError::new(e.to_string()))?;
        Ok(Value::from(date.format("%B %d, %Y").to_string()))
    } else {
        Err(FuncError::new("missing date argument"))
    }
}

fn main() {
    // 1. 创建并注册自定义函数
    let mut funcs = FuncMap::new();
    funcs.insert("upper", Func::new(uppercase));
    funcs.insert("fmt_date", Func::new(format_date));

    // 2. 准备模板数据
    let mut data = Object::new();
    
    // 添加用户信息
    let mut user = Object::new();
    user.insert("name".to_string(), Value::from("张三"));
    user.insert("email".to_string(), Value::from("zhangsan@example.com"));
    data.insert("user".to_string(), Value::from(user));
    
    // 添加订单列表
    let mut orders = Array::new();
    
    let mut order1 = Object::new();
    order1.insert("id".to_string(), Value::from(1001));
    order1.insert("date".to_string(), Value::from("2023-05-15"));
    order1.insert("amount".to_string(), Value::from(99.99));
    orders.push(Value::from(order1));
    
    let mut order2 = Object::new();
    order2.insert("id".to_string(), Value::from(1002));
    order2.insert("date".to_string(), Value::from("2023-06-20"));
    order2.insert("amount".to_string(), Value::from(149.99));
    orders.push(Value::from(order2));
    
    data.insert("orders".to_string(), Value::from(orders));

    // 3. 定义模板
    let tmpl = template!(
        r#"<!DOCTYPE html>
<html>
<head>
    <title>订单详情 - {{upper .user.name}}</title>
</head>
<body>
    <h1>欢迎, {{.user.name}}!</h1>
    <p>您的邮箱: {{.user.email}}</p>
    
    <h2>订单列表</h2>
    <table border="1">
        <tr>
            <th>订单ID</th>
            <th>日期</th>
            <th>金额</th>
        </tr>
        {{range .orders}}
        <tr>
            <td>{{.id}}</td>
            <td>{{fmt_date .date}}</td>
            <td>${{.amount}}</td>
        </tr>
        {{end}}
    </table>
</body>
</html>"#,
        funcs
    );

    // 4. 渲染模板
    match tmpl(&Value::from(data)) {
        Ok(output) => println!("{}", output),
        Err(e) => eprintln!("模板渲染错误: {}", e),
    }
}

性能提示

  1. 重用Value对象以避免重复分配
  2. 对于静态内容,考虑预编译模板
  3. 使用引用而不是克隆大型数据结构

总结

gtmpl_value为Rust开发者提供了一个强大而灵活的工具来处理模板渲染需求,特别适合Web应用、代码生成和报告生成等场景。通过本指南中的示例,您可以快速掌握gtmpl_value的基本用法和高级特性,从而在项目中高效地实现模板渲染功能。

回到顶部