use std::net::IpAddr;
use serde::{Deserialize, Serialize};
use super::de::null_default;
use super::location::Location;
use super::user_agent::UserAgent;
#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct IpInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ip: Option<IpAddr>,
#[serde(default, rename = "type", skip_serializing_if = "Option::is_none")]
pub ip_type: Option<IpType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hostname: Option<String>,
#[serde(default, deserialize_with = "null_default")]
pub carrier: Carrier,
#[serde(default, deserialize_with = "null_default")]
pub company: Company,
#[serde(default, deserialize_with = "null_default")]
pub connection: Connection,
#[serde(default, deserialize_with = "null_default")]
pub currency: Currency,
#[serde(default, deserialize_with = "null_default")]
pub location: Location,
#[serde(default, deserialize_with = "null_default")]
pub security: Security,
#[serde(default, deserialize_with = "null_default")]
pub time_zone: TimeZone,
}
#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct RequesterIpInfo {
#[serde(flatten)]
pub info: IpInfo,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub user_agent: Option<UserAgent>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[non_exhaustive]
pub enum IpType {
#[serde(rename = "IPv4")]
V4,
#[serde(rename = "IPv6")]
V6,
Unknown,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct Carrier {
#[serde(default, deserialize_with = "null_default")]
pub name: String,
#[serde(default, deserialize_with = "null_default")]
pub mcc: String,
#[serde(default, deserialize_with = "null_default")]
pub mnc: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum CompanyType {
Business,
Education,
Government,
Hosting,
Isp,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct Company {
#[serde(default, deserialize_with = "null_default")]
pub name: String,
#[serde(default, deserialize_with = "null_default")]
pub domain: String,
#[serde(default, rename = "type", skip_serializing_if = "Option::is_none")]
pub company_type: Option<CompanyType>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum ConnectionType {
Business,
Education,
Government,
Hosting,
Inactive,
Isp,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct Connection {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub asn: Option<u32>,
#[serde(default, deserialize_with = "null_default")]
pub domain: String,
#[serde(default, deserialize_with = "null_default")]
pub organization: String,
#[serde(default, deserialize_with = "null_default")]
pub route: String,
#[serde(default, rename = "type", skip_serializing_if = "Option::is_none")]
pub connection_type: Option<ConnectionType>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct Currency {
#[serde(default, deserialize_with = "null_default")]
pub code: String,
#[serde(default, deserialize_with = "null_default")]
pub name: String,
#[serde(default, deserialize_with = "null_default")]
pub name_native: String,
#[serde(default, deserialize_with = "null_default")]
pub plural: String,
#[serde(default, deserialize_with = "null_default")]
pub plural_native: String,
#[serde(default, deserialize_with = "null_default")]
pub symbol: String,
#[serde(default, deserialize_with = "null_default")]
pub symbol_native: String,
#[serde(default, deserialize_with = "null_default")]
pub format: CurrencyFormat,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct CurrencyFormat {
#[serde(default, deserialize_with = "null_default")]
pub decimal_separator: String,
#[serde(default, deserialize_with = "null_default")]
pub group_separator: String,
#[serde(default, deserialize_with = "null_default")]
pub negative: CurrencyFormatAffix,
#[serde(default, deserialize_with = "null_default")]
pub positive: CurrencyFormatAffix,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct CurrencyFormatAffix {
#[serde(default, deserialize_with = "null_default")]
pub prefix: String,
#[serde(default, deserialize_with = "null_default")]
pub suffix: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct Security {
#[serde(default, deserialize_with = "null_default")]
pub is_abuser: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_attacker: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_bogon: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_cloud_provider: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_proxy: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_relay: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_tor: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_tor_exit: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_anonymous: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_threat: bool,
#[serde(default, deserialize_with = "null_default")]
pub is_vpn: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize, Serialize)]
#[non_exhaustive]
pub struct TimeZone {
#[serde(default, deserialize_with = "null_default")]
pub id: String,
#[serde(default, deserialize_with = "null_default")]
pub abbreviation: String,
#[serde(default, deserialize_with = "null_default")]
pub current_time: String,
#[serde(default, deserialize_with = "null_default")]
pub name: String,
#[serde(default, deserialize_with = "null_default")]
pub offset: i32,
#[serde(default, deserialize_with = "null_default")]
pub in_daylight_saving: bool,
}