Skip to main content

babelforce_manager_sdk/resources/
sms.rs

1use std::sync::Arc;
2
3use crate::error::{map_manager_err, ManagerError};
4use crate::gen::manager::apis::configuration::Configuration;
5use crate::gen::manager::apis::sms_api as api;
6use crate::gen::manager::models;
7use crate::http::{collect_all, fetch_page, Page};
8use crate::retry::{with_retry, RetryPolicy};
9
10/// SMS records — `/api/v2/sms`.
11pub struct SmsResource {
12    pub(crate) cfg: Arc<Configuration>,
13    pub(crate) retry: RetryPolicy,
14}
15
16impl SmsResource {
17    /// List all SMS records (auto-paginated).
18    pub async fn list_all(&self) -> Result<Vec<models::Sms>, ManagerError> {
19        collect_all(&self.retry, map_manager_err, |page| async move {
20            let r = api::list_smss(self.cfg.as_ref(), Some(page), None).await?;
21            Ok((r.items, r.pagination.pages, r.pagination.current))
22        })
23        .await
24    }
25
26    /// Get a single SMS record by id.
27    pub async fn get(&self, id: &str) -> Result<models::SmsItemResponse, ManagerError> {
28        with_retry(&self.retry, true, || api::get_sms(self.cfg.as_ref(), id))
29            .await
30            .map_err(map_manager_err)
31    }
32
33    /// Send an outbound SMS.
34    pub async fn send(
35        &self,
36        body: models::SmsSendRequest,
37    ) -> Result<models::SmsItemResponse, ManagerError> {
38        with_retry(&self.retry, false, || {
39            api::send_sms(self.cfg.as_ref(), body.clone())
40        })
41        .await
42        .map_err(map_manager_err)
43    }
44
45    /// Delete an SMS record by id.
46    pub async fn delete(&self, id: &str) -> Result<models::SmsItemResponse, ManagerError> {
47        with_retry(&self.retry, false, || {
48            api::delete_sms(self.cfg.as_ref(), id)
49        })
50        .await
51        .map_err(map_manager_err)
52    }
53
54    /// One page of SMS reporting records.
55    pub async fn report_page(
56        &self,
57        page: i32,
58        per_page: Option<i32>,
59    ) -> Result<Page<models::Sms>, ManagerError> {
60        fetch_page(&self.retry, map_manager_err, || async move {
61            let r = api::report_sms(self.cfg.as_ref(), Some(page), per_page).await?;
62            Ok((
63                r.items,
64                r.pagination.pages,
65                r.pagination.current,
66                Some(r.pagination.total),
67            ))
68        })
69        .await
70    }
71
72    /// SMS reporting records (auto-paginated).
73    pub async fn report(&self) -> Result<Vec<models::Sms>, ManagerError> {
74        collect_all(&self.retry, map_manager_err, |page| async move {
75            let r = api::report_sms(self.cfg.as_ref(), Some(page), None).await?;
76            Ok((r.items, r.pagination.pages, r.pagination.current))
77        })
78        .await
79    }
80
81    /// Create a test inbound SMS.
82    pub async fn test_inbound(
83        &self,
84        body: models::SmsSendRequest,
85    ) -> Result<models::SmsItemResponse, ManagerError> {
86        with_retry(&self.retry, false, || {
87            api::test_inbound_sms(self.cfg.as_ref(), body.clone())
88        })
89        .await
90        .map_err(map_manager_err)
91    }
92}