#debugging #write #display #format

no-std ufmt

core::fmt 小(6-40倍),快(2-9倍)且无 panic 的替代方案

4 个版本

0.2.0 2022年8月10日
0.1.2 2022年8月10日
0.1.0 2019年11月17日
0.1.0-beta.5 2019年6月18日
0.1.0-beta.4 2019年5月9日

#13 in #write

Download history 6953/week @ 2024-04-20 6663/week @ 2024-04-27 7816/week @ 2024-05-04 7841/week @ 2024-05-11 9643/week @ 2024-05-18 11264/week @ 2024-05-25 10783/week @ 2024-06-01 8823/week @ 2024-06-08 10232/week @ 2024-06-15 8270/week @ 2024-06-22 8894/week @ 2024-06-29 10041/week @ 2024-07-06 11841/week @ 2024-07-13 9567/week @ 2024-07-20 8151/week @ 2024-07-27 5375/week @ 2024-08-03

36,498 每月下载量
用于 66 crates(53 个直接使用)

MIT/Apache

155KB
1.5K SLoC

μfmt

core::fmt 小(6-40倍),快(2-9倍)且无 panic 的替代方案

Call graph of formatting structs

一个格式化某些结构的程序(使用 cargo-call-stack 生成)。源代码位于文件底部。程序使用 -C opt-level=z 编译。

API 文档

设计目标

从最高优先级到最低优先级

  • 优化二进制大小和速度(而不是编译时间)

  • 生成代码中无动态调度

  • 优化时,生成代码中无 panic 分支

  • 尽可能无递归

功能

  • DebugDisplay 类似特质

  • core::write! 类似宏

  • 一个泛型 Formatter<'_, impl uWrite> 而不是单个 core::FormatteruWrite 特质有一个关联的错误类型,因此每个写入器都可以选择其错误类型。例如,std::String 的实现使用 Infallible 作为其错误类型。

  • core::fmt::Formatter::debug_struct 类似 API

  • #[derive(uDebug)]

  • uDebug 的格式化(例如:`{ :? }`)

  • 整数原语(例如:`i32`)的十六进制格式化(例如:`{:x}`)

最低支持的 Rust 版本 (MSRV)

此 crate 没有最低支持的 Rust 版本,可能使用最新稳定 Rust 版本中可用的语言特性和标准库 API。

换句话说,这个crate对Rust版本要求的变化不被视为semver重大变更,可能会出现在补丁版本发布中。

许可证

所有源代码(包括代码片段)均受以下任一许可证的许可

由您选择。

贡献

除非您明确表示,否则根据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