generator.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package pkg
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "go/format"
  7. "io/ioutil"
  8. "log"
  9. "strings"
  10. "github.com/jinzhu/gorm"
  11. )
  12. // fieldConfig
  13. type fieldConfig struct {
  14. FieldName string
  15. ColumnName string
  16. FieldType string
  17. HumpName string
  18. }
  19. // structConfig
  20. type structConfig struct {
  21. config
  22. StructName string
  23. OnlyFields []fieldConfig
  24. OptionFields []fieldConfig
  25. }
  26. type ImportPkg struct {
  27. Pkg string
  28. }
  29. type structHelpers struct {
  30. Titelize func(string) string
  31. }
  32. type config struct {
  33. PkgName string
  34. Helpers structHelpers
  35. QueryBuilderName string
  36. }
  37. // The Generator is the one responsible for generating the code, adding the imports, formating, and writing it to the file.
  38. type Generator struct {
  39. buf map[string]*bytes.Buffer
  40. inputFile string
  41. config config
  42. structConfigs []structConfig
  43. }
  44. // NewGenerator function creates an instance of the generator given the name of the output file as an argument.
  45. func NewGenerator(outputFile string) *Generator {
  46. return &Generator{
  47. buf: map[string]*bytes.Buffer{},
  48. inputFile: outputFile,
  49. }
  50. }
  51. // ParserAST parse by go file
  52. func (g *Generator) ParserAST(p *Parser, structs []string) (ret *Generator) {
  53. for _, v := range structs {
  54. g.buf[gorm.ToDBName(v)] = new(bytes.Buffer)
  55. }
  56. g.structConfigs = p.Parse()
  57. g.config.PkgName = p.pkg.Name
  58. g.config.Helpers = structHelpers{
  59. Titelize: strings.Title,
  60. }
  61. g.config.QueryBuilderName = SQLColumnToHumpStyle(p.pkg.Name) + "QueryBuilder"
  62. return g
  63. }
  64. func (g *Generator) checkConfig() (err error) {
  65. if len(g.config.PkgName) == 0 {
  66. err = errors.New("package name dose'n set")
  67. return
  68. }
  69. for i := 0; i < len(g.structConfigs); i++ {
  70. g.structConfigs[i].config = g.config
  71. }
  72. return
  73. }
  74. // Generate executes the template and store it in an internal buffer.
  75. func (g *Generator) Generate() *Generator {
  76. if err := g.checkConfig(); err != nil {
  77. panic(err)
  78. }
  79. for _, v := range g.structConfigs {
  80. if _, ok := g.buf[gorm.ToDBName(v.StructName)]; !ok {
  81. continue
  82. }
  83. if err := outputTemplate.Execute(g.buf[gorm.ToDBName(v.StructName)], v); err != nil {
  84. panic(err)
  85. }
  86. }
  87. return g
  88. }
  89. // Format function formats the output of the generation.
  90. func (g *Generator) Format() *Generator {
  91. for k := range g.buf {
  92. formattedOutput, err := format.Source(g.buf[k].Bytes())
  93. if err != nil {
  94. panic(err)
  95. }
  96. g.buf[k] = bytes.NewBuffer(formattedOutput)
  97. }
  98. return g
  99. }
  100. // Flush function writes the output to the output file.
  101. func (g *Generator) Flush() error {
  102. for k := range g.buf {
  103. filename := g.inputFile + "/gen_" + strings.ToLower(k) + ".go"
  104. if err := ioutil.WriteFile(filename, g.buf[k].Bytes(), 0777); err != nil {
  105. log.Fatalln(err)
  106. }
  107. fmt.Println(" └── file : ", fmt.Sprintf("%s_repo/gen_%s.go", strings.ToLower(k), strings.ToLower(k)))
  108. }
  109. return nil
  110. }