1use cashu::State;
4
5#[derive(thiserror::Error, Debug)]
7pub enum Error {
8 #[error("Token already pending for another update")]
10 Pending,
11 #[error("Token already spent")]
13 AlreadySpent,
14 #[error("Invalid transition: From {0} to {1}")]
16 InvalidTransition(State, State),
17}
18
19#[inline]
20pub fn check_state_transition(current_state: State, new_state: State) -> Result<(), Error> {
22 let is_valid_transition = match current_state {
23 State::Unspent => matches!(new_state, State::Pending | State::Spent),
24 State::Pending => matches!(new_state, State::Unspent | State::Spent),
25 _ => false,
28 };
29
30 if !is_valid_transition {
31 Err(match current_state {
32 State::Pending => Error::Pending,
33 State::Spent => Error::AlreadySpent,
34 _ => Error::InvalidTransition(current_state, new_state),
35 })
36 } else {
37 Ok(())
38 }
39}