pub struct RunFsm { /* private fields */ }Expand description
Finite state machine for a workflow run.
Wraps a RunStatus and enforces valid transitions via typed
RunEvents. Records every transition in a history log.
§Transition table
| From | Event | To |
|---|---|---|
| Pending | PickedUp | Running |
| Pending | CancelRequested | Cancelled |
| Running | AllStepsCompleted | Completed |
| Running | StepFailed | Failed |
| Running | StepFailedRetryable | Retrying |
| Running | CancelRequested | Cancelled |
| Retrying | RetryStarted | Running |
| Retrying | MaxRetriesExceeded | Failed |
| Retrying | CancelRequested | Cancelled |
| Running | ApprovalRequested | AwaitingApproval |
| AwaitingApproval | Approved | Running |
| AwaitingApproval | Rejected | Failed |
| AwaitingApproval | CancelRequested | Cancelled |
§Examples
use ironflow_engine::fsm::{RunFsm, RunEvent};
use ironflow_store::entities::RunStatus;
let mut fsm = RunFsm::new();
assert_eq!(fsm.state(), RunStatus::Pending);
fsm.apply(RunEvent::PickedUp).unwrap();
assert_eq!(fsm.state(), RunStatus::Running);
fsm.apply(RunEvent::AllStepsCompleted).unwrap();
assert_eq!(fsm.state(), RunStatus::Completed);
assert_eq!(fsm.history().len(), 2);Implementations§
Source§impl RunFsm
impl RunFsm
Sourcepub fn new() -> Self
pub fn new() -> Self
Create a new FSM in Pending state.
§Examples
use ironflow_engine::fsm::RunFsm;
use ironflow_store::entities::RunStatus;
let fsm = RunFsm::new();
assert_eq!(fsm.state(), RunStatus::Pending);Sourcepub fn from_state(state: RunStatus) -> Self
pub fn from_state(state: RunStatus) -> Self
Create a FSM from an existing state (e.g. loaded from DB).
§Examples
use ironflow_engine::fsm::RunFsm;
use ironflow_store::entities::RunStatus;
let fsm = RunFsm::from_state(RunStatus::Running);
assert_eq!(fsm.state(), RunStatus::Running);Sourcepub fn history(&self) -> &[Transition<RunStatus, RunEvent>]
pub fn history(&self) -> &[Transition<RunStatus, RunEvent>]
Returns the full transition history.
Sourcepub fn is_terminal(&self) -> bool
pub fn is_terminal(&self) -> bool
Returns true if the FSM is in a terminal state.
Sourcepub fn apply(
&mut self,
event: RunEvent,
) -> Result<RunStatus, TransitionError<RunStatus, RunEvent>>
pub fn apply( &mut self, event: RunEvent, ) -> Result<RunStatus, TransitionError<RunStatus, RunEvent>>
Apply an event, transitioning to a new state if valid.
§Errors
Returns TransitionError if the event is not allowed in the current state.
§Examples
use ironflow_engine::fsm::{RunFsm, RunEvent};
use ironflow_store::entities::RunStatus;
let mut fsm = RunFsm::new();
// Valid transition
assert!(fsm.apply(RunEvent::PickedUp).is_ok());
// Invalid: can't pick up a running run
assert!(fsm.apply(RunEvent::PickedUp).is_err());Trait Implementations§
Auto Trait Implementations§
impl Freeze for RunFsm
impl RefUnwindSafe for RunFsm
impl Send for RunFsm
impl Sync for RunFsm
impl Unpin for RunFsm
impl UnsafeUnpin for RunFsm
impl UnwindSafe for RunFsm
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more