genenums.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright GoFrame gf Author(https://goframe.org). All Rights Reserved.
  2. //
  3. // This Source Code Form is subject to the terms of the MIT License.
  4. // If a copy of the MIT was not distributed with this file,
  5. // You can obtain one at https://github.com/gogf/gf.
  6. package genenums
  7. import (
  8. "context"
  9. "golang.org/x/tools/go/packages"
  10. "github.com/gogf/gf/cmd/gf/v2/internal/consts"
  11. "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
  12. "github.com/gogf/gf/v2/frame/g"
  13. "github.com/gogf/gf/v2/os/gfile"
  14. "github.com/gogf/gf/v2/text/gstr"
  15. "github.com/gogf/gf/v2/util/gtag"
  16. )
  17. type (
  18. CGenEnums struct{}
  19. CGenEnumsInput struct {
  20. g.Meta `name:"enums" config:"{CGenEnumsConfig}" brief:"{CGenEnumsBrief}" eg:"{CGenEnumsEg}"`
  21. Src string `name:"src" short:"s" dc:"source folder path to be parsed" d:"."`
  22. Path string `name:"path" short:"p" dc:"output go file path storing enums content" d:"internal/boot/boot_enums.go"`
  23. Prefixes []string `name:"prefixes" short:"x" dc:"only exports packages that starts with specified prefixes"`
  24. }
  25. CGenEnumsOutput struct{}
  26. )
  27. const (
  28. CGenEnumsConfig = `gfcli.gen.enums`
  29. CGenEnumsBrief = `parse go files in current project and generate enums go file`
  30. CGenEnumsEg = `
  31. gf gen enums
  32. gf gen enums -p internal/boot/boot_enums.go
  33. gf gen enums -p internal/boot/boot_enums.go -s .
  34. gf gen enums -x github.com/gogf
  35. `
  36. )
  37. func init() {
  38. gtag.Sets(g.MapStrStr{
  39. `CGenEnumsEg`: CGenEnumsEg,
  40. `CGenEnumsBrief`: CGenEnumsBrief,
  41. `CGenEnumsConfig`: CGenEnumsConfig,
  42. })
  43. }
  44. func (c CGenEnums) Enums(ctx context.Context, in CGenEnumsInput) (out *CGenEnumsOutput, err error) {
  45. realPath := gfile.RealPath(in.Src)
  46. if realPath == "" {
  47. mlog.Fatalf(`source folder path "%s" does not exist`, in.Src)
  48. }
  49. err = gfile.Chdir(realPath)
  50. if err != nil {
  51. mlog.Fatal(err)
  52. }
  53. mlog.Printf(`scanning for enums: %s`, realPath)
  54. cfg := &packages.Config{
  55. Dir: realPath,
  56. Mode: pkgLoadMode,
  57. Tests: false,
  58. }
  59. pkgs, err := packages.Load(cfg)
  60. if err != nil {
  61. mlog.Fatal(err)
  62. }
  63. p := NewEnumsParser(in.Prefixes)
  64. p.ParsePackages(pkgs)
  65. var enumsContent = gstr.ReplaceByMap(consts.TemplateGenEnums, g.MapStrStr{
  66. "{PackageName}": gfile.Basename(gfile.Dir(in.Path)),
  67. "{EnumsJson}": "`" + p.Export() + "`",
  68. })
  69. enumsContent = gstr.Trim(enumsContent)
  70. if err = gfile.PutContents(in.Path, enumsContent); err != nil {
  71. return
  72. }
  73. mlog.Printf(`generated enums go file: %s`, in.Path)
  74. mlog.Print("done!")
  75. return
  76. }