123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- package config
- import (
- "fmt"
- "os"
- "reflect"
- "time"
- )
- type Configer interface {
- Set(key, val string) error
- String(key string) string
- Strings(key string) []string
- Int(key string) (int, error)
- Int64(key string) (int64, error)
- Bool(key string) (bool, error)
- Float(key string) (float64, error)
- DefaultString(key string, defaultVal string) string
- DefaultStrings(key string, defaultVal []string) []string
- DefaultInt(key string, defaultVal int) int
- DefaultInt64(key string, defaultVal int64) int64
- DefaultBool(key string, defaultVal bool) bool
- DefaultFloat(key string, defaultVal float64) float64
- DIY(key string) (interface{}, error)
- GetSection(section string) (map[string]string, error)
- SaveConfigFile(filename string) error
- }
- type Config interface {
- Parse(key string) (Configer, error)
- ParseData(data []byte) (Configer, error)
- }
- var adapters = make(map[string]Config)
- func Register(name string, adapter Config) {
- if adapter == nil {
- panic("config: Register adapter is nil")
- }
- if _, ok := adapters[name]; ok {
- panic("config: Register called twice for adapter " + name)
- }
- adapters[name] = adapter
- }
- func NewConfig(adapterName, filename string) (Configer, error) {
- adapter, ok := adapters[adapterName]
- if !ok {
- return nil, fmt.Errorf("config: unknown adaptername %q (forgotten import?)", adapterName)
- }
- return adapter.Parse(filename)
- }
- func NewConfigData(adapterName string, data []byte) (Configer, error) {
- adapter, ok := adapters[adapterName]
- if !ok {
- return nil, fmt.Errorf("config: unknown adaptername %q (forgotten import?)", adapterName)
- }
- return adapter.ParseData(data)
- }
- func ExpandValueEnvForMap(m map[string]interface{}) map[string]interface{} {
- for k, v := range m {
- switch value := v.(type) {
- case string:
- m[k] = ExpandValueEnv(value)
- case map[string]interface{}:
- m[k] = ExpandValueEnvForMap(value)
- case map[string]string:
- for k2, v2 := range value {
- value[k2] = ExpandValueEnv(v2)
- }
- m[k] = value
- }
- }
- return m
- }
- func ExpandValueEnv(value string) (realValue string) {
- realValue = value
- vLen := len(value)
-
- if vLen < 3 {
- return
- }
-
- if value[0] != '$' || value[1] != '{' || value[vLen-1] != '}' {
- return
- }
- key := ""
- defaultV := ""
-
- for i := 2; i < vLen; i++ {
- if value[i] == '|' && (i+1 < vLen && value[i+1] == '|') {
- key = value[2:i]
- defaultV = value[i+2 : vLen-1]
- break
- } else if value[i] == '}' {
- key = value[2:i]
- break
- }
- }
- realValue = os.Getenv(key)
- if realValue == "" {
- realValue = defaultV
- }
- return
- }
- func ParseBool(val interface{}) (value bool, err error) {
- if val != nil {
- switch v := val.(type) {
- case bool:
- return v, nil
- case string:
- switch v {
- case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "Y", "y", "ON", "on", "On":
- return true, nil
- case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "N", "n", "OFF", "off", "Off":
- return false, nil
- }
- case int8, int32, int64:
- strV := fmt.Sprintf("%d", v)
- if strV == "1" {
- return true, nil
- } else if strV == "0" {
- return false, nil
- }
- case float64:
- if v == 1.0 {
- return true, nil
- } else if v == 0.0 {
- return false, nil
- }
- }
- return false, fmt.Errorf("parsing %q: invalid syntax", val)
- }
- return false, fmt.Errorf("parsing <nil>: invalid syntax")
- }
- func ToString(x interface{}) string {
- switch y := x.(type) {
-
-
-
-
- case time.Time:
- return y.Format("A Monday")
-
- case string:
- return y
-
- case fmt.Stringer:
- return y.String()
-
- case error:
- return y.Error()
- }
-
- if v := reflect.ValueOf(x); v.Kind() == reflect.String {
- return v.String()
- }
-
- return fmt.Sprint(x)
- }
|