113 lines
1.8 KiB
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
|
|
}
|