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),
}
}
性能提示
- 重用Value对象以避免重复分配
- 对于静态内容,考虑预编译模板
- 使用引用而不是克隆大型数据结构
总结
gtmpl_value为Rust开发者提供了一个强大而灵活的工具来处理模板渲染需求,特别适合Web应用、代码生成和报告生成等场景。通过本指南中的示例,您可以快速掌握gtmpl_value的基本用法和高级特性,从而在项目中高效地实现模板渲染功能。