/
generator.go
60 lines (48 loc) · 1.78 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
package main
import (
"bytes"
"fmt"
"strings"
"text/template"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
)
type generator struct{}
func (g *generator) Generate(req *plugin.CodeGeneratorRequest) *plugin.CodeGeneratorResponse {
resp := &plugin.CodeGeneratorResponse{}
for _, name := range req.FileToGenerate {
file := getFileDescriptor(req, name)
for _, service := range file.Service {
presenter := &serviceView{service, file}
resp.File = append(resp.File, generateFile(presenter, interfaceTemplate, presenter.InterfaceName()))
resp.File = append(resp.File, generateFile(presenter, exceptionTemplate, presenter.ExceptionName()))
resp.File = append(resp.File, generateFile(presenter, clientTemplate, presenter.ClassName()))
resp.File = append(resp.File, generateFile(presenter, stubTemplate, presenter.StubName()))
resp.File = append(resp.File, generateFile(presenter, noopTemplate, presenter.NoopName()))
}
}
return resp
}
func generateFile(presenter *serviceView, t *template.Template, name string) *plugin.CodeGeneratorResponse_File {
buffer := &bytes.Buffer{}
err := t.Execute(buffer, presenter)
if err != nil {
panic(err)
}
resp := &plugin.CodeGeneratorResponse_File{}
resp.Name = proto.String(getFileName(presenter.Namespace(), name))
resp.Content = proto.String(buffer.String())
return resp
}
func getFileDescriptor(req *plugin.CodeGeneratorRequest, name string) *descriptor.FileDescriptorProto {
for _, d := range req.ProtoFile {
if d.GetName() == name {
return d
}
}
panic(fmt.Errorf("could not find descriptor for %q", name))
}
func getFileName(ns, class string) string {
return strings.Join(strings.Split(ns, `\`), "/") + "/" + class + ".php"
}