opts/envfile.go
cd51ac92
 package opts
 
 import (
 	"bufio"
33dde1f7
 	"fmt"
cd51ac92
 	"os"
33dde1f7
 	"strings"
cd51ac92
 )
 
 /*
 Read in a line delimited file with environment variables enumerated
 */
 func ParseEnvFile(filename string) ([]string, error) {
 	fh, err := os.Open(filename)
 	if err != nil {
 		return []string{}, err
 	}
4e0014f5
 	defer fh.Close()
bfaa917a
 
33dde1f7
 	lines := []string{}
 	scanner := bufio.NewScanner(fh)
 	for scanner.Scan() {
 		line := scanner.Text()
 		// line is not empty, and not starting with '#'
ff4ac744
 		if len(line) > 0 && !strings.HasPrefix(line, "#") {
 			if strings.Contains(line, "=") {
 				data := strings.SplitN(line, "=", 2)
500c8ba4
 
 				// trim the front of a variable, but nothing else
 				variable := strings.TrimLeft(data[0], whiteSpaces)
 				if strings.ContainsAny(variable, whiteSpaces) {
 					return []string{}, ErrBadEnvVariable{fmt.Sprintf("variable '%s' has white spaces", variable)}
 				}
 
 				// pass the value through, no trimming
 				lines = append(lines, fmt.Sprintf("%s=%s", variable, data[1]))
ff4ac744
 			} else {
500c8ba4
 				// if only a pass-through variable is given, clean it up.
 				lines = append(lines, fmt.Sprintf("%s=%s", strings.TrimSpace(line), os.Getenv(line)))
33dde1f7
 			}
cd51ac92
 		}
 	}
 	return lines, nil
 }
500c8ba4
 
 var whiteSpaces = " \t"
 
 type ErrBadEnvVariable struct {
 	msg string
 }
 
 func (e ErrBadEnvVariable) Error() string {
 	return fmt.Sprintf("poorly formatted environment: %s", e.msg)
 }