1#![recursion_limit = "1024"]
2mod auth;
4pub mod blocking;
5pub mod error_enums;
6pub mod request_types;
7pub mod result;
8pub mod schemas;
9use request_types::*;
10use reqwest::multipart as reqwest_multipart;
11use reqwest::Client as ReqwestClient;
12use reqwest::RequestBuilder as ReqwestRequestBuilder;
13use schemas::*;
14use std::collections::BTreeMap;
15
16#[derive(Clone, Debug)]
17pub struct Client {
18 pub base_url: String,
19 auth: BTreeMap<String, auth::AuthProvider>,
20}
21
22impl Default for Client {
23 fn default() -> Self {
24 Self {
25 base_url: "https://app.loops.so/api/v1".to_string(),
26 auth: BTreeMap::new(),
27 }
28 }
29}
30
31impl Client {
32 pub fn with_api_key(mut self, val: &str) -> Self {
34 self.auth.insert(
35 "apiKey".to_string(),
36 auth::AuthProvider::Bearer(val.to_string()),
37 );
38 self
39 }
40 fn builder_with_auth(
41 &self,
42 mut req_builder: ReqwestRequestBuilder,
43 auth_names: &[&str],
44 ) -> ReqwestRequestBuilder {
45 for auth_name in auth_names {
46 if let Some(provider) = self.auth.get(&auth_name.to_string()) {
47 req_builder = provider.add_auth(req_builder);
48 }
49 }
50 req_builder
51 }
52 fn async_multipart_file(&self, path: &str) -> std::io::Result<reqwest_multipart::Part> {
53 let path: &std::path::Path = path.as_ref();
54 let file_name = path
55 .file_name()
56 .map(|filename| filename.to_string_lossy().into_owned());
57 let file_bytes = std::fs::read(path)?;
58 Ok(reqwest_multipart::Part::bytes(file_bytes).file_name(file_name.unwrap_or_default()))
59 }
60 pub async fn get_contacts_custom_fields(
62 &self,
63 ) -> result::Result<Vec<CustomField>, error_enums::GetContactsCustomFieldsErrors> {
64 let endpoint = "/contacts/customFields";
65 let url = format!("{}{}", self.base_url, endpoint);
66 let query_params: Vec<(&str, String)> = vec![];
67 let unauthed_builder = ReqwestClient::default().get(&url).query(&query_params);
68 let authed_builder = self.builder_with_auth(unauthed_builder, &["apiKey"]);
69 let response = authed_builder
70 .send()
71 .await
72 .map_err(result::Error::Dispatch)?;
73 let status_code = response.status().as_u16();
74 match status_code {
75 200 => {
76 let response_text = response.text().await.unwrap_or_default();
77 let data = serde_json::from_str::<Vec<CustomField>>(&response_text).map_err(
78 |serde_err| result::Error::UnexpectedResponseBody {
79 status_code,
80 method: "GET".to_string(),
81 url: url.to_string(),
82 response_text,
83 expected_signature: "Vec<CustomField>".to_string(),
84 serde_err,
85 },
86 )?;
87 Ok(data)
88 }
89 405 => {
90 let response_text = response.text().await.unwrap_or_default();
91 let data = serde_json::from_str::<serde_json::Value>(&response_text).map_err(
92 |serde_err| result::Error::UnexpectedResponseBody {
93 status_code,
94 method: "GET".to_string(),
95 url: url.to_string(),
96 response_text,
97 expected_signature: "serde_json::Value".to_string(),
98 serde_err,
99 },
100 )?;
101 Err(result::Error::Response {
102 status_code,
103 method: "GET".to_string(),
104 url: url.to_string(),
105 data: error_enums::GetContactsCustomFieldsErrors::Status405(data),
106 })
107 }
108 _ => {
109 let expected_status_codes: Vec<String> = vec!["200".to_string(), "405".to_string()];
110 Err(result::Error::UnexpectedStatus {
111 status_code,
112 method: "".to_string(),
113 url: url.to_string(),
114 response,
115 expected_status_codes,
116 })
117 }
118 }
119 }
120 pub async fn get_contacts_find(
122 &self,
123 request: GetContactsFindRequest,
124 ) -> result::Result<Vec<Contact>, error_enums::GetContactsFindErrors> {
125 let endpoint = "/contacts/find";
126 let url = format!("{}{}", self.base_url, endpoint);
127 let mut query_params: Vec<(&str, String)> = vec![];
128 query_params.push(("email", format!("{}", &request.email)));
129 let unauthed_builder = ReqwestClient::default().get(&url).query(&query_params);
130 let authed_builder = self.builder_with_auth(unauthed_builder, &["apiKey"]);
131 let response = authed_builder
132 .send()
133 .await
134 .map_err(result::Error::Dispatch)?;
135 let status_code = response.status().as_u16();
136 match status_code {
137 200 => {
138 let response_text = response.text().await.unwrap_or_default();
139 let data =
140 serde_json::from_str::<Vec<Contact>>(&response_text).map_err(|serde_err| {
141 result::Error::UnexpectedResponseBody {
142 status_code,
143 method: "GET".to_string(),
144 url: url.to_string(),
145 response_text,
146 expected_signature: "Vec<Contact>".to_string(),
147 serde_err,
148 }
149 })?;
150 Ok(data)
151 }
152 400 => {
153 let response_text = response.text().await.unwrap_or_default();
154 let data = serde_json::from_str::<ContactFailureResponse>(&response_text).map_err(
155 |serde_err| result::Error::UnexpectedResponseBody {
156 status_code,
157 method: "GET".to_string(),
158 url: url.to_string(),
159 response_text,
160 expected_signature: "ContactFailureResponse".to_string(),
161 serde_err,
162 },
163 )?;
164 Err(result::Error::Response {
165 status_code,
166 method: "GET".to_string(),
167 url: url.to_string(),
168 data: error_enums::GetContactsFindErrors::Status400(data),
169 })
170 }
171 405 => {
172 let response_text = response.text().await.unwrap_or_default();
173 let data = serde_json::from_str::<serde_json::Value>(&response_text).map_err(
174 |serde_err| result::Error::UnexpectedResponseBody {
175 status_code,
176 method: "GET".to_string(),
177 url: url.to_string(),
178 response_text,
179 expected_signature: "serde_json::Value".to_string(),
180 serde_err,
181 },
182 )?;
183 Err(result::Error::Response {
184 status_code,
185 method: "GET".to_string(),
186 url: url.to_string(),
187 data: error_enums::GetContactsFindErrors::Status405(data),
188 })
189 }
190 _ => {
191 let expected_status_codes: Vec<String> =
192 vec!["200".to_string(), "400".to_string(), "405".to_string()];
193 Err(result::Error::UnexpectedStatus {
194 status_code,
195 method: "".to_string(),
196 url: url.to_string(),
197 response,
198 expected_status_codes,
199 })
200 }
201 }
202 }
203 pub async fn post_contacts_create(
205 &self,
206 request: PostContactsCreateRequest,
207 ) -> result::Result<ContactSuccessResponse, error_enums::PostContactsCreateErrors> {
208 let endpoint = "/contacts/create";
209 let url = format!("{}{}", self.base_url, endpoint);
210 let query_params: Vec<(&str, String)> = vec![];
211 let unauthed_builder = ReqwestClient::default().post(&url).query(&query_params);
212 let authed_builder = self.builder_with_auth(unauthed_builder, &["apiKey"]);
213 let request_body: serde_json::Value =
214 serde_json::to_value(request.data).map_err(result::Error::Serialize)?;
215 let response = authed_builder
216 .json(&request_body)
217 .send()
218 .await
219 .map_err(result::Error::Dispatch)?;
220 let status_code = response.status().as_u16();
221 match status_code {
222 200 => {
223 let response_text = response.text().await.unwrap_or_default();
224 let data = serde_json::from_str::<ContactSuccessResponse>(&response_text).map_err(
225 |serde_err| result::Error::UnexpectedResponseBody {
226 status_code,
227 method: "POST".to_string(),
228 url: url.to_string(),
229 response_text,
230 expected_signature: "ContactSuccessResponse".to_string(),
231 serde_err,
232 },
233 )?;
234 Ok(data)
235 }
236 400 => {
237 let response_text = response.text().await.unwrap_or_default();
238 let data = serde_json::from_str::<ContactFailureResponse>(&response_text).map_err(
239 |serde_err| result::Error::UnexpectedResponseBody {
240 status_code,
241 method: "POST".to_string(),
242 url: url.to_string(),
243 response_text,
244 expected_signature: "ContactFailureResponse".to_string(),
245 serde_err,
246 },
247 )?;
248 Err(result::Error::Response {
249 status_code,
250 method: "POST".to_string(),
251 url: url.to_string(),
252 data: error_enums::PostContactsCreateErrors::Status400(data),
253 })
254 }
255 405 => {
256 let response_text = response.text().await.unwrap_or_default();
257 let data = serde_json::from_str::<ContactFailureResponse>(&response_text).map_err(
258 |serde_err| result::Error::UnexpectedResponseBody {
259 status_code,
260 method: "POST".to_string(),
261 url: url.to_string(),
262 response_text,
263 expected_signature: "ContactFailureResponse".to_string(),
264 serde_err,
265 },
266 )?;
267 Err(result::Error::Response {
268 status_code,
269 method: "POST".to_string(),
270 url: url.to_string(),
271 data: error_enums::PostContactsCreateErrors::Status405(data),
272 })
273 }
274 409 => {
275 let response_text = response.text().await.unwrap_or_default();
276 let data = serde_json::from_str::<ContactFailureResponse>(&response_text).map_err(
277 |serde_err| result::Error::UnexpectedResponseBody {
278 status_code,
279 method: "POST".to_string(),
280 url: url.to_string(),
281 response_text,
282 expected_signature: "ContactFailureResponse".to_string(),
283 serde_err,
284 },
285 )?;
286 Err(result::Error::Response {
287 status_code,
288 method: "POST".to_string(),
289 url: url.to_string(),
290 data: error_enums::PostContactsCreateErrors::Status409(data),
291 })
292 }
293 _ => {
294 let expected_status_codes: Vec<String> = vec![
295 "200".to_string(),
296 "400".to_string(),
297 "405".to_string(),
298 "409".to_string(),
299 ];
300 Err(result::Error::UnexpectedStatus {
301 status_code,
302 method: "".to_string(),
303 url: url.to_string(),
304 response,
305 expected_status_codes,
306 })
307 }
308 }
309 }
310 pub async fn post_contacts_delete(
312 &self,
313 request: PostContactsDeleteRequest,
314 ) -> result::Result<ContactDeleteResponse, error_enums::PostContactsDeleteErrors> {
315 let endpoint = "/contacts/delete";
316 let url = format!("{}{}", self.base_url, endpoint);
317 let query_params: Vec<(&str, String)> = vec![];
318 let unauthed_builder = ReqwestClient::default().post(&url).query(&query_params);
319 let authed_builder = self.builder_with_auth(unauthed_builder, &["apiKey"]);
320 let request_body: serde_json::Value =
321 serde_json::to_value(request.data).map_err(result::Error::Serialize)?;
322 let response = authed_builder
323 .json(&request_body)
324 .send()
325 .await
326 .map_err(result::Error::Dispatch)?;
327 let status_code = response.status().as_u16();
328 match status_code {
329 200 => {
330 let response_text = response.text().await.unwrap_or_default();
331 let data = serde_json::from_str::<ContactDeleteResponse>(&response_text).map_err(
332 |serde_err| result::Error::UnexpectedResponseBody {
333 status_code,
334 method: "POST".to_string(),
335 url: url.to_string(),
336 response_text,
337 expected_signature: "ContactDeleteResponse".to_string(),
338 serde_err,
339 },
340 )?;
341 Ok(data)
342 }
343 400 => {
344 let response_text = response.text().await.unwrap_or_default();
345 let data = serde_json::from_str::<ContactFailureResponse>(&response_text).map_err(
346 |serde_err| result::Error::UnexpectedResponseBody {
347 status_code,
348 method: "POST".to_string(),
349 url: url.to_string(),
350 response_text,
351 expected_signature: "ContactFailureResponse".to_string(),
352 serde_err,
353 },
354 )?;
355 Err(result::Error::Response {
356 status_code,
357 method: "POST".to_string(),
358 url: url.to_string(),
359 data: error_enums::PostContactsDeleteErrors::Status400(data),
360 })
361 }
362 404 => {
363 let response_text = response.text().await.unwrap_or_default();
364 let data = serde_json::from_str::<ContactFailureResponse>(&response_text).map_err(
365 |serde_err| result::Error::UnexpectedResponseBody {
366 status_code,
367 method: "POST".to_string(),
368 url: url.to_string(),
369 response_text,
370 expected_signature: "ContactFailureResponse".to_string(),
371 serde_err,
372 },
373 )?;
374 Err(result::Error::Response {
375 status_code,
376 method: "POST".to_string(),
377 url: url.to_string(),
378 data: error_enums::PostContactsDeleteErrors::Status404(data),
379 })
380 }
381 405 => {
382 let response_text = response.text().await.unwrap_or_default();
383 let data = serde_json::from_str::<serde_json::Value>(&response_text).map_err(
384 |serde_err| result::Error::UnexpectedResponseBody {
385 status_code,
386 method: "POST".to_string(),
387 url: url.to_string(),
388 response_text,
389 expected_signature: "serde_json::Value".to_string(),
390 serde_err,
391 },
392 )?;
393 Err(result::Error::Response {
394 status_code,
395 method: "POST".to_string(),
396 url: url.to_string(),
397 data: error_enums::PostContactsDeleteErrors::Status405(data),
398 })
399 }
400 500 => {
401 let response_text = response.text().await.unwrap_or_default();
402 let data = serde_json::from_str::<PostContactsDeleteResponse500>(&response_text)
403 .map_err(|serde_err| result::Error::UnexpectedResponseBody {
404 status_code,
405 method: "POST".to_string(),
406 url: url.to_string(),
407 response_text,
408 expected_signature: "PostContactsDeleteResponse500".to_string(),
409 serde_err,
410 })?;
411 Err(result::Error::Response {
412 status_code,
413 method: "POST".to_string(),
414 url: url.to_string(),
415 data: error_enums::PostContactsDeleteErrors::Status500(data),
416 })
417 }
418 _ => {
419 let expected_status_codes: Vec<String> = vec![
420 "200".to_string(),
421 "400".to_string(),
422 "404".to_string(),
423 "405".to_string(),
424 "500".to_string(),
425 ];
426 Err(result::Error::UnexpectedStatus {
427 status_code,
428 method: "".to_string(),
429 url: url.to_string(),
430 response,
431 expected_status_codes,
432 })
433 }
434 }
435 }
436 pub async fn post_events_send(
438 &self,
439 request: PostEventsSendRequest,
440 ) -> result::Result<EventSuccessResponse, error_enums::PostEventsSendErrors> {
441 let endpoint = "/events/send";
442 let url = format!("{}{}", self.base_url, endpoint);
443 let query_params: Vec<(&str, String)> = vec![];
444 let unauthed_builder = ReqwestClient::default().post(&url).query(&query_params);
445 let authed_builder = self.builder_with_auth(unauthed_builder, &["apiKey"]);
446 let request_body: serde_json::Value =
447 serde_json::to_value(request.data).map_err(result::Error::Serialize)?;
448 let response = authed_builder
449 .json(&request_body)
450 .send()
451 .await
452 .map_err(result::Error::Dispatch)?;
453 let status_code = response.status().as_u16();
454 match status_code {
455 200 => {
456 let response_text = response.text().await.unwrap_or_default();
457 let data = serde_json::from_str::<EventSuccessResponse>(&response_text).map_err(
458 |serde_err| result::Error::UnexpectedResponseBody {
459 status_code,
460 method: "POST".to_string(),
461 url: url.to_string(),
462 response_text,
463 expected_signature: "EventSuccessResponse".to_string(),
464 serde_err,
465 },
466 )?;
467 Ok(data)
468 }
469 400 => {
470 let response_text = response.text().await.unwrap_or_default();
471 let data = serde_json::from_str::<EventFailureResponse>(&response_text).map_err(
472 |serde_err| result::Error::UnexpectedResponseBody {
473 status_code,
474 method: "POST".to_string(),
475 url: url.to_string(),
476 response_text,
477 expected_signature: "EventFailureResponse".to_string(),
478 serde_err,
479 },
480 )?;
481 Err(result::Error::Response {
482 status_code,
483 method: "POST".to_string(),
484 url: url.to_string(),
485 data: error_enums::PostEventsSendErrors::Status400(data),
486 })
487 }
488 405 => {
489 let response_text = response.text().await.unwrap_or_default();
490 let data = serde_json::from_str::<serde_json::Value>(&response_text).map_err(
491 |serde_err| result::Error::UnexpectedResponseBody {
492 status_code,
493 method: "POST".to_string(),
494 url: url.to_string(),
495 response_text,
496 expected_signature: "serde_json::Value".to_string(),
497 serde_err,
498 },
499 )?;
500 Err(result::Error::Response {
501 status_code,
502 method: "POST".to_string(),
503 url: url.to_string(),
504 data: error_enums::PostEventsSendErrors::Status405(data),
505 })
506 }
507 _ => {
508 let expected_status_codes: Vec<String> =
509 vec!["200".to_string(), "400".to_string(), "405".to_string()];
510 Err(result::Error::UnexpectedStatus {
511 status_code,
512 method: "".to_string(),
513 url: url.to_string(),
514 response,
515 expected_status_codes,
516 })
517 }
518 }
519 }
520 pub async fn post_transactional(
522 &self,
523 request: PostTransactionalRequest,
524 ) -> result::Result<TransactionalSuccessResponse, error_enums::PostTransactionalErrors> {
525 let endpoint = "/transactional";
526 let url = format!("{}{}", self.base_url, endpoint);
527 let query_params: Vec<(&str, String)> = vec![];
528 let unauthed_builder = ReqwestClient::default().post(&url).query(&query_params);
529 let authed_builder = self.builder_with_auth(unauthed_builder, &["apiKey"]);
530 let request_body: serde_json::Value =
531 serde_json::to_value(request.data).map_err(result::Error::Serialize)?;
532 let response = authed_builder
533 .json(&request_body)
534 .send()
535 .await
536 .map_err(result::Error::Dispatch)?;
537 let status_code = response.status().as_u16();
538 match status_code {
539 200 => {
540 let response_text = response.text().await.unwrap_or_default();
541 let data = serde_json::from_str::<TransactionalSuccessResponse>(&response_text)
542 .map_err(|serde_err| result::Error::UnexpectedResponseBody {
543 status_code,
544 method: "POST".to_string(),
545 url: url.to_string(),
546 response_text,
547 expected_signature: "TransactionalSuccessResponse".to_string(),
548 serde_err,
549 })?;
550 Ok(data)
551 }
552 400 => {
553 let response_text = response.text().await.unwrap_or_default();
554 let data =
555 serde_json::from_str::<PostTransactionalResponse400Union>(&response_text)
556 .map_err(|serde_err| result::Error::UnexpectedResponseBody {
557 status_code,
558 method: "POST".to_string(),
559 url: url.to_string(),
560 response_text,
561 expected_signature: "PostTransactionalResponse400Union".to_string(),
562 serde_err,
563 })?;
564 Err(result::Error::Response {
565 status_code,
566 method: "POST".to_string(),
567 url: url.to_string(),
568 data: error_enums::PostTransactionalErrors::Status400(data),
569 })
570 }
571 404 => {
572 let response_text = response.text().await.unwrap_or_default();
573 let data = serde_json::from_str::<TransactionalFailure2Response>(&response_text)
574 .map_err(|serde_err| result::Error::UnexpectedResponseBody {
575 status_code,
576 method: "POST".to_string(),
577 url: url.to_string(),
578 response_text,
579 expected_signature: "TransactionalFailure2Response".to_string(),
580 serde_err,
581 })?;
582 Err(result::Error::Response {
583 status_code,
584 method: "POST".to_string(),
585 url: url.to_string(),
586 data: error_enums::PostTransactionalErrors::Status404(data),
587 })
588 }
589 405 => {
590 let response_text = response.text().await.unwrap_or_default();
591 let data = serde_json::from_str::<serde_json::Value>(&response_text).map_err(
592 |serde_err| result::Error::UnexpectedResponseBody {
593 status_code,
594 method: "POST".to_string(),
595 url: url.to_string(),
596 response_text,
597 expected_signature: "serde_json::Value".to_string(),
598 serde_err,
599 },
600 )?;
601 Err(result::Error::Response {
602 status_code,
603 method: "POST".to_string(),
604 url: url.to_string(),
605 data: error_enums::PostTransactionalErrors::Status405(data),
606 })
607 }
608 _ => {
609 let expected_status_codes: Vec<String> = vec![
610 "200".to_string(),
611 "400".to_string(),
612 "404".to_string(),
613 "405".to_string(),
614 ];
615 Err(result::Error::UnexpectedStatus {
616 status_code,
617 method: "".to_string(),
618 url: url.to_string(),
619 response,
620 expected_status_codes,
621 })
622 }
623 }
624 }
625 pub async fn put_contacts_update(
627 &self,
628 request: PutContactsUpdateRequest,
629 ) -> result::Result<ContactSuccessResponse, error_enums::PutContactsUpdateErrors> {
630 let endpoint = "/contacts/update";
631 let url = format!("{}{}", self.base_url, endpoint);
632 let query_params: Vec<(&str, String)> = vec![];
633 let unauthed_builder = ReqwestClient::default().put(&url).query(&query_params);
634 let authed_builder = self.builder_with_auth(unauthed_builder, &["apiKey"]);
635 let request_body: serde_json::Value =
636 serde_json::to_value(request.data).map_err(result::Error::Serialize)?;
637 let response = authed_builder
638 .json(&request_body)
639 .send()
640 .await
641 .map_err(result::Error::Dispatch)?;
642 let status_code = response.status().as_u16();
643 match status_code {
644 200 => {
645 let response_text = response.text().await.unwrap_or_default();
646 let data = serde_json::from_str::<ContactSuccessResponse>(&response_text).map_err(
647 |serde_err| result::Error::UnexpectedResponseBody {
648 status_code,
649 method: "PUT".to_string(),
650 url: url.to_string(),
651 response_text,
652 expected_signature: "ContactSuccessResponse".to_string(),
653 serde_err,
654 },
655 )?;
656 Ok(data)
657 }
658 400 => {
659 let response_text = response.text().await.unwrap_or_default();
660 let data = serde_json::from_str::<ContactFailureResponse>(&response_text).map_err(
661 |serde_err| result::Error::UnexpectedResponseBody {
662 status_code,
663 method: "PUT".to_string(),
664 url: url.to_string(),
665 response_text,
666 expected_signature: "ContactFailureResponse".to_string(),
667 serde_err,
668 },
669 )?;
670 Err(result::Error::Response {
671 status_code,
672 method: "PUT".to_string(),
673 url: url.to_string(),
674 data: error_enums::PutContactsUpdateErrors::Status400(data),
675 })
676 }
677 405 => {
678 let response_text = response.text().await.unwrap_or_default();
679 let data = serde_json::from_str::<ContactFailureResponse>(&response_text).map_err(
680 |serde_err| result::Error::UnexpectedResponseBody {
681 status_code,
682 method: "PUT".to_string(),
683 url: url.to_string(),
684 response_text,
685 expected_signature: "ContactFailureResponse".to_string(),
686 serde_err,
687 },
688 )?;
689 Err(result::Error::Response {
690 status_code,
691 method: "PUT".to_string(),
692 url: url.to_string(),
693 data: error_enums::PutContactsUpdateErrors::Status405(data),
694 })
695 }
696 _ => {
697 let expected_status_codes: Vec<String> =
698 vec!["200".to_string(), "400".to_string(), "405".to_string()];
699 Err(result::Error::UnexpectedStatus {
700 status_code,
701 method: "".to_string(),
702 url: url.to_string(),
703 response,
704 expected_status_codes,
705 })
706 }
707 }
708 }
709}