1use crate::internal::path_escape;
4use crate::runtime::{self, Error};
5
6#[derive(Clone, Debug, Default)]
8pub struct DocgenTemplateListDocgenTemplatesOptions {
9 pub marker: Option<String>,
10 pub limit: Option<i64>,
11}
12
13#[derive(Clone, Debug, Default)]
15pub struct DocgenTemplateListDocgenTemplateTagsOptions {
16 pub template_version_id: Option<String>,
17 pub marker: Option<String>,
18 pub limit: Option<i64>,
19}
20
21#[derive(Clone, Debug, Default)]
23pub struct DocgenTemplateListJobOptions {
24 pub marker: Option<String>,
25 pub limit: Option<i64>,
26}
27
28pub struct DocgenTemplateListDocgenTemplatesPaginator {
31 manager: DocgenTemplateManager,
32 options: DocgenTemplateListDocgenTemplatesOptions,
33 buffer: std::vec::IntoIter<crate::models::schemas::DocGenTemplate>,
34 done: bool,
35}
36
37impl DocgenTemplateListDocgenTemplatesPaginator {
38 pub async fn next(&mut self) -> Option<Result<crate::models::schemas::DocGenTemplate, Error>> {
41 loop {
42 if let Some(item) = self.buffer.next() {
43 return Some(Ok(item));
44 }
45 if self.done {
46 return None;
47 }
48 let page = match self
49 .manager
50 .list_docgen_templates_page(Some(self.options.clone()))
51 .await
52 {
53 Ok(page) => page,
54 Err(err) => {
55 self.done = true;
56 return Some(Err(err));
57 }
58 };
59 self.buffer = page.entries.unwrap_or_default().into_iter();
60 match page.next_marker.flatten() {
61 Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
62 _ => self.done = true,
63 }
64 }
65 }
66}
67
68pub struct DocgenTemplateListDocgenTemplateTagsPaginator {
71 manager: DocgenTemplateManager,
72 template_id: String,
73 options: DocgenTemplateListDocgenTemplateTagsOptions,
74 buffer: std::vec::IntoIter<crate::models::schemas::DocGenTag>,
75 done: bool,
76}
77
78impl DocgenTemplateListDocgenTemplateTagsPaginator {
79 pub async fn next(&mut self) -> Option<Result<crate::models::schemas::DocGenTag, Error>> {
82 loop {
83 if let Some(item) = self.buffer.next() {
84 return Some(Ok(item));
85 }
86 if self.done {
87 return None;
88 }
89 let page = match self
90 .manager
91 .list_docgen_template_tags_page(
92 self.template_id.clone(),
93 Some(self.options.clone()),
94 )
95 .await
96 {
97 Ok(page) => page,
98 Err(err) => {
99 self.done = true;
100 return Some(Err(err));
101 }
102 };
103 self.buffer = page.entries.unwrap_or_default().into_iter();
104 match page.next_marker.flatten() {
105 Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
106 _ => self.done = true,
107 }
108 }
109 }
110}
111
112pub struct DocgenTemplateListJobPaginator {
115 manager: DocgenTemplateManager,
116 template_id: String,
117 options: DocgenTemplateListJobOptions,
118 buffer: std::vec::IntoIter<crate::models::schemas::DocGenJob>,
119 done: bool,
120}
121
122impl DocgenTemplateListJobPaginator {
123 pub async fn next(&mut self) -> Option<Result<crate::models::schemas::DocGenJob, Error>> {
126 loop {
127 if let Some(item) = self.buffer.next() {
128 return Some(Ok(item));
129 }
130 if self.done {
131 return None;
132 }
133 let page = match self
134 .manager
135 .list_job_page(self.template_id.clone(), Some(self.options.clone()))
136 .await
137 {
138 Ok(page) => page,
139 Err(err) => {
140 self.done = true;
141 return Some(Err(err));
142 }
143 };
144 self.buffer = page.entries.unwrap_or_default().into_iter();
145 match page.next_marker.flatten() {
146 Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
147 _ => self.done = true,
148 }
149 }
150 }
151}
152
153pub struct DocgenTemplateManager {
155 session: std::sync::Arc<runtime::Client>,
156}
157
158impl DocgenTemplateManager {
159 pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
160 Self { session }
161 }
162
163 async fn list_docgen_templates_page(
164 &self,
165 opts: Option<DocgenTemplateListDocgenTemplatesOptions>,
166 ) -> Result<crate::models::schemas::DocGenTemplates, Error> {
167 let mut url = self.session.base_url("api");
168 url.push_str("/docgen_templates");
169 let mut req = self.session.new_request("GET", &url);
170 let opts = opts.unwrap_or_default();
171 if let Some(value) = opts.marker {
172 req = runtime::with_query(req, "marker", &value);
173 }
174 if let Some(value) = opts.limit {
175 req = runtime::with_query(req, "limit", &value.to_string());
176 }
177 req = runtime::with_header(req, "box-version", "2025.0");
178 let resp = self.session.fetch(req).await?;
179 let data = runtime::response_bytes(&resp)?;
180 Ok(serde_json::from_slice(&data)?)
181 }
182
183 pub fn list_docgen_templates(
185 &self,
186 opts: Option<DocgenTemplateListDocgenTemplatesOptions>,
187 ) -> DocgenTemplateListDocgenTemplatesPaginator {
188 DocgenTemplateListDocgenTemplatesPaginator {
189 manager: DocgenTemplateManager::new(self.session.clone()),
190 options: opts.unwrap_or_default(),
191 buffer: Vec::new().into_iter(),
192 done: false,
193 }
194 }
195
196 pub async fn create_docgen_templates(
197 &self,
198 body: crate::models::schemas::DocGenTemplateCreateRequest,
199 ) -> Result<crate::models::schemas::DocGenTemplateBase, Error> {
200 let mut url = self.session.base_url("api");
201 url.push_str("/docgen_templates");
202 let mut req = self.session.new_request("POST", &url);
203 req = runtime::with_header(req, "box-version", "2025.0");
204 let payload = serde_json::to_vec(&body)?;
205 req = runtime::with_json_body(req, &payload);
206 let resp = self.session.fetch(req).await?;
207 let data = runtime::response_bytes(&resp)?;
208 Ok(serde_json::from_slice(&data)?)
209 }
210
211 pub async fn get_docgen_template(
212 &self,
213 template_id: String,
214 ) -> Result<crate::models::schemas::DocGenTemplate, Error> {
215 let mut url = self.session.base_url("api");
216 url.push_str("/docgen_templates");
217 url.push('/');
218 let seg = path_escape(&template_id);
219 url.push_str(&seg);
220 let mut req = self.session.new_request("GET", &url);
221 req = runtime::with_header(req, "box-version", "2025.0");
222 let resp = self.session.fetch(req).await?;
223 let data = runtime::response_bytes(&resp)?;
224 Ok(serde_json::from_slice(&data)?)
225 }
226
227 pub async fn delete_docgen_template(&self, template_id: String) -> Result<(), Error> {
228 let mut url = self.session.base_url("api");
229 url.push_str("/docgen_templates");
230 url.push('/');
231 let seg = path_escape(&template_id);
232 url.push_str(&seg);
233 let mut req = self.session.new_request("DELETE", &url);
234 req = runtime::with_header(req, "box-version", "2025.0");
235 let _ = self.session.fetch(req).await?;
236 Ok(())
237 }
238
239 async fn list_docgen_template_tags_page(
240 &self,
241 template_id: String,
242 opts: Option<DocgenTemplateListDocgenTemplateTagsOptions>,
243 ) -> Result<crate::models::schemas::DocGenTags, Error> {
244 let mut url = self.session.base_url("api");
245 url.push_str("/docgen_templates");
246 url.push('/');
247 let seg = path_escape(&template_id);
248 url.push_str(&seg);
249 url.push_str("/tags");
250 let mut req = self.session.new_request("GET", &url);
251 let opts = opts.unwrap_or_default();
252 if let Some(value) = opts.template_version_id {
253 req = runtime::with_query(req, "template_version_id", &value);
254 }
255 if let Some(value) = opts.marker {
256 req = runtime::with_query(req, "marker", &value);
257 }
258 if let Some(value) = opts.limit {
259 req = runtime::with_query(req, "limit", &value.to_string());
260 }
261 req = runtime::with_header(req, "box-version", "2025.0");
262 let resp = self.session.fetch(req).await?;
263 let data = runtime::response_bytes(&resp)?;
264 Ok(serde_json::from_slice(&data)?)
265 }
266
267 pub fn list_docgen_template_tags(
269 &self,
270 template_id: String,
271 opts: Option<DocgenTemplateListDocgenTemplateTagsOptions>,
272 ) -> DocgenTemplateListDocgenTemplateTagsPaginator {
273 DocgenTemplateListDocgenTemplateTagsPaginator {
274 manager: DocgenTemplateManager::new(self.session.clone()),
275 template_id,
276 options: opts.unwrap_or_default(),
277 buffer: Vec::new().into_iter(),
278 done: false,
279 }
280 }
281
282 async fn list_job_page(
283 &self,
284 template_id: String,
285 opts: Option<DocgenTemplateListJobOptions>,
286 ) -> Result<crate::models::schemas::DocGenJobs, Error> {
287 let mut url = self.session.base_url("api");
288 url.push_str("/docgen_template_jobs");
289 url.push('/');
290 let seg = path_escape(&template_id);
291 url.push_str(&seg);
292 let mut req = self.session.new_request("GET", &url);
293 let opts = opts.unwrap_or_default();
294 if let Some(value) = opts.marker {
295 req = runtime::with_query(req, "marker", &value);
296 }
297 if let Some(value) = opts.limit {
298 req = runtime::with_query(req, "limit", &value.to_string());
299 }
300 req = runtime::with_header(req, "box-version", "2025.0");
301 let resp = self.session.fetch(req).await?;
302 let data = runtime::response_bytes(&resp)?;
303 Ok(serde_json::from_slice(&data)?)
304 }
305
306 pub fn list_job(
308 &self,
309 template_id: String,
310 opts: Option<DocgenTemplateListJobOptions>,
311 ) -> DocgenTemplateListJobPaginator {
312 DocgenTemplateListJobPaginator {
313 manager: DocgenTemplateManager::new(self.session.clone()),
314 template_id,
315 options: opts.unwrap_or_default(),
316 buffer: Vec::new().into_iter(),
317 done: false,
318 }
319 }
320}