smart-debug 0.0.3

Derive macro for `Debug` with easy manipulation of fields
Documentation
use serde::Serialize;
use smart_debug::SmartDebug;

#[test]
fn basic() {
    #[derive(Serialize, SmartDebug, Default)]
    #[debug(skip_defaults)]
    struct Basic {
        default: bool,
        not_default: bool,
    }

    let basic = Basic {
        default: false,
        not_default: true,
    };

    insta::with_settings!({ info => &basic }, {
        insta::assert_debug_snapshot!(basic);
    });
}

#[test]
fn kitchen_sink() {
    struct Wrapper<'a>(&'a str);

    impl<'a> std::fmt::Debug for Wrapper<'a> {
        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
            f.write_str("Wrapped")
        }
    }

    #[derive(Serialize, SmartDebug, Default)]
    #[debug(skip_defaults)]
    struct KitchenSink {
        default_skipped: (),
        #[debug(skip)]
        skip_skipped: (),
        #[debug(no_skip)]
        no_skip_displayed: (),
        #[debug(skip_if = false)]
        skip_if_skipped: bool,
        #[debug(skip_if = true)]
        skip_if_displayed: bool,
        #[debug("<hidden>")]
        password_is_hidden: &'static str,
        #[debug(wrapper = Wrapper)]
        wrapped_display: &'static str,
    }

    let kitchen_sink = KitchenSink {
        password_is_hidden: "hunter2",
        wrapped_display: "NotWrapped",
        ..Default::default()
    };

    insta::with_settings!({ info => &kitchen_sink }, {
        insta::assert_debug_snapshot!(kitchen_sink);
    });
}

#[test]
fn format_str() {
    #[derive(Serialize, SmartDebug, Default)]
    struct FormatStrs {
        #[debug("{:#x}")]
        hex: u64,
        #[debug("{}")]
        display: &'static str,
        #[debug("I am the text")]
        just_text: (),
    }

    let format_strs = FormatStrs {
        hex: 0x1234abcd,
        display: "You'll see unescaped quotes -> \"\"\"",
        ..Default::default()
    };

    insta::with_settings!({ info => &format_strs }, {
        insta::assert_debug_snapshot!(format_strs)
    });
}

#[test]
fn unit_struct() {
    #[derive(Serialize, SmartDebug)]
    struct Unit;

    let unit = Unit;

    insta::with_settings!({ info => &unit }, {
        insta::assert_debug_snapshot!(unit);
    });
}

#[test]
fn tuple_struct() {
    #[derive(Serialize, SmartDebug, Default)]
    struct Tuple(bool, u8);

    let tuple = Tuple::default();

    insta::with_settings!({info => &tuple}, {
        insta::assert_debug_snapshot!(tuple);
    });

    #[derive(Serialize, SmartDebug, Default)]
    #[debug(skip)]
    struct GlobalSkip((), ());

    let global_skip = GlobalSkip::default();

    insta::with_settings!({ info => &global_skip }, {
        insta::assert_debug_snapshot!(global_skip);
    });

    #[derive(Serialize, SmartDebug)]
    #[debug(skip)]
    struct GlobalSkipWithLocalOverride(#[debug(no_skip)] &'static str, ());

    let global_w_local = GlobalSkipWithLocalOverride("Local override", ());

    insta::with_settings!({ info => &global_w_local }, {
        insta::assert_debug_snapshot!(global_w_local);
    });

    #[derive(Serialize, SmartDebug, Default)]
    struct FirstFieldSkipped(#[debug(skip)] (), ());

    let first_field_skipped = FirstFieldSkipped::default();

    insta::with_settings!({ info => &first_field_skipped }, {
        insta::assert_debug_snapshot!(first_field_skipped);
    });
}

#[test]
fn container_lit_str() {
    #[derive(Serialize, SmartDebug)]
    #[debug("This is a custom debug repr")]
    struct CustomDebugRepr;

    let custom = CustomDebugRepr;

    insta::with_settings!({ info => &custom }, {
        insta::assert_debug_snapshot!(custom);
    });
}