Skip to main content

box_open_sdk/managers/
recent_items.rs

1// Code generated by box-gantry. DO NOT EDIT.
2
3use crate::runtime::{self, Error};
4
5/// Optional parameters for [`RecentItemsManager::list`].
6#[derive(Clone, Debug, Default)]
7pub struct RecentItemsListOptions {
8    pub fields: Option<Vec<String>>,
9    pub limit: Option<i64>,
10    pub marker: Option<String>,
11}
12
13/// Async paginator over [`RecentItemsManager::list`], yielding one `crate::models::schemas::RecentItem`
14/// per item across pages (FR-7.3).
15pub struct RecentItemsListPaginator {
16    manager: RecentItemsManager,
17    options: RecentItemsListOptions,
18    buffer: std::vec::IntoIter<crate::models::schemas::RecentItem>,
19    done: bool,
20}
21
22impl RecentItemsListPaginator {
23    /// The next item, advancing pages as needed; `None` at the end.
24    /// An error is yielded once, then iteration stops.
25    pub async fn next(&mut self) -> Option<Result<crate::models::schemas::RecentItem, Error>> {
26        loop {
27            if let Some(item) = self.buffer.next() {
28                return Some(Ok(item));
29            }
30            if self.done {
31                return None;
32            }
33            let page = match self.manager.list_page(Some(self.options.clone())).await {
34                Ok(page) => page,
35                Err(err) => {
36                    self.done = true;
37                    return Some(Err(err));
38                }
39            };
40            self.buffer = page.entries.unwrap_or_default().into_iter();
41            match page.next_marker.flatten() {
42                Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
43                _ => self.done = true,
44            }
45        }
46    }
47}
48
49/// Operations for the "recent_items" API area.
50pub struct RecentItemsManager {
51    session: std::sync::Arc<runtime::Client>,
52}
53
54impl RecentItemsManager {
55    pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
56        Self { session }
57    }
58
59    async fn list_page(
60        &self,
61        opts: Option<RecentItemsListOptions>,
62    ) -> Result<crate::models::schemas::RecentItems, Error> {
63        let mut url = self.session.base_url("api");
64        url.push_str("/recent_items");
65        let mut req = self.session.new_request("GET", &url);
66        let opts = opts.unwrap_or_default();
67        if let Some(value) = opts.fields {
68            req = runtime::with_query(req, "fields", &value.join(","));
69        }
70        if let Some(value) = opts.limit {
71            req = runtime::with_query(req, "limit", &value.to_string());
72        }
73        if let Some(value) = opts.marker {
74            req = runtime::with_query(req, "marker", &value);
75        }
76        let resp = self.session.fetch(req).await?;
77        let data = runtime::response_bytes(&resp)?;
78        Ok(serde_json::from_slice(&data)?)
79    }
80
81    /// Iterate every `crate::models::schemas::RecentItem` across pages, threading the cursor.
82    pub fn list(&self, opts: Option<RecentItemsListOptions>) -> RecentItemsListPaginator {
83        RecentItemsListPaginator {
84            manager: RecentItemsManager::new(self.session.clone()),
85            options: opts.unwrap_or_default(),
86            buffer: Vec::new().into_iter(),
87            done: false,
88        }
89    }
90}