nautilus_common/
component.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16use crate::enums::{ComponentState, ComponentTrigger};
17
18impl ComponentState {
19    #[rustfmt::skip]
20    pub fn transition(&mut self, trigger: &ComponentTrigger) -> anyhow::Result<Self> {
21        let new_state = match (&self, trigger) {
22            (Self::PreInitialized, ComponentTrigger::Initialize) => Self::Ready,
23            (Self::Ready, ComponentTrigger::Reset) => Self::Resetting,
24            (Self::Ready, ComponentTrigger::Start) => Self::Starting,
25            (Self::Ready, ComponentTrigger::Dispose) => Self::Disposing,
26            (Self::Resetting, ComponentTrigger::ResetCompleted) => Self::Ready,
27            (Self::Starting, ComponentTrigger::StartCompleted) => Self::Running,
28            (Self::Starting, ComponentTrigger::Stop) => Self::Stopping,
29            (Self::Starting, ComponentTrigger::Fault) => Self::Faulting,
30            (Self::Running, ComponentTrigger::Stop) => Self::Stopping,
31            (Self::Running, ComponentTrigger::Degrade) => Self::Degrading,
32            (Self::Running, ComponentTrigger::Fault) => Self::Faulting,
33            (Self::Resuming, ComponentTrigger::Stop) => Self::Stopping,
34            (Self::Resuming, ComponentTrigger::ResumeCompleted) => Self::Running,
35            (Self::Resuming, ComponentTrigger::Fault) => Self::Faulting,
36            (Self::Stopping, ComponentTrigger::StopCompleted) => Self::Stopped,
37            (Self::Stopping, ComponentTrigger::Fault) => Self::Faulting,
38            (Self::Stopped, ComponentTrigger::Reset) => Self::Resetting,
39            (Self::Stopped, ComponentTrigger::Resume) => Self::Resuming,
40            (Self::Stopped, ComponentTrigger::Dispose) => Self::Disposing,
41            (Self::Stopped, ComponentTrigger::Fault) => Self::Faulting,
42            (Self::Degrading, ComponentTrigger::DegradeCompleted) => Self::Degraded,
43            (Self::Degraded, ComponentTrigger::Resume) => Self::Resuming,
44            (Self::Degraded, ComponentTrigger::Stop) => Self::Stopping,
45            (Self::Degraded, ComponentTrigger::Fault) => Self::Faulting,
46            (Self::Disposing, ComponentTrigger::DisposeCompleted) => Self::Disposed,
47            (Self::Faulting, ComponentTrigger::FaultCompleted) => Self::Faulted,
48            _ => anyhow::bail!("Invalid state trigger {self} -> {trigger}"),
49        };
50        Ok(new_state)
51    }
52}