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((
23                r.items,
24                r.pagination.pages.unwrap_or(1),
25                r.pagination.current.unwrap_or(1),
26            ))
27        })
28        .await
29    }
30
31    /// List one page of service numbers.
32    pub async fn list_page(
33        &self,
34        page: i32,
35        per_page: Option<i32>,
36    ) -> Result<Page<models::ServiceNumber>, ManagerError> {
37        let cfg = self.cfg.get().await?;
38        let cfg = cfg.as_ref();
39        fetch_page(&self.retry, map_manager_err, || async move {
40            let r = api::list_service_numbers(cfg, Some(page), per_page).await?;
41            Ok((
42                r.items,
43                r.pagination.pages.unwrap_or(1),
44                r.pagination.current.unwrap_or(1),
45                r.pagination.total,
46            ))
47        })
48        .await
49    }
50
51    /// Get a single service number by id.
52    pub async fn get(&self, id: &str) -> Result<models::ServiceNumberItemResponse, ManagerError> {
53        let cfg = self.cfg.get().await?;
54        let cfg = cfg.as_ref();
55        with_retry(&self.retry, true, || api::get_service_number(cfg, id))
56            .await
57            .map_err(map_manager_err)
58    }
59
60    /// Add tags to a service number; returns the updated number.
61    pub async fn add_tags(
62        &self,
63        id: &str,
64        tags: Vec<String>,
65    ) -> Result<models::ServiceNumberItemResponse, ManagerError> {
66        let cfg = self.cfg.get().await?;
67        let cfg = cfg.as_ref();
68        let body = models::AddNumberTagsRequest { tags };
69        with_retry(&self.retry, false, || {
70            manager_api::add_tags_to_number(cfg, id, body.clone())
71        })
72        .await
73        .map_err(map_manager_err)
74    }
75
76    /// Update a service number; returns the updated number.
77    pub async fn update(
78        &self,
79        id: &str,
80        body: std::collections::HashMap<String, serde_json::Value>,
81    ) -> Result<models::ServiceNumberItemResponse, ManagerError> {
82        let cfg = self.cfg.get().await?;
83        let cfg = cfg.as_ref();
84        with_retry(&self.retry, false, || {
85            api::update_service_number(cfg, id, body.clone())
86        })
87        .await
88        .map_err(map_manager_err)
89    }
90}