9 releases

new 0.1.2 May 21, 2024
0.1.1 Oct 11, 2023
0.1.0 Jul 11, 2023
0.0.6 Mar 24, 2023
0.0.1 Sep 10, 2022

#618 in Rust patterns

Download history 19/week @ 2024-02-18 13/week @ 2024-02-25 1/week @ 2024-03-03 10/week @ 2024-03-10 43/week @ 2024-03-31 1/week @ 2024-04-07 1/week @ 2024-04-14 2/week @ 2024-04-21 4/week @ 2024-05-12 244/week @ 2024-05-19

248 downloads per month
Used in 2 crates

MIT/Apache

23KB
445 lines

crates.io docs.rs

More robust and versatile implementation of derive(Debug) and derive(Display). Unlike the version ofderive(Debug) in the standard library, these macros will always successfully generate an implementation - even if a member does not implement Debug/Display. In that case, the generated implementation will print a replacement string of the form <TypeName>.

use fmt_derive::Debug; // replacement for `use std::fmt::Debug;`

// a type that implements neither `Debug` nor `Display`
struct Unprintable;

#[derive(Debug, fmt_derive::Display)]
struct Printable {
	// unprintable members will be printed as `<Type>`
	unprintable: Unprintable,

	// use `#[display(ignore)]` (or `#[debug(ignore]` respectively) to skip a member when printing
	#[display(ignore)]
	ignored: u32,

	// use the `fmt` attribute to refer to both `Debug` and `Display` at once
	#[fmt("{:#08X}", self.hex_number)]
	hex_number: u32,
}

fn main() {
	let printable = Printable{
		hex_number: 0xDEADBEEF,
		ignored: 42,
		unprintable: Unprintable,
	};

	assert_eq!(format!("{:?}", printable), "Printable { unprintable: <Unprintable>, ignored: 42, hex_number: 0xDEADBEEF }");
	assert_eq!(format!("{}", printable), "Printable { unprintable: <Unprintable>, hex_number: 0xDEADBEEF }");
}

no_std

This crate is no_std and can be used from both no_std and std contexts without any action required.

MSRV

The current MSRV is 1.69.0. For this project, it is primarily driven by the few dependencies it relies on.

Dependencies

~1.4–2.1MB
~42K SLoC