use reqwest::Method;
use crate::client::Bkash;
use crate::config::Product;
use crate::error::Error;
use crate::models::subscriptions::{
AgreementStatusResponse, CancelAgreementRequest, CancelAgreementResponse,
CreateAgreementRequest, CreateAgreementResponse, ExecuteAgreementRequest,
ExecuteAgreementResponse, QueryAgreementRequest,
};
#[derive(Debug, Clone, Copy)]
pub struct SubscriptionsClient<'a> {
client: &'a Bkash,
}
impl<'a> SubscriptionsClient<'a> {
#[must_use]
pub(crate) fn new(client: &'a Bkash) -> Self {
Self { client }
}
pub async fn create_subscription(
&self,
req: CreateAgreementRequest,
) -> Result<CreateAgreementResponse, Error> {
self.client
.transport()
.request(
Product::Subscriptions,
Method::POST,
"tokenized/checkout/create",
Some(&req),
)
.await
}
pub async fn execute_subscription(
&self,
payment_id: &str,
) -> Result<ExecuteAgreementResponse, Error> {
let req = ExecuteAgreementRequest::new(payment_id);
self.client
.transport()
.request(
Product::Subscriptions,
Method::POST,
"tokenized/checkout/execute",
Some(&req),
)
.await
}
pub async fn query_subscription(
&self,
agreement_id: &str,
) -> Result<AgreementStatusResponse, Error> {
let req = QueryAgreementRequest::new(agreement_id);
self.client
.transport()
.request(
Product::Subscriptions,
Method::POST,
"tokenized/checkout/agreement/status",
Some(&req),
)
.await
}
pub async fn cancel_subscription(
&self,
agreement_id: &str,
) -> Result<CancelAgreementResponse, Error> {
let req = CancelAgreementRequest::new(agreement_id);
self.client
.transport()
.request(
Product::Subscriptions,
Method::POST,
"tokenized/checkout/agreement/cancel",
Some(&req),
)
.await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn client_is_copy() {
fn assert_copy<T: Copy>() {}
assert_copy::<SubscriptionsClient<'_>>();
}
}