gendata.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 {{if isNumberType .Type.Name}}num{{else}}{{.Type.Name}}{{end}} {{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 {{if isNumberType .Type.Name}}num{{else}}{{.Type.Name}}{{end}} {{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}}(
  42. {{range .Members}}
  43. {{lowCamelCase .Name}}: {{appendNullCoalescing .}}
  44. {{if isAtomicType .Type.Name}}
  45. m['{{getPropertyFromMember .}}'] {{appendDefaultEmptyValue .Type.Name}}
  46. {{else if isAtomicListType .Type.Name}}
  47. m['{{getPropertyFromMember .}}']?.cast<{{getCoreType .Type.Name}}>() {{appendDefaultEmptyValue .Type.Name}}
  48. {{else if isClassListType .Type.Name}}
  49. ((m['{{getPropertyFromMember .}}'] {{appendDefaultEmptyValue .Type.Name}}) as List<dynamic>).map((i) => {{getCoreType .Type.Name}}.fromJson(i)).toList()
  50. {{else if isMapType .Type.Name}}
  51. {{if isNumberType .Type.Name}}num{{else}}{{.Type.Name}}{{end}}.from(m['{{getPropertyFromMember .}}'] ?? {})
  52. {{else}}
  53. {{.Type.Name}}.fromJson(m['{{getPropertyFromMember .}}']){{end}}
  54. ,{{end}}
  55. );
  56. }
  57. Map<String,dynamic> toJson() {
  58. return { {{range .Members}}
  59. '{{getPropertyFromMember .}}':
  60. {{if isDirectType .Type.Name}}
  61. {{lowCamelCase .Name}}
  62. {{else if isMapType .Type.Name}}
  63. {{lowCamelCase .Name}}
  64. {{else if isClassListType .Type.Name}}
  65. {{lowCamelCase .Name}}{{if isNullableType .Type.Name}}?{{end}}.map((i) => i{{if isListItemsNullable .Type.Name}}?{{end}}.toJson())
  66. {{else}}
  67. {{lowCamelCase .Name}}{{if isNullableType .Type.Name}}?{{end}}.toJson()
  68. {{end}}
  69. ,{{end}}
  70. };
  71. }
  72. }
  73. {{end}}`
  74. func genData(dir string, api *spec.ApiSpec, isLegacy bool) error {
  75. err := os.MkdirAll(dir, 0o755)
  76. if err != nil {
  77. return err
  78. }
  79. err = genTokens(dir, isLegacy)
  80. if err != nil {
  81. return err
  82. }
  83. file, err := os.OpenFile(dir+strings.ToLower(api.Service.Name+".dart"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
  84. if err != nil {
  85. return err
  86. }
  87. defer file.Close()
  88. t := template.New("dataTemplate")
  89. t = t.Funcs(funcMap)
  90. tpl := dataTemplateV2
  91. if isLegacy {
  92. tpl = dataTemplate
  93. }
  94. t, err = t.Parse(tpl)
  95. if err != nil {
  96. return err
  97. }
  98. err = convertDataType(api)
  99. if err != nil {
  100. return err
  101. }
  102. return t.Execute(file, api)
  103. }
  104. func genTokens(dir string, isLeagcy bool) error {
  105. path := dir + "tokens.dart"
  106. if fileExists(path) {
  107. return nil
  108. }
  109. tokensFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
  110. if err != nil {
  111. return err
  112. }
  113. defer tokensFile.Close()
  114. tpl := tokensFileContentV2
  115. if isLeagcy {
  116. tpl = tokensFileContent
  117. }
  118. _, err = tokensFile.WriteString(tpl)
  119. return err
  120. }
  121. func convertDataType(api *spec.ApiSpec) error {
  122. types := api.Types
  123. if len(types) == 0 {
  124. return nil
  125. }
  126. for _, ty := range types {
  127. defineStruct, ok := ty.(spec.DefineStruct)
  128. if ok {
  129. for index, member := range defineStruct.Members {
  130. tp, err := specTypeToDart(member.Type)
  131. if err != nil {
  132. return err
  133. }
  134. defineStruct.Members[index].Type = buildSpecType(member.Type, tp)
  135. }
  136. }
  137. }
  138. return nil
  139. }