derive-ctor 1.0.6

Adds `#[derive(ctor)]` which allows for the auto-generation of struct, enum, and union constructors.
Documentation
use derive_ctor::ctor;

#[derive(Debug, PartialEq)]
struct NoDefault {}

#[derive(ctor, Debug, PartialEq)]
#[ctor(default)]
struct DefaultCtorStruct {
    #[ctor(expr(NoDefault {}))]
    name: NoDefault,
    #[ctor(default)]
    value: i32,
}

#[test]
fn test_struct_with_default_ctor() {
    let result = Default::default();
    assert_eq!(
        DefaultCtorStruct {
            name: NoDefault {},
            value: 0
        },
        result
    );
}

#[derive(ctor, Debug, PartialEq)]
#[ctor(pub new, default)]
struct TestDefaultCtorWithTargetedFieldConfig {
    #[ctor(expr(String::from("Default")) = 1)]
    name: String,
    #[ctor(expr(404) = 1)]
    value: u32,
}

#[test]
fn test_struct_with_targeted_field_default_ctor() {
    let non_default = TestDefaultCtorWithTargetedFieldConfig::new(String::from("Foo"), 505);
    assert_eq!(
        TestDefaultCtorWithTargetedFieldConfig {
            name: String::from("Foo"),
            value: 505
        },
        non_default
    );

    let default = Default::default();
    assert_eq!(
        TestDefaultCtorWithTargetedFieldConfig {
            name: String::from("Default"),
            value: 404
        },
        default
    );
}

#[derive(ctor, Debug, PartialEq)]
#[ctor(default(all))]
struct ImplementDefaultAllMembers {
    name: String,
    value: u32,
    #[ctor(expr(NoDefault {}))]
    no_default: NoDefault,
    #[ctor(into)]
    provided: String,
    #[ctor(expr!(adjusted - 10))]
    adjusted: i32
}

#[test]
fn test_struct_implement_default_all_members() {
    let result = Default::default();
    assert_eq!(
        ImplementDefaultAllMembers {
            name: Default::default(),
            value: Default::default(),
            no_default: NoDefault {},
            provided: Default::default(),
            adjusted: 0,
        },
        result
    );
}

#[derive(ctor, Debug, PartialEq)]
#[ctor(with_defaults(default), new(into))]
struct CtorNestedProperties {
    name: String,
    #[ctor(expr!(value + 1))]
    value: u32
}

#[test]
fn test_struct_with_nested_properties() {
    let test1 = CtorNestedProperties::with_defaults();
    assert_eq!(CtorNestedProperties { name: String::default(), value: 0 }, test1);
    
    let test2 = CtorNestedProperties::new("FooBar", 30);
    assert_eq!(CtorNestedProperties { name: String::from("FooBar"), value: 31 },  test2)
    
}