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