#[macro_use] extern crate specialize_call; struct A(); struct B(); struct C(); #[derive(Debug)] enum Select { A, B, C, } use core::any::type_name as tn; #[test] fn specialize_call_1() { fn do_it(_arg: usize) -> &'static str { tn::() } assert_eq!( Some(tn::>()), specialize_call!(do_it, (1), Select::<1>::A, [ (Select::<1>::A => A::<1>), (Select::<1>::B => B::<1>), ]) ); assert_eq!( Some(tn::>()), specialize_call!(do_it, (2), Select::<1>::B, [ (Select::<1>::A => A::<1>), (Select::<1>::B => B::<1>), ]) ); assert_eq!( None::<&str>, specialize_call!(do_it, (3), Select::<1>::C, [ (Select::<1>::A => A::<1>), (Select::<1>::B => B::<1>), ]) ); } #[test] fn specialize_call_2() { fn do_it(_arg: usize) -> (&'static str, &'static str) { (tn::(), tn::()) } assert_eq!( Some((tn::>(), tn::>())), specialize_call!(do_it, (1), (Select::<1>::A, Select::<2>::C), [ (Select::<1>::A => A::<1>), (Select::<1>::B => B::<1>), ], [ (Select::<2>::B => B::<2>), (Select::<2>::C => C::<2>), ] ) ); assert_eq!( Some((tn::>(), tn::>())), specialize_call!(do_it, (1), (Select::<1>::B, Select::<2>::B), [ (Select::<1>::A => A::<1>), (Select::<1>::B => B::<1>), ], [ (Select::<2>::B => B::<2>), (Select::<2>::C => C::<2>), ] ) ); assert_eq!( None::<(&str, &str)>, specialize_call!(do_it, (1), (Select::<1>::C, Select::<2>::C), [ (Select::<1>::A => A::<1>), (Select::<1>::B => B::<1>), ], [ (Select::<2>::B => B::<2>), (Select::<2>::C => C::<2>), ] ) ); assert_eq!( None::<(&str, &str)>, specialize_call!(do_it, (1), (Select::<1>::A, Select::<2>::A), [ (Select::<1>::A => A::<1>), (Select::<1>::B => B::<1>), ], [ (Select::<2>::B => B::<2>), (Select::<2>::C => C::<2>), ] ) ); }