gendata.go 3.9 KB

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