1pub mod api;
2pub mod utility;
3
4use std::collections::HashMap;
5
6pub use crate::utility::{ZBError, ZBResult, ApiBaseUrl};
7pub use crate::utility::structures::{ActivityData, ApiUsage};
8pub use crate::utility::structures::bulk::{ZBFile, ZBFileFeedback, ZBFileStatus};
9pub use crate::api::{FindEmailV2Builder, DomainSearchV2Builder};
10
11pub struct ZBUrlProvider {
14 pub url: String,
15 pub bulk_url: String,
16}
17
18impl ZBUrlProvider {
19 pub fn url_of(&self, endpoint: &str) -> String {
20 self.url.to_owned() + endpoint
21 }
22 pub fn bulk_url_of(&self, endpoint: &str) -> String {
23 self.bulk_url.to_owned() + endpoint
24 }
25}
26
27impl Default for ZBUrlProvider {
28 fn default() -> Self {
29 ZBUrlProvider {
30 url: ApiBaseUrl::Default.as_str().to_string(),
31 bulk_url: crate::utility::BULK_URI.to_string(),
32 }
33 }
34}
35
36pub struct ZeroBounce {
38 pub api_key: String,
39 pub base_url: String,
40 pub client: reqwest::blocking::Client,
41 pub url_provider: ZBUrlProvider,
42}
43
44impl ZeroBounce {
47 pub fn new(api_key: &str) -> ZeroBounce {
59 Self::with_base_url(api_key, ApiBaseUrl::Default)
60 }
61
62 pub fn with_base_url<T>(api_key: &str, base_url: T) -> ZeroBounce
83 where
84 T: Into<String>,
85 {
86 let base_url_string = base_url.into();
87
88 let mut url_provider = ZBUrlProvider::default();
89 url_provider.url = base_url_string.clone();
90
91 ZeroBounce {
92 api_key: api_key.to_string(),
93 base_url: base_url_string,
94 client: reqwest::blocking::Client::default(),
95 url_provider,
96 }
97 }
98
99 fn generic_get_request<'a>(&'a self, url: String, mut query_args: HashMap<&'a str, &'a str>) -> ZBResult<String> {
100 query_args.insert("api_key", self.api_key.as_str());
102
103 let response = self.client.get(url).query(&query_args).send()?;
104
105 let response_ok = response.status().is_success();
106 let response_content = response.text()?;
107
108 #[cfg(debug_assertions)]
110 {
111 eprintln!("Raw API response: {}", response_content);
112 }
113
114 if !response_ok {
115 return Err(ZBError::ExplicitError(response_content));
116 }
117
118 Ok(response_content)
119 }
120}