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