Skip to main content

babelforce_manager_sdk/resources/
calendars.rs

1use crate::error::{map_manager_err, ManagerError};
2use crate::gen::manager::apis::configuration::Configuration;
3use crate::gen::manager::apis::{calendar_api as api, manager_api};
4use crate::gen::manager::models;
5use crate::http::collect_all;
6use crate::retry::{with_retry, RetryPolicy};
7use crate::token::SharedCfg;
8
9/// Calendars — `/api/v2/calendars`.
10pub struct CalendarsResource {
11    pub(crate) cfg: SharedCfg<Configuration>,
12    pub(crate) retry: RetryPolicy,
13}
14
15impl CalendarsResource {
16    /// List all calendars (auto-paginated).
17    pub async fn list_all(&self) -> Result<Vec<models::Calendar>, 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_calendars(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    /// Create a calendar.
32    pub async fn create(
33        &self,
34        body: models::RestCreateCalendar,
35    ) -> Result<models::CalendarItemResponse, ManagerError> {
36        let cfg = self.cfg.get().await?;
37        let cfg = cfg.as_ref();
38        with_retry(&self.retry, false, || {
39            api::create_calendar(cfg, body.clone())
40        })
41        .await
42        .map_err(map_manager_err)
43    }
44
45    /// Get a calendar by id.
46    pub async fn get(&self, id: &str) -> Result<models::CalendarItemResponse, ManagerError> {
47        let cfg = self.cfg.get().await?;
48        let cfg = cfg.as_ref();
49        with_retry(&self.retry, true, || api::get_calendar(cfg, id))
50            .await
51            .map_err(map_manager_err)
52    }
53
54    /// Update a calendar.
55    pub async fn update(
56        &self,
57        id: &str,
58        body: models::RestUpdateCalendar,
59    ) -> Result<models::CalendarItemResponse, ManagerError> {
60        let cfg = self.cfg.get().await?;
61        let cfg = cfg.as_ref();
62        with_retry(&self.retry, false, || {
63            api::update_calendar(cfg, id, body.clone())
64        })
65        .await
66        .map_err(map_manager_err)
67    }
68
69    /// Delete a calendar.
70    pub async fn delete(&self, id: &str) -> Result<(), ManagerError> {
71        let cfg = self.cfg.get().await?;
72        let cfg = cfg.as_ref();
73        with_retry(&self.retry, false, || api::delete_calendar(cfg, id))
74            .await
75            .map_err(map_manager_err)?;
76        Ok(())
77    }
78
79    /// Get the dates configured on a calendar.
80    pub async fn get_dates(
81        &self,
82        id: &str,
83    ) -> Result<models::CalendarDateListResponse, ManagerError> {
84        let cfg = self.cfg.get().await?;
85        let cfg = cfg.as_ref();
86        with_retry(&self.retry, true, || {
87            manager_api::get_calender_dates(cfg, id)
88        })
89        .await
90        .map_err(map_manager_err)
91    }
92
93    /// Add a date to a calendar.
94    pub async fn add_date(
95        &self,
96        id: &str,
97        body: models::CalendarDateBody,
98    ) -> Result<models::CalendarDateItemResponse, ManagerError> {
99        let cfg = self.cfg.get().await?;
100        let cfg = cfg.as_ref();
101        with_retry(&self.retry, false, || {
102            manager_api::add_calendar_date(cfg, id, body.clone())
103        })
104        .await
105        .map_err(map_manager_err)
106    }
107
108    /// Get a single date from a calendar.
109    pub async fn get_date(
110        &self,
111        id: &str,
112        date_id: &str,
113    ) -> Result<models::CalendarDateItemResponse, ManagerError> {
114        let cfg = self.cfg.get().await?;
115        let cfg = cfg.as_ref();
116        with_retry(&self.retry, true, || {
117            api::get_calendar_date(cfg, id, date_id)
118        })
119        .await
120        .map_err(map_manager_err)
121    }
122
123    /// Update a date on a calendar.
124    pub async fn update_date(
125        &self,
126        id: &str,
127        date_id: &str,
128        body: models::CalendarDateBody,
129    ) -> Result<models::CalendarDateItemResponse, ManagerError> {
130        let cfg = self.cfg.get().await?;
131        let cfg = cfg.as_ref();
132        with_retry(&self.retry, false, || {
133            api::update_calendar_date(cfg, id, date_id, body.clone())
134        })
135        .await
136        .map_err(map_manager_err)
137    }
138
139    /// Remove a date from a calendar.
140    pub async fn remove_date(
141        &self,
142        id: &str,
143        date_id: &str,
144    ) -> Result<models::DefaultV2MessageResponse, ManagerError> {
145        let cfg = self.cfg.get().await?;
146        let cfg = cfg.as_ref();
147        with_retry(&self.retry, false, || {
148            api::remove_calendar_date(cfg, id, date_id)
149        })
150        .await
151        .map_err(map_manager_err)
152    }
153
154    /// Test whether a date is a holiday across the account's calendars.
155    pub async fn test_date(
156        &self,
157        date: Option<&str>,
158    ) -> Result<models::GenericItemResponse, ManagerError> {
159        let cfg = self.cfg.get().await?;
160        let cfg = cfg.as_ref();
161        with_retry(&self.retry, true, || api::test_calendar_date(cfg, date))
162            .await
163            .map_err(map_manager_err)
164    }
165
166    /// Bulk-delete calendars by id.
167    pub async fn bulk_delete(
168        &self,
169        ids: Vec<String>,
170    ) -> Result<models::DefaultV2MessageResponse, ManagerError> {
171        let cfg = self.cfg.get().await?;
172        let cfg = cfg.as_ref();
173        let ids = ids
174            .iter()
175            .map(|id| {
176                uuid::Uuid::parse_str(id)
177                    .map_err(|e| ManagerError::InvalidArgument(format!("ids: {e}")))
178            })
179            .collect::<Result<Vec<_>, _>>()?;
180        let body = models::BulkIdsRequest { ids };
181        with_retry(&self.retry, false, || {
182            api::bulk_delete_calendars(cfg, body.clone())
183        })
184        .await
185        .map_err(map_manager_err)
186    }
187
188    /// Bulk-update calendars.
189    pub async fn bulk_update(
190        &self,
191        body: models::CalendarBulkUpdateRequest,
192    ) -> Result<models::CalendarListResponse, ManagerError> {
193        let cfg = self.cfg.get().await?;
194        let cfg = cfg.as_ref();
195        with_retry(&self.retry, false, || {
196            api::bulk_update_calendars(cfg, body.clone())
197        })
198        .await
199        .map_err(map_manager_err)
200    }
201}