1 extern crate downcast;
2 use downcast::{downcast, downcast_sync, Any, AnySync};
3 use std::sync::Arc;
4
5 trait Simple: Any {}
6 downcast!(dyn Simple);
7
8 trait WithParams<T, U>: Any {}
9 downcast!(<T, U> dyn WithParams<T, U>);
10 struct Param1;
11 struct Param2;
12
13 struct ImplA {
14 data: String
15 }
16 impl Simple for ImplA {}
17 impl WithParams<Param1, Param2> for ImplA {}
18
19 struct ImplB;
20 impl Simple for ImplB {}
21 impl WithParams<Param1, Param2> for ImplB {}
22
23 #[test]
simple()24 fn simple(){
25 let mut a: Box<dyn Simple> = Box::new(ImplA{ data: "data".into() });
26
27 assert_eq!(a.downcast_ref::<ImplA>().unwrap().data, "data");
28 assert!(a.downcast_ref::<ImplB>().is_err());
29
30 assert_eq!(a.downcast_mut::<ImplA>().unwrap().data, "data");
31 assert!(a.downcast_mut::<ImplB>().is_err());
32
33 assert_eq!(a.downcast::<ImplA>().unwrap().data, "data");
34 }
35
36 #[test]
with_params()37 fn with_params(){
38 let mut a: Box<dyn WithParams<Param1, Param2>> = Box::new(ImplA{ data: "data".into() });
39
40 assert_eq!(a.downcast_ref::<ImplA>().unwrap().data, "data");
41 assert!(a.downcast_ref::<ImplB>().is_err());
42
43 assert_eq!(a.downcast_mut::<ImplA>().unwrap().data, "data");
44 assert!(a.downcast_mut::<ImplB>().is_err());
45
46 assert_eq!(a.downcast::<ImplA>().unwrap().data, "data");
47 }
48
49 trait SimpleSync: AnySync {}
50 downcast_sync!(dyn SimpleSync);
51
52 impl SimpleSync for ImplA {}
53 impl SimpleSync for ImplB {}
54
55 #[test]
simple_sync()56 fn simple_sync(){
57 let a: Arc<dyn SimpleSync> = Arc::new(ImplA{ data: "data".into() });
58
59 assert_eq!(a.downcast_ref::<ImplA>().unwrap().data, "data");
60 assert!(a.downcast_ref::<ImplB>().is_err());
61
62 assert_eq!(a.downcast_arc::<ImplA>().unwrap().data, "data");
63 }
64
65 trait WithParamsSync<T, U>: AnySync {}
66 downcast_sync!(<T, U> dyn WithParamsSync<T, U>);
67 impl WithParamsSync<Param1, Param2> for ImplA {}
68 impl WithParamsSync<Param1, Param2> for ImplB {}
69
70 #[test]
with_params_sync()71 fn with_params_sync() {
72 let a: Arc<dyn WithParamsSync<Param1, Param2>> = Arc::new(ImplA{ data: "data".into() });
73
74 assert_eq!(a.downcast_ref::<ImplA>().unwrap().data, "data");
75 assert!(a.downcast_ref::<ImplB>().is_err());
76
77 assert_eq!(a.downcast_arc::<ImplA>().unwrap().data, "data");
78 }
79