@@ -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) ]
393413mod 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