#[derive(Debug, Default, PartialEq, Clone, Copy)]
pub enum DarajaEnvironment {
#[default]
Sandbox,
Live,
}
pub trait DarajaApi {
fn path(&self) -> &'static str;
fn environment(&self) -> DarajaEnvironment;
fn production(mut self) -> Self
where
Self: Sized,
{
self.set_environment(DarajaEnvironment::Live);
self
}
fn set_environment(&mut self, environment: DarajaEnvironment);
fn get_url(&self) -> String {
let url_prefix = match self.environment() {
DarajaEnvironment::Sandbox => "sandbox",
DarajaEnvironment::Live => "api",
};
format!("https://{}.safaricom.co.ke/{}", url_prefix, self.path())
}
}
#[cfg(test)]
mod test {
use crate::types::{DarajaApi, DarajaEnvironment};
#[test]
fn test_daraja_api_trait() {
struct ReversalAPI {
environment: DarajaEnvironment,
}
impl DarajaApi for ReversalAPI {
fn path(&self) -> &'static str {
"mpesa/reversal/v1/request"
}
fn environment(&self) -> DarajaEnvironment {
self.environment
}
fn set_environment(&mut self, environment: DarajaEnvironment) {
self.environment = environment;
}
}
let sandbox_api = ReversalAPI {
environment: DarajaEnvironment::Sandbox,
};
assert_eq!(
sandbox_api.get_url(),
"https://sandbox.safaricom.co.ke/mpesa/reversal/v1/request"
);
let live_api = sandbox_api.production();
assert_eq!(live_api.environment(), DarajaEnvironment::Live);
assert_eq!(
live_api.get_url(),
"https://api.safaricom.co.ke/mpesa/reversal/v1/request"
);
}
}