use percent_encoding::utf8_percent_encode;
use crate::client::Client;
use crate::errors::{Error, Result};
use crate::models::{
BreachAnalyticsResponse, EmailCheckResult, FreeEmailCheckResponse, PlusEmailCheckResponse,
};
use crate::utils::{validate_email, PATH_ENCODE_SET, QUERY_ENCODE_SET};
impl Client {
pub async fn check_email(&self, email: &str) -> Result<EmailCheckResult> {
validate_email(email)?;
let encoded_email = utf8_percent_encode(email, PATH_ENCODE_SET).to_string();
if self.has_api_key() {
let url = format!(
"{}/v3/check-email/{}?detailed=true",
self.config.plus_base_url, encoded_email
);
let response = self.get_with_retry(&url).await?;
let body: PlusEmailCheckResponse = response.json().await?;
Ok(EmailCheckResult::Plus(body))
} else {
let url = format!("{}/v1/check-email/{}", self.config.base_url, encoded_email);
match self.get_with_retry(&url).await {
Ok(response) => {
let body: FreeEmailCheckResponse = response.json().await?;
Ok(EmailCheckResult::Free(body))
}
Err(Error::NotFound { .. }) => {
Ok(EmailCheckResult::Free(FreeEmailCheckResponse {
breaches: vec![],
}))
}
Err(e) => Err(e),
}
}
}
pub async fn breach_analytics(&self, email: &str) -> Result<BreachAnalyticsResponse> {
validate_email(email)?;
let encoded_email = utf8_percent_encode(email, QUERY_ENCODE_SET).to_string();
let url = format!(
"{}/v1/breach-analytics?email={}",
self.config.base_url, encoded_email
);
let response = self.get_with_retry(&url).await?;
let body: BreachAnalyticsResponse = response.json().await?;
Ok(body)
}
}