box_open_sdk/managers/
trashed_items.rs1use crate::runtime::{self, Error};
4
5#[derive(Clone, Debug, Default)]
7pub struct TrashedItemsListFolderTrashItemsOptions {
8 pub fields: Option<Vec<String>>,
9 pub limit: Option<i64>,
10 pub offset: Option<i64>,
11 pub usemarker: Option<bool>,
12 pub marker: Option<String>,
13 pub direction: Option<crate::models::schemas::OrderDirection>,
14 pub sort: Option<crate::models::schemas::GetFolderTrashItemsSort>,
15}
16
17pub struct TrashedItemsListFolderTrashItemsPaginator {
20 manager: TrashedItemsManager,
21 options: TrashedItemsListFolderTrashItemsOptions,
22 buffer: std::vec::IntoIter<crate::models::schemas::Item>,
23 done: bool,
24}
25
26impl TrashedItemsListFolderTrashItemsPaginator {
27 pub async fn next(&mut self) -> Option<Result<crate::models::schemas::Item, Error>> {
30 loop {
31 if let Some(item) = self.buffer.next() {
32 return Some(Ok(item));
33 }
34 if self.done {
35 return None;
36 }
37 let page = match self
38 .manager
39 .list_folder_trash_items_page(Some(self.options.clone()))
40 .await
41 {
42 Ok(page) => page,
43 Err(err) => {
44 self.done = true;
45 return Some(Err(err));
46 }
47 };
48 self.buffer = page.entries.unwrap_or_default().into_iter();
49 match page.next_marker.flatten() {
50 Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
51 _ => self.done = true,
52 }
53 }
54 }
55}
56
57pub struct TrashedItemsManager {
59 session: std::sync::Arc<runtime::Client>,
60}
61
62impl TrashedItemsManager {
63 pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
64 Self { session }
65 }
66
67 async fn list_folder_trash_items_page(
68 &self,
69 opts: Option<TrashedItemsListFolderTrashItemsOptions>,
70 ) -> Result<crate::models::schemas::Items, Error> {
71 let mut url = self.session.base_url("api");
72 url.push_str("/folders");
73 url.push_str("/trash");
74 url.push_str("/items");
75 let mut req = self.session.new_request("GET", &url);
76 let opts = opts.unwrap_or_default();
77 if let Some(value) = opts.fields {
78 req = runtime::with_query(req, "fields", &value.join(","));
79 }
80 if let Some(value) = opts.limit {
81 req = runtime::with_query(req, "limit", &value.to_string());
82 }
83 if let Some(value) = opts.offset {
84 req = runtime::with_query(req, "offset", &value.to_string());
85 }
86 if let Some(value) = opts.usemarker {
87 req = runtime::with_query(req, "usemarker", &value.to_string());
88 }
89 if let Some(value) = opts.marker {
90 req = runtime::with_query(req, "marker", &value);
91 }
92 if let Some(value) = opts.direction {
93 req = runtime::with_query(req, "direction", &value.0);
94 }
95 if let Some(value) = opts.sort {
96 req = runtime::with_query(req, "sort", &value.0);
97 }
98 let resp = self.session.fetch(req).await?;
99 let data = runtime::response_bytes(&resp)?;
100 Ok(serde_json::from_slice(&data)?)
101 }
102
103 pub fn list_folder_trash_items(
105 &self,
106 opts: Option<TrashedItemsListFolderTrashItemsOptions>,
107 ) -> TrashedItemsListFolderTrashItemsPaginator {
108 TrashedItemsListFolderTrashItemsPaginator {
109 manager: TrashedItemsManager::new(self.session.clone()),
110 options: opts.unwrap_or_default(),
111 buffer: Vec::new().into_iter(),
112 done: false,
113 }
114 }
115}