use chrono::{DateTime, Utc};
use parse_display::{Display, FromStr};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ServiceListResponse {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub services: Vec<Service>,
#[serde(default)]
pub limit: i64,
#[serde(default)]
pub offset: i64,
#[serde(default)]
pub more: bool,
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ServiceObject {
#[serde(default)]
pub service: Service,
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Service {
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub id: String,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub name: String,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub description: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auto_resolve_timeout: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub acknowledgement_timeout: Option<i64>,
#[serde(default)]
pub status: Status,
#[serde(default)]
pub escalation_policy: EscalationPolicy,
#[serde(default)]
pub incident_urgency_rule: IncidentUrgencyRule,
#[serde(default)]
pub support_hours: Option<SupportHours>,
#[serde(default)]
pub scheduled_actions: Vec<ScheduledAction>,
#[serde(default)]
pub alert_creation: AlertCreation,
#[serde(default)]
pub alert_grouping_parameters: AlertGroupingParameters,
#[serde(default)]
pub auto_pause_notifications_parameters: AutoPauseNotificationsParameters,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize",
rename = "self"
)]
pub self_: String,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub html_url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_incident_timestamp: Option<DateTime<Utc>>,
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum Status {
Active,
Warning,
Critical,
Maintenance,
Disabled,
}
impl Default for Status {
fn default() -> Self {
Status::Active
}
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum AlertCreation {
CreateIncidents,
CreateAlertsAndIncidents,
}
impl Default for AlertCreation {
fn default() -> Self {
AlertCreation::CreateAlertsAndIncidents
}
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct EscalationPolicy {
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
pub type_: Option<EscalationPolicyType>,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub summary: String,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub name: String,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub description: String,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize",
rename = "self"
)]
pub self_: String,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub html_url: String,
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum EscalationPolicyType {
EscalationPolicyReference,
EscalationPolicy,
}
impl Default for EscalationPolicyType {
fn default() -> Self {
EscalationPolicyType::EscalationPolicyReference
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct IncidentUrgencyRule {
#[serde(default, rename = "type")]
pub type_: IncidentUrgencyRuleType,
#[serde(default)]
pub urgency: Option<Urgency>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub during_support_hours: Option<Box<IncidentUrgencyRule>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub outside_support_hours: Option<Box<IncidentUrgencyRule>>,
}
impl Default for IncidentUrgencyRule {
fn default() -> Self {
IncidentUrgencyRule {
type_: IncidentUrgencyRuleType::Constant,
urgency: Some(Urgency::High),
during_support_hours: None,
outside_support_hours: None,
}
}
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum IncidentUrgencyRuleType {
Constant,
UseSupportHours,
}
impl Default for IncidentUrgencyRuleType {
fn default() -> Self {
IncidentUrgencyRuleType::Constant
}
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum Urgency {
Low,
High,
SeverityBased,
}
impl Default for Urgency {
fn default() -> Self {
Urgency::High
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct SupportHours {
#[serde(default, rename = "type")]
pub type_: SupportHoursType,
#[serde(
default,
skip_serializing_if = "String::is_empty",
deserialize_with = "deserialize_null_string::deserialize"
)]
pub time_zone: String,
#[serde(
deserialize_with = "serde_naive_time::deserialize",
serialize_with = "serde_naive_time::serialize"
)]
pub start_time: chrono::NaiveTime,
#[serde(
deserialize_with = "serde_naive_time::deserialize",
serialize_with = "serde_naive_time::serialize"
)]
pub end_time: chrono::NaiveTime,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub days_of_week: Vec<i32>,
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum SupportHoursType {
FixedTimePerDay,
}
impl Default for SupportHoursType {
fn default() -> Self {
SupportHoursType::FixedTimePerDay
}
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ScheduledAction {
#[serde(default, rename = "type")]
pub type_: ScheduledActionType,
#[serde(default)]
pub at: ScheduledActionAt,
#[serde(default)]
pub to_urgency: Urgency,
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum ScheduledActionType {
UrgencyChange,
}
impl Default for ScheduledActionType {
fn default() -> Self {
ScheduledActionType::UrgencyChange
}
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ScheduledActionAt {
#[serde(default, rename = "type")]
pub type_: ScheduledActionAtType,
#[serde(default)]
pub name: ScheduledActionAtName,
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum ScheduledActionAtType {
NamedTime,
}
impl Default for ScheduledActionAtType {
fn default() -> Self {
ScheduledActionAtType::NamedTime
}
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum ScheduledActionAtName {
SupportHoursStart,
SupportHoursEnd,
}
impl Default for ScheduledActionAtName {
fn default() -> Self {
ScheduledActionAtName::SupportHoursStart
}
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct AlertGroupingParameters {
#[serde(default, rename = "type")]
pub type_: Option<AlertGroupingType>,
}
#[derive(Display, FromStr, PartialEq, Debug, JsonSchema, Deserialize, Serialize, Clone)]
#[display(style = "snake_case")]
#[serde(rename_all = "snake_case")]
pub enum AlertGroupingType {
Time,
Intelligent,
ContentBased,
}
impl Default for AlertGroupingType {
fn default() -> Self {
AlertGroupingType::Intelligent
}
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct AutoPauseNotificationsParameters {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub timeout: Option<i64>,
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct EscalationPolicyListResponse {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub escalation_policies: Vec<EscalationPolicy>,
#[serde(default)]
pub limit: i64,
#[serde(default)]
pub offset: i64,
#[serde(default)]
pub more: bool,
}
pub mod deserialize_null_string {
use serde::Deserialize;
pub fn deserialize<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(deserializer).unwrap_or_default();
Ok(s)
}
}
pub mod serde_naive_time {
use chrono::NaiveTime;
use serde::{Deserialize, Serializer};
pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveTime, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = NaiveTime::deserialize(deserializer)?;
Ok(s)
}
pub fn serialize<S>(time: &NaiveTime, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let s = format!("{}", time.format("%H:%M:%S"));
serializer.serialize_str(&s)
}
}