1 Star 0 Fork 0

ThinCats/conftool

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
parser.go 2.14 KB
一键复制 编辑 原始数据 按行查看 历史
package conftool
import (
"fmt"
"os"
"path/filepath"
"strings"
"gitee.com/thincats/conftool/helper"
"github.com/pkg/errors"
"github.com/spf13/pflag"
"github.com/spf13/viper"
)
func addConfigFileSupport(sv *viper.Viper, configDir string, filename string) error {
const errHeader = "parse config file"
configDir, err := filepath.Abs(configDir)
if err != nil {
return errors.Wrap(err, errHeader)
}
if filename == "" {
return errors.Errorf("%s: config filename is empty", errHeader)
}
ext := strings.TrimPrefix(filepath.Ext(filename), ".")
if ext == "" {
ext = "yaml" // 默认读取yaml文件
}
// 文件名不带后缀
file := filepath.Base(filename)
sv.SetConfigName(file)
sv.AddConfigPath(configDir) // config dir
sv.SetConfigType(ext)
err = sv.ReadInConfig()
if err != nil {
return errors.Wrap(err, errHeader)
}
return nil
}
func addEnvSupport(sv *viper.Viper, envPrefix string) error {
// tell viper to load env variables
sv.AutomaticEnv()
sv.SetEnvPrefix(envPrefix)
sv.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
return nil
}
func addCommandLineSupport(sv *viper.Viper, config interface{}, args []string) error {
const errHeader = "parse command line"
flags := pflag.NewFlagSet("", pflag.ContinueOnError)
flattenConfigTypes, err := helper.FlattenStructReflectType(config)
if err != nil {
return errors.Wrap(err, errHeader)
}
flattenConfigTags, err := helper.FlattenStructFieldTag(config, "cli")
if err != nil {
return errors.Wrap(err, errHeader)
}
for k, v := range flattenConfigTypes {
cliTag := flattenConfigTags[k]
// only bind flag if tag cli set
if cliTag != "-" && cliTag != "" {
tagParser, err := helper.NewTagParser(cliTag)
if err != nil {
return errors.WithMessage(err, errHeader+": tag `cli`")
}
key := helper.LowerFirstInDotString(k)
helper.AddFlag(flags, key, v, tagParser.QueryByKey("usage"))
}
}
// Parse command-line first
err = flags.Parse(args)
if err != nil {
return errors.Wrap(err, errHeader)
}
sv.BindPFlags(flags)
return nil
}
func exitIfError(err error) {
// if help error, not print stack
if !IsHelpError(err) {
fmt.Printf("%+v\n", err)
}
os.Exit(1)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/thincats/conftool.git
git@gitee.com:thincats/conftool.git
thincats
conftool
conftool
bd2eb12f567d

搜索帮助