5.3. Eudore Config
Config
实现config主要目标为了集成配置库,然后实现框架一体化,完美将配置融合到框架中,Config作为eudore.App的一部分然后全局传递。
Config主要方法未Get/Set来读写数据,和ParseFuncs和Parse来解析数据。
type (
ConfigParseFunc func(Config) error
ConfigParseOption func([]ConfigParseFunc) []ConfigParseFunc
// Config 定义配置管理,使用配置读写和解析功能。
Config interface {
Get(string) interface{}
Set(string, interface{}) error
ParseOption(ConfigParseOption)
Parse() error
}
)
ConfigMap
configmap使用map[string]interface{}作为配置存储。example
ConfigEuodre
configeudore使用自定义结构体来存储配置,如果Get/Set的key路径中含有'.'就会使用eudore.Get/eudore.Set方法来按路径一层层的选择对象属性。example
ConfigParse
type ConfigParseFunc func(Config) error
定义了配置解析函数,通过加载配置解析函数来解析配置,在Config接口中,ParseFuncs方法来修改Config的解析函数,最后调用Parse来解析全部配置。
例如ParseFuncs追加解析函数,ParseFuncs参数是当前的解析函数,返回新的解析函数,最后安顺序执行解析行为。
var c, _ := NewConfig("", nil)
// 追加一个解析函数
c.ParseFuncs(func(fn []ConfigParseFunc) []ConfigParseFunc{
return append(fn, func(c Config) error {
// 解析配置
return nil
})
})
c.Parse()
目前Config默认内置了六个解析函数,后续按顺序介绍。
ConfigParseRead
使用keys.config
读取到配置信息,然后多种方式读取到并存储给keys.configdata
,然后后续解析。
func ConfigParseRead(c Config) error {
path := GetString(c.Get("keys.config"))
if path == "" {
return nil //fmt.Errorf("config data is null")
}
// read protocol
// get read func
s := strings.SplitN(path, "://", 2)
fn := ConfigLoadConfigReadFunc(s[0])
if fn == nil {
// use default read func
fmt.Println("undefined read config: " + path + ", use default file:// .")
fn = ConfigLoadConfigReadFunc("default")
}
data, err := fn(path)
c.Set("keys.configdata", data)
return err
}
ConfigParseConfig
解析读取到的配置信息。
// ConfigParseConfig 函数获得'keys.configdata'的内容解析配置。
func ConfigParseConfig(c Config) error {
data := c.Get("keys.configdata")
if data == nil {
return nil
}
switch c.Get("keys.configtype") {
case "json":
return json.Unmarshal(data.([]byte), c)
case "xml":
return xml.Unmarshal(data.([]byte), c)
}
return nil
}
ConfigParseArgs
ConfigParseArgs函数解析命令行参数,必要是"--"开头,例如--keys.help=1
,对应的执行函数就是c.Set("keys.help", "1")
,来设置配置数据。
func ConfigParseArgs(c Config) (err error) {
for _, str := range os.Args[1:] {
if !strings.HasPrefix(str, "--") {
continue
}
c.Set(split2byte(str[2:], '='))
}
return
}
ConfigParseEnvs
ConfigParseEnvs解析环境变量配置,配置必须要"ENV_"开头,例如ENV_KEYS_HELP=1
,前缀ENV_删除,后续配置路径转换成小写,'-'替换成'.',对于命令行是--keys.help=1
,对应的执行函数就是c.Set("keys.help", "1")
。
func ConfigParseEnvs(c Config) error {
for _, value := range os.Environ() {
if strings.HasPrefix(value, "ENV_") {
k, v := split2byte(value, '=')
k = strings.ToLower(strings.Replace(k, "_", ".", -1))[4:]
c.Set(k, v)
}
}
return nil
}
ConfigParseMods
ConfigParseMods用于差异化配置,先获取enable的字符串数组的数组,表示启用那些模式,处理[]interface{}用于兼容。
然后读取对于的mods.xxx的数据,使用ConvertTo函数来加载对应的配置数据。
func ConfigParseMods(c Config) error {
mod, ok := c.Get("enable").([]string)
if !ok {
modi, ok := c.Get("enable").([]interface{})
if ok {
mod = make([]string, len(modi))
for i, s := range modi {
mod[i] = fmt.Sprint(s)
}
}else {
return nil
}
}
for _, i := range mod {
ConvertTo(c.Get("mods." + i), c.Get(""))
}
return nil
}
ConfigParseHelp
ConfigParseHelp的作用是输出当前配置信息,当前实现是检查keys.help
key是否存在,存在则使用json输出到标准输出。
func ConfigParseHelp(c Config) error {
ok := c.Get("keys.help") != nil
if ok {
JSON(c)
}
return nil
}
GetWarp
GetWarp提供封装func(string) interface{}
类型函数实现,转换一个interface{}类型为指定类型,可以通过App或Config或func创建GetWarp对象,然后获取数据并转换类型。
type GetWarp
func NewGetWarp(fn func(string) interface{}) GetWarp
func NewGetWarpWithApp(app *App) GetWarp
func NewGetWarpWithConfig(c Config) GetWarp
func NewGetWarpWithObject(obj interface{}) GetWarp
func (fn GetWarp) GetBool(key string, vals ...bool) bool
func (fn GetWarp) GetBytes(key string) []byte
func (fn GetWarp) GetFloat32(key string, vals ...float32) float32
func (fn GetWarp) GetFloat64(key string, vals ...float64) float64
func (fn GetWarp) GetInt(key string, vals ...int) int
func (fn GetWarp) GetInt64(key string, vals ...int64) int64
func (fn GetWarp) GetInterface(key string) interface{}
func (fn GetWarp) GetString(key string, vals ...string) string
func (fn GetWarp) GetStrings(key string) []string
func (fn GetWarp) GetUint(key string, vals ...uint) uint
func (fn GetWarp) GetUint64(key string, vals ...uint64) uint64
反馈和交流请加群组:QQ群373278915。
推荐文章: