#![allow(dead_code)] #[macro_use] extern crate derive_more; use std::borrow::Cow; #[derive(From)] struct EmptyTuple(); #[derive(From)] struct EmptyStruct {} #[derive(From)] struct EmptyUnit; #[derive(From)] struct MyInt(i32); #[derive(From)] struct MyInts(i32, i32); #[derive(From)] struct Point1D { x: i32, } #[derive(From)] struct Point2D { x: i32, y: i32, } #[derive(From)] enum MixedInts { SmallInt(i32), NamedBigInt { int: i64, }, TwoSmallInts(i32, i32), NamedBigInts { x: i64, y: i64, }, #[from(ignore)] Unsigned(u32), NamedUnsigned { x: u32, }, } #[derive(PartialEq, Eq, Debug)] #[derive(From)] #[from(forward)] struct MyIntForward(u64); #[test] fn forward_struct() { assert_eq!(MyIntForward(42), 42u32.into()); assert_eq!(MyIntForward(42), 42u16.into()); assert_eq!(MyIntForward(42), 42u64.into()); } #[derive(PartialEq, Eq, Debug)] #[derive(From)] enum MixedIntsForward { #[from(forward)] SmallInt(i32), NamedBigInt { int: i64, }, } #[test] fn forward_enum() { assert_eq!(MixedIntsForward::SmallInt(42), 42i32.into()); assert_eq!(MixedIntsForward::SmallInt(42), 42i16.into()); } #[derive(From, PartialEq)] enum AutoIgnore { SmallInt(i32), Uninteresting, Uninteresting2, } #[test] fn auto_ignore_variants() { assert!(AutoIgnore::SmallInt(42) == 42i32.into()); } #[derive(From, PartialEq)] enum AutoIgnoreWithDefaultTrue { #[from(ignore)] SmallInt(i32), Uninteresting, Uninteresting2, } #[derive(From, PartialEq)] enum AutoIgnoreWithForwardFields2 { #[from(forward)] SmallInt(i32), SmallIntIgnore(i32), } #[test] fn auto_ignore_with_forward_field2() { assert!(AutoIgnoreWithForwardFields2::SmallInt(42) == 42i32.into()); assert!(AutoIgnoreWithForwardFields2::SmallInt(42) == 42i16.into()); } #[derive(Debug, Eq, PartialEq)] #[derive(From)] #[from(types(u8, u16, u32))] struct MyIntExplicit(u64); #[test] fn explicit_types_struct() { assert_eq!(MyIntExplicit(42), 42u8.into()); assert_eq!(MyIntExplicit(42), 42u16.into()); assert_eq!(MyIntExplicit(42), 42u32.into()); assert_eq!(MyIntExplicit(42), 42u64.into()); } #[derive(Debug, Eq, PartialEq)] #[derive(From)] #[from(types(i8, i16))] struct MyIntsExplicit(i32, i32); #[test] fn explicit_types_struct_tupled() { assert_eq!(MyIntsExplicit(42, 42), (42i32, 42i32).into()); assert_eq!(MyIntsExplicit(42, 42), (42i8, 42i8).into()); assert_eq!(MyIntsExplicit(42, 42), (42i16, 42i16).into()); } #[derive(Debug, Eq, PartialEq)] #[derive(From)] enum MixedIntsExplicit { #[from(types(i8))] SmallInt(i32), #[from(types(i16, i64))] AnotherInt(i128), NamedBigInt { int: i64, }, } #[test] fn explicit_types_enum() { assert_eq!(MixedIntsExplicit::SmallInt(42), 42i32.into()); assert_eq!(MixedIntsExplicit::SmallInt(42), 42i8.into()); assert_eq!(MixedIntsExplicit::AnotherInt(42), 42i128.into()); assert_eq!(MixedIntsExplicit::AnotherInt(42), 42i64.into()); assert_eq!(MixedIntsExplicit::AnotherInt(42), 42i16.into()); } #[derive(Debug, Eq, PartialEq)] #[derive(From)] #[from(types(i8, i16))] struct Point2DExplicit { x: i32, y: i32, } #[test] fn explicit_types_point_2d() { let expected = Point2DExplicit { x: 42, y: 42 }; assert_eq!(expected, (42i32, 42i32).into()); assert_eq!(expected, (42i8, 42i8).into()); assert_eq!(expected, (42i16, 42i16).into()); } #[derive(Debug, Eq, PartialEq)] #[derive(From)] #[from(types("Cow<'_, str>", "&str"))] struct Name(String); #[test] fn explicit_complex_types_name() { let name = "EƤrendil"; let expected = Name(name.to_owned()); assert_eq!(expected, name.to_owned().into()); assert_eq!(expected, name.into()); assert_eq!(expected, Cow::Borrowed(name).into()); }