/
generate.go
112 lines (95 loc) · 2.61 KB
/
generate.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
package internal
import (
"fmt"
"regexp"
"google.golang.org/protobuf/compiler/protogen"
)
var reg = regexp.MustCompile(`^(.*\.)`)
func Generate(gen *protogen.Plugin, f []*protogen.File, version string) error {
g := gen.NewGeneratedFile("options.go", "")
g.P("// Code generated by protoc-gen-go-webitel. DO NOT EDIT.")
g.P("// versions:")
g.P("// - protoc-gen-go-webitel v", version)
g.P("// - protoc ", protocVersion(gen))
g.P()
g.P("package ", f[0].GoPackageName)
g.P()
generateFileContent(gen, f, g)
return nil
}
func generateFileContent(gen *protogen.Plugin, files []*protogen.File, g *protogen.GeneratedFile) {
generateType(g)
g.P("var WebitelAPI = WebitelServicesInfo{")
for _, f := range files {
for _, s := range f.Proto.GetService() {
objclass, err := extractServiceObjClassOption(s)
if err != nil {
return
}
g.P(`"`, s.GetName(), `": WebitelServices{`)
g.P("ObjClass: ", `"`, objclass, `"`, ",")
g.P("WebitelMethods: map[string]WebitelMethod{")
for _, m := range s.GetMethod() {
acc, err := extractMethodAccessOption(m)
if err != nil {
return
}
ht, err := extractMethodHttpOption(m)
if err != nil {
return
}
g.P(`"`, m.GetName(), `": WebitelMethod{`)
g.P("Access: ", acc, ",")
g.P("Input: ", `"`, reg.ReplaceAllString(m.GetInputType(), ""), `",`)
g.P("Output: ", `"`, reg.ReplaceAllString(m.GetInputType(), ""), `",`)
g.P("HttpBindings: []*HttpBinding{")
for _, h := range ht {
g.P("{")
g.P("Path: ", `"`, h.Path, `",`)
g.P("Method: ", `"`, h.Method, `",`)
g.P("},")
}
g.P("},")
g.P("},")
}
g.P("},")
g.P("},")
}
}
g.P("}")
g.P()
}
func generateType(g *protogen.GeneratedFile) {
g.P("// WebitelServicesInfo is the list of services defined in proto files.")
g.P("type WebitelServicesInfo map[string]WebitelServices")
g.P()
g.P("type WebitelServices struct {")
g.P("ObjClass string")
g.P("WebitelMethods map[string]WebitelMethod")
g.P("}")
g.P()
g.P("// WebitelMethod is the list of methods defined in this service.")
g.P("type WebitelMethod struct {")
g.P("HttpBindings []*HttpBinding")
g.P("Access int")
g.P("Input string")
g.P("Output string")
g.P("}")
g.P()
g.P("type HttpBinding struct {")
g.P("Path string")
g.P("Method string")
g.P("}")
g.P()
}
func protocVersion(gen *protogen.Plugin) string {
v := gen.Request.GetCompilerVersion()
if v == nil {
return "(unknown)"
}
var suffix string
if s := v.GetSuffix(); s != "" {
suffix = "-" + s
}
return fmt.Sprintf("v%d.%d.%d%s", v.GetMajor(), v.GetMinor(), v.GetPatch(), suffix)
}