lib: add 'Transaction' variants
Represent each enum variant with its own type to allow stronger typing when processing only a singular type of transactions.
This commit is contained in:
parent
eae54b8ce0
commit
c7e64692e6
|
@ -1,2 +1,5 @@
|
|||
pub mod core;
|
||||
pub use crate::core::*;
|
||||
|
||||
pub mod transaction;
|
||||
pub use crate::transaction::*;
|
||||
|
|
57
src/transaction.rs
Normal file
57
src/transaction.rs
Normal file
|
@ -0,0 +1,57 @@
|
|||
//! Define all supported transactions.
|
||||
use crate::core::{ClientId, TxAmount, TxId};
|
||||
|
||||
/// A generic [Transaction].
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub enum Transaction {
|
||||
Deposit(Deposit),
|
||||
Withdrawal(Withdrawal),
|
||||
Dispute(Dispute),
|
||||
Resolve(Resolve),
|
||||
Chargeback(Chargeback),
|
||||
}
|
||||
|
||||
/// Deposit funds into an account, i.e: increase its balance by the amount given.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub struct Deposit {
|
||||
pub client: ClientId,
|
||||
pub tx: TxId,
|
||||
pub amount: TxAmount,
|
||||
}
|
||||
|
||||
/// Withdraw funds from an account, i.e: the opposite of a [Deposit]. It is not allowed to withdraw
|
||||
/// more than is available on the given account, and should result in a no-op.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub struct Withdrawal {
|
||||
pub client: ClientId,
|
||||
pub tx: TxId,
|
||||
pub amount: TxAmount,
|
||||
}
|
||||
|
||||
/// Hold funds for an erroneous transaction that should be reversed. Extract the amount of funds
|
||||
/// corresponding to the given transaction into a held funds envelop by transfering it from their
|
||||
/// available funds. If the given transaction does not exist, this results in a no-op.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub struct Dispute {
|
||||
pub client: ClientId,
|
||||
pub tx: TxId,
|
||||
}
|
||||
|
||||
/// Resolve a [Dispute] in favor of the client: move the held funds for the diputed transaction
|
||||
/// back to the available funds. If either the given transaction does not exist, or is not
|
||||
/// disputed, this results in a no-op.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub struct Resolve {
|
||||
pub client: ClientId,
|
||||
pub tx: TxId,
|
||||
}
|
||||
|
||||
/// Resolve [Dispute] by withdrawing held funds. The held funds are decreased by the amount of the
|
||||
/// transaction. An account which succesffully executed a chargeback is subsequently frozen. If
|
||||
/// either the transaction does not exist, or is not disputed, this results in a no-op and the
|
||||
/// account is *not* frozen.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub struct Chargeback {
|
||||
pub client: ClientId,
|
||||
pub tx: TxId,
|
||||
}
|
Loading…
Reference in a new issue