boomerang_runtime/
reactor.rs

1use std::fmt::Debug;
2
3use downcast_rs::{impl_downcast, Downcast};
4
5tinymap::key_type! { pub ReactorKey }
6
7#[cfg(feature = "parallel")]
8pub trait ReactorState: Downcast + Send + Sync {}
9
10#[cfg(feature = "parallel")]
11impl<T> ReactorState for T where T: Downcast + Send + Sync {}
12
13#[cfg(not(feature = "parallel"))]
14pub trait ReactorState: Downcast {}
15
16#[cfg(not(feature = "parallel"))]
17impl<T> ReactorState for T where T: Downcast {}
18
19impl_downcast!(ReactorState);
20
21pub struct Reactor {
22    /// The reactor name
23    name: String,
24    /// The ReactorState
25    pub(crate) state: Box<dyn ReactorState>,
26}
27
28impl Debug for Reactor {
29    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
30        f.debug_struct("Reactor")
31            .field("name", &self.name)
32            .field("state", &"Box<dyn ReactorState>")
33            .finish()
34    }
35}
36
37impl Reactor {
38    pub fn new(name: &str, state: Box<dyn ReactorState>) -> Self {
39        Self {
40            name: name.to_owned(),
41            state,
42        }
43    }
44
45    pub fn get_name(&self) -> &str {
46        &self.name
47    }
48
49    pub fn get_state<T: ReactorState>(&self) -> Option<&T> {
50        self.state.downcast_ref()
51    }
52
53    pub fn get_state_mut<T: ReactorState>(&mut self) -> Option<&mut T> {
54        self.state.downcast_mut()
55    }
56}