diff --git a/config/src/config.rs b/config/src/config.rs index 500c11f40..2a22e2749 100644 --- a/config/src/config.rs +++ b/config/src/config.rs @@ -90,9 +90,10 @@ impl Config { config_content = Self::substitute_env_vars(config_content)?; figment_config = figment_config.merge(Toml::string(&config_content)); } + let config: ConfigWrapper = figment_config - .merge(Env::prefixed(prefix.get_prefix()).split("__")) - .merge(Env::prefixed(SHARED_PREFIX).split("__")) + .merge(Self::from_env_ignore_empty(prefix.get_prefix())) + .merge(Self::from_env_ignore_empty(SHARED_PREFIX)) .extract() .map_err(|e| e.to_string())?; @@ -100,6 +101,25 @@ impl Config { Ok(config.0) } + fn from_env_ignore_empty(prefix: &str) -> Env { + let prefixed_env = Env::prefixed(prefix).split("__"); + let ignore_prefixed: Vec<_> = prefixed_env + .iter() + .filter_map(|(key, value)| { + if value.is_empty() { + Some(key.into_string()) + } else { + None + } + }) + .collect(); + let ref_ignore = ignore_prefixed + .iter() + .map(|k| k.as_str()) + .collect::>(); + prefixed_env.ignore(&ref_ignore) + } + fn substitute_env_vars(content: String) -> Result { let reg = Regex::new(r"\$\{([A-Z_][A-Z0-9_]*)\}").map_err(|e| e.to_string())?; let mut missing_vars = Vec::new(); @@ -399,13 +419,14 @@ pub struct RavRequestConfig { #[cfg(test)] mod tests { + use figment::value::Uncased; use sealed_test::prelude::*; use std::{env, fs, path::PathBuf}; use tracing_test::traced_test; use crate::{Config, ConfigPrefix}; - use super::DatabaseConfig; + use super::{DatabaseConfig, SHARED_PREFIX}; #[test] fn test_minimal_config() { @@ -520,6 +541,23 @@ mod tests { ); } + #[test] + fn test_ignore_empty_values() { + env::set_var("INDEXER_TEST1", "123"); + env::set_var("INDEXER_TEST2", ""); + env::set_var("INDEXER_TEST3__TEST1", "123"); + env::set_var("INDEXER_TEST3__TEST2", ""); + + let env = Config::from_env_ignore_empty(SHARED_PREFIX); + + let values: Vec<_> = env.iter().collect(); + + assert_eq!(values.len(), 2); + + assert_eq!(values[0], (Uncased::new("test1"), "123".to_string())); + assert_eq!(values[1], (Uncased::new("test3.test1"), "123".to_string())); + } + // Test to check substitute_env_vars function is substituting env variables // indexers can use ${ENV_VAR_NAME} to point to the required env variable #[test]