use crate::error::{Error, Result};
use crate::types::Stage;
pub fn validate_transition(from: Stage, to: Stage) -> Result<()> {
let valid = matches!(
(from, to),
(Stage::Idle, Stage::PrePrepare)
| (Stage::PrePrepare, Stage::Prepare)
| (Stage::Prepare, Stage::Commit)
| (Stage::Commit, Stage::Reply)
| (Stage::Reply, Stage::Done)
);
if valid {
Ok(())
} else {
Err(Error::InvalidStage { from, to })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn valid_forward_transitions() {
assert!(validate_transition(Stage::Idle, Stage::PrePrepare).is_ok());
assert!(validate_transition(Stage::PrePrepare, Stage::Prepare).is_ok());
assert!(validate_transition(Stage::Prepare, Stage::Commit).is_ok());
assert!(validate_transition(Stage::Commit, Stage::Reply).is_ok());
assert!(validate_transition(Stage::Reply, Stage::Done).is_ok());
}
#[test]
fn invalid_transitions() {
assert!(validate_transition(Stage::Idle, Stage::Commit).is_err());
assert!(validate_transition(Stage::Prepare, Stage::PrePrepare).is_err());
assert!(validate_transition(Stage::Done, Stage::Idle).is_err());
}
}