use serde::Deserialize;
use serde::Serialize;
use crate::serde::{
deserialize_empty_string_or_parse, deserialize_empty_string_or_string,
deserialize_icinga_timestamp, deserialize_optional_icinga_timestamp,
deserialize_optional_seconds_as_duration, serialize_icinga_timestamp,
serialize_none_as_empty_string, serialize_none_as_empty_string_or_to_string,
serialize_optional_duration_as_seconds, serialize_optional_icinga_timestamp,
};
use crate::types::enums::acknowledgement_type::IcingaAcknowledgementType;
use crate::types::enums::host_or_service_state::IcingaHostOrServiceState;
use crate::types::enums::state_type::IcingaStateType;
use crate::types::names::IcingaCheckCommandName;
use crate::types::names::IcingaEndpointName;
use crate::types::names::IcingaEventCommandName;
use crate::types::names::IcingaTimePeriodName;
use super::check_result::IcingaCheckResult;
use super::custom_var_object::CustomVarHolder;
use super::custom_var_object::IcingaCustomVarObject;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct IcingaCheckable {
#[serde(flatten)]
pub custom_var: IcingaCustomVarObject,
pub acknowledgement: IcingaAcknowledgementType,
#[serde(
serialize_with = "serialize_optional_icinga_timestamp",
deserialize_with = "deserialize_optional_icinga_timestamp"
)]
pub acknowledgement_expiry: Option<time::OffsetDateTime>,
#[serde(
serialize_with = "serialize_optional_icinga_timestamp",
deserialize_with = "deserialize_optional_icinga_timestamp"
)]
pub acknowledgement_last_change: Option<time::OffsetDateTime>,
#[serde(
serialize_with = "serialize_none_as_empty_string",
deserialize_with = "deserialize_empty_string_or_string"
)]
pub action_url: Option<String>,
pub check_attempt: u64,
pub check_command: IcingaCheckCommandName,
#[serde(default)]
#[serde(
serialize_with = "serialize_optional_duration_as_seconds",
deserialize_with = "deserialize_optional_seconds_as_duration"
)]
pub check_interval: Option<time::Duration>,
#[serde(
serialize_with = "serialize_none_as_empty_string_or_to_string",
deserialize_with = "deserialize_empty_string_or_parse"
)]
pub check_period: Option<IcingaTimePeriodName>,
#[serde(default)]
#[serde(
serialize_with = "serialize_optional_duration_as_seconds",
deserialize_with = "deserialize_optional_seconds_as_duration"
)]
pub check_timeout: Option<time::Duration>,
#[serde(
serialize_with = "serialize_none_as_empty_string_or_to_string",
deserialize_with = "deserialize_empty_string_or_parse"
)]
pub command_endpoint: Option<IcingaEndpointName>,
pub downtime_depth: u64,
pub enable_active_checks: bool,
pub enable_event_handler: bool,
pub enable_flapping: bool,
pub enable_notifications: bool,
pub enable_passive_checks: bool,
pub enable_perfdata: bool,
#[serde(
serialize_with = "serialize_none_as_empty_string_or_to_string",
deserialize_with = "deserialize_empty_string_or_parse"
)]
pub event_command: Option<IcingaEventCommandName>,
pub executions: Option<()>,
pub flapping: bool,
pub flapping_current: f64,
#[serde(default)]
pub flapping_ignore_states: Option<Vec<IcingaHostOrServiceState>>,
#[serde(
serialize_with = "serialize_optional_icinga_timestamp",
deserialize_with = "deserialize_optional_icinga_timestamp"
)]
pub flapping_last_change: Option<time::OffsetDateTime>,
pub flapping_threshold: f64,
pub flapping_threshold_low: f64,
pub flapping_threshold_high: f64,
pub force_next_check: bool,
pub force_next_notification: bool,
pub handled: bool,
#[serde(
serialize_with = "serialize_none_as_empty_string",
deserialize_with = "deserialize_empty_string_or_string"
)]
pub icon_image: Option<String>,
#[serde(
serialize_with = "serialize_none_as_empty_string",
deserialize_with = "deserialize_empty_string_or_string"
)]
pub icon_image_alt: Option<String>,
#[serde(
serialize_with = "serialize_icinga_timestamp",
deserialize_with = "deserialize_icinga_timestamp"
)]
pub last_check: time::OffsetDateTime,
pub last_check_result: IcingaCheckResult,
#[serde(
serialize_with = "serialize_icinga_timestamp",
deserialize_with = "deserialize_icinga_timestamp"
)]
pub last_hard_state_change: time::OffsetDateTime,
pub last_reachable: bool,
#[serde(
serialize_with = "serialize_optional_icinga_timestamp",
deserialize_with = "deserialize_optional_icinga_timestamp"
)]
pub last_state_change: Option<time::OffsetDateTime>,
pub last_state_type: IcingaStateType,
#[serde(
serialize_with = "serialize_optional_icinga_timestamp",
deserialize_with = "deserialize_optional_icinga_timestamp"
)]
pub last_state_unreachable: Option<time::OffsetDateTime>,
pub max_check_attempts: u64,
#[serde(
serialize_with = "serialize_optional_icinga_timestamp",
deserialize_with = "deserialize_optional_icinga_timestamp"
)]
pub next_check: Option<time::OffsetDateTime>,
#[serde(
serialize_with = "serialize_optional_icinga_timestamp",
deserialize_with = "deserialize_optional_icinga_timestamp"
)]
pub next_update: Option<time::OffsetDateTime>,
#[serde(
serialize_with = "serialize_none_as_empty_string",
deserialize_with = "deserialize_empty_string_or_string"
)]
pub notes: Option<String>,
#[serde(
serialize_with = "serialize_none_as_empty_string",
deserialize_with = "deserialize_empty_string_or_string"
)]
pub notes_url: Option<String>,
#[serde(
serialize_with = "serialize_optional_icinga_timestamp",
deserialize_with = "deserialize_optional_icinga_timestamp"
)]
pub previous_state_change: Option<time::OffsetDateTime>,
pub problem: bool,
#[serde(default)]
#[serde(
serialize_with = "serialize_optional_duration_as_seconds",
deserialize_with = "deserialize_optional_seconds_as_duration"
)]
pub retry_interval: Option<time::Duration>,
pub severity: u64,
pub state_type: IcingaStateType,
pub volatile: bool,
}
impl CustomVarHolder for IcingaCheckable {
fn custom_var_value(&self, name: &str) -> Option<&serde_json::Value> {
self.custom_var.custom_var_value(name)
}
}