tool.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package cli
  2. import (
  3. "os"
  4. "path/filepath"
  5. "reflect"
  6. "strings"
  7. jsoniter "github.com/json-iterator/go"
  8. )
  9. func NewJsonDecoder(dir, filename string) (*jsoniter.Decoder, error) {
  10. //_, filename, _, _ := runtime.Caller(1)
  11. filename, err := filepath.Abs(filepath.Join(dir, filename))
  12. if err != nil {
  13. return nil, err
  14. }
  15. bytes, err := os.ReadFile(filename)
  16. if err != nil {
  17. return nil, err
  18. }
  19. return jsoniter.NewDecoder(strings.NewReader(string(bytes))), nil
  20. }
  21. func WalkDir(dir string, fn func(absDir string, fs os.FileInfo) error) error {
  22. absDir, err := filepath.Abs(dir)
  23. if err != nil {
  24. return err
  25. }
  26. fs, err := os.ReadDir(absDir)
  27. if err != nil {
  28. return err
  29. }
  30. for _, f := range fs {
  31. info, _ := f.Info()
  32. if err = fn(absDir, info); err != nil {
  33. return err
  34. }
  35. }
  36. return nil
  37. }
  38. func ToMap[K comparable, V any](v any) (map[K]V, bool) {
  39. kind := reflect.TypeOf(v).Kind()
  40. if kind != reflect.Map {
  41. return nil, false
  42. }
  43. val := reflect.ValueOf(v)
  44. vals := make(map[K]V)
  45. iter := val.MapRange()
  46. for iter.Next() {
  47. k := iter.Key().Interface()
  48. v := iter.Value().Interface()
  49. vals[k.(K)] = v.(V)
  50. }
  51. return vals, true
  52. }