#编译时 #常量 #格式化

no-std compile-fmt

编译时格式化和派生功能(例如,panic / 断言)

1 个不稳定版本

0.1.0 2023年12月28日

#65值格式化

Download history 1065/week @ 2024-04-04 5449/week @ 2024-04-11 8622/week @ 2024-04-18 5508/week @ 2024-04-25 7251/week @ 2024-05-02 10898/week @ 2024-05-09 9921/week @ 2024-05-16 7428/week @ 2024-05-23 13607/week @ 2024-05-30 10010/week @ 2024-06-06 9512/week @ 2024-06-13 8895/week @ 2024-06-20 8554/week @ 2024-06-27

39,617 每月下载量
用于 2 个 crate(通过 vise

MIT/Apache

65KB
1K SLoC

编译时格式化

Build Status License: MIT OR Apache-2.0 rust 1.65+ required no_std supported

文档: crate docs (main)

这个 crate 允许在编译时格式化值(例如,在 const fn 中)。格式化的值不需要是常量;例如,在 const fn 中的参数或局部变量可以被格式化。

特性

  • 无依赖。
  • 无条件 #[no_std]-兼容。
  • 格式化逻辑空间效率高;即,它分配尽可能少的字节,可以证明对于所有可能的输入都是足够的。
  • 不依赖于 proc 宏。这使得库更轻量。

为什么?

该 crate 的一个主要用例是更丰富的动态编译时 panic 消息。它也可以在其他上下文中使用(包括在运行时)。

使用方法

将此添加到您的 Crate.toml

[dependencies]
compile-fmt = "0.1.0"

基本使用

use compile_fmt::{compile_assert, clip, fmt};

const fn check_str(s: &str) {
    const MAX_LEN: usize = 16;
    compile_assert!(
        s.len() <= MAX_LEN,
        "String '", s => clip(MAX_LEN, ""), "' is too long; \
         expected no more than ", MAX_LEN, " bytes, got ",
        s.len() => fmt::<usize>(), " bytes"
    );
    // ^ `clip` and `fmt` specify how dynamic (non-constant) args
    // should be formatted
  
    // main logic
}

let res = std::panic::catch_unwind(|| {
    check_str("very long string indeed");
});
let err = res.unwrap_err();
let panic_message = err.downcast_ref::<String>().unwrap();
assert_eq!(
    panic_message,
    "String 'very long string…' is too long; expected no more than \
     16 bytes, got 23 bytes"
);

有关使用示例的更多信息,请参阅 crate 文档。

限制

  • 只能格式化标准库中的一些类型:整数、charstr 串。
  • 格式化说明符不支持十六进制编码、调试格式化等。
  • 填充逻辑假设任何 Unicode 字符具有相同的显示宽度,这并不完全正确(例如,有些字符具有零宽度,而不是与上一个字符组合)。std 的填充逻辑也做出了相同的假设。

替代方案和类似工具

  • const_panic 提供了覆盖主要用例(编译时 panic)的功能。它支持更多类型和格式,但代价是更复杂。它还使用不同的方法来计算生成的消息大小。
  • const_format 提供了常量值的一般用途格式化。它似乎不支持“动态”/非常量参数。

贡献

所有贡献都欢迎!请参阅贡献指南以了解如何参与。

许可证

compile-fmt遵循Apache License, Version 2.0MIT许可证,由您自行选择。

除非您明确表示,否则您提交给compile-fmt并有意将其包含在内的任何贡献,如Apache-2.0许可证中定义,将按上述方式双重授权,不附加任何额外条款或条件。

无运行时依赖