Finite state machines in rust; bendns fork to add types.
| -rw-r--r-- | README.md | 7 | ||||
| -rw-r--r-- | rust_fsm/examples/circuit_breaker.rs | 10 | ||||
| -rw-r--r-- | rust_fsm/examples/circuit_breaker_dsl.rs | 10 | ||||
| -rw-r--r-- | rust_fsm/src/lib.rs | 18 |
4 files changed, 16 insertions, 29 deletions
@@ -78,12 +78,11 @@ This state machine can be used as follows: ```rust // Initialize the state machine. The state is `Closed` now. let mut machine: StateMachineWrapper<CircuitBreaker> = StateMachineWrapper::new(); -// Consume the `Successful` input. No state transition is performed. Output -// is `None`. -machine.consume_anyway(&CircuitBreakerInput::Successful); +// Consume the `Successful` input. No state transition is performed. +let _ = machine.consume(&CircuitBreakerInput::Successful); // Consume the `Unsuccesful` input. The machine is moved to the `Open` // state. The output is `SetupTimer`. -let output = machine.consume_anyway(&CircuitBreakerInput::Unsuccesful); +let output = machine.consume(&CircuitBreakerInput::Unsuccesful).unwrap(); // Check the output if output == Some(CircuitBreakerOutput::SetupTimer) { // Set up the timer... diff --git a/rust_fsm/examples/circuit_breaker.rs b/rust_fsm/examples/circuit_breaker.rs index b2814d3..e318b30 100644 --- a/rust_fsm/examples/circuit_breaker.rs +++ b/rust_fsm/examples/circuit_breaker.rs @@ -69,7 +69,7 @@ fn main() { let machine = Arc::new(Mutex::new(machine)); { let mut lock = machine.lock().unwrap(); - let res = lock.consume_anyway(&CircuitBreakerInput::Unsuccessful); + let res = lock.consume(&CircuitBreakerInput::Unsuccessful).unwrap(); assert_eq!(res, Some(CircuitBreakerOutputSetTimer)); assert_eq!(lock.state(), &CircuitBreakerState::Open); } @@ -79,7 +79,7 @@ fn main() { std::thread::spawn(move || { std::thread::sleep(Duration::new(5, 0)); let mut lock = machine_wait.lock().unwrap(); - let res = lock.consume_anyway(&CircuitBreakerInput::TimerTriggered); + let res = lock.consume(&CircuitBreakerInput::TimerTriggered).unwrap(); assert_eq!(res, None); assert_eq!(lock.state(), &CircuitBreakerState::HalfOpen); }); @@ -89,8 +89,8 @@ fn main() { std::thread::spawn(move || { std::thread::sleep(Duration::new(1, 0)); let mut lock = machine_try.lock().unwrap(); - let res = lock.consume_anyway(&CircuitBreakerInput::Successful); - assert_eq!(res, None); + let res = lock.consume(&CircuitBreakerInput::Successful); + assert_eq!(res, Err(())); assert_eq!(lock.state(), &CircuitBreakerState::Open); }); @@ -98,7 +98,7 @@ fn main() { std::thread::sleep(Duration::new(7, 0)); { let mut lock = machine.lock().unwrap(); - let res = lock.consume_anyway(&CircuitBreakerInput::Successful); + let res = lock.consume(&CircuitBreakerInput::Successful).unwrap(); assert_eq!(res, None); assert_eq!(lock.state(), &CircuitBreakerState::Closed); } diff --git a/rust_fsm/examples/circuit_breaker_dsl.rs b/rust_fsm/examples/circuit_breaker_dsl.rs index 04b2e03..ecdc080 100644 --- a/rust_fsm/examples/circuit_breaker_dsl.rs +++ b/rust_fsm/examples/circuit_breaker_dsl.rs @@ -24,7 +24,7 @@ fn main() { let machine = Arc::new(Mutex::new(machine)); { let mut lock = machine.lock().unwrap(); - let res = lock.consume_anyway(&CircuitBreakerInput::Unsuccessful); + let res = lock.consume(&CircuitBreakerInput::Unsuccessful).unwrap(); assert_eq!(res, Some(CircuitBreakerOutput::SetupTimer)); assert_eq!(lock.state(), &CircuitBreakerState::Open); } @@ -34,7 +34,7 @@ fn main() { std::thread::spawn(move || { std::thread::sleep(Duration::new(5, 0)); let mut lock = machine_wait.lock().unwrap(); - let res = lock.consume_anyway(&CircuitBreakerInput::TimerTriggered); + let res = lock.consume(&CircuitBreakerInput::TimerTriggered).unwrap(); assert_eq!(res, None); assert_eq!(lock.state(), &CircuitBreakerState::HalfOpen); }); @@ -44,8 +44,8 @@ fn main() { std::thread::spawn(move || { std::thread::sleep(Duration::new(1, 0)); let mut lock = machine_try.lock().unwrap(); - let res = lock.consume_anyway(&CircuitBreakerInput::Successful); - assert_eq!(res, None); + let res = lock.consume(&CircuitBreakerInput::Successful); + assert_eq!(res, Err(())); assert_eq!(lock.state(), &CircuitBreakerState::Open); }); @@ -53,7 +53,7 @@ fn main() { std::thread::sleep(Duration::new(7, 0)); { let mut lock = machine.lock().unwrap(); - let res = lock.consume_anyway(&CircuitBreakerInput::Successful); + let res = lock.consume(&CircuitBreakerInput::Successful).unwrap(); assert_eq!(res, None); assert_eq!(lock.state(), &CircuitBreakerState::Closed); } diff --git a/rust_fsm/src/lib.rs b/rust_fsm/src/lib.rs index 5443af6..a45beab 100644 --- a/rust_fsm/src/lib.rs +++ b/rust_fsm/src/lib.rs @@ -76,12 +76,11 @@ //! ```rust,ignore //! // Initialize the state machine. The state is `Closed` now. //! let mut machine: StateMachineWrapper<CircuitBreaker> = StateMachineWrapper::new(); -//! // Consume the `Successful` input. No state transition is performed. Output -//! // is `None`. -//! machine.consume_anyway(&CircuitBreakerInput::Successful); +//! // Consume the `Successful` input. No state transition is performed. +//! let _ = machine.consume(&CircuitBreakerInput::Successful); //! // Consume the `Unsuccesful` input. The machine is moved to the `Open` //! // state. The output is `SetupTimer`. -//! let output = machine.consume_anyway(&CircuitBreakerInput::Unsuccesful); +//! let output = machine.consume(&CircuitBreakerInput::Unsuccesful).unwrap(); //! // Check the output //! if output == Some(CircuitBreakerOutput::SetupTimer) { //! // Set up the timer... @@ -176,17 +175,6 @@ where Ok(output) } - /// Consumes the provided input, gives an output and performs a state - /// transition. If a state transition is not allowed, this function just - /// provides an output. - pub fn consume_anyway(&mut self, input: &T::Input) -> Option<T::Output> { - let output = T::output(&self.state, input); - if let Some(state) = T::transition(&self.state, input) { - self.state = state; - } - output - } - /// Returns the current state. pub fn state(&self) -> &T::State { &self.state |