#macro #generate #text #handy #formatted

beard

用于在Rust中生成格式化文本的便捷宏

3个不稳定版本

0.2.1 2021年6月18日
0.2.0 2021年6月18日
0.1.0 2021年6月17日

#2421 in Rust模式

MIT/Apache

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")?;
}
};

ifif 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.

无运行时依赖