1*bd70d2d1SLoGin use intertrait::*; 2*bd70d2d1SLoGin use intertrait::cast::*; 3*bd70d2d1SLoGin use std::marker::PhantomData; 4*bd70d2d1SLoGin 5*bd70d2d1SLoGin #[cast_to(Greet)] 6*bd70d2d1SLoGin struct Data<T: 'static> { 7*bd70d2d1SLoGin phantom: PhantomData<T>, 8*bd70d2d1SLoGin } 9*bd70d2d1SLoGin 10*bd70d2d1SLoGin trait Source: CastFrom {} 11*bd70d2d1SLoGin 12*bd70d2d1SLoGin trait Greet { greet(&self)13*bd70d2d1SLoGin fn greet(&self); 14*bd70d2d1SLoGin } 15*bd70d2d1SLoGin 16*bd70d2d1SLoGin impl<T: 'static> Greet for Data<T> { greet(&self)17*bd70d2d1SLoGin fn greet(&self) { 18*bd70d2d1SLoGin println!("Hello"); 19*bd70d2d1SLoGin } 20*bd70d2d1SLoGin } 21*bd70d2d1SLoGin 22*bd70d2d1SLoGin impl<T: 'static> Source for Data<T> {} 23*bd70d2d1SLoGin main()24*bd70d2d1SLoGinfn main() { 25*bd70d2d1SLoGin let data = Data::<i32> { 26*bd70d2d1SLoGin phantom: PhantomData, 27*bd70d2d1SLoGin }; 28*bd70d2d1SLoGin let source: &dyn Source = &data; 29*bd70d2d1SLoGin let greet = source.cast::<dyn Greet>(); 30*bd70d2d1SLoGin greet.unwrap().greet(); 31*bd70d2d1SLoGin } 32