add godotenv.Read() which returns a map rather than calling os.Setenv

This commit is contained in:
John Barton (joho)
2013-09-04 12:40:17 +10:00
parent 38f18b8248
commit 6e333bd708
3 changed files with 82 additions and 5 deletions

View File

@ -34,9 +34,7 @@ import (
It's important to note that it WILL NOT OVERRIDE an env variable that already exists - consider the .env file to set dev vars or sensible defaults
*/
func Load(filenames ...string) (err error) {
if len(filenames) == 0 {
filenames = []string{".env"}
}
filenames = filenamesOrDefault(filenames)
for _, filename := range filenames {
err = loadFile(filename)
@ -47,12 +45,55 @@ func Load(filenames ...string) (err error) {
return
}
func Read(filenames ...string) (envMap map[string]string, err error) {
filenames = filenamesOrDefault(filenames)
envMap = make(map[string]string)
for _, filename := range filenames {
individualEnvMap, individualErr := readFile(filename)
if individualErr != nil {
err = individualErr
return // return early on a spazout
}
for key, value := range individualEnvMap {
envMap[key] = value
}
}
return
}
func filenamesOrDefault(filenames []string) []string {
if len(filenames) == 0 {
return []string{".env"}
} else {
return filenames
}
}
func loadFile(filename string) (err error) {
envMap, err := readFile(filename)
if err != nil {
return
}
for key, value := range envMap {
os.Setenv(key, value)
}
return
}
func readFile(filename string) (envMap map[string]string, err error) {
content, err := ioutil.ReadFile(filename)
if err != nil {
return
}
envMap = make(map[string]string)
lines := strings.Split(string(content), "\n")
for _, fullLine := range lines {
@ -60,11 +101,10 @@ func loadFile(filename string) (err error) {
key, value, err := parseLine(fullLine)
if err == nil && os.Getenv(key) == "" {
os.Setenv(key, value)
envMap[key] = value
}
}
}
return
}