代码拉取完成,页面将自动刷新
package config
import (
"fmt"
"reflect"
)
type elemFlagConfig struct {
cfgPath string
cmdPath string
flagName string
}
type RendererFlag struct {
sort int
elems []elemFlagConfig
lookup FlagLookupFunc
}
func NewRendererFlag(sort int) *RendererFlag {
return &RendererFlag{
sort: sort,
elems: make([]elemFlagConfig, 0, 8),
}
}
func (r *RendererFlag) Name() string {
return "env"
}
func (r *RendererFlag) Sort() int {
return r.sort
}
func (r *RendererFlag) Render(body reflect.Value, desc *ConfigDesc) error {
if r.lookup == nil {
return nil
}
for _, elem := range r.elems {
if err := r.parseFlagElem(body, desc, elem); err != nil {
return err
}
}
return nil
}
type FlagLookupFunc func(cmdPath string, flagName string) (string, bool)
func (r *RendererFlag) SetLookupFunc(lookup FlagLookupFunc) {
r.lookup = lookup
}
func (r *RendererFlag) parseFlagElem(body reflect.Value, desc *ConfigDesc, elem elemFlagConfig) error {
flagVal, ok := r.lookup(elem.cmdPath, elem.flagName)
if !ok {
//没设置flag, 不要了
return nil
}
rv, err := findFieldInBody(body, desc, elem.cfgPath)
if err != nil {
return err
}
if rv.Kind() == reflect.Invalid {
return nil
}
if err := setValueFromString(rv, flagVal); err != nil {
return fmt.Errorf("config: set flag [%s] value [%s] to [%s] failed: %v", elem.flagName, flagVal, elem.cfgPath, err)
}
return nil
}
func (r *RendererFlag) BindFlag(cfgPath, cmdPath, flagName string) {
elem := elemFlagConfig{
cfgPath: cfgPath,
cmdPath: cmdPath,
flagName: flagName,
}
r.elems = append(r.elems, elem)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。