gendata.go 2.3 KB

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