use serde::{Deserialize, Serialize};
use crate::ValidationViolation;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct StatusSnapshot {
pub schema_version: u16,
pub observed_at_unix_ms: u64,
pub sample_interval_ms: u64,
pub capabilities: MetricCapabilities,
pub system: SystemIdentity,
pub cpu: CpuMetrics,
pub load: LoadAverage,
pub memory: MemoryMetrics,
pub swap: SwapMetrics,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct MetricCapabilities {
pub cpu_iowait: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct SystemIdentity {
pub name: String,
pub hostname: String,
pub os_name: String,
pub os_version: String,
pub kernel_name: String,
pub kernel_release: String,
pub architecture: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct CpuMetrics {
pub logical_cores: u32,
pub usage_pct: f32,
pub iowait_pct: Option<f32>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct LoadAverage {
pub one: f32,
pub five: f32,
pub fifteen: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct MemoryMetrics {
pub used_bytes: u64,
pub total_bytes: u64,
pub usage_pct: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct SwapMetrics {
pub used_bytes: u64,
pub total_bytes: u64,
pub usage_pct: f32,
}
impl StatusSnapshot {
pub fn validate(&self) -> Result<(), Vec<ValidationViolation>> {
crate::validate::validate(self)
}
}