config.rs
1 use std::env::{self, VarError}; 2 3 #[derive(Debug, Clone, thiserror::Error)] 4 pub enum ConfigError { 5 #[error("Environment variable error")] 6 EnvVarError(#[from] VarError), 7 #[error("Empty variable error `{0}`")] 8 VarEmpty(String), 9 #[error("Invalid bool `{0}`")] 10 InvalidBool(String), 11 } 12 13 pub type ConfigResult<T> = Result<T, ConfigError>; 14 15 pub struct Config { 16 pub database_url: String, 17 pub log_db_statements: bool, 18 pub storage_directory: String, 19 pub docker_socket_url: String, 20 pub registry_url: String, 21 pub auth_service: String, 22 pub accounts_rs_auth_endpoint: String, 23 pub accounts_rs_me_endpoint: String, 24 } 25 26 impl Config { 27 pub fn new() -> ConfigResult<Config> { 28 dotenvy::dotenv().ok(); 29 Ok(Self { 30 database_url: load_env_str("DATABASE_URL")?, 31 log_db_statements: load_env_bool("LOG_DB_STATEMENTS")?, 32 storage_directory: load_env_str("STORAGE_DIRECTORY")?, 33 docker_socket_url: load_env_str("DOCKER_SOCKET_URL")?, 34 registry_url: load_env_str("REGISTRY_URL")?, 35 auth_service: load_env_str("AUTH_SERVICE")?, 36 accounts_rs_auth_endpoint: load_env_str("ACCOUNTS_RS_AUTH_ENDPOINT")?, 37 accounts_rs_me_endpoint: load_env_str("ACCOUNTS_RS_ME_ENDPOINT")?, 38 }) 39 } 40 } 41 42 fn load_env_str(key: &str) -> ConfigResult<String> { 43 let key = key.to_string(); 44 let var = env::var(&key)?; 45 46 if var.is_empty() { 47 return Err(ConfigError::VarEmpty(key)); 48 } 49 50 Ok(var) 51 } 52 53 fn load_env_bool(key: &str) -> ConfigResult<bool> { 54 let var = load_env_str(key)?; 55 match var.as_str() { 56 "false" => Ok(false), 57 "true" => Ok(true), 58 _ => Err(ConfigError::InvalidBool(var)), 59 } 60 }