thunkmetrc_wrapper/services/
lab_tests_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 LabTestsService {
14 client: MetrcClient,
15 rate_limiter: Arc<MetrcRateLimiter>,
16}
17
18impl LabTestsService {
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_lab_tests_record(&self, license_number: Option<String>, body: Option<Vec<CreateRecordRequestItem>>) -> std::result::Result<Option<WriteResponse>, Box<dyn Error + Send + Sync>> {
35 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
36 let client = self.client.clone();
37
38 let body_val = body_val.clone();
39
40 let resp_val = self.rate_limiter.execute(None,false,
41 move || {
42 let client = client.clone();
43 let license_number = license_number.clone();
44 let body_val = body_val.clone();
45
46 async move {
47 client.lab_tests().create_lab_tests_record(license_number, body_val.as_ref()
48 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
49 }
50 }
51 ).await?;
52
53 if let Some(v) = resp_val {
54 let typed: WriteResponse = serde_json::from_value(v)?;
55 Ok(Some(typed))
56 } else {
57 Ok(None)
58 }
59 }
60
61 pub async fn get_lab_tests_batches(&self, page_number: Option<String>, page_size: Option<String>, body: Option<&Value>) -> std::result::Result<Option<PaginatedResponse<Batch>>, Box<dyn Error + Send + Sync>> {
67 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
68 let client = self.client.clone();
69
70 let body_val = body_val.clone();
71
72 let resp_val = self.rate_limiter.execute(None,true,
73 move || {
74 let client = client.clone();
75 let page_number = page_number.clone();
76 let page_size = page_size.clone();
77 let body_val = body_val.clone();
78
79 async move {
80 client.lab_tests().get_lab_tests_batches(page_number, page_size, 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: PaginatedResponse<Batch> = serde_json::from_value(v)?;
88 Ok(Some(typed))
89 } else {
90 Ok(None)
91 }
92 }
93
94 pub async fn get_lab_tests_lab_test_document_by_id(&self, id: &str, license_number: Option<String>, body: Option<&Value>) -> std::result::Result<Option<serde_json::Value>, Box<dyn Error + Send + Sync>> {
103 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
104 let id = id.to_string();
105 let client = self.client.clone();
106
107 let body_val = body_val.clone();
108
109 let resp_val = self.rate_limiter.execute(None,true,
110 move || {
111 let client = client.clone();
112 let id = id.clone();
113 let license_number = license_number.clone();
114 let body_val = body_val.clone();
115
116 async move {
117 client.lab_tests().get_lab_tests_lab_test_document_by_id(&id, license_number, body_val.as_ref()
118 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
119 }
120 }
121 ).await?;
122
123 if let Some(v) = resp_val {
124 let typed: serde_json::Value = serde_json::from_value(v)?;
125 Ok(Some(typed))
126 } else {
127 Ok(None)
128 }
129 }
130
131 pub async fn get_lab_tests_types(&self, page_number: Option<String>, page_size: Option<String>, body: Option<&Value>) -> std::result::Result<Option<PaginatedResponse<LabTestsType>>, Box<dyn Error + Send + Sync>> {
137 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
138 let client = self.client.clone();
139
140 let body_val = body_val.clone();
141
142 let resp_val = self.rate_limiter.execute(None,true,
143 move || {
144 let client = client.clone();
145 let page_number = page_number.clone();
146 let page_size = page_size.clone();
147 let body_val = body_val.clone();
148
149 async move {
150 client.lab_tests().get_lab_tests_types(page_number, page_size, 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: PaginatedResponse<LabTestsType> = serde_json::from_value(v)?;
158 Ok(Some(typed))
159 } else {
160 Ok(None)
161 }
162 }
163
164 pub async fn get_lab_tests_results(&self, license_number: Option<String>, package_id: Option<String>, page_number: Option<String>, page_size: Option<String>, body: Option<&Value>) -> std::result::Result<Option<PaginatedResponse<Result>>, Box<dyn Error + Send + Sync>> {
175 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
176 let client = self.client.clone();
177
178 let body_val = body_val.clone();
179
180 let resp_val = self.rate_limiter.execute(None,true,
181 move || {
182 let client = client.clone();
183 let license_number = license_number.clone();
184 let package_id = package_id.clone();
185 let page_number = page_number.clone();
186 let page_size = page_size.clone();
187 let body_val = body_val.clone();
188
189 async move {
190 client.lab_tests().get_lab_tests_results(license_number, package_id, page_number, page_size, body_val.as_ref()
191 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
192 }
193 }
194 ).await?;
195
196 if let Some(v) = resp_val {
197 let typed: PaginatedResponse<Result> = serde_json::from_value(v)?;
198 Ok(Some(typed))
199 } else {
200 Ok(None)
201 }
202 }
203
204 pub async fn get_lab_tests_states(&self, body: Option<&Value>) -> 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,true,
214 move || {
215 let client = client.clone();
216 let body_val = body_val.clone();
217
218 async move {
219 client.lab_tests().get_lab_tests_states(body_val.as_ref()
220 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
221 }
222 }
223 ).await?;
224
225 if let Some(v) = resp_val {
226 let typed: serde_json::Value = serde_json::from_value(v)?;
227 Ok(Some(typed))
228 } else {
229 Ok(None)
230 }
231 }
232
233 pub async fn update_lab_tests_lab_test_document(&self, license_number: Option<String>, body: Option<Vec<UpdateLabTestDocumentRequestItem>>) -> std::result::Result<Option<WriteResponse>, Box<dyn Error + Send + Sync>> {
242 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
243 let client = self.client.clone();
244
245 let body_val = body_val.clone();
246
247 let resp_val = self.rate_limiter.execute(None,false,
248 move || {
249 let client = client.clone();
250 let license_number = license_number.clone();
251 let body_val = body_val.clone();
252
253 async move {
254 client.lab_tests().update_lab_tests_lab_test_document(license_number, body_val.as_ref()
255 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
256 }
257 }
258 ).await?;
259
260 if let Some(v) = resp_val {
261 let typed: WriteResponse = serde_json::from_value(v)?;
262 Ok(Some(typed))
263 } else {
264 Ok(None)
265 }
266 }
267
268 pub async fn update_lab_tests_results_release(&self, license_number: Option<String>, body: Option<Vec<UpdateResultsReleaseRequestItem>>) -> std::result::Result<Option<WriteResponse>, Box<dyn Error + Send + Sync>> {
277 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
278 let client = self.client.clone();
279
280 let body_val = body_val.clone();
281
282 let resp_val = self.rate_limiter.execute(None,false,
283 move || {
284 let client = client.clone();
285 let license_number = license_number.clone();
286 let body_val = body_val.clone();
287
288 async move {
289 client.lab_tests().update_lab_tests_results_release(license_number, body_val.as_ref()
290 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
291 }
292 }
293 ).await?;
294
295 if let Some(v) = resp_val {
296 let typed: WriteResponse = serde_json::from_value(v)?;
297 Ok(Some(typed))
298 } else {
299 Ok(None)
300 }
301 }
302}
303