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 }