...
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
37 package oneofcheck
38
39 import (
40 "fmt"
41 "github.com/gogo/protobuf/gogoproto"
42 "github.com/gogo/protobuf/protoc-gen-gogo/generator"
43 "os"
44 )
45
46 type plugin struct {
47 *generator.Generator
48 }
49
50 func NewPlugin() *plugin {
51 return &plugin{}
52 }
53
54 func (p *plugin) Name() string {
55 return "oneofcheck"
56 }
57
58 func (p *plugin) Init(g *generator.Generator) {
59 p.Generator = g
60 }
61
62 func (p *plugin) Generate(file *generator.FileDescriptor) {
63 for _, msg := range file.Messages() {
64 face := gogoproto.IsFace(file.FileDescriptorProto, msg.DescriptorProto)
65 for _, field := range msg.GetField() {
66 if field.OneofIndex == nil {
67 continue
68 }
69 if face {
70 fmt.Fprintf(os.Stderr, "ERROR: field %v.%v cannot be in a face and oneof\n", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
71 os.Exit(1)
72 }
73 if gogoproto.IsEmbed(field) {
74 fmt.Fprintf(os.Stderr, "ERROR: field %v.%v cannot be in an oneof and an embedded field\n", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
75 os.Exit(1)
76 }
77 if !gogoproto.IsNullable(field) {
78 fmt.Fprintf(os.Stderr, "ERROR: field %v.%v cannot be in an oneof and a non-nullable field\n", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
79 os.Exit(1)
80 }
81 if gogoproto.IsUnion(file.FileDescriptorProto, msg.DescriptorProto) {
82 fmt.Fprintf(os.Stderr, "ERROR: field %v.%v cannot be in an oneof and in an union (deprecated)\n", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
83 os.Exit(1)
84 }
85 }
86 }
87 }
88
89 func (p *plugin) GenerateImports(*generator.FileDescriptor) {}
90
91 func init() {
92 generator.RegisterPlugin(NewPlugin())
93 }
94
View as plain text