format.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package format
  2. import (
  3. "bufio"
  4. "errors"
  5. "fmt"
  6. "go/scanner"
  7. "io/ioutil"
  8. "os"
  9. "path/filepath"
  10. "strings"
  11. "github.com/tal-tech/go-zero/core/errorx"
  12. "github.com/tal-tech/go-zero/tools/goctl/api/util"
  13. "github.com/urfave/cli"
  14. )
  15. func GoFormatApi(c *cli.Context) error {
  16. useStdin := c.Bool("stdin")
  17. var be errorx.BatchError
  18. if useStdin {
  19. if err := ApiFormatByStdin(); err != nil {
  20. be.Add(err)
  21. }
  22. } else {
  23. dir := c.String("dir")
  24. if len(dir) == 0 {
  25. return errors.New("missing -dir")
  26. }
  27. _, err := os.Lstat(dir)
  28. if err != nil {
  29. return errors.New(dir + ": No such file or directory")
  30. }
  31. err = filepath.Walk(dir, func(path string, fi os.FileInfo, errBack error) (err error) {
  32. if strings.HasSuffix(path, ".api") {
  33. if err := ApiFormatByPath(path); err != nil {
  34. be.Add(util.WrapErr(err, fi.Name()))
  35. }
  36. }
  37. return nil
  38. })
  39. be.Add(err)
  40. }
  41. if be.NotNil() {
  42. scanner.PrintError(os.Stderr, be.Err())
  43. os.Exit(1)
  44. }
  45. return be.Err()
  46. }
  47. func ApiFormatByStdin() error {
  48. data, err := ioutil.ReadAll(os.Stdin)
  49. if err != nil {
  50. return err
  51. }
  52. result := apiFormat(string(data))
  53. _, err = fmt.Print(result)
  54. if err != nil {
  55. return err
  56. }
  57. return nil
  58. }
  59. func ApiFormatByPath(apiFilePath string) error {
  60. data, err := ioutil.ReadFile(apiFilePath)
  61. if err != nil {
  62. return err
  63. }
  64. result := apiFormat(string(data))
  65. if err := ioutil.WriteFile(apiFilePath, []byte(result), os.ModePerm); err != nil {
  66. return err
  67. }
  68. return nil
  69. }
  70. func apiFormat(data string) string {
  71. var builder strings.Builder
  72. scanner := bufio.NewScanner(strings.NewReader(data))
  73. var tapCount = 0
  74. for scanner.Scan() {
  75. line := strings.TrimSpace(scanner.Text())
  76. noCommentLine := util.RemoveComment(line)
  77. if noCommentLine == ")" || noCommentLine == "}" {
  78. tapCount -= 1
  79. }
  80. util.WriteIndent(&builder, tapCount)
  81. builder.WriteString(line + "\n")
  82. if strings.HasSuffix(noCommentLine, "(") || strings.HasSuffix(noCommentLine, "{") {
  83. tapCount += 1
  84. }
  85. }
  86. return strings.TrimSpace(builder.String())
  87. }