1use crate::internal::path_escape;
4use crate::runtime::{self, Error};
5
6#[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#[derive(Clone, Debug, Default)]
20pub struct FoldersUpdateOptions {
21 pub fields: Option<Vec<String>>,
22 pub if_match: Option<String>,
23}
24
25#[derive(Clone, Debug, Default)]
27pub struct FoldersDeleteOptions {
28 pub if_match: Option<String>,
29 pub recursive: Option<bool>,
30}
31
32#[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#[derive(Clone, Debug, Default)]
47pub struct FoldersCreateOptions {
48 pub fields: Option<Vec<String>>,
49}
50
51#[derive(Clone, Debug, Default)]
53pub struct FoldersCopyOptions {
54 pub fields: Option<Vec<String>>,
55}
56
57pub 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 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
98pub 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 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}