@@ -14,9 +14,16 @@ import (
1414// }
1515//
1616// if your envPrefix is XXX, it can be set in env like XXX_DSN
17- func BindEnvs (v * viper.Viper , envPrefix string , iface any ) { bindEnvs (v , envPrefix , "" , iface ) }
17+ func BindEnvs (v * viper.Viper , envPrefix string , iface any ) {
18+ walkStruct (iface , "" , func (fieldv reflect.Value , path , envKey string ) error {
19+ if err := v .BindEnv (path , envPrefix + envKey ); err != nil {
20+ panic (err )
21+ }
22+ return nil
23+ })
24+ }
1825
19- func bindEnvs ( v * viper. Viper , envPrefix string , prefix string , iface any ) {
26+ func walkStruct ( iface any , prefix string , fn func ( fieldv reflect. Value , path , envKey string ) error ) error {
2027 ifv := reflect .Indirect (reflect .ValueOf (iface ))
2128 ift := ifv .Type ()
2229
@@ -34,14 +41,17 @@ func bindEnvs(v *viper.Viper, envPrefix string, prefix string, iface any) {
3441 path = prefix + "." + name
3542 }
3643
37- switch fieldv .Kind () {
38- case reflect .Struct :
39- bindEnvs (v , envPrefix , path , fieldv .Addr ().Interface ())
40- default :
41- envKey := strings .ToUpper (strings .ReplaceAll (path , "." , "_" ))
42- if err := v .BindEnv (path , envPrefix + envKey ); err != nil {
43- panic (err )
44+ envKey := strings .ToUpper (strings .ReplaceAll (path , "." , "_" ))
45+
46+ if fieldv .Kind () == reflect .Struct {
47+ if err := walkStruct (fieldv .Addr ().Interface (), path , fn ); err != nil {
48+ return err
49+ }
50+ } else {
51+ if err := fn (fieldv , path , envKey ); err != nil {
52+ return err
4453 }
4554 }
4655 }
56+ return nil
4757}
0 commit comments