gendata.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package dartgen
  2. import (
  3. "os"
  4. "strings"
  5. "text/template"
  6. "github.com/zeromicro/go-zero/tools/goctl/api/spec"
  7. )
  8. const dataTemplate = `// --{{with .Info}}{{.Title}}{{end}}--
  9. {{ range .Types}}
  10. class {{.Name}}{
  11. {{range .Members}}
  12. /// {{.Comment}}
  13. final {{.Type.Name}} {{lowCamelCase .Name}};
  14. {{end}}
  15. {{.Name}}({ {{range .Members}}
  16. this.{{lowCamelCase .Name}},{{end}}
  17. });
  18. factory {{.Name}}.fromJson(Map<String,dynamic> m) {
  19. return {{.Name}}({{range .Members}}
  20. {{lowCamelCase .Name}}: {{if isDirectType .Type.Name}}m['{{getPropertyFromMember .}}']{{else if isClassListType .Type.Name}}(m['{{getPropertyFromMember .}}'] as List<dynamic>).map((i) => {{getCoreType .Type.Name}}.fromJson(i)){{else}}{{.Type.Name}}.fromJson(m['{{getPropertyFromMember .}}']){{end}},{{end}}
  21. );
  22. }
  23. Map<String,dynamic> toJson() {
  24. return { {{range .Members}}
  25. '{{getPropertyFromMember .}}': {{if isDirectType .Type.Name}}{{lowCamelCase .Name}}{{else if isClassListType .Type.Name}}{{lowCamelCase .Name}}.map((i) => i.toJson()){{else}}{{lowCamelCase .Name}}.toJson(){{end}},{{end}}
  26. };
  27. }
  28. }
  29. {{end}}
  30. `
  31. const dataTemplateV2 = `// --{{with .Info}}{{.Title}}{{end}}--
  32. {{ range .Types}}
  33. class {{.Name}} {
  34. {{range .Members}}
  35. {{if .Comment}}{{.Comment}}{{end}}
  36. final {{.Type.Name}} {{lowCamelCase .Name}};
  37. {{end}}{{.Name}}({{if .Members}}{
  38. {{range .Members}} required this.{{lowCamelCase .Name}},
  39. {{end}}}{{end}});
  40. factory {{.Name}}.fromJson(Map<String,dynamic> m) {
  41. return {{.Name}}({{range .Members}}
  42. {{lowCamelCase .Name}}: {{if isDirectType .Type.Name}}m['{{getPropertyFromMember .}}']{{else if isClassListType .Type.Name}}(m['{{getPropertyFromMember .}}'] as List<dynamic>).map((i) => {{getCoreType .Type.Name}}.fromJson(i)){{else}}{{.Type.Name}}.fromJson(m['{{getPropertyFromMember .}}']){{end}},{{end}}
  43. );
  44. }
  45. Map<String,dynamic> toJson() {
  46. return { {{range .Members}}
  47. '{{getPropertyFromMember .}}': {{if isDirectType .Type.Name}}{{lowCamelCase .Name}}{{else if isClassListType .Type.Name}}{{lowCamelCase .Name}}.map((i) => i.toJson()){{else}}{{lowCamelCase .Name}}.toJson(){{end}},{{end}}
  48. };
  49. }
  50. }
  51. {{end}}`
  52. func genData(dir string, api *spec.ApiSpec, isLegacy bool) error {
  53. err := os.MkdirAll(dir, 0o755)
  54. if err != nil {
  55. return err
  56. }
  57. err = genTokens(dir, isLegacy)
  58. if err != nil {
  59. return err
  60. }
  61. file, err := os.OpenFile(dir+strings.ToLower(api.Service.Name+".dart"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
  62. if err != nil {
  63. return err
  64. }
  65. defer file.Close()
  66. t := template.New("dataTemplate")
  67. t = t.Funcs(funcMap)
  68. tpl := dataTemplateV2
  69. if isLegacy {
  70. tpl = dataTemplate
  71. }
  72. t, err = t.Parse(tpl)
  73. if err != nil {
  74. return err
  75. }
  76. err = convertDataType(api)
  77. if err != nil {
  78. return err
  79. }
  80. return t.Execute(file, api)
  81. }
  82. func genTokens(dir string, isLeagcy bool) error {
  83. path := dir + "tokens.dart"
  84. if fileExists(path) {
  85. return nil
  86. }
  87. tokensFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
  88. if err != nil {
  89. return err
  90. }
  91. defer tokensFile.Close()
  92. tpl := tokensFileContentV2
  93. if isLeagcy {
  94. tpl = tokensFileContent
  95. }
  96. _, err = tokensFile.WriteString(tpl)
  97. return err
  98. }
  99. func convertDataType(api *spec.ApiSpec) error {
  100. types := api.Types
  101. if len(types) == 0 {
  102. return nil
  103. }
  104. for _, ty := range types {
  105. defineStruct, ok := ty.(spec.DefineStruct)
  106. if ok {
  107. for index, member := range defineStruct.Members {
  108. tp, err := specTypeToDart(member.Type)
  109. if err != nil {
  110. return err
  111. }
  112. defineStruct.Members[index].Type = buildSpecType(member.Type, tp)
  113. }
  114. }
  115. }
  116. return nil
  117. }