本书未发布

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

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~