Skip to main content

babelforce_manager_sdk/resources/
numbers.rs

1use crate::error::{map_manager_err, ManagerError};
2use crate::gen::manager::apis::configuration::Configuration;
3use crate::gen::manager::apis::{manager_api, service_number_api as api};
4use crate::gen::manager::models;
5use crate::http::{collect_all, fetch_page, Page};
6use crate::retry::{with_retry, RetryPolicy};
7use crate::token::SharedCfg;
8
9/// Service (phone) numbers — `/api/v2/numbers`.
10pub struct NumbersResource {
11    pub(crate) cfg: SharedCfg<Configuration>,
12    pub(crate) retry: RetryPolicy,
13}
14
15impl NumbersResource {
16    /// List all service numbers (auto-paginated).
17    pub async fn list_all(&self) -> Result<Vec<models::ServiceNumber>, ManagerError> {
18        let cfg = self.cfg.get().await?;
19        let cfg = cfg.as_ref();
20        collect_all(&self.retry, map_manager_err, |page| async move {
21            let r = api::list_service_numbers(cfg, Some(page), None).await?;
22            Ok((r.items, r.pagination.pages, r.pagination.current))
23        })
24        .await
25    }
26
27    /// List one page of service numbers.
28    pub async fn list_page(
29        &self,
30        page: i32,
31        per_page: Option<i32>,
32    ) -> Result<Page<models::ServiceNumber>, ManagerError> {
33        let cfg = self.cfg.get().await?;
34        let cfg = cfg.as_ref();
35        fetch_page(&self.retry, map_manager_err, || async move {
36            let r = api::list_service_numbers(cfg, Some(page), per_page).await?;
37            Ok((
38                r.items,
39                r.pagination.pages,
40                r.pagination.current,
41                Some(r.pagination.total),
42            ))
43        })
44        .await
45    }
46
47    /// Get a single service number by id.
48    pub async fn get(&self, id: &str) -> Result<models::ServiceNumberItemResponse, ManagerError> {
49        let cfg = self.cfg.get().await?;
50        let cfg = cfg.as_ref();
51        with_retry(&self.retry, true, || api::get_service_number(cfg, id))
52            .await
53            .map_err(map_manager_err)
54    }
55
56    /// Add tags to a service number; returns the updated number.
57    pub async fn add_tags(
58        &self,
59        id: &str,
60        tags: Vec<String>,
61    ) -> Result<models::ServiceNumberItemResponse, ManagerError> {
62        let cfg = self.cfg.get().await?;
63        let cfg = cfg.as_ref();
64        let body = models::AddNumberTagsRequest { tags };
65        with_retry(&self.retry, false, || {
66            manager_api::add_tags_to_number(cfg, id, body.clone())
67        })
68        .await
69        .map_err(map_manager_err)
70    }
71
72    /// Update a service number; returns the updated number.
73    pub async fn update(
74        &self,
75        id: &str,
76        body: std::collections::HashMap<String, serde_json::Value>,
77    ) -> Result<models::ServiceNumberItemResponse, ManagerError> {
78        let cfg = self.cfg.get().await?;
79        let cfg = cfg.as_ref();
80        with_retry(&self.retry, false, || {
81            api::update_service_number(cfg, id, body.clone())
82        })
83        .await
84        .map_err(map_manager_err)
85    }
86}