Derive Macro smart_default::SmartDefault
source · #[derive(SmartDefault)]
{
// Attributes available to this derive:
#[default]
}
Expand description
Smart Default
This crate provides a custom derive for SmartDefault
. SmartDefault
is not a real trait -
deriving it will actually impl Default
. The difference from regular #[derive(Default)]
is
that #[derive(SmartDefault)]
allows you to use #[default = "..."]
attributes to customize
the ::default()
method and to support struct
s that don’t have Default
for all their
fields - and even enum
s!
Examples
use smart_default::SmartDefault;
#[derive(SmartDefault)]
enum Foo {
Bar,
#[default]
Baz {
#[default = 12]
a: i32,
b: i32,
#[default(Some(Default::default()))]
c: Option<i32>,
#[default(_code = "vec![1, 2, 3]")]
d: Vec<u32>,
#[default = "four"]
e: String,
},
Qux(i32),
}
assert!(Foo::default() == Foo::Baz {
a: 12,
b: 0,
c: Some(0),
d: vec![1, 2, 3],
e: "four".to_owned(),
});
Baz
has the#[default]
attribute. This means that the defaultFoo
is aFoo::Baz
. Only one variant may have a#[default]
attribute, and that attribute must have no value.a
has a#[default = 12]
attribute. This means that it’s default value is12
.b
has no#[default = ...]
attribute. It’s default value willi32
’s default value instead -0
.c
is anOption<i32>
, and it’s default isSome(Default::default())
. Rust cannot (currently) parse#[default = Some(Default::default())]
and therefore we have to use a special syntax:#[default(Some(Default::default))]
d
has the!
token in it, which cannot (currently) be parsed even with#[default(...)]
, so we have to encode it as a string and mark it as_code =
.e
is aString
, so the string literal “four” is automatically converted to it. This automatic conversion only happens to string (or byte string) literals - and only if_code
is not used.- Documentation for the
impl Default
section is generated automatically, specifying the default value returned from::default()
.