/ backend / src / config.rs
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  }