@@ -89,16 +89,36 @@ impl Config {
89
89
config_content = Self :: substitute_env_vars ( config_content) ?;
90
90
figment_config = figment_config. merge ( Toml :: string ( & config_content) ) ;
91
91
}
92
+
92
93
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 ) )
95
96
. extract ( )
96
97
. map_err ( |e| e. to_string ( ) ) ?;
97
98
98
99
config. 0 . validate ( ) ?;
99
100
Ok ( config. 0 )
100
101
}
101
102
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
+
102
122
fn substitute_env_vars ( content : String ) -> Result < String , String > {
103
123
let reg = Regex :: new ( r"\$\{([A-Z_][A-Z0-9_]*)\}" ) . map_err ( |e| e. to_string ( ) ) ?;
104
124
let mut missing_vars = Vec :: new ( ) ;
@@ -391,13 +411,14 @@ pub struct RavRequestConfig {
391
411
392
412
#[ cfg( test) ]
393
413
mod tests {
414
+ use figment:: value:: Uncased ;
394
415
use sealed_test:: prelude:: * ;
395
416
use std:: { env, fs, path:: PathBuf } ;
396
417
use tracing_test:: traced_test;
397
418
398
419
use crate :: { Config , ConfigPrefix } ;
399
420
400
- use super :: DatabaseConfig ;
421
+ use super :: { DatabaseConfig , SHARED_PREFIX } ;
401
422
402
423
#[ test]
403
424
fn test_minimal_config ( ) {
@@ -512,6 +533,23 @@ mod tests {
512
533
) ;
513
534
}
514
535
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
+
515
553
// Test to check substitute_env_vars function is substituting env variables
516
554
// indexers can use ${ENV_VAR_NAME} to point to the required env variable
517
555
#[ test]
0 commit comments