gendata.go 3.5 KB

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