box_open_sdk/managers/
groups.rs1use crate::internal::path_escape;
4use crate::runtime::{self, Error};
5
6#[derive(Clone, Debug, Default)]
8pub struct GroupsListOptions {
9 pub filter_term: Option<String>,
10 pub fields: Option<Vec<String>>,
11 pub limit: Option<i64>,
12 pub offset: Option<i64>,
13}
14
15#[derive(Clone, Debug, Default)]
17pub struct GroupsCreateOptions {
18 pub fields: Option<Vec<String>>,
19}
20
21#[derive(Clone, Debug, Default)]
23pub struct GroupsGetOptions {
24 pub fields: Option<Vec<String>>,
25}
26
27#[derive(Clone, Debug, Default)]
29pub struct GroupsUpdateOptions {
30 pub fields: Option<Vec<String>>,
31}
32
33pub struct GroupsListPaginator {
36 manager: GroupsManager,
37 options: GroupsListOptions,
38 buffer: std::vec::IntoIter<crate::models::schemas::GroupFull>,
39 done: bool,
40}
41
42impl GroupsListPaginator {
43 pub async fn next(&mut self) -> Option<Result<crate::models::schemas::GroupFull, Error>> {
46 loop {
47 if let Some(item) = self.buffer.next() {
48 return Some(Ok(item));
49 }
50 if self.done {
51 return None;
52 }
53 let page = match self.manager.list_page(Some(self.options.clone())).await {
54 Ok(page) => page,
55 Err(err) => {
56 self.done = true;
57 return Some(Err(err));
58 }
59 };
60 let items = page.entries.unwrap_or_default();
61 if items.is_empty() {
62 self.done = true;
63 } else {
64 let next = self.options.offset.unwrap_or(0) + items.len() as i64;
65 self.options.offset = Some(next);
66 }
67 self.buffer = items.into_iter();
68 }
69 }
70}
71
72pub struct GroupsManager {
74 session: std::sync::Arc<runtime::Client>,
75}
76
77impl GroupsManager {
78 pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
79 Self { session }
80 }
81
82 async fn list_page(
83 &self,
84 opts: Option<GroupsListOptions>,
85 ) -> Result<crate::models::schemas::Groups, Error> {
86 let mut url = self.session.base_url("api");
87 url.push_str("/groups");
88 let mut req = self.session.new_request("GET", &url);
89 let opts = opts.unwrap_or_default();
90 if let Some(value) = opts.filter_term {
91 req = runtime::with_query(req, "filter_term", &value);
92 }
93 if let Some(value) = opts.fields {
94 req = runtime::with_query(req, "fields", &value.join(","));
95 }
96 if let Some(value) = opts.limit {
97 req = runtime::with_query(req, "limit", &value.to_string());
98 }
99 if let Some(value) = opts.offset {
100 req = runtime::with_query(req, "offset", &value.to_string());
101 }
102 let resp = self.session.fetch(req).await?;
103 let data = runtime::response_bytes(&resp)?;
104 Ok(serde_json::from_slice(&data)?)
105 }
106
107 pub fn list(&self, opts: Option<GroupsListOptions>) -> GroupsListPaginator {
109 GroupsListPaginator {
110 manager: GroupsManager::new(self.session.clone()),
111 options: opts.unwrap_or_default(),
112 buffer: Vec::new().into_iter(),
113 done: false,
114 }
115 }
116
117 pub async fn create(
118 &self,
119 body: crate::models::schemas::GroupCreateRequest,
120 opts: Option<GroupsCreateOptions>,
121 ) -> Result<crate::models::schemas::GroupFull, Error> {
122 let mut url = self.session.base_url("api");
123 url.push_str("/groups");
124 let mut req = self.session.new_request("POST", &url);
125 let opts = opts.unwrap_or_default();
126 if let Some(value) = opts.fields {
127 req = runtime::with_query(req, "fields", &value.join(","));
128 }
129 let payload = serde_json::to_vec(&body)?;
130 req = runtime::with_json_body(req, &payload);
131 let resp = self.session.fetch(req).await?;
132 let data = runtime::response_bytes(&resp)?;
133 Ok(serde_json::from_slice(&data)?)
134 }
135
136 pub async fn get(
137 &self,
138 group_id: String,
139 opts: Option<GroupsGetOptions>,
140 ) -> Result<crate::models::schemas::GroupFull, Error> {
141 let mut url = self.session.base_url("api");
142 url.push_str("/groups");
143 url.push('/');
144 let seg = path_escape(&group_id);
145 url.push_str(&seg);
146 let mut req = self.session.new_request("GET", &url);
147 let opts = opts.unwrap_or_default();
148 if let Some(value) = opts.fields {
149 req = runtime::with_query(req, "fields", &value.join(","));
150 }
151 let resp = self.session.fetch(req).await?;
152 let data = runtime::response_bytes(&resp)?;
153 Ok(serde_json::from_slice(&data)?)
154 }
155
156 pub async fn update(
157 &self,
158 group_id: String,
159 body: crate::models::schemas::GroupUpdateRequest,
160 opts: Option<GroupsUpdateOptions>,
161 ) -> Result<crate::models::schemas::GroupFull, Error> {
162 let mut url = self.session.base_url("api");
163 url.push_str("/groups");
164 url.push('/');
165 let seg = path_escape(&group_id);
166 url.push_str(&seg);
167 let mut req = self.session.new_request("PUT", &url);
168 let opts = opts.unwrap_or_default();
169 if let Some(value) = opts.fields {
170 req = runtime::with_query(req, "fields", &value.join(","));
171 }
172 let payload = serde_json::to_vec(&body)?;
173 req = runtime::with_json_body(req, &payload);
174 let resp = self.session.fetch(req).await?;
175 let data = runtime::response_bytes(&resp)?;
176 Ok(serde_json::from_slice(&data)?)
177 }
178
179 pub async fn delete(&self, group_id: String) -> Result<(), 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 let req = self.session.new_request("DELETE", &url);
186 let _ = self.session.fetch(req).await?;
187 Ok(())
188 }
189}