use dotenvy::dotenv; use once_cell::sync::Lazy; pub const ENV_PREFIX: &str = "CL_"; pub struct Config { pub login_token: String, pub session_secret: String, pub root_path: String, pub username: String, pub bind_port: String, pub accounts: Accounts, } pub struct Accounts { pub email: Option, pub github: Option, pub twitter: Option, pub mastodon: Option, pub discord: Option, pub reddit: Option, } fn load_config() -> Config { dotenv().expect(".env file not found"); // return config value or panic if not set fn eval_required_conf(variable_name: String) -> String { match std::env::var(variable_name.clone()) { Ok(value) => { println!("{}: {}", variable_name, value); return value; } Err(_) => { panic!("{} not set!", variable_name) } } } // return optional value fn eval_optional_conf(variable_name: String, default_value: Option<&str>) -> Option { match std::env::var(variable_name.clone()) { Ok(value) => { println!("{}: {}", variable_name, value); return Some(value); } Err(_) => match default_value { Some(val) => { println!("Variable {variable_name} not set. Using default value: {val}."); return Some(String::from(val)); } None => { println!("Variable {variable_name} not set. No default, leaving this empty."); None } }, } } fn eval_conf_var(name: &str, required_var: bool, default: Option<&str>) -> Option { if required_var { Some(eval_required_conf(format!("{ENV_PREFIX}{name}"))) } else { eval_optional_conf(format!("{ENV_PREFIX}{name}"), default) } } Config { login_token: eval_conf_var("SUBMIT_TOKEN", true, None).unwrap(), session_secret: eval_conf_var("SESSION_SECRET", true, None).unwrap(), root_path: eval_conf_var("ROOT_PATH", false, Some("./content")).unwrap(), username: eval_conf_var("USERNAME", true, None).unwrap(), bind_port: eval_conf_var("BIND_PORT", false, Some("8000")).unwrap(), accounts: Accounts { email: eval_conf_var("EMAIL", false, None), github: eval_conf_var("GITHUB_ACCOUNT", false, None), discord: eval_conf_var("DISCORD_ACCOUNT", false, None), twitter: eval_conf_var("TWITTER_ACCOUNT", false, None), mastodon: eval_conf_var("MASTODON_ACCOUNT", false, None), reddit: eval_conf_var("REDDIT_ACCOUNT", false, None), }, } } pub static CONFIG: Lazy = Lazy::new(|| load_config());