gencomponents.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package javagen
  2. import (
  3. "fmt"
  4. "io"
  5. "path"
  6. "strings"
  7. "text/template"
  8. "zero/tools/goctl/api/spec"
  9. apiutil "zero/tools/goctl/api/util"
  10. "zero/tools/goctl/util"
  11. )
  12. const (
  13. componentTemplate = `// DO NOT EDIT, generated by goctl
  14. package com.xhb.logic.http.packet.{{.packet}}.model;
  15. import com.xhb.logic.http.DeProguardable;
  16. {{.componentType}}
  17. `
  18. )
  19. func genComponents(dir, packetName string, api *spec.ApiSpec) error {
  20. types := apiutil.GetSharedTypes(api)
  21. if len(types) == 0 {
  22. return nil
  23. }
  24. for _, ty := range types {
  25. if err := createComponent(dir, packetName, ty); err != nil {
  26. return err
  27. }
  28. }
  29. return nil
  30. }
  31. func createComponent(dir, packetName string, ty spec.Type) error {
  32. modelFile := util.Title(ty.Name) + ".java"
  33. filename := path.Join(dir, modelDir, modelFile)
  34. if err := util.RemoveOrQuit(filename); err != nil {
  35. return err
  36. }
  37. fp, created, err := apiutil.MaybeCreateFile(dir, modelDir, modelFile)
  38. if err != nil {
  39. return err
  40. }
  41. if !created {
  42. return nil
  43. }
  44. defer fp.Close()
  45. tys, err := buildType(ty)
  46. if err != nil {
  47. return err
  48. }
  49. t := template.Must(template.New("componentType").Parse(componentTemplate))
  50. return t.Execute(fp, map[string]string{
  51. "componentType": tys,
  52. "packet": packetName,
  53. })
  54. }
  55. func buildType(ty spec.Type) (string, error) {
  56. var builder strings.Builder
  57. if err := writeType(&builder, ty); err != nil {
  58. return "", apiutil.WrapErr(err, "Type "+ty.Name+" generate error")
  59. }
  60. return builder.String(), nil
  61. }
  62. func writeType(writer io.Writer, tp spec.Type) error {
  63. fmt.Fprintf(writer, "public class %s implements DeProguardable {\n", util.Title(tp.Name))
  64. for _, member := range tp.Members {
  65. if err := writeProperty(writer, member, 1); err != nil {
  66. return err
  67. }
  68. }
  69. genGetSet(writer, tp, 1)
  70. fmt.Fprintf(writer, "}\n")
  71. return nil
  72. }