#[macro_use] extern crate derivative; #[derive(Debug, Derivative, PartialEq)] #[derivative(Default="new")] struct Foo { foo: T, #[derivative(Default(value="min()", bound="U: std::ops::Not, U: Default"))] bar: U, } #[derive(Debug, Derivative, PartialEq)] #[derivative(Default(bound="T: Default, U: std::ops::Not, U: Default", new="true"))] struct Bar { foo: T, #[derivative(Default(value="min()"))] bar: U, } fn min>() -> T { !T::default() } #[derive(Debug, Derivative, PartialEq)] #[derivative(Default(bound=""))] struct WithOption { foo: Option, } struct NonDefault; #[test] fn main() { assert_eq!(Foo::default(), Foo { foo: 0u8, bar: 0xffu8 }); assert_eq!(Bar::default(), Bar { foo: 0u8, bar: 0xffu8 }); assert_eq!(Foo::new(), Foo { foo: 0u8, bar: 0xffu8 }); assert_eq!(Bar::new(), Bar { foo: 0u8, bar: 0xffu8 }); WithOption::::default(); }