structural-convert 0.13.0

Derive conversion traits (From, Into, TryFrom, TryInto) when fields are structurally similar in enums or structs
Documentation
use structural_convert::StructuralConvert;

#[test]
fn variant_is_unit_default() {
    #[derive(Debug, PartialEq, StructuralConvert)]
    #[convert(try_into(Lhs, default))]
    enum Rhs {
        #[convert(try_into(skip))]
        A,
    }

    #[derive(Debug, PartialEq, Default)]
    enum Lhs {
        #[default]
        X,
    }

    assert_eq!(Lhs::default(), Rhs::A.try_into().unwrap());
}

#[test]
fn variant_is_unnamed_default() {
    #[derive(Debug, PartialEq, StructuralConvert)]
    #[convert(try_into(Lhs, default))]
    enum Rhs {
        #[convert(try_into(skip))]
        A(i8, u32),
    }

    #[derive(Debug, PartialEq)]
    enum Lhs {
        X(i32, u32),
    }

    impl Default for Lhs {
        fn default() -> Self {
            Lhs::X(Default::default(), Default::default())
        }
    }

    assert_eq!(Lhs::default(), Rhs::A(1, 2).try_into().unwrap());
}

#[test]
fn variant_is_named_default() {
    #[derive(Debug, PartialEq, StructuralConvert)]
    #[convert(try_into(Lhs, default))]
    enum Rhs {
        #[convert(try_into(skip))]
        A { z: i8, x: u32 },
    }

    #[derive(Debug, PartialEq)]
    enum Lhs {
        X {},
    }

    impl Default for Lhs {
        fn default() -> Self {
            Lhs::X {}
        }
    }

    assert_eq!(Lhs::default(), Rhs::A { z: 1, x: 2 }.try_into().unwrap());
}

#[test]
fn variant_is_named_default_to_field() {
    #[derive(Debug, PartialEq, StructuralConvert)]
    #[convert(try_into(Lhs, default_for_fields("y", "e")))]
    enum Rhs {
        A { z: i8, x: u32 },
    }

    #[derive(Debug, PartialEq)]
    enum Lhs {
        A { z: i32, x: u32, y: u32, e: u32 },
    }

    assert_eq!(
        Lhs::A {
            z: 1,
            x: 2,
            y: Default::default(),
            e: Default::default()
        },
        Rhs::A { z: 1, x: 2 }.try_into().unwrap()
    );
}