gendata.go 4.1 KB

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