derive-ctor 1.0.3

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

#[derive(ctor, Debug, PartialEq)]
#[ctor(new, new2)]
struct TargetedGenerationStruct {
    arg1: u32,
    #[ctor(default = [0])]
    arg2: u32,
}

#[test]
fn test_struct_with_targeted_generation() {
    let targeted = TargetedGenerationStruct::new(100);
    assert_eq!(
        TargetedGenerationStruct {
            arg1: 100,
            arg2: Default::default()
        },
        targeted
    );
    let targeted2 = TargetedGenerationStruct::new2(50, 41);
    assert_eq!(TargetedGenerationStruct { arg1: 50, arg2: 41 }, targeted2);
}

fn test_method_2() -> String {
    String::from("FooBar")
}

#[derive(ctor, Debug, PartialEq)]
#[ctor(new, new2)]
struct TargetedGenerationStruct2 {
    #[ctor(expr(test_method_2()) = [1])]
    arg1: String,
    #[ctor(expr(33) = 0)]
    arg2: u32,
}

#[test]
fn test_struct_with_multiple_targeted_generations() {
    let tgs1 = TargetedGenerationStruct2::new(String::from("one"));
    assert_eq!(
        TargetedGenerationStruct2 {
            arg1: String::from("one"),
            arg2: 33
        },
        tgs1
    );

    let tgs2 = TargetedGenerationStruct2::new2(95);
    assert_eq!(
        TargetedGenerationStruct2 {
            arg1: String::from("FooBar"),
            arg2: 95
        },
        tgs2
    );
}

#[derive(ctor, Debug, PartialEq)]
#[ctor(m1, m2, m3)]
struct TestStructWithFieldWithMultipleTargets {
    #[ctor(into)]
    arg1: String,
    #[ctor(expr(5) = [0, 1])]
    arg2: u32,
}

#[test]
fn test_struct_multiple_targeted_generations_single_field() {
    let tswfwmt1 = TestStructWithFieldWithMultipleTargets::m1("One");
    assert_eq!(
        TestStructWithFieldWithMultipleTargets {
            arg1: String::from("One"),
            arg2: 5
        },
        tswfwmt1
    );

    let tswfwmt1 = TestStructWithFieldWithMultipleTargets::m2("Two");
    assert_eq!(
        TestStructWithFieldWithMultipleTargets {
            arg1: String::from("Two"),
            arg2: 5
        },
        tswfwmt1
    );

    let tswfwmt1 = TestStructWithFieldWithMultipleTargets::m3("Three", 77);
    assert_eq!(
        TestStructWithFieldWithMultipleTargets {
            arg1: String::from("Three"),
            arg2: 77
        },
        tswfwmt1
    );
}