nautilus_common/
component.rs1use std::fmt::Debug;
17
18use nautilus_model::identifiers::ComponentId;
19
20use crate::{
21 enums::{ComponentState, ComponentTrigger},
22 timer::TimeEvent,
23};
24
25pub trait Component: Debug {
27 fn id(&self) -> ComponentId;
29
30 fn state(&self) -> ComponentState;
32
33 fn trigger(&self) -> ComponentTrigger;
35
36 fn is_running(&self) -> bool;
38
39 fn is_stopped(&self) -> bool;
41
42 fn is_disposed(&self) -> bool;
44
45 fn start(&mut self) -> anyhow::Result<()>;
51
52 fn stop(&mut self) -> anyhow::Result<()>;
58
59 fn reset(&mut self) -> anyhow::Result<()>;
65
66 fn dispose(&mut self) -> anyhow::Result<()>;
72
73 fn handle_event(&mut self, event: TimeEvent);
75}
76
77#[rustfmt::skip]
78impl ComponentState {
79 pub fn transition(&mut self, trigger: &ComponentTrigger) -> anyhow::Result<Self> {
85 let new_state = match (&self, trigger) {
86 (Self::PreInitialized, ComponentTrigger::Initialize) => Self::Ready,
87 (Self::Ready, ComponentTrigger::Reset) => Self::Resetting,
88 (Self::Ready, ComponentTrigger::Start) => Self::Starting,
89 (Self::Ready, ComponentTrigger::Dispose) => Self::Disposing,
90 (Self::Resetting, ComponentTrigger::ResetCompleted) => Self::Ready,
91 (Self::Starting, ComponentTrigger::StartCompleted) => Self::Running,
92 (Self::Starting, ComponentTrigger::Stop) => Self::Stopping,
93 (Self::Starting, ComponentTrigger::Fault) => Self::Faulting,
94 (Self::Running, ComponentTrigger::Stop) => Self::Stopping,
95 (Self::Running, ComponentTrigger::Degrade) => Self::Degrading,
96 (Self::Running, ComponentTrigger::Fault) => Self::Faulting,
97 (Self::Resuming, ComponentTrigger::Stop) => Self::Stopping,
98 (Self::Resuming, ComponentTrigger::ResumeCompleted) => Self::Running,
99 (Self::Resuming, ComponentTrigger::Fault) => Self::Faulting,
100 (Self::Stopping, ComponentTrigger::StopCompleted) => Self::Stopped,
101 (Self::Stopping, ComponentTrigger::Fault) => Self::Faulting,
102 (Self::Stopped, ComponentTrigger::Reset) => Self::Resetting,
103 (Self::Stopped, ComponentTrigger::Resume) => Self::Resuming,
104 (Self::Stopped, ComponentTrigger::Dispose) => Self::Disposing,
105 (Self::Stopped, ComponentTrigger::Fault) => Self::Faulting,
106 (Self::Degrading, ComponentTrigger::DegradeCompleted) => Self::Degraded,
107 (Self::Degraded, ComponentTrigger::Resume) => Self::Resuming,
108 (Self::Degraded, ComponentTrigger::Stop) => Self::Stopping,
109 (Self::Degraded, ComponentTrigger::Fault) => Self::Faulting,
110 (Self::Disposing, ComponentTrigger::DisposeCompleted) => Self::Disposed,
111 (Self::Faulting, ComponentTrigger::FaultCompleted) => Self::Faulted,
112 _ => anyhow::bail!("Invalid state trigger {self} -> {trigger}"),
113 };
114 Ok(new_state)
115 }
116}