Skip to content

Commit 51bcdb7

Browse files
committed
fix: ignore empty environment variables strings
Signed-off-by: Gustavo Inacio <[email protected]>
1 parent 775f2f6 commit 51bcdb7

File tree

1 file changed

+41
-3
lines changed

1 file changed

+41
-3
lines changed

config/src/config.rs

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,36 @@ impl Config {
9090
config_content = Self::substitute_env_vars(config_content)?;
9191
figment_config = figment_config.merge(Toml::string(&config_content));
9292
}
93+
9394
let config: ConfigWrapper = figment_config
94-
.merge(Env::prefixed(prefix.get_prefix()).split("__"))
95-
.merge(Env::prefixed(SHARED_PREFIX).split("__"))
95+
.merge(Self::from_env_ignore_empty(prefix.get_prefix()))
96+
.merge(Self::from_env_ignore_empty(SHARED_PREFIX))
9697
.extract()
9798
.map_err(|e| e.to_string())?;
9899

99100
config.0.validate()?;
100101
Ok(config.0)
101102
}
102103

104+
fn from_env_ignore_empty(prefix: &str) -> Env {
105+
let prefixed_env = Env::prefixed(prefix).split("__");
106+
let ignore_prefixed: Vec<_> = prefixed_env
107+
.iter()
108+
.filter_map(|(key, value)| {
109+
if value.is_empty() {
110+
Some(key.into_string())
111+
} else {
112+
None
113+
}
114+
})
115+
.collect();
116+
let ref_ignore = ignore_prefixed
117+
.iter()
118+
.map(|k| k.as_str())
119+
.collect::<Vec<_>>();
120+
prefixed_env.ignore(&ref_ignore)
121+
}
122+
103123
fn substitute_env_vars(content: String) -> Result<String, String> {
104124
let reg = Regex::new(r"\$\{([A-Z_][A-Z0-9_]*)\}").map_err(|e| e.to_string())?;
105125
let mut missing_vars = Vec::new();
@@ -399,13 +419,14 @@ pub struct RavRequestConfig {
399419

400420
#[cfg(test)]
401421
mod tests {
422+
use figment::value::Uncased;
402423
use sealed_test::prelude::*;
403424
use std::{env, fs, path::PathBuf};
404425
use tracing_test::traced_test;
405426

406427
use crate::{Config, ConfigPrefix};
407428

408-
use super::DatabaseConfig;
429+
use super::{DatabaseConfig, SHARED_PREFIX};
409430

410431
#[test]
411432
fn test_minimal_config() {
@@ -520,6 +541,23 @@ mod tests {
520541
);
521542
}
522543

544+
#[test]
545+
fn test_ignore_empty_values() {
546+
env::set_var("INDEXER_TEST1", "123");
547+
env::set_var("INDEXER_TEST2", "");
548+
env::set_var("INDEXER_TEST3__TEST1", "123");
549+
env::set_var("INDEXER_TEST3__TEST2", "");
550+
551+
let env = Config::from_env_ignore_empty(SHARED_PREFIX);
552+
553+
let values: Vec<_> = env.iter().collect();
554+
555+
assert_eq!(values.len(), 2);
556+
557+
assert_eq!(values[0], (Uncased::new("test1"), "123".to_string()));
558+
assert_eq!(values[1], (Uncased::new("test3.test1"), "123".to_string()));
559+
}
560+
523561
// Test to check substitute_env_vars function is substituting env variables
524562
// indexers can use ${ENV_VAR_NAME} to point to the required env variable
525563
#[test]

0 commit comments

Comments
 (0)