use std::net::SocketAddr; #[derive(Debug, Clone)] pub struct AppConfig { pub app_host: String, pub app_port: u16, pub database_url: Option, pub ollama_base_url: String, pub ollama_chat_model: String, pub ollama_embed_model: String, pub help_center_seed_path: String, pub tickets_source: String, } impl AppConfig { pub fn from_env() -> Self { Self { app_host: env_or_default("APP_HOST", "0.0.0.0"), app_port: env_or_default("APP_PORT", "8080").parse().unwrap_or(8080), database_url: std::env::var("DATABASE_URL") .ok() .filter(|v| !v.trim().is_empty()), ollama_base_url: env_or_default("OLLAMA_BASE_URL", "http://localhost:11434"), ollama_chat_model: env_or_default("OLLAMA_CHAT_MODEL", "smollm2:360m"), ollama_embed_model: env_or_default("OLLAMA_EMBED_MODEL", "nomic-embed-text"), help_center_seed_path: env_or_default( "HELP_CENTER_SEED_PATH", "./seeds/help_articles.json", ), tickets_source: env_or_default("TICKETS_SOURCE", "chatbot"), } } pub fn socket_addr(&self) -> SocketAddr { format!("{}:{}", self.app_host, self.app_port) .parse() .expect("invalid APP_HOST/APP_PORT") } } fn env_or_default(key: &str, default: &str) -> String { std::env::var(key).unwrap_or_else(|_| default.to_string()) }