custom_debug 0.6.2

Derive Debug with a custom format per field
Documentation
#![allow(clippy::disallowed_names)]
use core::fmt;

use custom_debug::Debug;

#[derive(Debug)]
struct Foo {
    x: i32,
    #[debug(
        skip_if = Option::is_none,
        with = strip_some,
    )]
    y: Option<i32>,
    z: i32,
}

fn main() {
    let mut foo = Foo {
        x: 42,
        y: None,
        z: 171,
    };

    println!("With `y = None`:");
    println!("{:#?}", foo);

    foo.y = Some(123);
    println!("With `y = Some(123)`:");
    println!("{:#?}", foo);
}

fn strip_some<T: fmt::Debug>(value: &Option<T>, f: &mut fmt::Formatter) -> fmt::Result {
    if let Some(value) = value {
        value.fmt(f)?;
    }

    Ok(())
}