1use crate::internal::path_escape;
4use crate::runtime::{self, Error};
5
6#[derive(Clone, Debug, Default)]
8pub struct MetadataTemplatesListOptions {
9 pub marker: Option<String>,
10 pub limit: Option<i64>,
11}
12
13#[derive(Clone, Debug, Default)]
15pub struct MetadataTemplatesListGlobalOptions {
16 pub marker: Option<String>,
17 pub limit: Option<i64>,
18}
19
20#[derive(Clone, Debug, Default)]
22pub struct MetadataTemplatesListEnterpriseOptions {
23 pub marker: Option<String>,
24 pub limit: Option<i64>,
25}
26
27pub struct MetadataTemplatesListPaginator {
30 manager: MetadataTemplatesManager,
31 metadata_instance_id: String,
32 options: MetadataTemplatesListOptions,
33 buffer: std::vec::IntoIter<crate::models::schemas::MetadataTemplate>,
34 done: bool,
35}
36
37impl MetadataTemplatesListPaginator {
38 pub async fn next(
41 &mut self,
42 ) -> Option<Result<crate::models::schemas::MetadataTemplate, Error>> {
43 loop {
44 if let Some(item) = self.buffer.next() {
45 return Some(Ok(item));
46 }
47 if self.done {
48 return None;
49 }
50 let page = match self
51 .manager
52 .list_page(
53 self.metadata_instance_id.clone(),
54 Some(self.options.clone()),
55 )
56 .await
57 {
58 Ok(page) => page,
59 Err(err) => {
60 self.done = true;
61 return Some(Err(err));
62 }
63 };
64 self.buffer = page.entries.unwrap_or_default().into_iter();
65 match page.next_marker.flatten() {
66 Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
67 _ => self.done = true,
68 }
69 }
70 }
71}
72
73pub struct MetadataTemplatesListGlobalPaginator {
76 manager: MetadataTemplatesManager,
77 options: MetadataTemplatesListGlobalOptions,
78 buffer: std::vec::IntoIter<crate::models::schemas::MetadataTemplate>,
79 done: bool,
80}
81
82impl MetadataTemplatesListGlobalPaginator {
83 pub async fn next(
86 &mut self,
87 ) -> Option<Result<crate::models::schemas::MetadataTemplate, Error>> {
88 loop {
89 if let Some(item) = self.buffer.next() {
90 return Some(Ok(item));
91 }
92 if self.done {
93 return None;
94 }
95 let page = match self
96 .manager
97 .list_global_page(Some(self.options.clone()))
98 .await
99 {
100 Ok(page) => page,
101 Err(err) => {
102 self.done = true;
103 return Some(Err(err));
104 }
105 };
106 self.buffer = page.entries.unwrap_or_default().into_iter();
107 match page.next_marker.flatten() {
108 Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
109 _ => self.done = true,
110 }
111 }
112 }
113}
114
115pub struct MetadataTemplatesListEnterprisePaginator {
118 manager: MetadataTemplatesManager,
119 options: MetadataTemplatesListEnterpriseOptions,
120 buffer: std::vec::IntoIter<crate::models::schemas::MetadataTemplate>,
121 done: bool,
122}
123
124impl MetadataTemplatesListEnterprisePaginator {
125 pub async fn next(
128 &mut self,
129 ) -> Option<Result<crate::models::schemas::MetadataTemplate, Error>> {
130 loop {
131 if let Some(item) = self.buffer.next() {
132 return Some(Ok(item));
133 }
134 if self.done {
135 return None;
136 }
137 let page = match self
138 .manager
139 .list_enterprise_page(Some(self.options.clone()))
140 .await
141 {
142 Ok(page) => page,
143 Err(err) => {
144 self.done = true;
145 return Some(Err(err));
146 }
147 };
148 self.buffer = page.entries.unwrap_or_default().into_iter();
149 match page.next_marker.flatten() {
150 Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
151 _ => self.done = true,
152 }
153 }
154 }
155}
156
157pub struct MetadataTemplatesManager {
159 session: std::sync::Arc<runtime::Client>,
160}
161
162impl MetadataTemplatesManager {
163 pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
164 Self { session }
165 }
166
167 async fn list_page(
168 &self,
169 metadata_instance_id: String,
170 opts: Option<MetadataTemplatesListOptions>,
171 ) -> Result<crate::models::schemas::MetadataTemplates, Error> {
172 let mut url = self.session.base_url("api");
173 url.push_str("/metadata_templates");
174 let mut req = self.session.new_request("GET", &url);
175 req = runtime::with_query(req, "metadata_instance_id", &metadata_instance_id);
176 let opts = opts.unwrap_or_default();
177 if let Some(value) = opts.marker {
178 req = runtime::with_query(req, "marker", &value);
179 }
180 if let Some(value) = opts.limit {
181 req = runtime::with_query(req, "limit", &value.to_string());
182 }
183 let resp = self.session.fetch(req).await?;
184 let data = runtime::response_bytes(&resp)?;
185 Ok(serde_json::from_slice(&data)?)
186 }
187
188 pub fn list(
190 &self,
191 metadata_instance_id: String,
192 opts: Option<MetadataTemplatesListOptions>,
193 ) -> MetadataTemplatesListPaginator {
194 MetadataTemplatesListPaginator {
195 manager: MetadataTemplatesManager::new(self.session.clone()),
196 metadata_instance_id,
197 options: opts.unwrap_or_default(),
198 buffer: Vec::new().into_iter(),
199 done: false,
200 }
201 }
202
203 pub async fn get_schema(
204 &self,
205 scope: crate::models::schemas::GetFileIdMetadataIdScope,
206 template_key: String,
207 ) -> Result<crate::models::schemas::MetadataTemplate, Error> {
208 let mut url = self.session.base_url("api");
209 url.push_str("/metadata_templates");
210 url.push('/');
211 let seg = path_escape(&scope.0);
212 url.push_str(&seg);
213 url.push('/');
214 let seg = path_escape(&template_key);
215 url.push_str(&seg);
216 url.push_str("/schema");
217 let req = self.session.new_request("GET", &url);
218 let resp = self.session.fetch(req).await?;
219 let data = runtime::response_bytes(&resp)?;
220 Ok(serde_json::from_slice(&data)?)
221 }
222
223 pub async fn update_schema(
224 &self,
225 scope: crate::models::schemas::GetFileIdMetadataIdScope,
226 template_key: String,
227 body: Vec<crate::models::schemas::UpdateSchemaRequest>,
228 ) -> Result<crate::models::schemas::MetadataTemplate, Error> {
229 let mut url = self.session.base_url("api");
230 url.push_str("/metadata_templates");
231 url.push('/');
232 let seg = path_escape(&scope.0);
233 url.push_str(&seg);
234 url.push('/');
235 let seg = path_escape(&template_key);
236 url.push_str(&seg);
237 url.push_str("/schema");
238 let mut req = self.session.new_request("PUT", &url);
239 let payload = serde_json::to_vec(&body)?;
240 req = runtime::with_json_body(req, &payload);
241 let resp = self.session.fetch(req).await?;
242 let data = runtime::response_bytes(&resp)?;
243 Ok(serde_json::from_slice(&data)?)
244 }
245
246 pub async fn delete_schema(
247 &self,
248 scope: crate::models::schemas::GetFileIdMetadataIdScope,
249 template_key: String,
250 ) -> Result<(), Error> {
251 let mut url = self.session.base_url("api");
252 url.push_str("/metadata_templates");
253 url.push('/');
254 let seg = path_escape(&scope.0);
255 url.push_str(&seg);
256 url.push('/');
257 let seg = path_escape(&template_key);
258 url.push_str(&seg);
259 url.push_str("/schema");
260 let req = self.session.new_request("DELETE", &url);
261 let _ = self.session.fetch(req).await?;
262 Ok(())
263 }
264
265 pub async fn get(
266 &self,
267 template_id: String,
268 ) -> Result<crate::models::schemas::MetadataTemplate, Error> {
269 let mut url = self.session.base_url("api");
270 url.push_str("/metadata_templates");
271 url.push('/');
272 let seg = path_escape(&template_id);
273 url.push_str(&seg);
274 let req = self.session.new_request("GET", &url);
275 let resp = self.session.fetch(req).await?;
276 let data = runtime::response_bytes(&resp)?;
277 Ok(serde_json::from_slice(&data)?)
278 }
279
280 async fn list_global_page(
281 &self,
282 opts: Option<MetadataTemplatesListGlobalOptions>,
283 ) -> Result<crate::models::schemas::MetadataTemplates, Error> {
284 let mut url = self.session.base_url("api");
285 url.push_str("/metadata_templates");
286 url.push_str("/global");
287 let mut req = self.session.new_request("GET", &url);
288 let opts = opts.unwrap_or_default();
289 if let Some(value) = opts.marker {
290 req = runtime::with_query(req, "marker", &value);
291 }
292 if let Some(value) = opts.limit {
293 req = runtime::with_query(req, "limit", &value.to_string());
294 }
295 let resp = self.session.fetch(req).await?;
296 let data = runtime::response_bytes(&resp)?;
297 Ok(serde_json::from_slice(&data)?)
298 }
299
300 pub fn list_global(
302 &self,
303 opts: Option<MetadataTemplatesListGlobalOptions>,
304 ) -> MetadataTemplatesListGlobalPaginator {
305 MetadataTemplatesListGlobalPaginator {
306 manager: MetadataTemplatesManager::new(self.session.clone()),
307 options: opts.unwrap_or_default(),
308 buffer: Vec::new().into_iter(),
309 done: false,
310 }
311 }
312
313 async fn list_enterprise_page(
314 &self,
315 opts: Option<MetadataTemplatesListEnterpriseOptions>,
316 ) -> Result<crate::models::schemas::MetadataTemplates, Error> {
317 let mut url = self.session.base_url("api");
318 url.push_str("/metadata_templates");
319 url.push_str("/enterprise");
320 let mut req = self.session.new_request("GET", &url);
321 let opts = opts.unwrap_or_default();
322 if let Some(value) = opts.marker {
323 req = runtime::with_query(req, "marker", &value);
324 }
325 if let Some(value) = opts.limit {
326 req = runtime::with_query(req, "limit", &value.to_string());
327 }
328 let resp = self.session.fetch(req).await?;
329 let data = runtime::response_bytes(&resp)?;
330 Ok(serde_json::from_slice(&data)?)
331 }
332
333 pub fn list_enterprise(
335 &self,
336 opts: Option<MetadataTemplatesListEnterpriseOptions>,
337 ) -> MetadataTemplatesListEnterprisePaginator {
338 MetadataTemplatesListEnterprisePaginator {
339 manager: MetadataTemplatesManager::new(self.session.clone()),
340 options: opts.unwrap_or_default(),
341 buffer: Vec::new().into_iter(),
342 done: false,
343 }
344 }
345
346 pub async fn create_schema(
347 &self,
348 body: crate::models::schemas::CreateSchemaRequest,
349 ) -> Result<crate::models::schemas::MetadataTemplate, Error> {
350 let mut url = self.session.base_url("api");
351 url.push_str("/metadata_templates");
352 url.push_str("/schema");
353 let mut req = self.session.new_request("POST", &url);
354 let payload = serde_json::to_vec(&body)?;
355 req = runtime::with_json_body(req, &payload);
356 let resp = self.session.fetch(req).await?;
357 let data = runtime::response_bytes(&resp)?;
358 Ok(serde_json::from_slice(&data)?)
359 }
360}