@@ -22,6 +22,7 @@ type ENV_ struct {
2222 CONFIG_PATH string
2323 DEFAULTS_PATH string
2424 TOKENS_DIR string
25+ LOG_LEVEL string
2526 PORT string
2627 API_URL string
2728 API_TOKENS []string
@@ -49,6 +50,8 @@ var config *koanf.Koanf
4950
5051func InitEnv () {
5152 ENV .PORT = strconv .Itoa (config .Int ("server.port" ))
53+
54+ ENV .LOG_LEVEL = config .String ("loglevel" )
5255
5356 ENV .API_URL = config .String ("api.url" )
5457
@@ -77,10 +80,12 @@ func InitEnv() {
7780 }
7881
7982 config .Unmarshal ("messagealiases" , & ENV .MESSAGE_ALIASES )
80- config .Unmarshal ("variables" , & ENV .VARIABLES )
8183
82- ENV .VARIABLES ["NUMBER" ] = config .String ("number" )
83- ENV .VARIABLES ["RECIPIENTS" ] = config .Strings ("recipients" )
84+ transformChildren (config , "variables" , func (key string , value any ) (string , any ) {
85+ return strings .ToUpper (key ), value
86+ })
87+
88+ config .Unmarshal ("variables" , & ENV .VARIABLES )
8489
8590 ENV .BLOCKED_ENDPOINTS = config .Strings ("blockedendpoints" )
8691}
@@ -114,6 +119,8 @@ func Load() {
114119
115120 normalizeKeys (config )
116121
122+ templateConfig (config )
123+
117124 InitEnv ()
118125
119126 log .Info ("Finished Loading Configuration" )
@@ -141,6 +148,20 @@ func LoadFile(path string, config *koanf.Koanf, parser koanf.Parser) (koanf.Prov
141148 return f , err
142149}
143150
151+ func templateConfig (config * koanf.Koanf ) {
152+ data := config .All ()
153+
154+ for key , value := range data {
155+ str , isStr := value .(string )
156+
157+ if isStr {
158+ data [key ] = os .ExpandEnv (str )
159+ }
160+ }
161+
162+ config .Load (confmap .Provider (data , "." ), nil )
163+ }
164+
144165func LoadEnv (config * koanf.Koanf ) (koanf.Provider , error ) {
145166 e := env .Provider ("." , env.Opt {
146167 TransformFunc : normalizeEnv ,
@@ -175,8 +196,36 @@ func normalizeKeys(config *koanf.Koanf) {
175196 config .Load (confmap .Provider (data , "." ), nil )
176197}
177198
199+ func transformChildren (config * koanf.Koanf , prefix string , transform func (key string , value any ) (string , any )) error {
200+ var sub map [string ]any
201+ if err := config .Unmarshal (prefix , & sub ); err != nil {
202+ return err
203+ }
204+
205+ transformed := make (map [string ]any )
206+ for key , val := range sub {
207+ newKey , newVal := transform (key , val )
208+
209+ transformed [newKey ] = newVal
210+ }
211+
212+ // Remove the old subtree by overwriting with empty map
213+ config .Load (confmap .Provider (map [string ]any {
214+ prefix : map [string ]any {},
215+ }, "." ), nil )
216+
217+ // Load the normalized subtree back in
218+ config .Load (confmap .Provider (map [string ]any {
219+ prefix : transformed ,
220+ }, "." ), nil )
221+
222+ return nil
223+ }
224+
178225func normalizeEnv (key string , value string ) (string , any ) {
179- key = strings .ToLower (strings .ReplaceAll (key , "__" , "." ))
226+ key = strings .ToLower (key )
227+ key = strings .ReplaceAll (key , "__" , "." )
228+ key = strings .ReplaceAll (key , "_" , "" )
180229
181230 return key , safestrings .ToType (value )
182231}
0 commit comments