3 unstable releases

0.2.0 Aug 10, 2022
0.1.1 Feb 11, 2020
0.1.0 Nov 17, 2019
0.1.0-alpha.1 Jun 2, 2019

#1862 in Embedded development

Download history 5/week @ 2024-02-25 6/week @ 2024-03-10 61/week @ 2024-03-31

67 downloads per month


143 lines


A (6-40x) smaller, (2-9x) faster and panic-free alternative to core::fmt

Call graph of formatting structs

Call graph of a program that formats some structs (generated using cargo-call-stack). Source code can be found at the bottom of this file. The program was compiled with -C opt-level=z.

API docs

Design goals

From highest priority to lowest priority

  • Optimized for binary size and speed (rather than for compilation time)

  • No dynamic dispatch in generated code

  • No panicking branches in generated code, when optimized

  • No recursion where possible


  • Debug and Display-like traits

  • core::write!-like macro

  • A generic Formatter<'_, impl uWrite> instead of a single core::Formatter; the uWrite trait has an associated error type so each writer can choose its error type. For example, the implementation for std::String uses Infallible as its error type.

  • core::fmt::Formatter::debug_struct-like API

  • #[derive(uDebug)]

  • Pretty formatting ({:#?}) for uDebug

  • Hexadecimal formatting ({:x}) of integer primitives (e.g. i32)

Minimum Supported Rust Version (MSRV)

This crate does not have a Minimum Supported Rust Version (MSRV) and may make use of language features and API in the standard library available in the latest stable Rust version.

In other words, changes in the Rust version requirement of this crate are not considered semver breaking change and may occur in patch version release.


All source code (including code snippets) is licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be licensed as above, without any additional terms or conditions.


Formatting structs (snippet)

Full source code in 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);

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();

// ..


μfmt utilities

Minimum Supported Rust Version (MSRV)

This crate is guaranteed to compile on stable Rust 1.36 and up. It might compile on older versions but that may change in any new patch release.


~12K SLoC