derive-ctor 0.2.2

Adds `#[derive(ctor)]` which allows for the auto-generation of a constructor.
Documentation
use derive_ctor::ctor;
#[derive(ctor, Debug, PartialEq)]
#[ctor(init)]
struct Empty2 {}

#[test]
fn test_empty_struct_config_name() {
    let empty = Empty2::init();
    assert_eq!(Empty2 { }, empty)
}

#[derive(ctor, Debug, PartialEq)]
#[ctor(pub(crate) new)]
struct VisibilityStruct {}

#[test]
fn test_method_visibility() {
    let visibility = VisibilityStruct::new();
    assert_eq!(VisibilityStruct {}, visibility)
}

#[derive(ctor, Debug, PartialEq)]
#[ctor(m1, m2)]
struct ManyMethodStruct {}

#[test]
fn test_empty_struct_many_methods() {
    let many1 = ManyMethodStruct::m1();
    assert_eq!(ManyMethodStruct {}, many1);
    let many2 = ManyMethodStruct::m2();
    assert_eq!(ManyMethodStruct {}, many2);
}

#[derive(ctor, Debug, PartialEq)]
#[ctor(pub m1, pub(crate) m2, m3)]
struct ManyVisibleMethodStruct {}

#[test]
fn test_empty_struct_many_methods_with_visibility() {
    let m1 = ManyVisibleMethodStruct::m1();
    assert_eq!(ManyVisibleMethodStruct {}, m1);
    let m2 = ManyVisibleMethodStruct::m2();
    assert_eq!(ManyVisibleMethodStruct {}, m2);
    let m3 = ManyVisibleMethodStruct::m3();
    assert_eq!(ManyVisibleMethodStruct {}, m3);
}

#[derive(ctor, Debug, PartialEq)]
#[ctor(init)]
struct FieldStructCustomCtor {
    value: u32
}

#[test]
fn test_field_struct_with_custom_ctor_name() {
    let field_struct = FieldStructCustomCtor::init(15);
    assert_eq!(FieldStructCustomCtor { value: 15 }, field_struct);
}

#[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);
}