#text-formatting #iterator #formatting #join #replace #format-text

fmttools

不分配任何中间缓冲区或非安全代码,用于修改文本的工具

6 个版本

0.2.2 2023 年 11 月 30 日
0.2.1 2023 年 11 月 30 日
0.1.2 2023 年 11 月 28 日

#496算法 分类中

每月 38 次下载

MIT/Apache 协议

26KB
486

Fmttools

build_status crates.io

通过单个 write! 调用高效修改文本的工具。

  • 不执行任何分配
  • 仅使用安全的 Rust 实现

示例

连接迭代器元素

use fmttools::join;

let elements = vec!["abc", "\n", "123"];
assert_eq!("abc, \n, 123", format!("{}", join(&elements, ", ")));
assert_eq!("\"abc\", \"\\n\", \"123\"", format!("{:?}", join(&elements, ", ")));

使用自定义格式连接元素

use fmttools::join_fmt;

// Alternatively, a closure can be used
fn format_element(x: &i32, f: &mut Formatter<'_>) -> fmt::Result {
    if *x > 3 {
        return write!(f, "3+");
    }

    write!(f, "{}", x)
}

let elements = vec![1, 2, 3, 4, 5];
assert_eq!("1, 2, 3, 3+, 3+", format!("{}", join_fmt(&elements, ", ", format_element)));

替换任意模式

use fmttools::replace;

#[derive(Debug)]
struct FooBar {
    a: String,
}

let value = FooBar { a: "Bar".to_string() };
assert_eq!("FooBiz { a: \"Biz\" }", format!("{:?}", replace(&value, "Bar", "Biz")));

使用额外数据格式化

use fmttools::{DebugWith, ToFormatWith};

type RegistryKey = u32;

struct Registry {
    key_names: HashMap<RegistryKey, String>,
}

struct FooEntry {
    key: RegistryKey,
}

impl DebugWith<Registry> for FooEntry {
    fn fmt(&self, f: &mut Formatter<'_>, registry: &Registry) -> fmt::Result {
        let key_name = registry.key_names.get(&self.key)
            .map(|x| x.as_str())
            .unwrap_or("unknown");

        write!(f, "FooEntry {{ key: {:?} }}", key_name)
    }
}

let registry = Registry {
    key_names: HashMap::from([
        (2, "FooA".to_string()),
        (5, "FooB".to_string()),
        (9, "Bar".to_string()),
    ]),
};

let entry = FooEntry { key: 5 };

assert_eq!("FooEntry { key: \"FooB\" }", format!("{:?}", entry.fmt_with(&registry)));

许可证

在 Apache 许可证版本 2.0 或 MIT 许可证下发布,您可以选择其中一种。此文件不得复制、修改或分发,除非符合这些条款。

无运行时依赖