use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MonitoringConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub terminal: Option<TerminalMonitor>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tracking: Option<TrackingConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub system: Option<SystemMonitorConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub alerts: Option<Vec<AlertConfig>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub drift_detection: Option<DriftDetectionConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DriftDetectionConfig {
pub enabled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub baseline: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub threshold: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub window: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub features: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub method: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TerminalMonitor {
pub enabled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub refresh_rate: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metrics: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub charts: Option<Vec<ChartConfig>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChartConfig {
#[serde(rename = "type")]
pub chart_type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metric: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub window: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub show_eta: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrackingConfig {
pub enabled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub backend: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub project: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub experiment: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tags: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemMonitorConfig {
pub enabled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub interval: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metrics: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertConfig {
pub condition: String,
pub action: String,
pub message: String,
}