thunkmetrc_wrapper/services/
processing_job_service.rs1use thunkmetrc_client::MetrcClient;
2use serde_json::Value;
3use std::error::Error;
4use std::sync::Arc;
5#[allow(unused_imports)]
6use futures::Stream;
7use crate::ratelimiter::MetrcRateLimiter;
8#[allow(unused_imports)]
9use crate::utils::iterate_pages;
10#[allow(unused_imports)]
11use crate::models::*;
12
13pub struct ProcessingJobService {
14 client: MetrcClient,
15 rate_limiter: Arc<MetrcRateLimiter>,
16}
17
18impl ProcessingJobService {
19 pub fn new(client: MetrcClient, rate_limiter: Arc<MetrcRateLimiter>) -> Self {
20 Self {
21 client,
22 rate_limiter,
23 }
24 }
25
26 pub async fn create_adjust_processing_job(&self, license_number: Option<String>, body: Option<Vec<CreateAdjustProcessingJobRequestItem>>) -> std::result::Result<Option<WriteResponse>, Box<dyn Error + Send + Sync>> {
34 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
35 let client = self.client.clone();
36
37 let body_val = body_val.clone();
38
39 let resp_val = self.rate_limiter.execute(None,false,
40 move || {
41 let client = client.clone();
42 let license_number = license_number.clone();
43 let body_val = body_val.clone();
44
45 async move {
46 client.processing_job().create_adjust_processing_job(license_number, body_val.as_ref()
47 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
48 }
49 }
50 ).await?;
51
52 if let Some(v) = resp_val {
53 let typed: WriteResponse = serde_json::from_value(v)?;
54 Ok(Some(typed))
55 } else {
56 Ok(None)
57 }
58 }
59
60 pub async fn create_processing_job_job_types(&self, license_number: Option<String>, body: Option<Vec<CreateJobTypesRequestItem>>) -> std::result::Result<Option<WriteResponse>, Box<dyn Error + Send + Sync>> {
68 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
69 let client = self.client.clone();
70
71 let body_val = body_val.clone();
72
73 let resp_val = self.rate_limiter.execute(None,false,
74 move || {
75 let client = client.clone();
76 let license_number = license_number.clone();
77 let body_val = body_val.clone();
78
79 async move {
80 client.processing_job().create_processing_job_job_types(license_number, body_val.as_ref()
81 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
82 }
83 }
84 ).await?;
85
86 if let Some(v) = resp_val {
87 let typed: WriteResponse = serde_json::from_value(v)?;
88 Ok(Some(typed))
89 } else {
90 Ok(None)
91 }
92 }
93
94 pub async fn create_processing_job_packages(&self, license_number: Option<String>, body: Option<Vec<CreateProcessingJobPackagesRequestItem>>) -> std::result::Result<Option<WriteResponse>, Box<dyn Error + Send + Sync>> {
102 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
103 let client = self.client.clone();
104
105 let body_val = body_val.clone();
106
107 let resp_val = self.rate_limiter.execute(None,false,
108 move || {
109 let client = client.clone();
110 let license_number = license_number.clone();
111 let body_val = body_val.clone();
112
113 async move {
114 client.processing_job().create_processing_job_packages(license_number, body_val.as_ref()
115 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
116 }
117 }
118 ).await?;
119
120 if let Some(v) = resp_val {
121 let typed: WriteResponse = serde_json::from_value(v)?;
122 Ok(Some(typed))
123 } else {
124 Ok(None)
125 }
126 }
127
128 pub async fn delete_processing_job_job_type_by_id(&self, id: &str, license_number: Option<String>, body: Option<&Value>) -> std::result::Result<Option<serde_json::Value>, Box<dyn Error + Send + Sync>> {
136 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
137 let id = id.to_string();
138 let client = self.client.clone();
139
140 let body_val = body_val.clone();
141
142 let resp_val = self.rate_limiter.execute(None,false,
143 move || {
144 let client = client.clone();
145 let id = id.clone();
146 let license_number = license_number.clone();
147 let body_val = body_val.clone();
148
149 async move {
150 client.processing_job().delete_processing_job_job_type_by_id(&id, license_number, body_val.as_ref()
151 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
152 }
153 }
154 ).await?;
155
156 if let Some(v) = resp_val {
157 let typed: serde_json::Value = serde_json::from_value(v)?;
158 Ok(Some(typed))
159 } else {
160 Ok(None)
161 }
162 }
163
164 pub async fn delete_processing_job_by_id(&self, id: &str, license_number: Option<String>, body: Option<&Value>) -> std::result::Result<Option<serde_json::Value>, Box<dyn Error + Send + Sync>> {
172 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
173 let id = id.to_string();
174 let client = self.client.clone();
175
176 let body_val = body_val.clone();
177
178 let resp_val = self.rate_limiter.execute(None,false,
179 move || {
180 let client = client.clone();
181 let id = id.clone();
182 let license_number = license_number.clone();
183 let body_val = body_val.clone();
184
185 async move {
186 client.processing_job().delete_processing_job_by_id(&id, license_number, body_val.as_ref()
187 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
188 }
189 }
190 ).await?;
191
192 if let Some(v) = resp_val {
193 let typed: serde_json::Value = serde_json::from_value(v)?;
194 Ok(Some(typed))
195 } else {
196 Ok(None)
197 }
198 }
199
200 pub async fn finish_processing_job_processing_job(&self, license_number: Option<String>, body: Option<Vec<FinishProcessingJobRequestItem>>) -> std::result::Result<Option<serde_json::Value>, Box<dyn Error + Send + Sync>> {
208 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
209 let client = self.client.clone();
210
211 let body_val = body_val.clone();
212
213 let resp_val = self.rate_limiter.execute(None,false,
214 move || {
215 let client = client.clone();
216 let license_number = license_number.clone();
217 let body_val = body_val.clone();
218
219 async move {
220 client.processing_job().finish_processing_job_processing_job(license_number, body_val.as_ref()
221 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
222 }
223 }
224 ).await?;
225
226 if let Some(v) = resp_val {
227 let typed: serde_json::Value = serde_json::from_value(v)?;
228 Ok(Some(typed))
229 } else {
230 Ok(None)
231 }
232 }
233
234 pub async fn get_processing_job_active_job_types(&self, last_modified_end: Option<String>, last_modified_start: Option<String>, license_number: Option<String>, page_number: Option<String>, page_size: Option<String>, body: Option<&Value>) -> std::result::Result<Option<PaginatedResponse<ActiveJobType>>, Box<dyn Error + Send + Sync>> {
245 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
246 let client = self.client.clone();
247
248 let body_val = body_val.clone();
249
250 let resp_val = self.rate_limiter.execute(None,true,
251 move || {
252 let client = client.clone();
253 let last_modified_end = last_modified_end.clone();
254 let last_modified_start = last_modified_start.clone();
255 let license_number = license_number.clone();
256 let page_number = page_number.clone();
257 let page_size = page_size.clone();
258 let body_val = body_val.clone();
259
260 async move {
261 client.processing_job().get_processing_job_active_job_types(last_modified_end, last_modified_start, license_number, page_number, page_size, body_val.as_ref()
262 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
263 }
264 }
265 ).await?;
266
267 if let Some(v) = resp_val {
268 let typed: PaginatedResponse<ActiveJobType> = serde_json::from_value(v)?;
269 Ok(Some(typed))
270 } else {
271 Ok(None)
272 }
273 }
274
275 pub async fn get_active_processing_job(&self, last_modified_end: Option<String>, last_modified_start: Option<String>, license_number: Option<String>, page_number: Option<String>, page_size: Option<String>, body: Option<&Value>) -> std::result::Result<Option<PaginatedResponse<ProcessingJob>>, Box<dyn Error + Send + Sync>> {
286 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
287 let client = self.client.clone();
288
289 let body_val = body_val.clone();
290
291 let resp_val = self.rate_limiter.execute(None,true,
292 move || {
293 let client = client.clone();
294 let last_modified_end = last_modified_end.clone();
295 let last_modified_start = last_modified_start.clone();
296 let license_number = license_number.clone();
297 let page_number = page_number.clone();
298 let page_size = page_size.clone();
299 let body_val = body_val.clone();
300
301 async move {
302 client.processing_job().get_active_processing_job(last_modified_end, last_modified_start, license_number, page_number, page_size, body_val.as_ref()
303 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
304 }
305 }
306 ).await?;
307
308 if let Some(v) = resp_val {
309 let typed: PaginatedResponse<ProcessingJob> = serde_json::from_value(v)?;
310 Ok(Some(typed))
311 } else {
312 Ok(None)
313 }
314 }
315
316 pub async fn get_processing_job_inactive_job_types(&self, last_modified_end: Option<String>, last_modified_start: Option<String>, license_number: Option<String>, page_number: Option<String>, page_size: Option<String>, body: Option<&Value>) -> std::result::Result<Option<PaginatedResponse<InactiveJobType>>, Box<dyn Error + Send + Sync>> {
327 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
328 let client = self.client.clone();
329
330 let body_val = body_val.clone();
331
332 let resp_val = self.rate_limiter.execute(None,true,
333 move || {
334 let client = client.clone();
335 let last_modified_end = last_modified_end.clone();
336 let last_modified_start = last_modified_start.clone();
337 let license_number = license_number.clone();
338 let page_number = page_number.clone();
339 let page_size = page_size.clone();
340 let body_val = body_val.clone();
341
342 async move {
343 client.processing_job().get_processing_job_inactive_job_types(last_modified_end, last_modified_start, license_number, page_number, page_size, body_val.as_ref()
344 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
345 }
346 }
347 ).await?;
348
349 if let Some(v) = resp_val {
350 let typed: PaginatedResponse<InactiveJobType> = serde_json::from_value(v)?;
351 Ok(Some(typed))
352 } else {
353 Ok(None)
354 }
355 }
356
357 pub async fn get_inactive_processing_job(&self, last_modified_end: Option<String>, last_modified_start: Option<String>, license_number: Option<String>, page_number: Option<String>, page_size: Option<String>, body: Option<&Value>) -> std::result::Result<Option<PaginatedResponse<ProcessingJob>>, Box<dyn Error + Send + Sync>> {
368 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
369 let client = self.client.clone();
370
371 let body_val = body_val.clone();
372
373 let resp_val = self.rate_limiter.execute(None,true,
374 move || {
375 let client = client.clone();
376 let last_modified_end = last_modified_end.clone();
377 let last_modified_start = last_modified_start.clone();
378 let license_number = license_number.clone();
379 let page_number = page_number.clone();
380 let page_size = page_size.clone();
381 let body_val = body_val.clone();
382
383 async move {
384 client.processing_job().get_inactive_processing_job(last_modified_end, last_modified_start, license_number, page_number, page_size, body_val.as_ref()
385 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
386 }
387 }
388 ).await?;
389
390 if let Some(v) = resp_val {
391 let typed: PaginatedResponse<ProcessingJob> = serde_json::from_value(v)?;
392 Ok(Some(typed))
393 } else {
394 Ok(None)
395 }
396 }
397
398 pub async fn get_processing_job_job_types_attributes(&self, license_number: Option<String>, body: Option<&Value>) -> std::result::Result<Option<PaginatedResponse<JobTypesAttribute>>, Box<dyn Error + Send + Sync>> {
405 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
406 let client = self.client.clone();
407
408 let body_val = body_val.clone();
409
410 let resp_val = self.rate_limiter.execute(None,true,
411 move || {
412 let client = client.clone();
413 let license_number = license_number.clone();
414 let body_val = body_val.clone();
415
416 async move {
417 client.processing_job().get_processing_job_job_types_attributes(license_number, body_val.as_ref()
418 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
419 }
420 }
421 ).await?;
422
423 if let Some(v) = resp_val {
424 let typed: PaginatedResponse<JobTypesAttribute> = serde_json::from_value(v)?;
425 Ok(Some(typed))
426 } else {
427 Ok(None)
428 }
429 }
430
431 pub async fn get_processing_job_job_types_categories(&self, license_number: Option<String>, body: Option<&Value>) -> std::result::Result<Option<PaginatedResponse<JobTypesCategory>>, Box<dyn Error + Send + Sync>> {
438 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
439 let client = self.client.clone();
440
441 let body_val = body_val.clone();
442
443 let resp_val = self.rate_limiter.execute(None,true,
444 move || {
445 let client = client.clone();
446 let license_number = license_number.clone();
447 let body_val = body_val.clone();
448
449 async move {
450 client.processing_job().get_processing_job_job_types_categories(license_number, body_val.as_ref()
451 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
452 }
453 }
454 ).await?;
455
456 if let Some(v) = resp_val {
457 let typed: PaginatedResponse<JobTypesCategory> = serde_json::from_value(v)?;
458 Ok(Some(typed))
459 } else {
460 Ok(None)
461 }
462 }
463
464 pub async fn get_processing_job_by_id(&self, id: &str, license_number: Option<String>, body: Option<&Value>) -> std::result::Result<Option<ProcessingJob>, Box<dyn Error + Send + Sync>> {
472 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
473 let id = id.to_string();
474 let client = self.client.clone();
475
476 let body_val = body_val.clone();
477
478 let resp_val = self.rate_limiter.execute(None,true,
479 move || {
480 let client = client.clone();
481 let id = id.clone();
482 let license_number = license_number.clone();
483 let body_val = body_val.clone();
484
485 async move {
486 client.processing_job().get_processing_job_by_id(&id, license_number, body_val.as_ref()
487 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
488 }
489 }
490 ).await?;
491
492 if let Some(v) = resp_val {
493 let typed: ProcessingJob = serde_json::from_value(v)?;
494 Ok(Some(typed))
495 } else {
496 Ok(None)
497 }
498 }
499
500 pub async fn start_processing_job_processing_job(&self, license_number: Option<String>, body: Option<Vec<StartProcessingJobRequestItem>>) -> std::result::Result<Option<WriteResponse>, Box<dyn Error + Send + Sync>> {
508 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
509 let client = self.client.clone();
510
511 let body_val = body_val.clone();
512
513 let resp_val = self.rate_limiter.execute(None,false,
514 move || {
515 let client = client.clone();
516 let license_number = license_number.clone();
517 let body_val = body_val.clone();
518
519 async move {
520 client.processing_job().start_processing_job_processing_job(license_number, body_val.as_ref()
521 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
522 }
523 }
524 ).await?;
525
526 if let Some(v) = resp_val {
527 let typed: WriteResponse = serde_json::from_value(v)?;
528 Ok(Some(typed))
529 } else {
530 Ok(None)
531 }
532 }
533
534 pub async fn unfinish_processing_job_processing_job(&self, license_number: Option<String>, body: Option<Vec<UnfinishProcessingJobRequestItem>>) -> std::result::Result<Option<serde_json::Value>, Box<dyn Error + Send + Sync>> {
542 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
543 let client = self.client.clone();
544
545 let body_val = body_val.clone();
546
547 let resp_val = self.rate_limiter.execute(None,false,
548 move || {
549 let client = client.clone();
550 let license_number = license_number.clone();
551 let body_val = body_val.clone();
552
553 async move {
554 client.processing_job().unfinish_processing_job_processing_job(license_number, body_val.as_ref()
555 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
556 }
557 }
558 ).await?;
559
560 if let Some(v) = resp_val {
561 let typed: serde_json::Value = serde_json::from_value(v)?;
562 Ok(Some(typed))
563 } else {
564 Ok(None)
565 }
566 }
567
568 pub async fn update_processing_job_job_types(&self, license_number: Option<String>, body: Option<Vec<UpdateJobTypesRequestItem>>) -> std::result::Result<Option<WriteResponse>, Box<dyn Error + Send + Sync>> {
576 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
577 let client = self.client.clone();
578
579 let body_val = body_val.clone();
580
581 let resp_val = self.rate_limiter.execute(None,false,
582 move || {
583 let client = client.clone();
584 let license_number = license_number.clone();
585 let body_val = body_val.clone();
586
587 async move {
588 client.processing_job().update_processing_job_job_types(license_number, body_val.as_ref()
589 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
590 }
591 }
592 ).await?;
593
594 if let Some(v) = resp_val {
595 let typed: WriteResponse = serde_json::from_value(v)?;
596 Ok(Some(typed))
597 } else {
598 Ok(None)
599 }
600 }
601}
602