use anyhow::Result; use serde::{Deserialize, Serialize}; use std::path::Path; /// Main dashboard configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DashboardConfig { pub zmq: ZmqConfig, pub hosts: HostsConfig, pub system: SystemConfig, pub ssh: SshConfig, } /// ZMQ consumer configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ZmqConfig { pub subscriber_ports: Vec, } /// Hosts configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct HostsConfig { pub predefined_hosts: Vec, } /// System configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SystemConfig { pub nixos_config_git_url: String, pub nixos_config_branch: String, pub nixos_config_working_dir: String, pub nixos_config_api_key_file: Option, } /// SSH configuration for rebuild operations #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SshConfig { pub rebuild_user: String, pub rebuild_alias: String, } impl DashboardConfig { pub fn load_from_file>(path: P) -> Result { let path = path.as_ref(); let content = std::fs::read_to_string(path)?; let config: DashboardConfig = toml::from_str(&content)?; Ok(config) } } impl Default for DashboardConfig { fn default() -> Self { panic!("Dashboard configuration must be loaded from file - no hardcoded defaults allowed") } } impl Default for ZmqConfig { fn default() -> Self { panic!("Dashboard configuration must be loaded from file - no hardcoded defaults allowed") } } impl Default for HostsConfig { fn default() -> Self { panic!("Dashboard configuration must be loaded from file - no hardcoded defaults allowed") } }