Finite state machines in rust; bendns fork to add types.
rust_fsm: remove `consume_anyway`
Yevhenii Babichenko 2019-05-07
parent 0f264fd · commit 8c0f496
-rw-r--r--README.md7
-rw-r--r--rust_fsm/examples/circuit_breaker.rs10
-rw-r--r--rust_fsm/examples/circuit_breaker_dsl.rs10
-rw-r--r--rust_fsm/src/lib.rs18
4 files changed, 16 insertions, 29 deletions
diff --git a/README.md b/README.md
index b8b75bc..6d9eb1b 100644
--- a/README.md
+++ b/README.md
@@ -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