use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct IpDetails {
pub ip: String,
pub hostname: Option<String>,
pub city: String,
pub region: String,
pub country: String,
pub country_name: Option<String>,
pub is_eu: Option<bool>,
pub country_flag: Option<CountryFlag>,
pub country_flag_url: Option<String>,
pub country_currency: Option<CountryCurrency>,
pub continent: Option<Continent>,
pub loc: String,
pub org: Option<String>,
pub postal: Option<String>,
pub timezone: Option<String>,
pub asn: Option<AsnDetails>,
pub company: Option<CompanyDetails>,
pub carrier: Option<CarrierDetails>,
pub privacy: Option<PrivacyDetails>,
pub abuse: Option<AbuseDetails>,
pub domains: Option<DomainsDetails>,
pub bogon: Option<bool>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct AsnDetails {
pub asn: String,
pub name: String,
pub domain: String,
pub route: String,
#[serde(rename = "type")]
pub asn_type: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct CompanyDetails {
pub name: String,
pub domain: String,
#[serde(rename = "type")]
pub company_type: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct CarrierDetails {
pub name: String,
pub mcc: String,
pub mnc: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct PrivacyDetails {
pub vpn: bool,
pub proxy: bool,
pub tor: bool,
pub relay: bool,
pub hosting: bool,
pub service: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct AbuseDetails {
pub address: String,
pub country: String,
pub email: String,
pub name: String,
pub network: String,
pub phone: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct DomainsDetails {
pub ip: Option<String>,
pub total: u64,
pub domains: Vec<String>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq)]
pub struct CountryFlag {
pub emoji: String,
pub unicode: String,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq)]
pub struct CountryCurrency {
pub code: String,
pub symbol: String,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq)]
pub struct Continent {
pub code: String,
pub name: String,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct IpDetailsLite {
pub ip: String,
pub country_code: String,
pub country: String,
#[serde(skip_deserializing)]
pub country_name: String,
#[serde(skip_deserializing)]
pub is_eu: bool,
#[serde(skip_deserializing)]
pub country_flag: CountryFlag,
#[serde(skip_deserializing)]
pub country_flag_url: String,
#[serde(skip_deserializing)]
pub country_currency: CountryCurrency,
pub asn: String,
pub as_name: String,
pub as_domain: String,
#[serde(skip_deserializing)]
pub continent: Continent,
pub bogon: Option<bool>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct CoreGeo {
pub city: Option<String>,
pub region: Option<String>,
pub region_code: Option<String>,
pub country: Option<String>,
pub country_code: Option<String>,
pub continent: Option<String>,
pub continent_code: Option<String>,
pub latitude: f64,
pub longitude: f64,
pub timezone: Option<String>,
pub postal_code: Option<String>,
#[serde(skip_deserializing)]
pub country_name: Option<String>,
#[serde(skip_deserializing)]
pub is_eu: Option<bool>,
#[serde(skip_deserializing)]
pub country_flag: Option<CountryFlag>,
#[serde(skip_deserializing)]
pub country_flag_url: Option<String>,
#[serde(skip_deserializing)]
pub country_currency: Option<CountryCurrency>,
#[serde(skip_deserializing)]
pub continent_info: Option<Continent>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct CoreAS {
pub asn: String,
pub name: String,
pub domain: String,
#[serde(rename = "type")]
pub as_type: String,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct IpDetailsCore {
pub ip: String,
pub geo: Option<CoreGeo>,
#[serde(rename = "as")]
pub asn: Option<CoreAS>,
pub is_anonymous: bool,
pub is_anycast: bool,
pub is_hosting: bool,
pub is_mobile: bool,
pub is_satellite: bool,
pub bogon: Option<bool>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct PlusGeo {
pub city: Option<String>,
pub region: Option<String>,
pub region_code: Option<String>,
pub country: Option<String>,
pub country_code: Option<String>,
pub continent: Option<String>,
pub continent_code: Option<String>,
pub latitude: f64,
pub longitude: f64,
pub timezone: Option<String>,
pub postal_code: Option<String>,
pub dma_code: Option<String>,
pub geoname_id: Option<String>,
pub radius: Option<i32>,
pub last_changed: Option<String>,
#[serde(skip_deserializing)]
pub country_name: Option<String>,
#[serde(skip_deserializing)]
pub is_eu: Option<bool>,
#[serde(skip_deserializing)]
pub country_flag: Option<CountryFlag>,
#[serde(skip_deserializing)]
pub country_flag_url: Option<String>,
#[serde(skip_deserializing)]
pub country_currency: Option<CountryCurrency>,
#[serde(skip_deserializing)]
pub continent_info: Option<Continent>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct PlusAS {
pub asn: String,
pub name: String,
pub domain: String,
#[serde(rename = "type")]
pub as_type: String,
pub last_changed: Option<String>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct PlusMobile {
pub name: Option<String>,
pub mcc: Option<String>,
pub mnc: Option<String>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct PlusAnonymous {
pub is_proxy: bool,
pub is_relay: bool,
pub is_tor: bool,
pub is_vpn: bool,
pub name: Option<String>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct PlusAbuse {
pub address: Option<String>,
pub country: Option<String>,
#[serde(skip_deserializing)]
pub country_name: Option<String>,
pub email: Option<String>,
pub name: Option<String>,
pub network: Option<String>,
pub phone: Option<String>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct PlusCompany {
pub name: Option<String>,
pub domain: Option<String>,
#[serde(rename = "type")]
pub company_type: Option<String>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct PlusPrivacy {
pub vpn: bool,
pub proxy: bool,
pub tor: bool,
pub relay: bool,
pub hosting: bool,
pub service: Option<String>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct PlusDomains {
pub ip: Option<String>,
pub total: u64,
pub domains: Vec<String>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct IpDetailsPlus {
pub ip: String,
pub hostname: Option<String>,
pub geo: Option<PlusGeo>,
#[serde(rename = "as")]
pub asn: Option<PlusAS>,
pub mobile: Option<PlusMobile>,
pub anonymous: Option<PlusAnonymous>,
pub is_anonymous: bool,
pub is_anycast: bool,
pub is_hosting: bool,
pub is_mobile: bool,
pub is_satellite: bool,
pub abuse: Option<PlusAbuse>,
pub company: Option<PlusCompany>,
pub privacy: Option<PlusPrivacy>,
pub domains: Option<PlusDomains>,
pub bogon: Option<bool>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct ResproxyDetails {
#[serde(default)]
pub ip: String,
pub last_seen: Option<String>,
pub percent_days_seen: Option<f64>,
pub service: Option<String>,
}