use serde::{Deserialize, Serialize};
use crate::wire::Shell;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Manifest {
pub id: String,
pub version: String,
#[serde(default)]
pub description: Option<String>,
pub target: Target,
pub execute: Execute,
#[serde(default)]
pub rollout: Option<Rollout>,
#[serde(default)]
pub require_approval: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Rollout {
#[serde(default)]
pub strategy: RolloutStrategy,
pub waves: Vec<Wave>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Default)]
#[serde(rename_all = "lowercase")]
pub enum RolloutStrategy {
#[default]
Wave,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Wave {
pub group: String,
pub delay: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct Target {
#[serde(default)]
pub groups: Vec<String>,
#[serde(default)]
pub pcs: Vec<String>,
#[serde(default)]
pub all: bool,
}
impl Target {
pub fn is_specified(&self) -> bool {
self.all || !self.groups.is_empty() || !self.pcs.is_empty()
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Execute {
pub shell: ExecuteShell,
pub script: String,
pub timeout: String,
#[serde(default)]
pub jitter: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ExecuteShell {
Powershell,
Cmd,
}
impl From<ExecuteShell> for Shell {
fn from(s: ExecuteShell) -> Self {
match s {
ExecuteShell::Powershell => Shell::Powershell,
ExecuteShell::Cmd => Shell::Cmd,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Schedule {
pub id: String,
pub cron: String,
pub manifest: Manifest,
#[serde(default = "default_true")]
pub enabled: bool,
}
fn default_true() -> bool {
true
}