1个不稳定版本
0.1.0 | 2023年10月7日 |
---|
#300 在 无标准库
每月下载 164次
在 7 个包中使用 (通过 all-is-cubes)
10KB
76 行
manyfmt
这个Rust库 manyfmt
提供了适配器,可以轻松创建比std::fmt traits (Display
、Debug
、Binary
、LowerHex
、Pointer
) 提供的更多种类的格式化,而不需要编写任何不必要的样板代码。您还可以轻松地在格式化递归中传递额外的数据。
该库与 no_std
兼容;它可以在任何Rust可以运行的地方运行。
许可证
根据以下任一项许可
- Apache License,版本2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确表示,否则您提交给工作以包含在内的任何有意贡献,根据Apache-2.0许可证定义,应如上所述双许可,而无需任何额外的条款或条件。
lib.rs
:
提供适配器,可以轻松创建比std::fmt
traits (fmt::Display
、fmt::Debug
、fmt::Binary
、fmt::Pointer
等) 提供的更多种类的格式化,而无需编写任何不必要的样板代码。您还可以轻松地在格式化递归中传递额外的数据。
要创建一个新的格式,声明一个结构体(struct MyFormat;
)并为您想要能够格式化的类型实现 Fmt<MyFormat>
。然后调用 [Refmt::refmt()
] 来将格式作为一个包装类型应用于您的数据。
示例
以下代码实现了一个最小、非验证的 TOML 发射器。这展示了如何使用 manyfmt
生成复杂的格式,该格式在 std::fmt
系统内操作,无需分配,无需为每种情况编写新的引用包装类型。
use std::collections::BTreeMap;
use std::fmt;
use manyfmt::{Fmt, Refmt};
struct TomlFile;
struct TomlTable;
impl<S: AsRef<str>, T: Fmt<TomlTable>> Fmt<TomlFile> for BTreeMap<S, T> {
fn fmt(&self, fmt: &mut fmt::Formatter<'_>, _: &TomlFile) -> fmt::Result {
for (key, table) in self {
writeln!(
fmt,
"[{key}]\n{table}",
key = key.as_ref(),
table = table.refmt(&TomlTable)
)?;
}
Ok(())
}
}
impl<S: AsRef<str>, T: fmt::Debug> Fmt<TomlTable> for BTreeMap<S, T> {
fn fmt(&self, fmt: &mut fmt::Formatter<'_>, _: &TomlTable) -> fmt::Result {
for (key, value) in self {
// A real implementation would use TOML-specific value formatting
// rather than `Debug`, which promises nothing.
writeln!(fmt, "{key} = {value:?}", key = key.as_ref())?;
}
Ok(())
}
}
let data = BTreeMap::from([
("package", BTreeMap::from([("name", "manyfmt"), ("edition", "2021")])),
("lib", BTreeMap::from([("name", "manyfmt")])),
]);
let text = data.refmt(&TomlFile).to_string();
assert_eq!(text,
r#"[lib]
name = "manyfmt"
[package]
edition = "2021"
name = "manyfmt"
"#);