diff --git a/datatype.go b/datatype.go index 687d235..1bdba01 100644 --- a/datatype.go +++ b/datatype.go @@ -14,6 +14,7 @@ const ( TypeString DataType = iota TypeDirectory DataType = iota TypeBool DataType = iota + TypeHex DataType = iota ) type cValue struct { @@ -21,6 +22,7 @@ type cValue struct { intval int64 durval time.Duration boolval bool + binval []byte strval string err error } @@ -28,7 +30,10 @@ type cValue struct { func (dtype DataType) parse(key string, str string) (ret cValue) { info, ok := tInfo[dtype] if ok { - return info.parser(key, str) + ret = info.parser(key, str) + if len(ret.binval) == 0 { + ret.binval = make([]byte, 0, 0) + } } return } diff --git a/envconf.go b/envconf.go index c5ef0a4..f61993d 100644 --- a/envconf.go +++ b/envconf.go @@ -314,21 +314,28 @@ func (c *Config) getRawMap(key string, dtype DataType) (empty map[string]cValue) return } -// GetInt returns the value of an environment variable. +// Returns the value of an environment variable. // If the variable is not defined as envconf.TypeInt the function will return 0. func (c *Config) GetInt(key string) int64 { val := c.getRaw(key, TypeInt) return val.intval } -// GetMetric returns the value of an environment variable. +// Returns the value of an environment variable. +// If the variable is not defined as envconf.TypeHex the function will return []byte{}. +func (c *Config) GetHex(key string) []byte { + val := c.getRaw(key, TypeHex) + return val.binval +} + +// Returns the value of an environment variable. // If the variable is not defined as envconf.TypeMetric the function will return 0. func (c *Config) GetMetric(key string) int64 { val := c.getRaw(key, TypeMetric) return val.intval } -// GetDirectory returns the value of an environment variable. +// Returns the value of an environment variable. // If the variable is not defined as envconf.TypeDirectory the // function will return the empty string. func (c *Config) GetDirectory(key string) string { @@ -336,7 +343,7 @@ func (c *Config) GetDirectory(key string) string { return val.strval } -// GetString returns the value of an environment variable. +// Returns the value of an environment variable. // If the variable is not defined as envconf.TypeString the // function will return the empty string. func (c *Config) GetString(key string) string { @@ -344,7 +351,7 @@ func (c *Config) GetString(key string) string { return val.strval } -// GetDuration returns the value of an environment variable. +// Returns the value of an environment variable. // If the variable is not defined as envconf.TypeDuration the // function will return time.Duration(0). func (c *Config) GetDuration(key string) time.Duration { @@ -352,7 +359,7 @@ func (c *Config) GetDuration(key string) time.Duration { return val.durval } -// GetBool returns the value of an environment variable. +// Returns the value of an environment variable. // If the variable is not defined as envconf.TypeBool the // function will return false. func (c *Config) GetBool(key string) bool { @@ -392,6 +399,14 @@ func (c *Config) GetMapBool(key string) (retval map[string]bool) { return } +func (c *Config) GetMapHex(key string) (retval map[string][]byte) { + retval = make(map[string][]byte) + for k, v := range c.getRawMap(key, TypeHex) { + retval[k] = v.binval + } + return +} + func getFirstRune(str string) rune { for _, v := range str { return v diff --git a/parsers.go b/parsers.go index 5fcff78..e7f5cd8 100644 --- a/parsers.go +++ b/parsers.go @@ -1,6 +1,7 @@ package envconf import ( + "encoding/hex" "errors" "fmt" "os" @@ -65,6 +66,16 @@ func parseBool(key string, str string) (ret cValue) { return } +func parseHex(key string, str string) (ret cValue) { + val, err := hex.DecodeString(str) + if err == nil { + ret.binval = val + } else { + ret.err = errors.New(fmt.Sprintf(`Environment variable "%s" is not of type hex.`, key)) + } + return +} + func parseDirectory(_ string, str string) (ret cValue) { wd, err := os.Getwd() if err == nil { diff --git a/typeinfo.go b/typeinfo.go index c321654..29383dc 100644 --- a/typeinfo.go +++ b/typeinfo.go @@ -14,6 +14,7 @@ func init() { var durInfo dataTypeInfo var strInfo dataTypeInfo var dirInfo dataTypeInfo + var hexInfo dataTypeInfo var boolInfo dataTypeInfo intInfo.name = "int" @@ -21,6 +22,7 @@ func init() { durInfo.name = "duration" dirInfo.name = "directory" strInfo.name = "string" + hexInfo.name = "hex" boolInfo.name = "bool" intInfo.parser = parseInt @@ -28,6 +30,7 @@ func init() { durInfo.parser = parseDuration dirInfo.parser = parseDirectory strInfo.parser = parseString + hexInfo.parser = parseHex boolInfo.parser = parseBool tInfo[TypeInt] = intInfo @@ -35,5 +38,6 @@ func init() { tInfo[TypeDuration] = durInfo tInfo[TypeString] = strInfo tInfo[TypeDirectory] = dirInfo + tInfo[TypeHex] = hexInfo tInfo[TypeBool] = boolInfo }