72 lines
2.2 KiB
Go
72 lines
2.2 KiB
Go
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
|
|
}
|