-
Notifications
You must be signed in to change notification settings - Fork 0
/
generator.go
121 lines (102 loc) · 2.39 KB
/
generator.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package generator
import (
"encoding/json"
"fmt"
"github.com/dave/jennifer/jen"
"github.com/mlctrez/goapp-audioplayer/model/generate/spec"
"os"
"path/filepath"
"strings"
)
func Run() error {
return (&generator{}).run()
}
type generator struct {
spec *spec.Spec
qualifier string
webSocketMessageTypes map[string]bool
}
func (g *generator) initStruct() (err error) {
g.webSocketMessageTypes = map[string]bool{}
g.spec = &spec.Spec{}
return nil
}
func execute(functions ...func() error) (err error) {
for _, function := range functions {
if err = function(); err != nil {
return
}
}
return nil
}
func (g *generator) run() (err error) {
err = execute(
g.initStruct,
g.readSpec,
g.fillWebsocketTypes,
g.generateCommon,
g.generateRequestResponse,
g.generateWebsocketApi,
g.natsClientApi,
g.natsBackendApi,
)
return
}
func (g *generator) readSpec() (err error) {
var specBytes []byte
if specBytes, err = os.ReadFile("model/spec.json"); err != nil {
return
}
if err = json.Unmarshal(specBytes, g.spec); err != nil {
return
}
g.qualifier = filepath.Join(g.spec.Module, "model")
return
}
func (g *generator) newFile() *jen.File {
jp := jen.NewFilePath(g.qualifier)
jp.PackageComment("Package model is auto generated from model/spec.json - DO NOT EDIT")
return jp
}
func (g *generator) fillWebsocketTypes() (err error) {
for _, m := range g.spec.Methods {
g.webSocketMessageTypes[m.Request] = true
g.webSocketMessageTypes[m.Response] = true
}
return
}
func (g *generator) generateCommon() (err error) {
jp := g.newFile()
for _, t := range g.spec.Types {
if !g.webSocketMessageTypes[t.Name] {
jp.Line()
t.GenerateGo(jp, g.qualifier, false)
}
}
return g.render("common", jp)
}
func (g *generator) generateRequestResponse() (err error) {
for _, m := range g.spec.Methods {
jp := g.newFile()
for _, t := range g.spec.Types {
if t.Name == m.Response || t.Name == m.Request {
jp.Line()
t.GenerateGo(jp, g.qualifier, true)
}
}
if err = g.render(m.Name, jp); err != nil {
return
}
}
return
}
func (g *generator) render(name string, jf *jen.File) error {
goFileName := fmt.Sprintf("%s.go", strings.ToLower(name))
path := filepath.Join(filepath.Base(g.qualifier), goFileName)
create, err := os.Create(path)
if err != nil {
return err
}
defer func() { _ = create.Close() }()
return jf.Render(create)
}