...
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
40 package enumstringer
41
42 import (
43 "github.com/gogo/protobuf/gogoproto"
44 "github.com/gogo/protobuf/protoc-gen-gogo/generator"
45 )
46
47 type enumstringer struct {
48 *generator.Generator
49 generator.PluginImports
50 atleastOne bool
51 localName string
52 }
53
54 func NewEnumStringer() *enumstringer {
55 return &enumstringer{}
56 }
57
58 func (p *enumstringer) Name() string {
59 return "enumstringer"
60 }
61
62 func (p *enumstringer) Init(g *generator.Generator) {
63 p.Generator = g
64 }
65
66 func (p *enumstringer) Generate(file *generator.FileDescriptor) {
67 p.PluginImports = generator.NewPluginImports(p.Generator)
68 p.atleastOne = false
69
70 p.localName = generator.FileName(file)
71
72 strconvPkg := p.NewImport("strconv")
73
74 for _, enum := range file.Enums() {
75 if !gogoproto.IsEnumStringer(file.FileDescriptorProto, enum.EnumDescriptorProto) {
76 continue
77 }
78 if gogoproto.IsGoEnumStringer(file.FileDescriptorProto, enum.EnumDescriptorProto) {
79 panic("Go enum stringer conflicts with new enumstringer plugin: please use gogoproto.goproto_enum_stringer or gogoproto.goproto_enum_string_all and set it to false")
80 }
81 p.atleastOne = true
82 ccTypeName := generator.CamelCaseSlice(enum.TypeName())
83 p.P("func (x ", ccTypeName, ") String() string {")
84 p.In()
85 p.P(`s, ok := `, ccTypeName, `_name[int32(x)]`)
86 p.P(`if ok {`)
87 p.In()
88 p.P(`return s`)
89 p.Out()
90 p.P(`}`)
91 p.P(`return `, strconvPkg.Use(), `.Itoa(int(x))`)
92 p.Out()
93 p.P(`}`)
94 }
95
96 if !p.atleastOne {
97 return
98 }
99
100 }
101
102 func init() {
103 generator.RegisterPlugin(NewEnumStringer())
104 }
105
View as plain text