use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use crate::serde::{
deserialize_optional_seconds_as_duration, serialize_optional_duration_as_seconds,
};
use super::{
custom_var_object::{CustomVarHolder, IcingaCustomVarObject},
function::IcingaFunction,
};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct IcingaCommand {
#[serde(flatten)]
pub custom_var: IcingaCustomVarObject,
pub arguments: Option<BTreeMap<String, IcingaCommandArgumentDescription>>,
pub command: Option<IcingaCommandLine>,
pub env: Option<BTreeMap<String, String>>,
pub execute: IcingaFunction,
#[serde(default)]
#[serde(
serialize_with = "serialize_optional_duration_as_seconds",
deserialize_with = "deserialize_optional_seconds_as_duration"
)]
pub timeout: Option<time::Duration>,
}
impl CustomVarHolder for IcingaCommand {
fn custom_var_value(&self, name: &str) -> Option<&serde_json::Value> {
self.custom_var.custom_var_value(name)
}
}
#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(untagged)]
pub enum IcingaCommandParameter {
String(String),
Boolean(bool),
Integer(i64),
}
#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(untagged)]
pub enum IcingaCommandLine {
Shell(String),
Function(IcingaFunction),
Exec(Vec<IcingaCommandParameter>),
}
#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(untagged)]
pub enum IcingaArgumentCondition {
String(String),
Function(IcingaFunction),
}
#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(untagged)]
pub enum IcingaCommandArgumentDescription {
String(String),
Function(IcingaFunction),
FullDescription {
description: Option<String>,
value: Option<String>,
key: Option<String>,
skip_key: Option<bool>,
repeat_key: Option<bool>,
set_if: Option<IcingaArgumentCondition>,
required: Option<bool>,
order: Option<u64>,
separator: Option<String>,
},
}