Skip to main content

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