extern crate downcast; use downcast::{downcast, downcast_sync, Any, AnySync}; use std::sync::Arc; trait Simple: Any {} downcast!(dyn Simple); trait WithParams: Any {} downcast!( dyn WithParams); struct Param1; struct Param2; struct ImplA { data: String } impl Simple for ImplA {} impl WithParams for ImplA {} struct ImplB; impl Simple for ImplB {} impl WithParams for ImplB {} #[test] fn simple(){ let mut a: Box = Box::new(ImplA{ data: "data".into() }); assert_eq!(a.downcast_ref::().unwrap().data, "data"); assert!(a.downcast_ref::().is_err()); assert_eq!(a.downcast_mut::().unwrap().data, "data"); assert!(a.downcast_mut::().is_err()); assert_eq!(a.downcast::().unwrap().data, "data"); } #[test] fn with_params(){ let mut a: Box> = Box::new(ImplA{ data: "data".into() }); assert_eq!(a.downcast_ref::().unwrap().data, "data"); assert!(a.downcast_ref::().is_err()); assert_eq!(a.downcast_mut::().unwrap().data, "data"); assert!(a.downcast_mut::().is_err()); assert_eq!(a.downcast::().unwrap().data, "data"); } trait SimpleSync: AnySync {} downcast_sync!(dyn SimpleSync); impl SimpleSync for ImplA {} impl SimpleSync for ImplB {} #[test] fn simple_sync(){ let a: Arc = Arc::new(ImplA{ data: "data".into() }); assert_eq!(a.downcast_ref::().unwrap().data, "data"); assert!(a.downcast_ref::().is_err()); assert_eq!(a.downcast_arc::().unwrap().data, "data"); } trait WithParamsSync: AnySync {} downcast_sync!( dyn WithParamsSync); impl WithParamsSync for ImplA {} impl WithParamsSync for ImplB {} #[test] fn with_params_sync() { let a: Arc> = Arc::new(ImplA{ data: "data".into() }); assert_eq!(a.downcast_ref::().unwrap().data, "data"); assert!(a.downcast_ref::().is_err()); assert_eq!(a.downcast_arc::().unwrap().data, "data"); }