(Feat): Initial Commit
This commit is contained in:
71
internal/config/dot_env.go
Normal file
71
internal/config/dot_env.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/subosito/gotenv"
|
||||
)
|
||||
|
||||
// os.SetEnv func signature
|
||||
type envSetter = func(key string, value string) error
|
||||
|
||||
// DotEnvTryLoad forcefully overrides ENV variables through **a maybe available** .env file.
|
||||
//
|
||||
// This function will always remain silent if a .env file does not exist!
|
||||
// If we successfully apply an ENV file, we will log a warning.
|
||||
// If there are any other errors, we will panic!
|
||||
//
|
||||
// This mechanism should only be used **locally** to easily inject (gitignored)
|
||||
// secrets into your ENV. Non-existing .env files are actually the **best case**.
|
||||
//
|
||||
// When running normally (not within tests):
|
||||
// DotEnvTryLoad("/path/tp/my.env.local", os.SetEnv)
|
||||
//
|
||||
// For tests (and autoreset) use t.Setenv:
|
||||
// DotEnvTryLoad("/path/to/my.env.test.local", func(k string, v string) error { t.Setenv(k, v); return nil })
|
||||
func DotEnvTryLoad(absolutePathToEnvFile string, setEnvFn envSetter) {
|
||||
err := DotEnvLoad(absolutePathToEnvFile, setEnvFn)
|
||||
|
||||
if err != nil {
|
||||
if !errors.Is(err, os.ErrNotExist) {
|
||||
log.Panic().Err(err).Str("envFile", absolutePathToEnvFile).Msg(".env parse error!")
|
||||
}
|
||||
} else {
|
||||
log.Warn().Str("envFile", absolutePathToEnvFile).Msg(".env overrides ENV variables!")
|
||||
}
|
||||
}
|
||||
|
||||
// DotEnvLoad forcefully overrides ENV variables through the supplied .env file.
|
||||
//
|
||||
// This mechanism should only be used **locally** to easily inject (gitignored)
|
||||
// secrets into your ENV.
|
||||
//
|
||||
// When running normally (not within tests):
|
||||
// DotEnvLoad("/path/to/my.env.local", os.SetEnv)
|
||||
//
|
||||
// For tests (and ENV var autoreset) use t.Setenv:
|
||||
// DotEnvLoad("/path/to/my.env.test.local", func(k string, v string) error { t.Setenv(k, v); return nil })
|
||||
func DotEnvLoad(absolutePathToEnvFile string, setEnvFn envSetter) error {
|
||||
file, err := os.Open(absolutePathToEnvFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open .env file: %w", err)
|
||||
}
|
||||
|
||||
defer file.Close()
|
||||
|
||||
envs, err := gotenv.StrictParse(file)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to parse .env file: %w", err)
|
||||
}
|
||||
|
||||
for key, value := range envs {
|
||||
if err := setEnvFn(key, value); err != nil {
|
||||
return fmt.Errorf("failed to set environment variable: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user