gosimpleconf/gosimpleconf.go

113 lines
1.8 KiB
Go

package gosimpleconf
import (
"bufio"
"flag"
"fmt"
"io"
"log"
"os"
"strconv"
"strings"
)
type ConfigMap map[string]string
type FlagMap map[string]*string
func Load(filename string) (ConfigMap, error) {
var err error
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
parsedMap, err := parseFile(file)
if err != nil {
return nil, err
}
return parsedMap, nil
}
func SetupFlagOverrides(configMap ConfigMap) FlagMap {
flagMap := make(FlagMap)
for k, v := range configMap {
f := flag.String(k, v, "")
flagMap[k] = f
}
return flagMap
}
func ParseFlags(configMap ConfigMap, flagMap FlagMap) ConfigMap {
flag.Parse()
for k, v := range flagMap {
if v != nil && len(*v) > 0 {
configMap[k] = trimToken(*v)
}
}
return configMap
}
func Bool(value string) bool {
v, err := strconv.ParseBool(value)
if err != nil {
log.Printf("error parsing bool %v - %v\n", v, err)
v = false
}
return v
}
func parseFile(config io.Reader) (ConfigMap, error) {
var err error
parsedMap := make(ConfigMap)
scanner := bufio.NewScanner(config)
for scanner.Scan() {
line := scanner.Text()
trimmed := strings.TrimSpace(line)
if len(trimmed) == 0 {
// ignore empty lines
continue
}
if trimmed[0] == '#' {
// ignore comments
continue
}
split := strings.Split(trimmed, "=")
if len(split) != 2 {
return nil, fmt.Errorf("failed to parse config line: %v", trimmed)
}
key := trimToken(split[0])
value := trimToken(split[1])
parsedMap[key] = value
}
if err = scanner.Err(); err != nil {
return nil, err
}
return parsedMap, nil
}
func trimToken(value string) string {
// Trim off whitespace
v := strings.TrimSpace(value)
// Trim off any surrounding quotes, everything is a string anyway
v = strings.TrimPrefix(v, "\"")
v = strings.TrimSuffix(v, "\"")
return v
}