#格式化 #fmt #适配器 #特质 #提供 #递归 #调试

无std manyfmt

轻松创建比std::fmt traits提供的更多种类的格式化

1个不稳定版本

0.1.0 2023年10月7日

#300无标准库

Download history 58/week @ 2024-03-11 107/week @ 2024-03-18 49/week @ 2024-03-25 86/week @ 2024-04-01 14/week @ 2024-04-08 35/week @ 2024-04-15 33/week @ 2024-04-22 51/week @ 2024-04-29 26/week @ 2024-05-06 23/week @ 2024-05-13 93/week @ 2024-05-20 36/week @ 2024-05-27 34/week @ 2024-06-03 48/week @ 2024-06-10 42/week @ 2024-06-17 37/week @ 2024-06-24

每月下载 164次
7 个包中使用 (通过 all-is-cubes)

MIT/Apache

10KB
76

manyfmt

这个Rust库 manyfmt 提供了适配器,可以轻松创建比std::fmt traits (DisplayDebugBinaryLowerHexPointer) 提供的更多种类的格式化,而不需要编写任何不必要的样板代码。您还可以轻松地在格式化递归中传递额外的数据。

该库与 no_std 兼容;它可以在任何Rust可以运行的地方运行。

许可证

根据以下任一项许可

任选其一。

贡献

除非您明确表示,否则您提交给工作以包含在内的任何有意贡献,根据Apache-2.0许可证定义,应如上所述双许可,而无需任何额外的条款或条件。


lib.rs:

提供适配器,可以轻松创建比std::fmt traits (fmt::Displayfmt::Debugfmt::Binaryfmt::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"

"#);

无运行时依赖