@@ -8,15 +8,17 @@ import (
88
99 "github.com/knadh/koanf/parsers/dotenv"
1010 "github.com/knadh/koanf/parsers/yaml"
11- "github.com/knadh/koanf/providers/env"
11+ "github.com/knadh/koanf/providers/env/v2 "
1212 "github.com/knadh/koanf/providers/file"
1313 "github.com/knadh/koanf/providers/s3"
1414 "github.com/knadh/koanf/v2"
1515)
1616
17+ var errMissingAWSCreds = errors .New ("AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION must be set" )
18+
1719// Load reads configuration from various sources and unmarshals it into a given struct.
1820//
19- // It looks for configuration in the following order:
21+ // It looks for configuration in the following order (later overrides earlier) :
2022// 1. S3, if `withS3` is provided.
2123// 2. Local file, if `withYaml` is provided.
2224// 3. `.env` file in the current working directory.
@@ -28,7 +30,7 @@ import (
2830//
2931// The final configuration will be unmarshaled into the given struct. If unmarshaling fails, an error will be returned.
3032func Load [T any ](c * T , opts ... Option ) error {
31- options := & options {}
33+ options := new ( options )
3234 options .apply (opts ... )
3335
3436 k := koanf .New ("." )
@@ -40,7 +42,7 @@ func Load[T any](c *T, opts ...Option) error {
4042 endpoint := os .Getenv ("AWS_ENDPOINT" )
4143
4244 if accessKey == "" || secretKey == "" || region == "" {
43- return errors . New ( "AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION must be set" )
45+ return errMissingAWSCreds
4446 }
4547
4648 s3Config := s3.Config {
@@ -70,7 +72,13 @@ func Load[T any](c *T, opts ...Option) error {
7072 return fmt .Errorf ("load dotenv: %w" , err )
7173 }
7274
73- if err := k .Load (env .Provider ("" , "__" , strings .ToLower ), nil ); err != nil {
75+ if err := k .Load (env .Provider ("__" , env.Opt {
76+ Prefix : "" ,
77+ TransformFunc : func (k , v string ) (string , any ) {
78+ return strings .ToLower (k ), v
79+ },
80+ EnvironFunc : nil ,
81+ }), nil ); err != nil {
7482 return fmt .Errorf ("load env: %w" , err )
7583 }
7684
0 commit comments