#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum BuiltinProvider {
Stripe,
PayPal,
Lipila,
Circle,
Coinbase,
Bridge,
Binance,
MtnMomo,
Mpesa,
AirtelMoney,
Flutterwave,
Paystack,
OrangeMoney,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum PaymentProvider {
Stripe,
PayPal,
Lipila,
Circle,
Coinbase,
Bridge,
Binance,
MtnMomo,
Mpesa,
AirtelMoney,
Flutterwave,
Paystack,
OrangeMoney,
Other(String),
}
impl PaymentProvider {
#[inline]
#[must_use]
pub const fn as_builtin(&self) -> Option<BuiltinProvider> {
match self {
Self::Stripe => Some(BuiltinProvider::Stripe),
Self::PayPal => Some(BuiltinProvider::PayPal),
Self::Lipila => Some(BuiltinProvider::Lipila),
Self::Circle => Some(BuiltinProvider::Circle),
Self::Coinbase => Some(BuiltinProvider::Coinbase),
Self::Bridge => Some(BuiltinProvider::Bridge),
Self::Binance => Some(BuiltinProvider::Binance),
Self::MtnMomo => Some(BuiltinProvider::MtnMomo),
Self::Mpesa => Some(BuiltinProvider::Mpesa),
Self::AirtelMoney => Some(BuiltinProvider::AirtelMoney),
Self::Flutterwave => Some(BuiltinProvider::Flutterwave),
Self::Paystack => Some(BuiltinProvider::Paystack),
Self::OrangeMoney => Some(BuiltinProvider::OrangeMoney),
Self::Other(_) => None,
}
}
#[inline]
#[must_use]
pub fn other(provider: impl Into<String>) -> Self {
Self::Other(provider.into())
}
}
impl From<BuiltinProvider> for PaymentProvider {
#[inline]
fn from(provider: BuiltinProvider) -> Self {
match provider {
BuiltinProvider::Stripe => Self::Stripe,
BuiltinProvider::PayPal => Self::PayPal,
BuiltinProvider::Lipila => Self::Lipila,
BuiltinProvider::Circle => Self::Circle,
BuiltinProvider::Coinbase => Self::Coinbase,
BuiltinProvider::Bridge => Self::Bridge,
BuiltinProvider::Binance => Self::Binance,
BuiltinProvider::MtnMomo => Self::MtnMomo,
BuiltinProvider::Mpesa => Self::Mpesa,
BuiltinProvider::AirtelMoney => Self::AirtelMoney,
BuiltinProvider::Flutterwave => Self::Flutterwave,
BuiltinProvider::Paystack => Self::Paystack,
BuiltinProvider::OrangeMoney => Self::OrangeMoney,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn built_in_providers_round_trip_to_payment_provider() {
let providers = [
(BuiltinProvider::Stripe, PaymentProvider::Stripe),
(BuiltinProvider::PayPal, PaymentProvider::PayPal),
(BuiltinProvider::Lipila, PaymentProvider::Lipila),
(BuiltinProvider::Circle, PaymentProvider::Circle),
(BuiltinProvider::Coinbase, PaymentProvider::Coinbase),
(BuiltinProvider::Bridge, PaymentProvider::Bridge),
(BuiltinProvider::Binance, PaymentProvider::Binance),
(BuiltinProvider::MtnMomo, PaymentProvider::MtnMomo),
(BuiltinProvider::Mpesa, PaymentProvider::Mpesa),
(BuiltinProvider::AirtelMoney, PaymentProvider::AirtelMoney),
(BuiltinProvider::Flutterwave, PaymentProvider::Flutterwave),
(BuiltinProvider::Paystack, PaymentProvider::Paystack),
(BuiltinProvider::OrangeMoney, PaymentProvider::OrangeMoney),
];
for (builtin, payment_provider) in providers {
assert_eq!(PaymentProvider::from(builtin), payment_provider);
assert_eq!(payment_provider.as_builtin(), Some(builtin));
}
}
#[test]
fn other_provider_is_metadata_not_builtin_route_target() {
let provider = PaymentProvider::other("mtn-momo");
assert_eq!(provider, PaymentProvider::Other("mtn-momo".to_owned()));
assert_eq!(provider.as_builtin(), None);
}
}