respo/node/component/effect/
base.rs

1//! in order to make Effect implement PartialEq and as Any, some tricks are needed
2
3use std::{any::Any, fmt::Debug};
4
5/// A trick to share upcasting
6/// https://stackoverflow.com/a/28664881/883571
7pub trait AsRespoEffectBase {
8  fn as_base(&self) -> &dyn RespoEffectDynEq;
9}
10
11impl<T: RespoEffectDynEq> AsRespoEffectBase for T {
12  fn as_base(&self) -> &dyn RespoEffectDynEq {
13    self
14  }
15}
16
17pub trait RespoEffectDynEq
18where
19  Self: Debug + Any + 'static,
20{
21  fn as_any(&self) -> &dyn Any;
22  fn do_eq(&self, rhs: &dyn RespoEffectDynEq) -> Option<bool>;
23}
24
25impl<T> RespoEffectDynEq for T
26where
27  T: PartialEq + Debug + 'static,
28{
29  fn as_any(&self) -> &dyn Any {
30    self
31  }
32
33  fn do_eq(&self, rhs: &dyn RespoEffectDynEq) -> Option<bool> {
34    if let Some(rhs_concrete) = rhs.as_any().downcast_ref::<Self>() {
35      Some(self == rhs_concrete)
36    } else {
37      Some(false)
38    }
39  }
40}
41
42impl PartialEq for dyn RespoEffectDynEq {
43  fn eq(&self, rhs: &Self) -> bool {
44    self.do_eq(rhs) == Some(true)
45  }
46}