1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
//! Transactions
//! =============
//! This file contains all the structs and definitions needed to
//! create a transaction using the paystack API.
use crate::error::PaystackError;
use crate::{Channel, Currency, PaystackResult};
use serde::Serialize;
/// This struct is used to create a transaction body for creating a transaction using the Paystack API.
///
/// IMPORTANT: This class can only be created using the TransactionBuilder.
///
/// The struct has the following fields:
/// - amount: Amount should be in the smallest unit of the currency e.g. kobo if in NGN and cents if in USD
/// - email: Customer's email address
/// - currency (Optional): Currency in which amount should be charged (NGN, GHS, ZAR or USD). Defaults to your integration currency.
#[derive(Serialize, Debug)]
pub struct Transaction {
amount: String,
email: String,
currency: Option<Currency>,
}
/// Builder for the Transaction object
#[derive(Default, Clone)]
pub struct TransactionBuilder {
amount: Option<String>,
email: Option<String>,
currency: Option<Currency>,
channels: Option<Vec<Channel>>,
}
impl TransactionBuilder {
/// Create a new instance of the Transaction builder with default properties
pub fn new() -> Self {
TransactionBuilder::default()
}
/// Specify email for the Transaction
pub fn email(mut self, email: impl Into<String>) -> Self {
self.email = Some(email.into());
self
}
/// Specify the Transaction amount
pub fn amount(mut self, amount: impl Into<String>) -> Self {
self.amount = Some(amount.into());
self
}
/// Specify the Transaction currency
pub fn currency(mut self, currency: Currency) -> Self {
self.currency = Some(currency);
self
}
/// Specify the Tranaction channels
pub fn channels(mut self, channels: Vec<Channel>) -> Self {
self.channels = Some(channels);
self
}
/// Build the Transaction object
pub fn build(self) -> PaystackResult<Transaction> {
let Some(email) = self.email else {
return Err(
PaystackError::Transaction("email is required for transaction".to_string())
)
};
let Some(amount) = self.amount else {
return Err(
PaystackError::Transaction("amount is required for transaction".to_string())
)
};
Ok(Transaction {
email,
amount,
currency: self.currency,
})
}
}
/// This struct is used to create a partial debit transaction body for creating a partial debit using the Paystack API.
///
/// IMPORTANT: This class can only be created using the PartialDebitTransactionBuilder.
///
/// The struct has the following fields:
/// - authorization_code: Authorization Code for the transaction
/// - amount: Amount should be in the smallest unit of the currency e.g. kobo if in NGN and cents if in USD
/// - email: Customer's email address
/// - currency : Currency in which amount should be charged (NGN, GHS, ZAR or USD). Defaults to your integration currency.
/// - reference (Optional): Unique transaction reference.
/// - at_least: Minimum amount to charge
#[derive(Debug, Clone, Serialize)]
pub struct PartialDebitTransaction {
authorization_code: String,
amount: String,
email: String,
currency: Currency,
reference: Option<String>,
at_least: Option<String>,
}
/// Builder for the Transaction object
#[derive(Default, Clone)]
pub struct PartialDebitTransactionBuilder {
authorization_code: Option<String>,
amount: Option<String>,
email: Option<String>,
currency: Option<Currency>,
reference: Option<String>,
at_least: Option<String>,
}
impl PartialDebitTransactionBuilder {
/// Create new instance of the Partial Debit Transaction builder with default properties.
pub fn new() -> Self {
PartialDebitTransactionBuilder::default()
}
/// Specify the authorization code.
pub fn authorization_code(mut self, authorization_code: impl Into<String>) -> Self {
self.authorization_code = Some(authorization_code.into());
self
}
/// Specify the transaction amount.
pub fn amount(mut self, amount: impl Into<String>) -> Self {
self.amount = Some(amount.into());
self
}
/// Specify email for the Transaction.
pub fn email(mut self, email: impl Into<String>) -> Self {
self.email = Some(email.into());
self
}
/// Specify transaction currency.
pub fn currency(mut self, currency: Currency) -> Self {
self.currency = Some(currency);
self
}
/// Specify the transaction reference.
pub fn reference(mut self, reference: impl Into<String>) -> Self {
self.reference = Some(reference.into());
self
}
/// Specify the minimum amount to charge for the transaction.
pub fn at_least(mut self, at_least: impl Into<String>) -> Self {
self.at_least = Some(at_least.into());
self
}
/// Build the PartialDebitTransaction object
pub fn build(self) -> PaystackResult<PartialDebitTransaction> {
let Some(authorization_code) = self.authorization_code else {
return Err(
PaystackError::Transaction("authorization code is required for partial debit transaction".to_string())
)
};
let Some(email) = self.email else {
return Err(
PaystackError::Transaction("email is required for transaction".to_string())
)
};
let Some(currency) = self.currency else {
return Err(
PaystackError::Transaction("currency is required for transaction".to_string())
)
};
let Some(amount) = self.amount else {
return Err(
PaystackError::Transaction("amount is required for transaction".to_string())
)
};
Ok(PartialDebitTransaction {
authorization_code,
email,
amount,
currency,
reference: self.reference,
at_least: self.at_least,
})
}
}