util.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package javagen
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "strings"
  7. "github.com/tal-tech/go-zero/tools/goctl/api/spec"
  8. "github.com/tal-tech/go-zero/tools/goctl/util"
  9. )
  10. func writeProperty(writer io.Writer, member spec.Member, indent int) error {
  11. writeIndent(writer, indent)
  12. ty, err := specTypeToJava(member.Type)
  13. ty = strings.Replace(ty, "*", "", 1)
  14. if err != nil {
  15. return err
  16. }
  17. name, err := member.GetPropertyName()
  18. if err != nil {
  19. return err
  20. }
  21. _, err = fmt.Fprintf(writer, "private %s %s", ty, name)
  22. if err != nil {
  23. return err
  24. }
  25. err = writeDefaultValue(writer, member)
  26. if err != nil {
  27. return err
  28. }
  29. fmt.Fprint(writer, ";\n")
  30. return err
  31. }
  32. func writeDefaultValue(writer io.Writer, member spec.Member) error {
  33. javaType, err := specTypeToJava(member.Type)
  34. if err != nil {
  35. return err
  36. }
  37. if javaType == "String" {
  38. _, err := fmt.Fprintf(writer, " = \"\"")
  39. return err
  40. }
  41. return nil
  42. }
  43. func writeIndent(writer io.Writer, indent int) {
  44. for i := 0; i < indent; i++ {
  45. fmt.Fprint(writer, "\t")
  46. }
  47. }
  48. func indentString(indent int) string {
  49. var result = ""
  50. for i := 0; i < indent; i++ {
  51. result += "\t"
  52. }
  53. return result
  54. }
  55. func specTypeToJava(tp spec.Type) (string, error) {
  56. switch v := tp.(type) {
  57. case spec.DefineStruct:
  58. return util.Title(tp.Name()), nil
  59. case spec.PrimitiveType:
  60. r, ok := primitiveType(tp.Name())
  61. if !ok {
  62. return "", errors.New("unsupported primitive type " + tp.Name())
  63. }
  64. return r, nil
  65. case spec.MapType:
  66. valueType, err := specTypeToJava(v.Value)
  67. if err != nil {
  68. return "", err
  69. }
  70. return fmt.Sprintf("java.util.HashMap<String, %s>", util.Title(valueType)), nil
  71. case spec.ArrayType:
  72. if tp.Name() == "[]byte" {
  73. return "byte[]", nil
  74. }
  75. valueType, err := specTypeToJava(v.Value)
  76. if err != nil {
  77. return "", err
  78. }
  79. switch valueType {
  80. case "int":
  81. return "Integer[]", nil
  82. case "long":
  83. return "Long[]", nil
  84. case "float":
  85. return "Float[]", nil
  86. case "double":
  87. return "Double[]", nil
  88. case "boolean":
  89. return "Boolean[]", nil
  90. }
  91. return fmt.Sprintf("java.util.ArrayList<%s>", util.Title(valueType)), nil
  92. case spec.InterfaceType:
  93. return "Object", nil
  94. case spec.PointerType:
  95. return specTypeToJava(v.Type)
  96. }
  97. return "", errors.New("unsupported primitive type " + tp.Name())
  98. }
  99. func primitiveType(tp string) (string, bool) {
  100. switch tp {
  101. case "string":
  102. return "String", true
  103. case "int64", "uint64":
  104. return "long", true
  105. case "int", "int8", "int32", "uint", "uint8", "uint16", "uint32":
  106. return "int", true
  107. case "float", "float32":
  108. return "float", true
  109. case "float64":
  110. return "double", true
  111. case "bool":
  112. return "boolean", true
  113. }
  114. return "", false
  115. }