package envconf import ("strconv" "strings" "fmt" "errors" "os" "path" "time") func parseInt(key string, str string)(ret cValue) { val, err := strconv.ParseInt(str, 10, 64) if err == nil { ret.intval = val } else { ret.err = errors.New(fmt.Sprintf(`Environment variable "%s" is not of type int.`, key)) } return } func parseMetric(key string, str string)(ret cValue) { mod := int64(1) str = strings.ToUpper(str) if strings.HasSuffix(str, "K") { mod = 1024 str = strings.TrimSuffix(str, "K") } else if strings.HasSuffix(str, "M") { mod = 1024 * 1024 str = strings.TrimSuffix(str, "M") } else if strings.HasSuffix(str, "G") { mod = 1024 * 1024 * 1024 str = strings.TrimSuffix(str, "G") } else if strings.HasSuffix(str, "T") { mod = 1024 * 1024 * 1024 * 1024 str = strings.TrimSuffix(str, "T") } val, err := strconv.ParseInt(str, 10, 64) if err == nil { ret.intval = mod * val } else { ret.err = errors.New(fmt.Sprintf(`Environment variable "%s" is not of type int.`, key)) } return } func parseDuration(key string, str string)(ret cValue) { val, err := time.ParseDuration(str) if err == nil { ret.durval = val } else { ret.err = errors.New(fmt.Sprintf(`Environment variable "%s" is not of type duration.`, key)) } return } func parseBool(key string, str string)(ret cValue) { val, err := strconv.ParseBool(str) if err == nil { ret.boolval = val } else { ret.err = errors.New(fmt.Sprintf(`Environment variable "%s" is not of type bool.`, key)) } return } func parseDirectory(_ string, str string)(ret cValue) { wd, err := os.Getwd() if err == nil { if path.IsAbs(str) { ret.strval = path.Clean(str) } else { ret.strval = path.Join(wd, str) } } else { ret.strval = path.Clean(str) } return } func parseString(_ string, str string)(ret cValue) { ret.strval = str return }