package cli import ( "os" "path/filepath" "reflect" "strings" jsoniter "github.com/json-iterator/go" ) func NewJsonDecoder(dir, filename string) (*jsoniter.Decoder, error) { //_, filename, _, _ := runtime.Caller(1) filename, err := filepath.Abs(filepath.Join(dir, filename)) if err != nil { return nil, err } bytes, err := os.ReadFile(filename) if err != nil { return nil, err } return jsoniter.NewDecoder(strings.NewReader(string(bytes))), nil } func WalkDir(dir string, fn func(absDir string, fs os.FileInfo) error) error { absDir, err := filepath.Abs(dir) if err != nil { return err } fs, err := os.ReadDir(absDir) if err != nil { return err } for _, f := range fs { info, _ := f.Info() if err = fn(absDir, info); err != nil { return err } } return nil } func ToMap[K comparable, V any](v any) (map[K]V, bool) { kind := reflect.TypeOf(v).Kind() if kind != reflect.Map { return nil, false } val := reflect.ValueOf(v) vals := make(map[K]V) iter := val.MapRange() for iter.Next() { k := iter.Key().Interface() v := iter.Value().Interface() vals[k.(K)] = v.(V) } return vals, true }