boomerang_runtime/
reactor.rs1use 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 name: String,
24 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}