Skip to main content

aetheris_server/
config.rs

1//! Server configuration management.
2//!
3//! Loads settings from environment variables with sensible defaults.
4
5/// Authoritative server configuration.
6#[derive(Debug, Clone)]
7pub struct ServerConfig {
8    /// Port for Prometheus metrics scraping.
9    pub metrics_port: u16,
10    /// Authoritative tick rate in Hz.
11    pub tick_rate: u64,
12    /// Number of threads for parallel encoding.
13    pub encode_threads: usize,
14}
15
16impl ServerConfig {
17    /// Loads configuration from environment variables with safe defaults.
18    #[must_use]
19    pub fn load() -> Self {
20        let metrics_port = std::env::var("AETHERIS_METRICS_PORT")
21            .ok()
22            .and_then(|s| s.parse().ok())
23            .unwrap_or(9000);
24
25        let tick_rate = std::env::var("AETHERIS_TICK_RATE")
26            .ok()
27            .and_then(|s| s.parse().ok())
28            .unwrap_or(60);
29
30        let encode_threads = std::env::var("AETHERIS_ENCODE_THREADS")
31            .ok()
32            .and_then(|s| s.parse().ok())
33            .unwrap_or(2);
34
35        Self {
36            metrics_port,
37            tick_rate,
38            encode_threads,
39        }
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_config_defaults() {
49        // Clear env to ensure defaults
50        unsafe {
51            std::env::remove_var("AETHERIS_METRICS_PORT");
52        }
53        let config = ServerConfig::load();
54        assert_eq!(config.metrics_port, 9000);
55    }
56
57    #[test]
58    fn test_config_env_override() {
59        unsafe {
60            std::env::set_var("AETHERIS_METRICS_PORT", "9500");
61        }
62        let config = ServerConfig::load();
63        assert_eq!(config.metrics_port, 9500);
64        unsafe {
65            std::env::remove_var("AETHERIS_METRICS_PORT");
66        }
67    }
68}