Skip to content

Commit 1bc3c4e

Browse files
authored
fix: ignore empty environment variables strings (#473)
1 parent 42511b3 commit 1bc3c4e

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
@@ -89,16 +89,36 @@ impl Config {
8989
config_content = Self::substitute_env_vars(config_content)?;
9090
figment_config = figment_config.merge(Toml::string(&config_content));
9191
}
92+
9293
let config: ConfigWrapper = figment_config
93-
.merge(Env::prefixed(prefix.get_prefix()).split("__"))
94-
.merge(Env::prefixed(SHARED_PREFIX).split("__"))
94+
.merge(Self::from_env_ignore_empty(prefix.get_prefix()))
95+
.merge(Self::from_env_ignore_empty(SHARED_PREFIX))
9596
.extract()
9697
.map_err(|e| e.to_string())?;
9798

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

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

392412
#[cfg(test)]
393413
mod tests {
414+
use figment::value::Uncased;
394415
use sealed_test::prelude::*;
395416
use std::{env, fs, path::PathBuf};
396417
use tracing_test::traced_test;
397418

398419
use crate::{Config, ConfigPrefix};
399420

400-
use super::DatabaseConfig;
421+
use super::{DatabaseConfig, SHARED_PREFIX};
401422

402423
#[test]
403424
fn test_minimal_config() {
@@ -512,6 +533,23 @@ mod tests {
512533
);
513534
}
514535

536+
#[test]
537+
fn test_ignore_empty_values() {
538+
env::set_var("INDEXER_TEST1", "123");
539+
env::set_var("INDEXER_TEST2", "");
540+
env::set_var("INDEXER_TEST3__TEST1", "123");
541+
env::set_var("INDEXER_TEST3__TEST2", "");
542+
543+
let env = Config::from_env_ignore_empty(SHARED_PREFIX);
544+
545+
let values: Vec<_> = env.iter().collect();
546+
547+
assert_eq!(values.len(), 2);
548+
549+
assert_eq!(values[0], (Uncased::new("test1"), "123".to_string()));
550+
assert_eq!(values[1], (Uncased::new("test3.test1"), "123".to_string()));
551+
}
552+
515553
// Test to check substitute_env_vars function is substituting env variables
516554
// indexers can use ${ENV_VAR_NAME} to point to the required env variable
517555
#[test]

0 commit comments

Comments
 (0)