use serde::{Deserialize, Deserializer, Serialize};
fn deserialize_null_as_empty_vec<'de, D, T>(deserializer: D) -> std::result::Result<Vec<T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
let opt: Option<Vec<T>> = Option::deserialize(deserializer)?;
Ok(opt.unwrap_or_default())
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FreeEmailCheckResponse {
#[serde(default)]
pub breaches: Vec<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PlusBreachDetail {
pub breach_id: String,
pub breached_date: String,
pub logo: String,
pub password_risk: String,
pub searchable: String,
pub xposed_data: String,
pub xposed_records: u64,
pub xposure_desc: String,
pub domain: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PlusEmailCheckResponse {
pub status: String,
pub email: String,
pub breaches: Vec<PlusBreachDetail>,
}
#[derive(Debug, Clone)]
pub enum EmailCheckResult {
Free(FreeEmailCheckResponse),
Plus(PlusEmailCheckResponse),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BreachRecord {
#[serde(alias = "breachID")]
pub breach_id: String,
pub breached_date: String,
pub domain: String,
pub industry: String,
pub exposed_data: Vec<String>,
pub exposed_records: u64,
pub verified: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BreachListResponse {
#[serde(rename = "exposedBreaches")]
pub exposed_breaches: Vec<BreachRecord>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BreachAnalyticsDetail {
#[serde(default)]
pub breach: Option<String>,
#[serde(flatten)]
pub extra: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExposedBreaches {
#[serde(default)]
pub breaches_details: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BreachesSummary {
#[serde(flatten)]
pub data: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BreachMetrics {
#[serde(flatten)]
pub data: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PastesSummary {
#[serde(flatten)]
pub data: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BreachAnalyticsResponse {
#[serde(rename = "ExposedBreaches")]
pub exposed_breaches: ExposedBreaches,
#[serde(rename = "BreachesSummary")]
pub breaches_summary: BreachesSummary,
#[serde(rename = "BreachMetrics")]
pub breach_metrics: BreachMetrics,
#[serde(rename = "PastesSummary")]
pub pastes_summary: PastesSummary,
#[serde(rename = "ExposedPastes", default, deserialize_with = "deserialize_null_as_empty_vec")]
pub exposed_pastes: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PasswordAnonResult {
pub anon: String,
pub char: String,
pub count: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PasswordSearchAnon {
pub anon: String,
pub char: String,
pub count: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PasswordCheckResponse {
#[serde(rename = "SearchPassAnon")]
pub search_pass_anon: PasswordSearchAnon,
}