forked from wailsapp/wails
/
models.go
103 lines (88 loc) · 2.46 KB
/
models.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package parser
import (
"bytes"
"embed"
"github.com/zappie/wails/v3/internal/flags"
"io"
"sort"
"strings"
"text/template"
)
//go:embed templates
var templates embed.FS
type ModelDefinitions struct {
Package string
Models map[string]*StructDef
Enums map[string]*TypeDef
Imports []*ImportDef
}
func (p *Project) GenerateModel(wr io.Writer, def *ModelDefinitions, options *flags.GenerateBindingsOptions) error {
templateName := "model.js.tmpl"
if options.TS {
templateName = "model.ts.tmpl"
if options.UseInterfaces {
templateName = "interfaces.ts.tmpl"
}
}
// Fix up TS names
for _, model := range def.Models {
model.Name = options.TSPrefix + model.Name + options.TSSuffix
}
tmpl, err := template.New(templateName).ParseFS(templates, "templates/"+templateName)
if err != nil {
println("Unable to create class template: " + err.Error())
return err
}
err = tmpl.ExecuteTemplate(wr, templateName, def)
if err != nil {
println("Problem executing template: " + err.Error())
return err
}
return nil
}
const modelsHeader = `// @ts-check
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
`
func pkgAlias(fullPkg string) string {
pkgParts := strings.Split(fullPkg, "/")
return pkgParts[len(pkgParts)-1]
}
type Model struct {
Package string
}
func (p *Project) GenerateModels(models map[packagePath]map[structName]*StructDef, enums map[packagePath]map[string]*TypeDef, options *flags.GenerateBindingsOptions) (map[packagePath]string, error) {
if models == nil && enums == nil {
return nil, nil
}
var result = make(map[packagePath]string)
// sort pkgs by alias (e.g. services) instead of full pkg name (e.g. github.com/wailsapp/zappie/somedir/services)
// and then sort resulting list by the alias
var keys []string
for pkg := range models {
keys = append(keys, pkg)
}
for pkg := range enums {
keys = append(keys, pkg)
}
sort.Slice(keys, func(i, j int) bool {
return pkgAlias(keys[i]) < pkgAlias(keys[j])
})
for _, pkg := range keys {
var buffer bytes.Buffer
buffer.WriteString(modelsHeader)
err := p.GenerateModel(&buffer, &ModelDefinitions{
Imports: p.calculateImports(pkg, models[pkg]),
Package: pkgAlias(pkg),
Models: models[pkg],
Enums: enums[pkg],
}, options)
if err != nil {
return nil, err
}
// Get the relative package path
relativePackageDir := p.RelativePackageDir(pkg)
result[relativePackageDir] = buffer.String()
}
return result, nil
}