#![allow(dead_code)] #[macro_use] extern crate derive_more; use std::borrow::Cow; #[derive(Into)] #[into(owned, ref, ref_mut)] struct EmptyTuple(); #[derive(Into)] #[into(owned, ref, ref_mut)] struct EmptyStruct {} #[derive(Into)] #[into(owned, ref, ref_mut)] struct EmptyUnit; #[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Into)] #[into(owned(types(i64, i128)), ref, ref_mut)] struct MyInt(i32); #[test] fn explicit_types_struct_owned_only() { assert_eq!(i32::from(MyInt(42)), 42i32); assert_eq!(<&i32>::from(&MyInt(42)), &42i32); assert_eq!(<&mut i32>::from(&mut MyInt(42)), &mut 42i32); assert_eq!(i64::from(MyInt(42)), 42i64); assert_eq!(i128::from(MyInt(42)), 42i128); } #[derive(Into)] #[into(owned, ref, ref_mut)] struct MyInts(i32, i32); #[derive(Into)] #[into(owned, ref, ref_mut)] struct Point1D { x: i32, } #[derive(Debug, Eq, PartialEq)] #[derive(Into)] #[into(owned, ref, ref_mut)] struct Point2D { x: i32, y: i32, } #[derive(Into)] #[into(owned, ref, ref_mut)] struct Point2DWithIgnored { x: i32, y: i32, #[into(ignore)] useless: bool, } #[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Into)] #[into(owned(types(i64, i128)), ref, ref_mut, types(i32))] struct MyIntExplicit(MyInt); #[test] fn explicit_types_struct_all() { let mut input = MyIntExplicit(MyInt(42)); assert_eq!(MyInt::from(input), MyInt(42)); assert_eq!(<&MyInt>::from(&input), &MyInt(42)); assert_eq!(<&mut MyInt>::from(&mut input), &mut MyInt(42)); assert_eq!(i32::from(input), 42i32); assert_eq!(<&i32>::from(&input), &42i32); assert_eq!(<&mut i32>::from(&mut input), &mut 42i32); assert_eq!(i64::from(input), 42i64); assert_eq!(i128::from(input), 42i128); } #[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Into)] #[into(owned(types(i32, i64, i128)), ref(types(i32)), ref_mut(types(i32)))] struct MyIntsExplicit(i32, MyInt, MyIntExplicit); #[test] fn explicit_types_struct_tupled() { let mut input = MyIntsExplicit(42i32, MyInt(42), MyIntExplicit(MyInt(42))); assert_eq!( <(i32, MyInt, MyIntExplicit)>::from(input), (42i32, MyInt(42), MyIntExplicit(MyInt(42))), ); assert_eq!( <(&i32, &MyInt, &MyIntExplicit)>::from(&input), (&42i32, &MyInt(42), &MyIntExplicit(MyInt(42))), ); assert_eq!( <(&mut i32, &mut MyInt, &mut MyIntExplicit)>::from(&mut input), (&mut 42i32, &mut MyInt(42), &mut MyIntExplicit(MyInt(42))), ); assert_eq!(<(i32, i32, i32)>::from(input), (42i32, 42i32, 42i32)); assert_eq!(<(&i32, &i32, &i32)>::from(&input), (&42i32, &42i32, &42i32)); assert_eq!( <(&mut i32, &mut i32, &mut i32)>::from(&mut input), (&mut 42i32, &mut 42i32, &mut 42i32), ); assert_eq!(<(i64, i64, i64)>::from(input), (42i64, 42i64, 42i64)); assert_eq!(<(i128, i128, i128)>::from(input), (42i128, 42i128, 42i128)); } #[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Into)] #[into(owned, ref, ref_mut, types(i32))] struct Point2DExplicit { x: MyInt, y: MyInt, } #[test] fn explicit_types_point_2d() { let mut input = Point2DExplicit { x: MyInt(42), y: MyInt(42), }; assert_eq!(<(i32, i32)>::from(input), (42i32, 42i32)); assert_eq!(<(&i32, &i32)>::from(&input), (&42i32, &42i32)); assert_eq!( <(&mut i32, &mut i32)>::from(&mut input), (&mut 42i32, &mut 42i32) ); } #[derive(Clone, Debug, Eq, PartialEq)] #[derive(Into)] #[into(owned(types("Cow<'_, str>")))] struct Name(String); #[test] fn explicit_complex_types_name() { let name = "Ñolofinwë"; let input = Name(name.to_owned()); assert_eq!(String::from(input.clone()), name.to_owned()); assert_eq!(Cow::from(input.clone()), Cow::Borrowed(name)); }