...
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
52 package defaultcheck
53
54 import (
55 "fmt"
56 "github.com/gogo/protobuf/gogoproto"
57 "github.com/gogo/protobuf/protoc-gen-gogo/generator"
58 "os"
59 )
60
61 type plugin struct {
62 *generator.Generator
63 }
64
65 func NewPlugin() *plugin {
66 return &plugin{}
67 }
68
69 func (p *plugin) Name() string {
70 return "defaultcheck"
71 }
72
73 func (p *plugin) Init(g *generator.Generator) {
74 p.Generator = g
75 }
76
77 func (p *plugin) Generate(file *generator.FileDescriptor) {
78 proto3 := gogoproto.IsProto3(file.FileDescriptorProto)
79 for _, msg := range file.Messages() {
80 getters := gogoproto.HasGoGetters(file.FileDescriptorProto, msg.DescriptorProto)
81 face := gogoproto.IsFace(file.FileDescriptorProto, msg.DescriptorProto)
82 for _, field := range msg.GetField() {
83 if len(field.GetDefaultValue()) > 0 {
84 if !getters {
85 fmt.Fprintf(os.Stderr, "ERROR: field %v.%v cannot have a default value and not have a getter method", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
86 os.Exit(1)
87 }
88 if face {
89 fmt.Fprintf(os.Stderr, "ERROR: field %v.%v cannot have a default value be in a face", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
90 os.Exit(1)
91 }
92 }
93 if gogoproto.IsNullable(field) {
94 continue
95 }
96 if len(field.GetDefaultValue()) > 0 {
97 fmt.Fprintf(os.Stderr, "ERROR: field %v.%v cannot be non-nullable and have a default value", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
98 os.Exit(1)
99 }
100 if !field.IsMessage() && !gogoproto.IsCustomType(field) {
101 if field.IsRepeated() {
102 fmt.Fprintf(os.Stderr, "WARNING: field %v.%v is a repeated non-nullable native type, nullable=false has no effect\n", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
103 } else if proto3 {
104 fmt.Fprintf(os.Stderr, "ERROR: field %v.%v is a native type and in proto3 syntax with nullable=false there exists conflicting implementations when encoding zero values", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
105 os.Exit(1)
106 }
107 if field.IsBytes() {
108 fmt.Fprintf(os.Stderr, "WARNING: field %v.%v is a non-nullable bytes type, nullable=false has no effect\n", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name))
109 }
110 }
111 if !field.IsEnum() {
112 continue
113 }
114 enum := p.ObjectNamed(field.GetTypeName()).(*generator.EnumDescriptor)
115 if len(enum.Value) == 0 || enum.Value[0].GetNumber() != 0 {
116 fmt.Fprintf(os.Stderr, "ERROR: field %v.%v cannot be non-nullable and be an enum type %v which does not start with zero", generator.CamelCase(*msg.Name), generator.CamelCase(*field.Name), enum.GetName())
117 os.Exit(1)
118 }
119 }
120 }
121 for _, e := range file.GetExtension() {
122 if !gogoproto.IsNullable(e) {
123 fmt.Fprintf(os.Stderr, "ERROR: extended field %v cannot be nullable %v", generator.CamelCase(e.GetName()), generator.CamelCase(*e.Name))
124 os.Exit(1)
125 }
126 }
127 }
128
129 func (p *plugin) GenerateImports(*generator.FileDescriptor) {}
130
131 func init() {
132 generator.RegisterPlugin(NewPlugin())
133 }
134
View as plain text