You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
1.6 KiB
Go
102 lines
1.6 KiB
Go
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
|
|
}
|