3个不稳定版本
0.2.1 | 2021年6月18日 |
---|---|
0.2.0 | 2021年6月18日 |
0.1.0 | 2021年6月17日 |
#2421 in Rust模式
11KB
116 行
beard
与mustache相反。在这里,我们的目标是通过尽可能多地利用Rust的类型系统来检测错误情况,从而使得渲染是确定的。如果您正在寻找可以在Rust之外使用的解决方案,请查看mustache。
beard
是一个宏,它将生成必要的Rust代码以序列化给定的模板。您也可以通过自己编写代码(调用适当的std::io::Write方法)实现相同的功能。beard
只是提供一个帮助,使其更容易维护模板。
工作原理
字符串字面量
任何字符串字面量都将按原样写入输出。
use beard::beard;
#
beard! {
output,
"List of items:\n"
"\n"
"* item 1\n"
"* item 2\n"
};
序列化任何实现了Display的
您可以在字符串中插入实现了std::fmt::Display
的对象,就像您在std::format
宏中使用花括号一样,只是在字符串之外。
有趣的是,它还可以在括号内执行任何类型的操作,只要它返回一个实现了std::fmt::Display
的对象。
use beard::beard;
#
let value = 42;
beard! {
output,
{ value } "\n"
{ 1 + 2 } "\n"
};
序列化字节数组
在这种情况下,如果值已经是一个数组,并且不需要运行std::fmt::Display
的格式化到String
作为中间值。
use beard::beard;
#
let value = b"some array";
beard! {
output,
[{ value }] "\n"
};
调用序列化函数
您是否需要使用 std::io::Write
对象执行一些操作?您可以通过调用一个 lambda 函数(实际上并不是)来捕获变量。
use beard::beard;
#
let value = b"some array";
beard! {
output,
|| {
// do other operations
output.write_all(b"some bytes")?;
}
};
if
和 if let
语句
有时需要序列化或不序列化某些部分。
use beard::beard;
#
let value = false;
let optional = Some("something");
beard! {
output,
if (value) {
"Value is true\n"
} else {
"Value is false\n"
}
"Or do some pattern matching\n"
if let Some(value) = (optional) {
"We have " { value } "\n"
}
};
for
循环,遍历项目
如果您需要打印列表的项或实现了 std::iter::IntoIterator
的任何东西。
use beard::beard;
#
let shopping_list = ["apple", "pasta", "tomatoes", "garlic", "mozzarella"];
beard! {
output,
"Shopping list\n"
"\n"
for (index, item) in (shopping_list.iter().enumerate()) {
{index} ". " { item } "\n"
}
};
示例
use beard::beard;
#
let name = "Arthur";
let list = ["Bubble Bath", "Unicorn Crunchy Oat"];
beard! {
output,
"Hi " { name } "\n"
"\n"
"Confirmation order about the following items:\n"
for item in ( list ) {
" * " { item } "\n"
}
"\n"
"Your order will be ship to you once everything is ready.\n"
};
下面的示例将在 output
中生成一个字符串
Hi Arthur
Confirmation order about the following items:
* Bubble Bath
* Unicorn Crunch Oat
Your order will be ship to you once everything is ready.