Crate devault[−][src]
Expand description
A more flexible alternative to deriving Default
.
Deriving Devault
behaves the same as deriving Default
, but includes some added benefits.
Added Benefits
devault allows for specifying specific default values for fields, even if Default
is not
implemented for their respective type.
use devault::Devault; const C: u32 = 10; #[derive(Debug, Devault, PartialEq)] struct Foo { a: u8, #[devault("1.0")] b: f32, #[devault("C")] c: u32, #[devault("Bar(0.5)")] d: Bar, } #[derive(Debug, PartialEq)] struct Bar(f32); fn main() { let foo = Foo::default(); assert_eq!(foo.a, 0); assert_eq!(foo.b, 1.0); assert_eq!(foo.c, C); assert_eq!(foo.d, Bar(0.5)); }
It can be derived for enums too, with the requirement that a default value is provided.
use devault::Devault; #[derive(Debug, Devault, PartialEq)] #[devault("Foo::B(128)")] enum Foo { A, B(u8), } fn main() { assert_eq!(Foo::default(), Foo::B(128)); }
devault can generate associated constants and/or functions for constructing a field’s
default value outside of the Default
implementation.
use devault::Devault; #[derive(Debug, Devault, PartialEq)] struct Foo { #[devault("1.0", constant)] a: f32, #[devault("10", function)] b: u32, #[devault("0.5", constant = "INIT_C", function = "start_c")] c: f32, } #[derive(Debug, Devault, PartialEq)] #[devault("Bar::B(42)", constant)] enum Bar { A, B(u8), } fn main() { assert_eq!(Foo::DEFAULT_A, 1.0); assert_eq!(Foo::default_b(), 10); assert_eq!(Foo::INIT_C, 0.5); assert_eq!(Foo::start_c(), 0.5); assert_eq!(Bar::DEFAULT, Bar::B(42)); }
TODO
- Support generic types.