#literals #automatic #default #insert #struct #proc-macro

macro autodefault

A proc macro that automatically inserts ..Default::default() into your struct literals

3 stable releases

2.0.0 Apr 11, 2021
1.1.0 Apr 10, 2021
1.0.0 Apr 10, 2021

#1850 in Procedural macros

Download history 50/week @ 2024-07-21 26/week @ 2024-07-28 14/week @ 2024-08-04 25/week @ 2024-08-11 14/week @ 2024-08-18 13/week @ 2024-08-25 22/week @ 2024-09-01 34/week @ 2024-09-08 11/week @ 2024-09-15 33/week @ 2024-09-22 22/week @ 2024-09-29 3/week @ 2024-10-06 21/week @ 2024-10-13 9/week @ 2024-10-20 106/week @ 2024-10-27 33/week @ 2024-11-03

169 downloads per month

MPL-2.0 license

18KB
259 lines

Crates.io Crates.io docs.rs

autodefault

A library that automatically inserts ..Default::default() for you.

The pitch

Has this ever happened to you?

#[derive(Debug, Default, PartialEq, Eq)]
struct Inner {
    x: i32,
    y: i32,
    z: i32,
}

#[derive(Debug, Default, PartialEq, Eq)]
struct Mid {
    a: Inner,
    b: Inner,
    c: Inner,
    d: Inner
}

#[derive(Debug, Default, PartialEq, Eq)]
struct Outer {
    mid1: Mid,
    mid2: Mid,
    mid3: Mid,
    mid4: Mid,
}

fn build_outer() -> Outer {
    Outer {
        mid1: Mid {
            a: Inner {
                x: 10,
                ..Default::default()  // :D
            },
            b: Inner {
                y: 10,
                ..Default::default()  // :)
            },
            ..Default::default()  // :|
        },
        mid2: Mid {
            b: Inner {
                z: 10,
                ..Default::default()  // :/
            },
            ..Default::default()  // :(
        },
        ..Default::default()  // >:(
    }
}

Wouldn't it be nice if you could omit all the tedious ..Default::default() calls when building deeply nested struct literals? Now you can! With autodefault, it's never been easier to build up a large struct literal for your tests, bevy components, or anything else you might need!. Simply tag any function with the #[autodefault] attribute and let us handle the rest:

use autodefault::autodefault;

#[autodefault]
fn build_outer_simple() -> Outer {
    Outer {
        mid1: Mid {
            a: Inner { x: 10 },
            b: Inner { y: 10 },
        },
        mid2: Mid {
            b: Inner { z: 10 },
        }
    }
}  // :O

assert_eq!(build_outer(), build_outer_simple())

It's never been easier! Check out the reference documentation for more details.

Dependencies

~1.5MB
~36K SLoC