diff --git a/godotenv.go b/godotenv.go index d667e7f..69e8b44 100644 --- a/godotenv.go +++ b/godotenv.go @@ -1,5 +1,67 @@ package godotenv +import ( + "bufio" + "errors" + "os" + "strings" +) + func Load(filenames ...string) (err error) { + for _, filename := range filenames { + err = loadFile(filename) + if err != nil { + return // return early on a spazout + } + } + return +} + +func loadFile(filename string) (err error) { + file, err := os.Open(filename) + if err != nil { + return + } + + bufferSize := 20 + lines := make([]string, bufferSize) + lineReader := bufio.NewReaderSize(file, bufferSize) + for line, isPrefix, e := lineReader.ReadLine(); e == nil; line, isPrefix, e = lineReader.ReadLine() { + fullLine := string(line) + if isPrefix { + for { + line, isPrefix, _ = lineReader.ReadLine() + fullLine += string(line) + if !isPrefix { + break + } + } + } + // add a line to the game/parse + lines = append(lines, string(line)) + } + + for _, fullLine := range lines { + key, value, err := parseLine(fullLine) + + if err == nil { + os.Setenv(key, value) + } + } + + return +} + +func parseLine(line string) (key string, value string, err error) { + if len(line) == 0 { + err = errors.New("zero length string") + return + } + + splitString := strings.Split(line, "=") + + key = strings.Trim(splitString[0], " ") + value = strings.Trim(splitString[1], " ") + return } diff --git a/godotenv_test.go b/godotenv_test.go index d698b9a..72f2b28 100644 --- a/godotenv_test.go +++ b/godotenv_test.go @@ -5,6 +5,13 @@ import ( "testing" ) +func TestLoadFileNotFound(t *testing.T) { + err := Load("somefilethatwillneverexistever.env") + if err == nil { + t.Error("File wasn't found but Load didn't return an error") + } +} + func TestLoadPlainEnv(t *testing.T) { envFileName := "fixtures/plain.env" err := Load(envFileName)