1use super::*;
4
5#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
6pub struct ShieldList {
7 pub id: String,
8 pub r#type: String,
9 pub name: String,
10 pub enterprise: EnterpriseReference,
11 #[serde(default, skip_serializing_if = "Option::is_none")]
12 pub description: Option<String>,
13 pub created_at: chrono::DateTime<chrono::Utc>,
14 pub updated_at: chrono::DateTime<chrono::Utc>,
15 pub content: ShieldListContent,
16}
17
18#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
19pub struct ShieldListMini {
20 pub id: String,
21 pub r#type: ShieldListMiniType,
22 pub name: String,
23 pub content: ShieldListMiniContent,
24}
25
26#[derive(Clone, Debug, PartialEq)]
27pub enum ShieldListContent {
28 Country(ShieldListContentCountry),
29 Domain(ShieldListContentDomain),
30 Email(ShieldListContentEmail),
31 Ip(ShieldListContentIp),
32 Integration(ShieldListContentIntegration),
33 Unknown(serde_json::Value),
35}
36
37impl Default for ShieldListContent {
38 fn default() -> Self {
39 Self::Unknown(Default::default())
40 }
41}
42
43impl serde::Serialize for ShieldListContent {
44 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
45 match self {
46 Self::Country(inner) => inner.serialize(serializer),
47 Self::Domain(inner) => inner.serialize(serializer),
48 Self::Email(inner) => inner.serialize(serializer),
49 Self::Ip(inner) => inner.serialize(serializer),
50 Self::Integration(inner) => inner.serialize(serializer),
51 Self::Unknown(inner) => inner.serialize(serializer),
52 }
53 }
54}
55
56impl<'de> serde::Deserialize<'de> for ShieldListContent {
57 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
58 let value = serde_json::Value::deserialize(deserializer)?;
59 let tag = value
60 .get("type")
61 .and_then(serde_json::Value::as_str)
62 .map(str::to_owned);
63 match tag.as_deref() {
64 Some("country") => Ok(Self::Country(
65 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
66 )),
67 Some("domain") => Ok(Self::Domain(
68 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
69 )),
70 Some("email") => Ok(Self::Email(
71 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
72 )),
73 Some("ip") => Ok(Self::Ip(
74 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
75 )),
76 Some("integration") => Ok(Self::Integration(
77 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
78 )),
79 _ => Ok(Self::Unknown(value)),
80 }
81 }
82}
83
84#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
85pub struct ShieldListContentCountry {
86 pub r#type: ShieldListContentCountryType,
87 pub country_codes: Vec<String>,
88}
89
90#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
91pub struct ShieldListContentDomain {
92 pub r#type: ShieldListContentDomainType,
93 pub domains: Vec<String>,
94}
95
96#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
97pub struct ShieldListContentEmail {
98 pub r#type: ShieldListContentEmailType,
99 pub email_addresses: Vec<String>,
100}
101
102#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
103pub struct ShieldListContentIntegration {
104 pub r#type: ShieldListContentIntegrationType,
105 pub integrations: Vec<ShieldListContentIntegrationIntegrations>,
106}
107
108#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
109pub struct ShieldListContentIp {
110 pub r#type: ShieldListContentIpType,
111 pub ip_addresses: Vec<String>,
112}
113
114#[derive(Clone, Debug, PartialEq)]
115pub enum ShieldListContentRequest {
116 Country(ShieldListContentCountry),
117 Domain(ShieldListContentDomain),
118 Email(ShieldListContentEmail),
119 Ip(ShieldListContentIp),
120 Unknown(serde_json::Value),
122}
123
124impl Default for ShieldListContentRequest {
125 fn default() -> Self {
126 Self::Unknown(Default::default())
127 }
128}
129
130impl serde::Serialize for ShieldListContentRequest {
131 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
132 match self {
133 Self::Country(inner) => inner.serialize(serializer),
134 Self::Domain(inner) => inner.serialize(serializer),
135 Self::Email(inner) => inner.serialize(serializer),
136 Self::Ip(inner) => inner.serialize(serializer),
137 Self::Unknown(inner) => inner.serialize(serializer),
138 }
139 }
140}
141
142impl<'de> serde::Deserialize<'de> for ShieldListContentRequest {
143 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
144 let value = serde_json::Value::deserialize(deserializer)?;
145 let tag = value
146 .get("type")
147 .and_then(serde_json::Value::as_str)
148 .map(str::to_owned);
149 match tag.as_deref() {
150 Some("country") => Ok(Self::Country(
151 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
152 )),
153 Some("domain") => Ok(Self::Domain(
154 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
155 )),
156 Some("email") => Ok(Self::Email(
157 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
158 )),
159 Some("ip") => Ok(Self::Ip(
160 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
161 )),
162 _ => Ok(Self::Unknown(value)),
163 }
164 }
165}
166
167#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
168pub struct ShieldLists {
169 #[serde(default, skip_serializing_if = "Option::is_none")]
170 pub entries: Option<Vec<ShieldListMini>>,
171}
172
173#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
174pub struct ShieldListsCreate {
175 pub name: String,
176 #[serde(default, skip_serializing_if = "Option::is_none")]
177 pub description: Option<String>,
178 pub content: ShieldListContentRequest,
179}
180
181#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
182pub struct ShieldListsUpdate {
183 pub name: String,
184 #[serde(default, skip_serializing_if = "Option::is_none")]
185 pub description: Option<String>,
186 pub content: ShieldListContentRequest,
187}
188
189#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
190#[serde(transparent)]
191pub struct ShieldListMiniType(pub String);
192
193impl ShieldListMiniType {
194 pub const SHIELD_LIST: &'static str = "shield_list";
195}
196
197#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
198pub struct ShieldListMiniContent {
199 #[serde(default, skip_serializing_if = "Option::is_none")]
200 pub r#type: Option<String>,
201}
202
203#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
204#[serde(transparent)]
205pub struct ShieldListContentCountryType(pub String);
206
207impl ShieldListContentCountryType {
208 pub const COUNTRY: &'static str = "country";
209}
210
211#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
212#[serde(transparent)]
213pub struct ShieldListContentDomainType(pub String);
214
215impl ShieldListContentDomainType {
216 pub const DOMAIN: &'static str = "domain";
217}
218
219#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
220#[serde(transparent)]
221pub struct ShieldListContentEmailType(pub String);
222
223impl ShieldListContentEmailType {
224 pub const EMAIL: &'static str = "email";
225}
226
227#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
228#[serde(transparent)]
229pub struct ShieldListContentIntegrationType(pub String);
230
231impl ShieldListContentIntegrationType {
232 pub const INTEGRATION: &'static str = "integration";
233}
234
235#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
236pub struct ShieldListContentIntegrationIntegrations {
237 #[serde(default, skip_serializing_if = "Option::is_none")]
238 pub id: Option<String>,
239}
240
241#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
242#[serde(transparent)]
243pub struct ShieldListContentIpType(pub String);
244
245impl ShieldListContentIpType {
246 pub const IP: &'static str = "ip";
247}