|
|
@@ -1,6 +1,6 @@
|
|
|
//! State transition rules
|
|
|
|
|
|
-use cashu::State;
|
|
|
+use cashu::{MeltQuoteState, State};
|
|
|
|
|
|
/// State transition Error
|
|
|
#[derive(thiserror::Error, Debug)]
|
|
|
@@ -14,6 +14,12 @@ pub enum Error {
|
|
|
/// Invalid transition
|
|
|
#[error("Invalid transition: From {0} to {1}")]
|
|
|
InvalidTransition(State, State),
|
|
|
+ /// Already paid
|
|
|
+ #[error("Quote already paid")]
|
|
|
+ AlreadyPaid,
|
|
|
+ /// Invalid transition
|
|
|
+ #[error("Invalid melt quote state transition: From {0} to {1}")]
|
|
|
+ InvalidMeltQuoteTransition(MeltQuoteState, MeltQuoteState),
|
|
|
}
|
|
|
|
|
|
#[inline]
|
|
|
@@ -37,3 +43,41 @@ pub fn check_state_transition(current_state: State, new_state: State) -> Result<
|
|
|
Ok(())
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+#[inline]
|
|
|
+/// Check if the melt quote state transition is allowed
|
|
|
+///
|
|
|
+/// Valid transitions:
|
|
|
+/// - Unpaid -> Pending, Failed
|
|
|
+/// - Pending -> Unpaid, Paid, Failed
|
|
|
+/// - Paid -> (no transitions allowed)
|
|
|
+/// - Failed -> Pending
|
|
|
+pub fn check_melt_quote_state_transition(
|
|
|
+ current_state: MeltQuoteState,
|
|
|
+ new_state: MeltQuoteState,
|
|
|
+) -> Result<(), Error> {
|
|
|
+ let is_valid_transition = match current_state {
|
|
|
+ MeltQuoteState::Unpaid => {
|
|
|
+ matches!(new_state, MeltQuoteState::Pending | MeltQuoteState::Failed)
|
|
|
+ }
|
|
|
+ MeltQuoteState::Pending => matches!(
|
|
|
+ new_state,
|
|
|
+ MeltQuoteState::Unpaid | MeltQuoteState::Paid | MeltQuoteState::Failed
|
|
|
+ ),
|
|
|
+ MeltQuoteState::Failed => {
|
|
|
+ matches!(new_state, MeltQuoteState::Pending | MeltQuoteState::Unpaid)
|
|
|
+ }
|
|
|
+ MeltQuoteState::Paid => false,
|
|
|
+ MeltQuoteState::Unknown => true,
|
|
|
+ };
|
|
|
+
|
|
|
+ if !is_valid_transition {
|
|
|
+ Err(match current_state {
|
|
|
+ MeltQuoteState::Pending => Error::Pending,
|
|
|
+ MeltQuoteState::Paid => Error::AlreadyPaid,
|
|
|
+ _ => Error::InvalidMeltQuoteTransition(current_state, new_state),
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
+}
|