gentypes.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package gogen
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. "path"
  7. "strings"
  8. "git.i2edu.net/i2/go-zero/tools/goctl/api/spec"
  9. apiutil "git.i2edu.net/i2/go-zero/tools/goctl/api/util"
  10. "git.i2edu.net/i2/go-zero/tools/goctl/config"
  11. "git.i2edu.net/i2/go-zero/tools/goctl/util"
  12. "git.i2edu.net/i2/go-zero/tools/goctl/util/format"
  13. )
  14. const (
  15. typesFile = "types"
  16. typesTemplate = `// Code generated by goctl. DO NOT EDIT.
  17. package types{{if .containsTime}}
  18. import (
  19. "time"
  20. ){{end}}
  21. {{.types}}
  22. `
  23. )
  24. // BuildTypes gen types to string
  25. func BuildTypes(types []spec.Type) (string, error) {
  26. var builder strings.Builder
  27. first := true
  28. for _, tp := range types {
  29. if first {
  30. first = false
  31. } else {
  32. builder.WriteString("\n\n")
  33. }
  34. if err := writeType(&builder, tp); err != nil {
  35. return "", apiutil.WrapErr(err, "Type "+tp.Name()+" generate error")
  36. }
  37. }
  38. return builder.String(), nil
  39. }
  40. func genTypes(dir string, cfg *config.Config, api *spec.ApiSpec) error {
  41. val, err := BuildTypes(api.Types)
  42. if err != nil {
  43. return err
  44. }
  45. typeFilename, err := format.FileNamingFormat(cfg.NamingFormat, typesFile)
  46. if err != nil {
  47. return err
  48. }
  49. typeFilename = typeFilename + ".go"
  50. filename := path.Join(dir, typesDir, typeFilename)
  51. os.Remove(filename)
  52. return genFile(fileGenConfig{
  53. dir: dir,
  54. subdir: typesDir,
  55. filename: typeFilename,
  56. templateName: "typesTemplate",
  57. category: "",
  58. templateFile: "",
  59. builtinTemplate: typesTemplate,
  60. data: map[string]interface{}{
  61. "types": val,
  62. "containsTime": false,
  63. },
  64. })
  65. }
  66. func writeType(writer io.Writer, tp spec.Type) error {
  67. structType, ok := tp.(spec.DefineStruct)
  68. if !ok {
  69. return fmt.Errorf("unspport struct type: %s", tp.Name())
  70. }
  71. fmt.Fprintf(writer, "type %s struct {\n", util.Title(tp.Name()))
  72. for _, member := range structType.Members {
  73. if member.IsInline {
  74. if _, err := fmt.Fprintf(writer, "%s\n", strings.Title(member.Type.Name())); err != nil {
  75. return err
  76. }
  77. continue
  78. }
  79. if err := writeProperty(writer, member.Name, member.Tag, member.GetComment(), member.Type, 1); err != nil {
  80. return err
  81. }
  82. }
  83. fmt.Fprintf(writer, "}")
  84. return nil
  85. }