123456789101112131415161718192021222324252627282930313233343536373839 |
- //! State transition rules
- use cashu::State;
- /// State transition Error
- #[derive(thiserror::Error, Debug)]
- pub enum Error {
- /// Pending Token
- #[error("Token already pending for another update")]
- Pending,
- /// Already spent
- #[error("Token already spent")]
- AlreadySpent,
- /// Invalid transition
- #[error("Invalid transition: From {0} to {1}")]
- InvalidTransition(State, State),
- }
- #[inline]
- /// Check if the state transition is allowed
- pub fn check_state_transition(current_state: State, new_state: State) -> Result<(), Error> {
- let is_valid_transition = match current_state {
- State::Unspent => matches!(new_state, State::Pending | State::Spent),
- State::Pending => matches!(new_state, State::Unspent | State::Spent),
- // Any other state shouldn't be updated by the mint, and the wallet does not use this
- // function
- _ => false,
- };
- if !is_valid_transition {
- Err(match current_state {
- State::Pending => Error::Pending,
- State::Spent => Error::AlreadySpent,
- _ => Error::InvalidTransition(current_state, new_state),
- })
- } else {
- Ok(())
- }
- }
|