123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package flags
- import (
- "bytes"
- _ "embed"
- "encoding/json"
- "fmt"
- "io"
- "log"
- "strings"
- "testing"
- "github.com/zeromicro/go-zero/tools/goctl/util"
- )
- //go:embed default_en.json
- var defaultEnFlagConfig []byte
- type ConfigLoader struct {
- conf map[string]any
- }
- func (cl *ConfigLoader) ReadConfig(in io.Reader) error {
- return json.NewDecoder(in).Decode(&cl.conf)
- }
- func (cl *ConfigLoader) GetString(key string) string {
- keyList := strings.FieldsFunc(key, func(r rune) bool {
- return r == '.'
- })
- var conf = cl.conf
- for idx, k := range keyList {
- val, ok := conf[k]
- if !ok {
- return ""
- }
- if idx < len(keyList)-1 {
- conf, ok = val.(map[string]any)
- if !ok {
- return ""
- }
- continue
- }
- return fmt.Sprint(val)
- }
- return ""
- }
- type Flags struct {
- loader *ConfigLoader
- }
- func MustLoad() *Flags {
- loader := &ConfigLoader{
- conf: map[string]any{},
- }
- if err := loader.ReadConfig(bytes.NewBuffer(defaultEnFlagConfig)); err != nil {
- log.Fatal(err)
- }
- return &Flags{
- loader: loader,
- }
- }
- func setTestData(t *testing.T, data []byte) {
- origin := defaultEnFlagConfig
- defaultEnFlagConfig = data
- t.Cleanup(func() {
- defaultEnFlagConfig = origin
- })
- }
- func (f *Flags) Get(key string) (string, error) {
- value := f.loader.GetString(key)
- for util.IsTemplateVariable(value) {
- value = util.TemplateVariable(value)
- if value == key {
- return "", fmt.Errorf("the variable can not be self: %q", key)
- }
- return f.Get(value)
- }
- return value, nil
- }
- var flags *Flags
- func Get(key string) string {
- if flags == nil {
- flags = MustLoad()
- }
- v, err := flags.Get(key)
- if err != nil {
- log.Fatal(err)
- return ""
- }
- return v
- }
|