reactive_graph_behaviour_model_api/
transition.rs

1use reactive_graph_reactive_model_api::ReactiveInstance;
2use reactive_graph_reactive_model_api::ReactiveInstanceContainer;
3
4use crate::BehaviourConnectFailed;
5use crate::BehaviourDisconnectFailed;
6use crate::BehaviourInitializationFailed;
7use crate::BehaviourReconnectFailed;
8use crate::BehaviourShutdownFailed;
9use crate::BehaviourTypesContainer;
10
11#[allow(drop_bounds)]
12pub trait BehaviourTransitions<ID: Clone, T: ReactiveInstance<ID> + BehaviourTypesContainer>:
13    ReactiveInstanceContainer<ID, T> + BehaviourInit<ID, T> + BehaviourShutdown<ID, T> + BehaviourConnect<ID, T> + BehaviourDisconnect<ID, T> + Drop
14{
15    /// Reconnects the reactive streams.
16    fn reconnect(&self) -> Result<(), BehaviourReconnectFailed> {
17        self.disconnect().map_err(BehaviourReconnectFailed::BehaviourDisconnectFailed)?;
18        self.connect().map_err(BehaviourReconnectFailed::BehaviourConnectFailed)?;
19        Ok(())
20    }
21}
22
23pub trait BehaviourInit<ID: Clone, T: ReactiveInstance<ID>> {
24    /// Initializes the behaviour. For example, calculates and propagates the initial value.
25    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
26        Ok(())
27    }
28}
29
30pub trait BehaviourShutdown<ID: Clone, T: ReactiveInstance<ID>> {
31    /// Destructs the behaviour.
32    fn shutdown(&self) -> Result<(), BehaviourShutdownFailed> {
33        Ok(())
34    }
35}
36
37pub trait BehaviourConnect<ID: Clone, T: ReactiveInstance<ID>> {
38    /// Connects the reactive streams.
39    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
40        Ok(())
41    }
42}
43
44pub trait BehaviourDisconnect<ID: Clone, T: ReactiveInstance<ID>> {
45    /// Disconnects the reactive streams.
46    fn disconnect(&self) -> Result<(), BehaviourDisconnectFailed> {
47        Ok(())
48    }
49}