use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct IpInfo {
#[serde(default)]
pub ip: String,
#[serde(default)]
pub is_eu: bool,
#[serde(default)]
pub city: Option<String>,
#[serde(default)]
pub region: Option<String>,
#[serde(default)]
pub region_code: Option<String>,
#[serde(default)]
pub region_type: Option<String>,
#[serde(default)]
pub country_name: Option<String>,
#[serde(default)]
pub country_code: Option<String>,
#[serde(default)]
pub continent_name: Option<String>,
#[serde(default)]
pub continent_code: Option<String>,
#[serde(default)]
pub latitude: f64,
#[serde(default)]
pub longitude: f64,
#[serde(default)]
pub postal: Option<String>,
#[serde(default)]
pub calling_code: Option<String>,
#[serde(default)]
pub flag: Option<String>,
#[serde(default)]
pub emoji_flag: Option<String>,
#[serde(default)]
pub emoji_unicode: Option<String>,
#[serde(default)]
pub organisation: Option<String>,
#[serde(default)]
pub asn: Option<Asn>,
#[serde(default)]
pub company: Option<Company>,
#[serde(default)]
pub carrier: Option<Carrier>,
#[serde(default)]
pub languages: Vec<Language>,
#[serde(default)]
pub currency: Option<Currency>,
#[serde(default)]
pub time_zone: Option<TimeZone>,
#[serde(default)]
pub threat: Option<Threat>,
#[serde(default)]
pub count: Option<String>,
#[serde(default)]
pub status: Option<i32>,
#[serde(default)]
pub message: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Asn {
#[serde(default)]
pub asn: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub domain: String,
#[serde(default)]
pub route: String,
#[serde(default, rename = "type")]
pub asn_type: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Company {
#[serde(default)]
pub name: String,
#[serde(default)]
pub domain: String,
#[serde(default)]
pub network: String,
#[serde(default, rename = "type")]
pub company_type: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Carrier {
#[serde(default)]
pub name: String,
#[serde(default)]
pub mcc: String,
#[serde(default)]
pub mnc: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Language {
#[serde(default)]
pub name: String,
#[serde(default)]
pub native: String,
#[serde(default)]
pub code: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Currency {
#[serde(default)]
pub name: String,
#[serde(default)]
pub code: String,
#[serde(default)]
pub symbol: String,
#[serde(default)]
pub native: String,
#[serde(default)]
pub plural: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TimeZone {
#[serde(default)]
pub name: String,
#[serde(default, rename = "abbr")]
pub abbreviation: String,
#[serde(default)]
pub offset: String,
#[serde(default)]
pub is_dst: bool,
#[serde(default)]
pub current_time: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Threat {
#[serde(default)]
pub is_tor: bool,
#[serde(default)]
pub is_vpn: bool,
#[serde(default)]
pub is_icloud_relay: bool,
#[serde(default)]
pub is_proxy: bool,
#[serde(default)]
pub is_datacenter: bool,
#[serde(default)]
pub is_anonymous: bool,
#[serde(default)]
pub is_known_attacker: bool,
#[serde(default)]
pub is_known_abuser: bool,
#[serde(default)]
pub is_threat: bool,
#[serde(default)]
pub is_bogon: bool,
#[serde(default)]
pub blocklists: Vec<Blocklist>,
#[serde(default)]
pub scores: Option<ThreatScores>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ThreatScores {
#[serde(default)]
pub vpn_score: i32,
#[serde(default)]
pub proxy_score: i32,
#[serde(default)]
pub threat_score: i32,
#[serde(default)]
pub trust_score: i32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Blocklist {
#[serde(default)]
pub name: String,
#[serde(default)]
pub site: String,
#[serde(default, rename = "type")]
pub blocklist_type: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub(crate) struct BulkResponse {
pub responses: Vec<IpInfo>,
}