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
//! Charge
//! ===========
//! This file contains all the structs and definitions needed to
//! create charges usingt the Paystack API.
use crate::{error, Channel, Currency, PaystackResult};
/// This struct is used to create a charge body for creating a Charge Authorization using the Paystack API.
///
/// IMPORTANT: This class can only be created using the ChargeBuilder.
///
/// 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.
/// An enum is used for type safety.
/// - authorizatuin_code: A valid authorization code to charge
/// - reference (Optional): Unique transaction reference. Only -, ., = and alphanumeric characters allowed.
/// - channel (Optional): Send us 'card' or 'bank' or 'card','bank' as an array to specify what options to show the user paying.
/// An enum is used to implement this for type safety
/// - transaction_charge (Optional): A flat fee to charge the subaccount for this transaction
/// (in kobo if currency is NGN, pesewas, if currency is GHS, and cents, if currency is ZAR).
/// This overrides the split percentage set when the subaccount was created.
/// Ideally, you will need to use this if you are splitting in flat rates
/// (since subaccount creation only allows for percentage split). e.g. 7000 for a 70 naira
#[derive(serde::Serialize, Debug)]
pub struct Charge {
email: String,
amount: String,
authorization_code: String,
reference: Option<String>,
currency: Option<Currency>,
channel: Option<Vec<Channel>>,
transaction_charge: Option<u32>,
}
/// Builder for the Charge object
#[derive(Default, Clone)]
pub struct ChargeBuilder {
email: Option<String>,
amount: Option<String>,
authorization_code: Option<String>,
reference: Option<String>,
currency: Option<Currency>,
channel: Option<Vec<Channel>>,
transaction_charge: Option<u32>,
}
impl ChargeBuilder {
/// Create a new instance of the Transaction builder with default properties
pub fn new() -> Self {
ChargeBuilder::default()
}
/// Specify the transaction email
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 charge Authorization Code
pub fn authorization_code(mut self, code: impl Into<String>) -> Self {
self.authorization_code = Some(code.into());
self
}
/// Specify charge reference
pub fn reference(mut self, reference: impl Into<String>) -> Self {
self.reference = Some(reference.into());
self
}
/// Specify charge currency
pub fn currency(mut self, currency: Currency) -> Self {
self.currency = Some(currency);
self
}
/// Specify charge channel
pub fn channel(mut self, channel: Vec<Channel>) -> Self {
self.channel = Some(channel);
self
}
/// Specify charge transaction charge
pub fn transaction_charge(mut self, transaction_charge: u32) -> Self {
self.transaction_charge = Some(transaction_charge);
self
}
/// Build the Charge object
pub fn build(self) -> PaystackResult<Charge> {
let Some(email) = self.email else {
return Err(error::PaystackError::Charge("email is required for creating a charge".to_string()))
};
let Some(amount) = self.amount else {
return Err(error::PaystackError::Charge(
"amount is required for creating charge".to_string()
))
};
let Some(authorization_code) = self.authorization_code else {
return Err(error::PaystackError::Charge(
"authorization code is required for creating a charge".to_string()
))
};
Ok(Charge {
email,
amount,
authorization_code,
reference: self.reference,
currency: self.currency,
channel: self.channel,
transaction_charge: self.transaction_charge,
})
}
}