1 个不稳定版本
0.1.0 | 2021年10月15日 |
---|
#1636 在 嵌入式开发
145KB
1K SLoC
aya-ufmt
这是对 https://github.com/japaric/ufmt 的分支,经过修改以与 eBPF 内核验证器兼容。
μfmt
比
core::fmt
小 (6-40 倍),快 (2-9 倍) 且无 panic 的替代品。
格式化某些结构体的程序调用图(使用 cargo-call-stack
生成)。源代码位于此文件的底部。该程序使用 -C opt-level=z
编译。
API 文档
设计目标
从最高优先级到最低优先级
-
优化二进制大小和速度(而不是编译时间)
-
生成代码中无动态分派
-
优化时,生成代码中无 panic 分支
-
尽可能避免递归
功能
-
Debug
和Display
类似的特质 -
core::write!
类似的宏 -
通用的
Formatter<'_, impl uWrite>
,而不是单个core::Formatter
;uWrite
特质有一个关联的错误类型,因此每个 writer 可以选择其错误类型。例如,std::String
的实现使用Infallible
作为其错误类型。 -
core::fmt::Formatter::debug_struct
类似的 API -
#[derive(uDebug)]
-
为
uDebug
提供漂亮格式化({:#?}
)
最小支持的 Rust 版本(MSRV)
此 crate 保证在稳定 Rust 1.34 及以上版本上编译。它可能在较旧版本上编译,但任何新的补丁版本都可能改变这一点。
许可协议
所有源代码(包括代码片段)都受以下其中之一许可协议的许可:
-
Apache License, Version 2.0(《LICENSE-APACHE》或https://apache.ac.cn/licenses/LICENSE-2.0)
-
MIT 许可证(《LICENSE-MIT》或https://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在作品中的贡献,应如上所述进行许可,不附加任何额外条款或条件。
附录
格式化结构体(代码片段)
完整源代码在nopanic/examples/struct.rs。
// ..
#[derive(Clone, Copy, uDebug)]
struct Pair {
x: i32,
y: i32,
}
static X: AtomicI32 = AtomicI32::new(0);
static Y: AtomicI32 = AtomicI32::new(0);
#[exception]
fn PendSV() {
let x = X.load(Ordering::Relaxed);
let y = Y.load(Ordering::Relaxed);
uwrite!(&mut W, "{:?}", Braces {}).unwrap();
uwrite!(&mut W, "{:#?}", Braces {}).unwrap();
uwrite!(&mut W, "{:?}", Parens()).unwrap();
uwrite!(&mut W, "{:#?}", Parens()).unwrap();
uwrite!(&mut W, "{:?}", I32(x)).unwrap();
uwrite!(&mut W, "{:#?}", I32(x)).unwrap();
uwrite!(&mut W, "{:?}", Tuple(x, y)).unwrap();
uwrite!(&mut W, "{:#?}", Tuple(x, y)).unwrap();
let pair = Pair { x, y };
uwrite!(&mut W, "{:?}", pair).unwrap();
uwrite!(&mut W, "{:#?}", pair).unwrap();
let first = pair;
let second = pair;
uwrite!(&mut W, "{:?}", Nested { first, second }).unwrap();
uwrite!(&mut W, "{:#?}", Nested { first, second }).unwrap();
}
// ..
依赖项
~1.5MB
~35K SLoC