use std::time::Duration; #[derive(Debug, Clone)] pub struct GatewayConfig { pub listen: String, pub auth_endpoint: String, pub game_endpoint: String, pub server_major_version: i32, pub server_minor_version: i32, pub server_build: i32, pub content_version: i32, pub server_environment: String, pub facebook_app_id: Option, pub startup_cooldown_seconds: i32, pub read_timeout: Duration, pub max_payload_len: usize, } impl Default for GatewayConfig { fn default() -> Self { Self { listen: "0.0.0.0:9339".to_owned(), auth_endpoint: "127.0.0.1:9401".to_owned(), game_endpoint: "127.0.0.1:9402".to_owned(), server_major_version: 2, server_minor_version: 0, server_build: 1306, content_version: 8, server_environment: "prod".to_owned(), facebook_app_id: None, startup_cooldown_seconds: 0, read_timeout: Duration::from_secs(90), max_payload_len: 1024 * 1024, } } } impl GatewayConfig { pub fn from_env() -> Self { let defaults = Self::default(); Self { listen: env_string("SCROLL_GATEWAY_LISTEN").unwrap_or(defaults.listen), auth_endpoint: env_string("SCROLL_AUTH_ENDPOINT").unwrap_or(defaults.auth_endpoint), game_endpoint: env_string("SCROLL_GAME_ENDPOINT").unwrap_or(defaults.game_endpoint), server_major_version: env_i32("SCROLL_SERVER_MAJOR") .unwrap_or(defaults.server_major_version), server_minor_version: env_i32("SCROLL_SERVER_MINOR") .unwrap_or(defaults.server_minor_version), server_build: env_i32("SCROLL_SERVER_BUILD").unwrap_or(defaults.server_build), content_version: env_i32("SCROLL_CONTENT_VERSION").unwrap_or(defaults.content_version), server_environment: env_string("SCROLL_ENVIRONMENT") .unwrap_or(defaults.server_environment), facebook_app_id: env_string("SCROLL_FACEBOOK_APP_ID"), startup_cooldown_seconds: env_i32("SCROLL_STARTUP_COOLDOWN") .unwrap_or(defaults.startup_cooldown_seconds), read_timeout: env_i32("SCROLL_READ_TIMEOUT_SECONDS") .map(|seconds| Duration::from_secs(seconds.max(1) as u64)) .unwrap_or(defaults.read_timeout), max_payload_len: env_i32("SCROLL_MAX_PAYLOAD") .map(|value| value.max(1024) as usize) .unwrap_or(defaults.max_payload_len), } } } fn env_string(key: &str) -> Option { std::env::var(key).ok().filter(|value| !value.is_empty()) } fn env_i32(key: &str) -> Option { env_string(key).and_then(|value| value.parse().ok()) }