dabus/util/dyn_downcast.rs
1use std::any::Any;
2
3/// This trait allows downcasting `dyn Trait` to `dyn Any`,
4/// which is neccesary when using the `downcast` functions of Any with another trait
5///
6/// # Examples
7///
8/// ```rust
9/// use std::any::Any;
10/// use dabus::extras::AsAny;
11///
12/// // you have this struct
13/// struct Foo;
14///
15/// // and want to use it as `dyn Bar`
16/// trait Bar: AsAny {
17/// fn do_something(&self);
18/// }
19///
20/// impl Bar for Foo {
21/// fn do_something(&self) {
22/// // some work is done here probably
23/// }
24/// }
25/// # fn main() {
26/// // but how do you do that?
27/// let dyn_bar: Box<dyn Bar> = Box::new(Foo);
28///
29/// // use it as that trait
30/// dyn_bar.do_something();
31///
32/// // using AsAny, you can cast dyn Bar to dyn Any, and then call .downcast() on it
33/// let foo_again: Foo = *dyn_bar.to_any().downcast().unwrap();
34/// // tada
35/// # }
36/// ```
37pub trait AsAny: 'static {
38 fn as_any(&self) -> &dyn Any;
39 fn mut_any(&mut self) -> &mut dyn Any;
40 fn to_any(self: Box<Self>) -> Box<dyn Any>;
41}
42
43impl<T: 'static> AsAny for T {
44 fn as_any(&self) -> &dyn Any {
45 self
46 }
47 fn mut_any(&mut self) -> &mut dyn Any {
48 self
49 }
50 fn to_any(self: Box<Self>) -> Box<dyn Any> {
51 self
52 }
53}