Skip to main content

box_open_sdk/managers/
folders.rs

1// Code generated by box-gantry. DO NOT EDIT.
2
3use crate::internal::path_escape;
4use crate::runtime::{self, Error};
5
6/// Optional parameters for [`FoldersManager::get`].
7#[derive(Clone, Debug, Default)]
8pub struct FoldersGetOptions {
9    pub fields: Option<Vec<String>>,
10    pub if_none_match: Option<String>,
11    pub boxapi: Option<String>,
12    pub sort: Option<crate::models::schemas::GetIdSort>,
13    pub direction: Option<crate::models::schemas::OrderDirection>,
14    pub offset: Option<i64>,
15    pub limit: Option<i64>,
16}
17
18/// Optional parameters for [`FoldersManager::update`].
19#[derive(Clone, Debug, Default)]
20pub struct FoldersUpdateOptions {
21    pub fields: Option<Vec<String>>,
22    pub if_match: Option<String>,
23}
24
25/// Optional parameters for [`FoldersManager::delete`].
26#[derive(Clone, Debug, Default)]
27pub struct FoldersDeleteOptions {
28    pub if_match: Option<String>,
29    pub recursive: Option<bool>,
30}
31
32/// Optional parameters for [`FoldersManager::list_items`].
33#[derive(Clone, Debug, Default)]
34pub struct FoldersListItemsOptions {
35    pub fields: Option<Vec<String>>,
36    pub usemarker: Option<bool>,
37    pub marker: Option<String>,
38    pub offset: Option<i64>,
39    pub limit: Option<i64>,
40    pub boxapi: Option<String>,
41    pub sort: Option<crate::models::schemas::GetIdSort>,
42    pub direction: Option<crate::models::schemas::OrderDirection>,
43}
44
45/// Optional parameters for [`FoldersManager::create`].
46#[derive(Clone, Debug, Default)]
47pub struct FoldersCreateOptions {
48    pub fields: Option<Vec<String>>,
49}
50
51/// Optional parameters for [`FoldersManager::copy`].
52#[derive(Clone, Debug, Default)]
53pub struct FoldersCopyOptions {
54    pub fields: Option<Vec<String>>,
55}
56
57/// Async paginator over [`FoldersManager::list_items`], yielding one `crate::models::schemas::Item`
58/// per item across pages (FR-7.3).
59pub struct FoldersListItemsPaginator {
60    manager: FoldersManager,
61    folder_id: String,
62    options: FoldersListItemsOptions,
63    buffer: std::vec::IntoIter<crate::models::schemas::Item>,
64    done: bool,
65}
66
67impl FoldersListItemsPaginator {
68    /// The next item, advancing pages as needed; `None` at the end.
69    /// An error is yielded once, then iteration stops.
70    pub async fn next(&mut self) -> Option<Result<crate::models::schemas::Item, Error>> {
71        loop {
72            if let Some(item) = self.buffer.next() {
73                return Some(Ok(item));
74            }
75            if self.done {
76                return None;
77            }
78            let page = match self
79                .manager
80                .list_items_page(self.folder_id.clone(), Some(self.options.clone()))
81                .await
82            {
83                Ok(page) => page,
84                Err(err) => {
85                    self.done = true;
86                    return Some(Err(err));
87                }
88            };
89            self.buffer = page.entries.unwrap_or_default().into_iter();
90            match page.next_marker.flatten() {
91                Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
92                _ => self.done = true,
93            }
94        }
95    }
96}
97
98/// Operations for the "folders" API area.
99pub struct FoldersManager {
100    session: std::sync::Arc<runtime::Client>,
101}
102
103impl FoldersManager {
104    pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
105        Self { session }
106    }
107
108    pub async fn get(
109        &self,
110        folder_id: String,
111        opts: Option<FoldersGetOptions>,
112    ) -> Result<crate::models::schemas::FolderFull, Error> {
113        let mut url = self.session.base_url("api");
114        url.push_str("/folders");
115        url.push('/');
116        let seg = path_escape(&folder_id);
117        url.push_str(&seg);
118        let mut req = self.session.new_request("GET", &url);
119        let opts = opts.unwrap_or_default();
120        if let Some(value) = opts.fields {
121            req = runtime::with_query(req, "fields", &value.join(","));
122        }
123        if let Some(value) = opts.if_none_match {
124            req = runtime::with_header(req, "if-none-match", &value);
125        }
126        if let Some(value) = opts.boxapi {
127            req = runtime::with_header(req, "boxapi", &value);
128        }
129        if let Some(value) = opts.sort {
130            req = runtime::with_query(req, "sort", &value.0);
131        }
132        if let Some(value) = opts.direction {
133            req = runtime::with_query(req, "direction", &value.0);
134        }
135        if let Some(value) = opts.offset {
136            req = runtime::with_query(req, "offset", &value.to_string());
137        }
138        if let Some(value) = opts.limit {
139            req = runtime::with_query(req, "limit", &value.to_string());
140        }
141        let resp = self.session.fetch(req).await?;
142        let data = runtime::response_bytes(&resp)?;
143        Ok(serde_json::from_slice(&data)?)
144    }
145
146    pub async fn update(
147        &self,
148        folder_id: String,
149        body: crate::models::schemas::UpdateFolderRequest,
150        opts: Option<FoldersUpdateOptions>,
151    ) -> Result<crate::models::schemas::FolderFull, Error> {
152        let mut url = self.session.base_url("api");
153        url.push_str("/folders");
154        url.push('/');
155        let seg = path_escape(&folder_id);
156        url.push_str(&seg);
157        let mut req = self.session.new_request("PUT", &url);
158        let opts = opts.unwrap_or_default();
159        if let Some(value) = opts.fields {
160            req = runtime::with_query(req, "fields", &value.join(","));
161        }
162        if let Some(value) = opts.if_match {
163            req = runtime::with_header(req, "if-match", &value);
164        }
165        let payload = serde_json::to_vec(&body)?;
166        req = runtime::with_json_body(req, &payload);
167        let resp = self.session.fetch(req).await?;
168        let data = runtime::response_bytes(&resp)?;
169        Ok(serde_json::from_slice(&data)?)
170    }
171
172    pub async fn delete(
173        &self,
174        folder_id: String,
175        opts: Option<FoldersDeleteOptions>,
176    ) -> Result<(), Error> {
177        let mut url = self.session.base_url("api");
178        url.push_str("/folders");
179        url.push('/');
180        let seg = path_escape(&folder_id);
181        url.push_str(&seg);
182        let mut req = self.session.new_request("DELETE", &url);
183        let opts = opts.unwrap_or_default();
184        if let Some(value) = opts.if_match {
185            req = runtime::with_header(req, "if-match", &value);
186        }
187        if let Some(value) = opts.recursive {
188            req = runtime::with_query(req, "recursive", &value.to_string());
189        }
190        let _ = self.session.fetch(req).await?;
191        Ok(())
192    }
193
194    async fn list_items_page(
195        &self,
196        folder_id: String,
197        opts: Option<FoldersListItemsOptions>,
198    ) -> Result<crate::models::schemas::Items, Error> {
199        let mut url = self.session.base_url("api");
200        url.push_str("/folders");
201        url.push('/');
202        let seg = path_escape(&folder_id);
203        url.push_str(&seg);
204        url.push_str("/items");
205        let mut req = self.session.new_request("GET", &url);
206        let opts = opts.unwrap_or_default();
207        if let Some(value) = opts.fields {
208            req = runtime::with_query(req, "fields", &value.join(","));
209        }
210        if let Some(value) = opts.usemarker {
211            req = runtime::with_query(req, "usemarker", &value.to_string());
212        }
213        if let Some(value) = opts.marker {
214            req = runtime::with_query(req, "marker", &value);
215        }
216        if let Some(value) = opts.offset {
217            req = runtime::with_query(req, "offset", &value.to_string());
218        }
219        if let Some(value) = opts.limit {
220            req = runtime::with_query(req, "limit", &value.to_string());
221        }
222        if let Some(value) = opts.boxapi {
223            req = runtime::with_header(req, "boxapi", &value);
224        }
225        if let Some(value) = opts.sort {
226            req = runtime::with_query(req, "sort", &value.0);
227        }
228        if let Some(value) = opts.direction {
229            req = runtime::with_query(req, "direction", &value.0);
230        }
231        let resp = self.session.fetch(req).await?;
232        let data = runtime::response_bytes(&resp)?;
233        Ok(serde_json::from_slice(&data)?)
234    }
235
236    /// Iterate every `crate::models::schemas::Item` across pages, threading the cursor.
237    pub fn list_items(
238        &self,
239        folder_id: String,
240        opts: Option<FoldersListItemsOptions>,
241    ) -> FoldersListItemsPaginator {
242        FoldersListItemsPaginator {
243            manager: FoldersManager::new(self.session.clone()),
244            folder_id,
245            options: opts.unwrap_or_default(),
246            buffer: Vec::new().into_iter(),
247            done: false,
248        }
249    }
250
251    pub async fn create(
252        &self,
253        body: crate::models::schemas::CreateFolderRequest,
254        opts: Option<FoldersCreateOptions>,
255    ) -> Result<crate::models::schemas::FolderFull, Error> {
256        let mut url = self.session.base_url("api");
257        url.push_str("/folders");
258        let mut req = self.session.new_request("POST", &url);
259        let opts = opts.unwrap_or_default();
260        if let Some(value) = opts.fields {
261            req = runtime::with_query(req, "fields", &value.join(","));
262        }
263        let payload = serde_json::to_vec(&body)?;
264        req = runtime::with_json_body(req, &payload);
265        let resp = self.session.fetch(req).await?;
266        let data = runtime::response_bytes(&resp)?;
267        Ok(serde_json::from_slice(&data)?)
268    }
269
270    pub async fn copy(
271        &self,
272        folder_id: String,
273        body: crate::models::schemas::CopyFolderRequest,
274        opts: Option<FoldersCopyOptions>,
275    ) -> Result<crate::models::schemas::FolderFull, Error> {
276        let mut url = self.session.base_url("api");
277        url.push_str("/folders");
278        url.push('/');
279        let seg = path_escape(&folder_id);
280        url.push_str(&seg);
281        url.push_str("/copy");
282        let mut req = self.session.new_request("POST", &url);
283        let opts = opts.unwrap_or_default();
284        if let Some(value) = opts.fields {
285            req = runtime::with_query(req, "fields", &value.join(","));
286        }
287        let payload = serde_json::to_vec(&body)?;
288        req = runtime::with_json_body(req, &payload);
289        let resp = self.session.fetch(req).await?;
290        let data = runtime::response_bytes(&resp)?;
291        Ok(serde_json::from_slice(&data)?)
292    }
293}