2021-03-23 11:57:09 +00:00
|
|
|
package envconf
|
2021-03-23 13:37:00 +00:00
|
|
|
import ("fmt"
|
|
|
|
"errors"
|
|
|
|
"time"
|
|
|
|
"strconv")
|
|
|
|
|
2021-03-23 11:57:09 +00:00
|
|
|
type DataType int
|
|
|
|
const (
|
|
|
|
TypeNone DataType = iota
|
|
|
|
TypeInt DataType = iota
|
|
|
|
TypeDuration DataType = iota
|
|
|
|
TypeString DataType = iota
|
|
|
|
TypeBool DataType = iota
|
|
|
|
)
|
|
|
|
|
|
|
|
func (dtype DataType) String()(string) {
|
|
|
|
types := make(map[DataType]string)
|
|
|
|
types[TypeNone] = "none"
|
|
|
|
types[TypeInt] = "int"
|
|
|
|
types[TypeDuration] = "duration"
|
|
|
|
types[TypeString] = "string"
|
|
|
|
types[TypeBool] = "bool"
|
|
|
|
str, ok := types[dtype]
|
|
|
|
if ok {
|
|
|
|
return str
|
|
|
|
}
|
|
|
|
return "invalid"
|
|
|
|
}
|
2021-03-23 13:37:00 +00:00
|
|
|
|
|
|
|
type cValue struct {
|
|
|
|
intval int64
|
|
|
|
durval time.Duration
|
|
|
|
boolval bool
|
|
|
|
strval string
|
|
|
|
err error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (dtype DataType) parse(key string, str string)(ret cValue) {
|
|
|
|
parsers := make(map[DataType](func(string,string)(cValue)))
|
|
|
|
parsers[TypeInt] = parseInt
|
|
|
|
parsers[TypeDuration] = parseDuration
|
|
|
|
parsers[TypeString] = parseString
|
|
|
|
parsers[TypeBool] = parseBool
|
|
|
|
parser, ok := parsers[dtype]
|
|
|
|
if ok {
|
|
|
|
return parser(key, str)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
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 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 parseString(_ string, str string)(ret cValue) {
|
|
|
|
ret.strval = str
|
|
|
|
return
|
|
|
|
}
|