1use chrono::{DateTime, Utc};
4use parse_display::{Display, FromStr};
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
10pub struct ServiceListResponse {
11 #[serde(default, skip_serializing_if = "Vec::is_empty")]
13 pub services: Vec<Service>,
14 #[serde(default)]
16 pub limit: i64,
17 #[serde(default)]
19 pub offset: i64,
20 #[serde(default)]
22 pub more: bool,
23}
24
25#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
27pub struct ServiceObject {
28 #[serde(default)]
30 pub service: Service,
31}
32
33#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
35pub struct Service {
36 #[serde(
38 default,
39 skip_serializing_if = "String::is_empty",
40 deserialize_with = "deserialize_null_string::deserialize"
41 )]
42 pub id: String,
43 #[serde(
45 default,
46 skip_serializing_if = "String::is_empty",
47 deserialize_with = "deserialize_null_string::deserialize"
48 )]
49 pub name: String,
50 #[serde(
52 default,
53 skip_serializing_if = "String::is_empty",
54 deserialize_with = "deserialize_null_string::deserialize"
55 )]
56 pub description: String,
57 #[serde(default, skip_serializing_if = "Option::is_none")]
59 pub auto_resolve_timeout: Option<i64>,
60 #[serde(default, skip_serializing_if = "Option::is_none")]
62 pub acknowledgement_timeout: Option<i64>,
63 #[serde(default)]
71 pub status: Status,
72 #[serde(default)]
74 pub escalation_policy: EscalationPolicy,
75 #[serde(default)]
77 pub incident_urgency_rule: IncidentUrgencyRule,
78 #[serde(default)]
80 pub support_hours: Option<SupportHours>,
81 #[serde(default)]
83 pub scheduled_actions: Vec<ScheduledAction>,
84 #[serde(default)]
89 pub alert_creation: AlertCreation,
90 #[serde(default)]
92 pub alert_grouping_parameters: AlertGroupingParameters,
93 #[serde(default)]
95 pub auto_pause_notifications_parameters: AutoPauseNotificationsParameters,
96
97 #[serde(
99 default,
100 skip_serializing_if = "String::is_empty",
101 deserialize_with = "deserialize_null_string::deserialize",
102 rename = "self"
103 )]
104 pub self_: String,
105 #[serde(
107 default,
108 skip_serializing_if = "String::is_empty",
109 deserialize_with = "deserialize_null_string::deserialize"
110 )]
111 pub html_url: String,
112 #[serde(default, skip_serializing_if = "Option::is_none")]
114 pub created_at: Option<DateTime<Utc>>,
115 #[serde(default, skip_serializing_if = "Option::is_none")]
117 pub last_incident_timestamp: Option<DateTime<Utc>>,
118}
119
120#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
122#[display(style = "snake_case")]
123#[serde(rename_all = "snake_case")]
124pub enum Status {
125 Active,
127 Warning,
129 Critical,
131 Maintenance,
133 Disabled,
135}
136
137impl Default for Status {
138 fn default() -> Self {
139 Status::Active
140 }
141}
142
143#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
145#[display(style = "snake_case")]
146#[serde(rename_all = "snake_case")]
147pub enum AlertCreation {
148 CreateIncidents,
150 CreateAlertsAndIncidents,
152}
153
154impl Default for AlertCreation {
155 fn default() -> Self {
156 AlertCreation::CreateAlertsAndIncidents
157 }
158}
159
160#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
162pub struct EscalationPolicy {
163 #[serde(
165 default,
166 skip_serializing_if = "String::is_empty",
167 deserialize_with = "deserialize_null_string::deserialize"
168 )]
169 pub id: String,
170 #[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
172 pub type_: Option<EscalationPolicyType>,
173 #[serde(
175 default,
176 skip_serializing_if = "String::is_empty",
177 deserialize_with = "deserialize_null_string::deserialize"
178 )]
179 pub summary: String,
180 #[serde(
182 default,
183 skip_serializing_if = "String::is_empty",
184 deserialize_with = "deserialize_null_string::deserialize"
185 )]
186 pub name: String,
187 #[serde(
189 default,
190 skip_serializing_if = "String::is_empty",
191 deserialize_with = "deserialize_null_string::deserialize"
192 )]
193 pub description: String,
194 #[serde(
196 default,
197 skip_serializing_if = "String::is_empty",
198 deserialize_with = "deserialize_null_string::deserialize",
199 rename = "self"
200 )]
201 pub self_: String,
202 #[serde(
204 default,
205 skip_serializing_if = "String::is_empty",
206 deserialize_with = "deserialize_null_string::deserialize"
207 )]
208 pub html_url: String,
209}
210
211#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
213#[display(style = "snake_case")]
214#[serde(rename_all = "snake_case")]
215pub enum EscalationPolicyType {
216 EscalationPolicyReference,
218 EscalationPolicy,
220}
221
222impl Default for EscalationPolicyType {
223 fn default() -> Self {
224 EscalationPolicyType::EscalationPolicyReference
225 }
226}
227
228#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
230pub struct IncidentUrgencyRule {
231 #[serde(default, rename = "type")]
233 pub type_: IncidentUrgencyRuleType,
234 #[serde(default)]
236 pub urgency: Option<Urgency>,
237 #[serde(default, skip_serializing_if = "Option::is_none")]
239 pub during_support_hours: Option<Box<IncidentUrgencyRule>>,
240 #[serde(default, skip_serializing_if = "Option::is_none")]
242 pub outside_support_hours: Option<Box<IncidentUrgencyRule>>,
243}
244
245impl Default for IncidentUrgencyRule {
246 fn default() -> Self {
247 IncidentUrgencyRule {
248 type_: IncidentUrgencyRuleType::Constant,
249 urgency: Some(Urgency::High),
250 during_support_hours: None,
251 outside_support_hours: None,
252 }
253 }
254}
255
256#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
258#[display(style = "snake_case")]
259#[serde(rename_all = "snake_case")]
260pub enum IncidentUrgencyRuleType {
261 Constant,
263 UseSupportHours,
265}
266
267impl Default for IncidentUrgencyRuleType {
268 fn default() -> Self {
269 IncidentUrgencyRuleType::Constant
270 }
271}
272
273#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
275#[display(style = "snake_case")]
276#[serde(rename_all = "snake_case")]
277pub enum Urgency {
278 Low,
280 High,
282 SeverityBased,
284}
285
286impl Default for Urgency {
287 fn default() -> Self {
288 Urgency::High
289 }
290}
291
292#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
294pub struct SupportHours {
295 #[serde(default, rename = "type")]
297 pub type_: SupportHoursType,
298 #[serde(
300 default,
301 skip_serializing_if = "String::is_empty",
302 deserialize_with = "deserialize_null_string::deserialize"
303 )]
304 pub time_zone: String,
305 #[serde(
307 deserialize_with = "serde_naive_time::deserialize",
308 serialize_with = "serde_naive_time::serialize"
309 )]
310 pub start_time: chrono::NaiveTime,
311 #[serde(
313 deserialize_with = "serde_naive_time::deserialize",
314 serialize_with = "serde_naive_time::serialize"
315 )]
316 pub end_time: chrono::NaiveTime,
317 #[serde(default, skip_serializing_if = "Vec::is_empty")]
319 pub days_of_week: Vec<i32>,
320}
321
322#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
324#[display(style = "snake_case")]
325#[serde(rename_all = "snake_case")]
326pub enum SupportHoursType {
327 FixedTimePerDay,
329}
330
331impl Default for SupportHoursType {
332 fn default() -> Self {
333 SupportHoursType::FixedTimePerDay
334 }
335}
336
337#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
339pub struct ScheduledAction {
340 #[serde(default, rename = "type")]
342 pub type_: ScheduledActionType,
343 #[serde(default)]
345 pub at: ScheduledActionAt,
346 #[serde(default)]
348 pub to_urgency: Urgency,
349}
350
351#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
353#[display(style = "snake_case")]
354#[serde(rename_all = "snake_case")]
355pub enum ScheduledActionType {
356 UrgencyChange,
358}
359
360impl Default for ScheduledActionType {
361 fn default() -> Self {
362 ScheduledActionType::UrgencyChange
363 }
364}
365
366#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
368pub struct ScheduledActionAt {
369 #[serde(default, rename = "type")]
371 pub type_: ScheduledActionAtType,
372 #[serde(default)]
374 pub name: ScheduledActionAtName,
375}
376
377#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
379#[display(style = "snake_case")]
380#[serde(rename_all = "snake_case")]
381pub enum ScheduledActionAtType {
382 NamedTime,
384}
385
386impl Default for ScheduledActionAtType {
387 fn default() -> Self {
388 ScheduledActionAtType::NamedTime
389 }
390}
391
392#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
394#[display(style = "snake_case")]
395#[serde(rename_all = "snake_case")]
396pub enum ScheduledActionAtName {
397 SupportHoursStart,
399 SupportHoursEnd,
401}
402
403impl Default for ScheduledActionAtName {
404 fn default() -> Self {
405 ScheduledActionAtName::SupportHoursStart
406 }
407}
408
409#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
411pub struct AlertGroupingParameters {
412 #[serde(default, rename = "type")]
414 pub type_: Option<AlertGroupingType>,
415}
416
417#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
419#[display(style = "snake_case")]
420#[serde(rename_all = "snake_case")]
421pub enum AlertGroupingType {
422 Time,
424 Intelligent,
426 ContentBased,
428}
429
430impl Default for AlertGroupingType {
431 fn default() -> Self {
432 AlertGroupingType::Intelligent
433 }
434}
435
436#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
438pub struct AutoPauseNotificationsParameters {
439 #[serde(default)]
441 pub enabled: bool,
442 #[serde(default)]
445 pub timeout: Option<i64>,
446}
447
448#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
450pub struct EscalationPolicyListResponse {
451 #[serde(default, skip_serializing_if = "Vec::is_empty")]
453 pub escalation_policies: Vec<EscalationPolicy>,
454 #[serde(default)]
456 pub limit: i64,
457 #[serde(default)]
459 pub offset: i64,
460 #[serde(default)]
462 pub more: bool,
463}
464
465pub mod deserialize_null_string {
467 use serde::Deserialize;
468
469 pub fn deserialize<'de, D>(deserializer: D) -> Result<String, D::Error>
471 where
472 D: serde::Deserializer<'de>,
473 {
474 let s = String::deserialize(deserializer).unwrap_or_default();
475
476 Ok(s)
477 }
478}
479
480pub mod serde_naive_time {
482 use chrono::NaiveTime;
483 use serde::{Deserialize, Serializer};
484
485 pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveTime, D::Error>
487 where
488 D: serde::Deserializer<'de>,
489 {
490 let s = NaiveTime::deserialize(deserializer)?;
491
492 Ok(s)
493 }
494
495 pub fn serialize<S>(time: &NaiveTime, serializer: S) -> Result<S::Ok, S::Error>
497 where
498 S: Serializer,
499 {
500 let s = format!("{}", time.format("%H:%M:%S"));
501 serializer.serialize_str(&s)
502 }
503}