1 个不稳定版本
0.1.0 | 2023年12月28日 |
---|
#65 在 值格式化
39,617 每月下载量
用于 2 个 crate(通过 vise)
65KB
1K SLoC
编译时格式化
这个 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 文档。
限制
- 只能格式化标准库中的一些类型:整数、
char
和str
串。 - 格式化说明符不支持十六进制编码、调试格式化等。
- 填充逻辑假设任何 Unicode 字符具有相同的显示宽度,这并不完全正确(例如,有些字符具有零宽度,而不是与上一个字符组合)。std 的填充逻辑也做出了相同的假设。
替代方案和类似工具
const_panic
提供了覆盖主要用例(编译时 panic)的功能。它支持更多类型和格式,但代价是更复杂。它还使用不同的方法来计算生成的消息大小。const_format
提供了常量值的一般用途格式化。它似乎不支持“动态”/非常量参数。
贡献
所有贡献都欢迎!请参阅贡献指南以了解如何参与。
许可证
compile-fmt
遵循Apache License, Version 2.0或MIT许可证,由您自行选择。
除非您明确表示,否则您提交给compile-fmt
并有意将其包含在内的任何贡献,如Apache-2.0许可证中定义,将按上述方式双重授权,不附加任何额外条款或条件。