123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- package dartgen
- import (
- "os"
- "strings"
- "text/template"
- "github.com/wuntsong-org/go-zero-plus/tools/goctlwt/api/spec"
- )
- const dataTemplate = `// --{{with .Info}}{{.Title}}{{end}}--
- {{ range .Types}}
- class {{.Name}}{
- {{range .Members}}
- /// {{.Comment}}
- final {{if isNumberType .Type.Name}}num{{else}}{{.Type.Name}}{{end}} {{lowCamelCase .Name}};
- {{end}}
- {{.Name}}({ {{range .Members}}
- this.{{lowCamelCase .Name}},{{end}}
- });
- factory {{.Name}}.fromJson(Map<String,dynamic> m) {
- return {{.Name}}({{range .Members}}
- {{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}}
- );
- }
- Map<String,dynamic> toJson() {
- return { {{range .Members}}
- '{{getPropertyFromMember .}}': {{if isDirectType .Type.Name}}{{lowCamelCase .Name}}{{else if isClassListType .Type.Name}}{{lowCamelCase .Name}}.map((i) => i.toJson()){{else}}{{lowCamelCase .Name}}.toJson(){{end}},{{end}}
- };
- }
- }
- {{end}}
- `
- const dataTemplateV2 = `// --{{with .Info}}{{.Title}}{{end}}--
- {{ range .Types}}
- class {{.Name}} {
- {{range .Members}}
- {{if .Comment}}{{.Comment}}{{end}}
- final {{if isNumberType .Type.Name}}num{{else}}{{.Type.Name}}{{end}} {{lowCamelCase .Name}};
- {{end}}{{.Name}}({{if .Members}}{
- {{range .Members}} required this.{{lowCamelCase .Name}},
- {{end}}}{{end}});
- factory {{.Name}}.fromJson(Map<String,dynamic> m) {
- return {{.Name}}(
- {{range .Members}}
- {{lowCamelCase .Name}}: {{appendNullCoalescing .}}
- {{if isAtomicType .Type.Name}}
- m['{{getPropertyFromMember .}}'] {{appendDefaultEmptyValue .Type.Name}}
- {{else if isAtomicListType .Type.Name}}
- m['{{getPropertyFromMember .}}']?.cast<{{getCoreType .Type.Name}}>() {{appendDefaultEmptyValue .Type.Name}}
- {{else if isClassListType .Type.Name}}
- ((m['{{getPropertyFromMember .}}'] {{appendDefaultEmptyValue .Type.Name}}) as List<dynamic>).map((i) => {{getCoreType .Type.Name}}.fromJson(i)).toList()
- {{else}}
- {{.Type.Name}}.fromJson(m['{{getPropertyFromMember .}}']){{end}}
- ,{{end}}
- );
- }
- Map<String,dynamic> toJson() {
- return { {{range .Members}}
- '{{getPropertyFromMember .}}':
- {{if isDirectType .Type.Name}}
- {{lowCamelCase .Name}}
- {{else if isClassListType .Type.Name}}
- {{lowCamelCase .Name}}{{if isNullableType .Type.Name}}?{{end}}.map((i) => i{{if isListItemsNullable .Type.Name}}?{{end}}.toJson())
- {{else}}
- {{lowCamelCase .Name}}{{if isNullableType .Type.Name}}?{{end}}.toJson()
- {{end}}
- ,{{end}}
- };
- }
- }
- {{end}}`
- func genData(dir string, api *spec.ApiSpec, isLegacy bool) error {
- err := os.MkdirAll(dir, 0o755)
- if err != nil {
- return err
- }
- err = genTokens(dir, isLegacy)
- if err != nil {
- return err
- }
- file, err := os.OpenFile(dir+strings.ToLower(api.Service.Name+".dart"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
- if err != nil {
- return err
- }
- defer file.Close()
- t := template.New("dataTemplate")
- t = t.Funcs(funcMap)
- tpl := dataTemplateV2
- if isLegacy {
- tpl = dataTemplate
- }
- t, err = t.Parse(tpl)
- if err != nil {
- return err
- }
- err = convertDataType(api)
- if err != nil {
- return err
- }
- return t.Execute(file, api)
- }
- func genTokens(dir string, isLeagcy bool) error {
- path := dir + "tokens.dart"
- if fileExists(path) {
- return nil
- }
- tokensFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
- if err != nil {
- return err
- }
- defer tokensFile.Close()
- tpl := tokensFileContentV2
- if isLeagcy {
- tpl = tokensFileContent
- }
- _, err = tokensFile.WriteString(tpl)
- return err
- }
- func convertDataType(api *spec.ApiSpec) error {
- types := api.Types
- if len(types) == 0 {
- return nil
- }
- for _, ty := range types {
- defineStruct, ok := ty.(spec.DefineStruct)
- if ok {
- for index, member := range defineStruct.Members {
- tp, err := specTypeToDart(member.Type)
- if err != nil {
- return err
- }
- defineStruct.Members[index].Type = buildSpecType(member.Type, tp)
- }
- }
- }
- return nil
- }
|