use std::sync::Arc;
use crate::config::{Config, ConfigBuilder};
use crate::error::Error;
use crate::token::TokenCache;
use crate::transport::Transport;
pub struct Bkash {
inner: Arc<Inner>,
}
struct Inner {
config: Config,
transport: Transport,
}
impl Clone for Bkash {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
impl std::fmt::Debug for Bkash {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Bkash")
.field("config", &self.inner.config)
.field("transport", &self.inner.transport)
.finish_non_exhaustive()
}
}
impl Bkash {
pub async fn new(config: Config) -> Result<Self, Error> {
config.validate()?;
let transport = Transport::new(config.clone()).await?;
Ok(Self {
inner: Arc::new(Inner { config, transport }),
})
}
#[must_use]
pub fn builder() -> ConfigBuilder {
Config::builder()
}
#[must_use]
pub fn config(&self) -> &Config {
&self.inner.config
}
#[must_use]
pub fn transport(&self) -> &Transport {
&self.inner.transport
}
#[must_use]
pub fn token_cache(&self) -> &TokenCache {
self.inner.transport.token_cache()
}
#[cfg(feature = "tokenized-checkout")]
#[must_use]
pub fn tokenized(&self) -> crate::tokenized::TokenizedCheckoutClient<'_> {
crate::tokenized::TokenizedCheckoutClient::new(self)
}
#[cfg(feature = "checkout")]
#[must_use]
pub fn checkout(&self) -> crate::checkout::CheckoutClient<'_> {
crate::checkout::CheckoutClient::new(self)
}
#[cfg(feature = "auth-capture")]
#[must_use]
pub fn auth_capture(&self) -> crate::auth_capture::AuthCaptureClient<'_> {
crate::auth_capture::AuthCaptureClient::new(self)
}
#[cfg(feature = "subscriptions")]
#[must_use]
pub fn subscriptions(&self) -> crate::subscriptions::SubscriptionsClient<'_> {
crate::subscriptions::SubscriptionsClient::new(self)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::Environment;
#[tokio::test]
async fn new_rejects_missing_credentials() {
let cfg = Config::builder().environment(Environment::Sandbox).build();
assert!(cfg.is_err());
}
#[tokio::test]
async fn new_constructs_valid_client() {
let cfg = Config::builder()
.environment(Environment::Sandbox)
.app_key("k")
.app_secret("s")
.username("u")
.password("p")
.build()
.unwrap();
let bkash = Bkash::new(cfg).await.unwrap();
assert_eq!(bkash.config().environment, Environment::Sandbox);
}
#[tokio::test]
async fn client_is_clone() {
let cfg = Config::builder()
.environment(Environment::Sandbox)
.app_key("k")
.app_secret("s")
.username("u")
.password("p")
.build()
.unwrap();
let bkash = Bkash::new(cfg).await.unwrap();
let _b2 = bkash.clone();
}
#[test]
fn builder_helper_returns_config_builder() {
let _b: ConfigBuilder = Bkash::builder();
}
}