1use crate::internal::path_escape;
4use crate::runtime::{self, Error};
5
6#[derive(Clone, Debug, Default)]
8pub struct MembershipsListUserOptions {
9 pub limit: Option<i64>,
10 pub offset: Option<i64>,
11}
12
13#[derive(Clone, Debug, Default)]
15pub struct MembershipsListGroupOptions {
16 pub limit: Option<i64>,
17 pub offset: Option<i64>,
18}
19
20#[derive(Clone, Debug, Default)]
22pub struct MembershipsCreateGroupOptions {
23 pub fields: Option<Vec<String>>,
24}
25
26#[derive(Clone, Debug, Default)]
28pub struct MembershipsGetGroupOptions {
29 pub fields: Option<Vec<String>>,
30}
31
32#[derive(Clone, Debug, Default)]
34pub struct MembershipsUpdateGroupOptions {
35 pub fields: Option<Vec<String>>,
36}
37
38pub 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 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
82pub 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 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
126pub 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 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 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}