gencomponents.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package javagen
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "path"
  7. "strings"
  8. "text/template"
  9. "github.com/tal-tech/go-zero/tools/goctl/api/spec"
  10. apiutil "github.com/tal-tech/go-zero/tools/goctl/api/util"
  11. "github.com/tal-tech/go-zero/tools/goctl/util"
  12. )
  13. const (
  14. componentTemplate = `// Code generated by goctl. DO NOT EDIT.
  15. package com.xhb.logic.http.packet.{{.packet}}.model;
  16. import com.xhb.logic.http.DeProguardable;
  17. import org.jetbrains.annotations.NotNull;
  18. import org.jetbrains.annotations.Nullable;
  19. {{.componentType}}
  20. `
  21. )
  22. func genComponents(dir, packetName string, api *spec.ApiSpec) error {
  23. types := apiutil.GetSharedTypes(api)
  24. if len(types) == 0 {
  25. return nil
  26. }
  27. for _, ty := range types {
  28. if err := createComponent(dir, packetName, ty, api.Types); err != nil {
  29. return err
  30. }
  31. }
  32. return nil
  33. }
  34. func createComponent(dir, packetName string, ty spec.Type, types []spec.Type) error {
  35. modelFile := util.Title(ty.Name) + ".java"
  36. filename := path.Join(dir, modelDir, modelFile)
  37. if err := util.RemoveOrQuit(filename); err != nil {
  38. return err
  39. }
  40. fp, created, err := apiutil.MaybeCreateFile(dir, modelDir, modelFile)
  41. if err != nil {
  42. return err
  43. }
  44. if !created {
  45. return nil
  46. }
  47. defer fp.Close()
  48. tys, err := buildType(ty, types)
  49. if err != nil {
  50. return err
  51. }
  52. t := template.Must(template.New("componentType").Parse(componentTemplate))
  53. return t.Execute(fp, map[string]string{
  54. "componentType": tys,
  55. "packet": packetName,
  56. })
  57. }
  58. func buildType(ty spec.Type, types []spec.Type) (string, error) {
  59. var builder strings.Builder
  60. if err := writeType(&builder, ty, types); err != nil {
  61. return "", apiutil.WrapErr(err, "Type "+ty.Name+" generate error")
  62. }
  63. return builder.String(), nil
  64. }
  65. func writeType(writer io.Writer, tp spec.Type, types []spec.Type) error {
  66. fmt.Fprintf(writer, "public class %s implements DeProguardable {\n", util.Title(tp.Name))
  67. var members []spec.Member
  68. err := writeMembers(writer, types, tp.Members, &members, 1)
  69. if err != nil {
  70. return err
  71. }
  72. genGetSet(writer, members, 1)
  73. fmt.Fprintf(writer, "}")
  74. return nil
  75. }
  76. func writeMembers(writer io.Writer, types []spec.Type, members []spec.Member, allMembers *[]spec.Member, indent int) error {
  77. for _, member := range members {
  78. if !member.IsInline {
  79. _, err := member.GetPropertyName()
  80. if err != nil {
  81. return err
  82. }
  83. }
  84. if !member.IsBodyMember() {
  85. continue
  86. }
  87. for _, item := range *allMembers {
  88. if item.Name == member.Name {
  89. continue
  90. }
  91. }
  92. if member.IsInline {
  93. hasInline := false
  94. for _, ty := range types {
  95. if strings.ToLower(ty.Name) == strings.ToLower(member.Name) {
  96. err := writeMembers(writer, types, ty.Members, allMembers, indent)
  97. if err != nil {
  98. return err
  99. }
  100. hasInline = true
  101. break
  102. }
  103. }
  104. if !hasInline {
  105. return errors.New("inline type " + member.Name + " not exist, please correct api file")
  106. }
  107. } else {
  108. if err := writeProperty(writer, member, indent); err != nil {
  109. return err
  110. }
  111. *allMembers = append(*allMembers, member)
  112. }
  113. }
  114. return nil
  115. }