use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct RawConfig {
#[serde(default)]
pub schema_version: Option<u32>,
#[serde(default)]
pub general: Option<GeneralSection>,
#[serde(default)]
pub local: Option<LocalSection>,
#[serde(default)]
pub view: Option<ViewSection>,
#[serde(default)]
pub api: Option<ApiSection>,
#[serde(default)]
pub alerts: Option<AlertsSection>,
#[serde(default)]
pub energy: Option<EnergySection>,
#[serde(default)]
pub display: Option<DisplaySection>,
#[serde(default)]
pub record: Option<RecordSection>,
#[serde(default)]
pub snapshot: Option<SnapshotSection>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct GeneralSection {
pub default_mode: Option<String>,
pub theme: Option<String>,
pub locale: Option<String>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct LocalSection {
pub interval_secs: Option<u64>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ViewSection {
pub hostfile: Option<String>,
pub hosts: Option<Vec<String>>,
pub interval_secs: Option<u64>,
pub ssh: Option<Vec<String>>,
pub ssh_hostfile: Option<String>,
pub ssh_key: Option<String>,
pub ssh_config: Option<String>,
pub ssh_strict_host_key: Option<String>,
pub ssh_timeout_secs: Option<u64>,
pub ssh_fallback: Option<String>,
pub ssh_known_hosts: Option<String>,
pub ssh_concurrency: Option<usize>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct ApiSection {
pub port: Option<u16>,
#[serde(default)]
pub socket: SocketSetting,
pub processes: Option<bool>,
pub interval_secs: Option<u64>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
#[serde(untagged)]
pub enum SocketSetting {
#[default]
Unset,
Bool(bool),
Path(String),
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct AlertsSection {
pub enabled: Option<bool>,
pub temp_warn_c: Option<u32>,
pub temp_crit_c: Option<u32>,
pub util_idle_pct: Option<u32>,
pub util_idle_warn_mins: Option<u32>,
pub hysteresis_c: Option<u32>,
pub bell_on_critical: Option<bool>,
pub webhook_url: Option<String>,
pub power_crit_w: Option<u32>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct EnergySection {
pub price_per_kwh: Option<f64>,
pub currency: Option<String>,
pub show_cost: Option<bool>,
pub wal_path: Option<String>,
pub gap_interpolate_seconds: Option<u64>,
pub wal_enabled: Option<bool>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct DisplaySection {
pub color_scheme: Option<String>,
pub gauge_style: Option<String>,
pub show_led_grid: Option<bool>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct RecordSection {
pub output_dir: Option<String>,
pub compress: Option<String>,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct SnapshotSection {
pub default_format: Option<String>,
pub default_pretty: Option<bool>,
}
pub const KNOWN_TOP_LEVEL: &[&str] = &[
"schema_version",
"general",
"local",
"view",
"api",
"alerts",
"energy",
"display",
"record",
"snapshot",
];