use super::*;
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldList {
pub id: String,
pub r#type: String,
pub name: String,
pub enterprise: EnterpriseReference,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
pub content: ShieldListContent,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListMini {
pub id: String,
pub r#type: ShieldListMiniType,
pub name: String,
pub content: ShieldListMiniContent,
}
#[derive(Clone, Debug, PartialEq)]
pub enum ShieldListContent {
Country(ShieldListContentCountry),
Domain(ShieldListContentDomain),
Email(ShieldListContentEmail),
Ip(ShieldListContentIp),
Integration(ShieldListContentIntegration),
Unknown(serde_json::Value),
}
impl Default for ShieldListContent {
fn default() -> Self {
Self::Unknown(Default::default())
}
}
impl serde::Serialize for ShieldListContent {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::Country(inner) => inner.serialize(serializer),
Self::Domain(inner) => inner.serialize(serializer),
Self::Email(inner) => inner.serialize(serializer),
Self::Ip(inner) => inner.serialize(serializer),
Self::Integration(inner) => inner.serialize(serializer),
Self::Unknown(inner) => inner.serialize(serializer),
}
}
}
impl<'de> serde::Deserialize<'de> for ShieldListContent {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = serde_json::Value::deserialize(deserializer)?;
let tag = value
.get("type")
.and_then(serde_json::Value::as_str)
.map(str::to_owned);
match tag.as_deref() {
Some("country") => Ok(Self::Country(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("domain") => Ok(Self::Domain(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("email") => Ok(Self::Email(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("ip") => Ok(Self::Ip(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("integration") => Ok(Self::Integration(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
_ => Ok(Self::Unknown(value)),
}
}
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListContentCountry {
pub r#type: ShieldListContentCountryType,
pub country_codes: Vec<String>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListContentDomain {
pub r#type: ShieldListContentDomainType,
pub domains: Vec<String>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListContentEmail {
pub r#type: ShieldListContentEmailType,
pub email_addresses: Vec<String>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListContentIntegration {
pub r#type: ShieldListContentIntegrationType,
pub integrations: Vec<ShieldListContentIntegrationIntegrations>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListContentIp {
pub r#type: ShieldListContentIpType,
pub ip_addresses: Vec<String>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum ShieldListContentRequest {
Country(ShieldListContentCountry),
Domain(ShieldListContentDomain),
Email(ShieldListContentEmail),
Ip(ShieldListContentIp),
Unknown(serde_json::Value),
}
impl Default for ShieldListContentRequest {
fn default() -> Self {
Self::Unknown(Default::default())
}
}
impl serde::Serialize for ShieldListContentRequest {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::Country(inner) => inner.serialize(serializer),
Self::Domain(inner) => inner.serialize(serializer),
Self::Email(inner) => inner.serialize(serializer),
Self::Ip(inner) => inner.serialize(serializer),
Self::Unknown(inner) => inner.serialize(serializer),
}
}
}
impl<'de> serde::Deserialize<'de> for ShieldListContentRequest {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = serde_json::Value::deserialize(deserializer)?;
let tag = value
.get("type")
.and_then(serde_json::Value::as_str)
.map(str::to_owned);
match tag.as_deref() {
Some("country") => Ok(Self::Country(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("domain") => Ok(Self::Domain(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("email") => Ok(Self::Email(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("ip") => Ok(Self::Ip(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
_ => Ok(Self::Unknown(value)),
}
}
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldLists {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub entries: Option<Vec<ShieldListMini>>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListsCreate {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub content: ShieldListContentRequest,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListsUpdate {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub content: ShieldListContentRequest,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct ShieldListMiniType(pub String);
impl ShieldListMiniType {
pub const SHIELD_LIST: &'static str = "shield_list";
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListMiniContent {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct ShieldListContentCountryType(pub String);
impl ShieldListContentCountryType {
pub const COUNTRY: &'static str = "country";
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct ShieldListContentDomainType(pub String);
impl ShieldListContentDomainType {
pub const DOMAIN: &'static str = "domain";
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct ShieldListContentEmailType(pub String);
impl ShieldListContentEmailType {
pub const EMAIL: &'static str = "email";
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct ShieldListContentIntegrationType(pub String);
impl ShieldListContentIntegrationType {
pub const INTEGRATION: &'static str = "integration";
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct ShieldListContentIntegrationIntegrations {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct ShieldListContentIpType(pub String);
impl ShieldListContentIpType {
pub const IP: &'static str = "ip";
}