blob: 390d4e4be6b83a11fc1ef758422e5ee5a8bd1574 [file] [log] [blame]
Scott Baker2d897982019-09-24 11:50:08 -07001// Protocol Buffers for Go with Gadgets
2//
3// Copyright (c) 2013, The GoGo Authors. All rights reserved.
4// http://github.com/gogo/protobuf
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
9//
10// * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12// * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29package gogoproto
30
31import google_protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
32import proto "github.com/gogo/protobuf/proto"
33
34func IsEmbed(field *google_protobuf.FieldDescriptorProto) bool {
35 return proto.GetBoolExtension(field.Options, E_Embed, false)
36}
37
38func IsNullable(field *google_protobuf.FieldDescriptorProto) bool {
39 return proto.GetBoolExtension(field.Options, E_Nullable, true)
40}
41
42func IsStdTime(field *google_protobuf.FieldDescriptorProto) bool {
43 return proto.GetBoolExtension(field.Options, E_Stdtime, false)
44}
45
46func IsStdDuration(field *google_protobuf.FieldDescriptorProto) bool {
47 return proto.GetBoolExtension(field.Options, E_Stdduration, false)
48}
49
50func IsStdDouble(field *google_protobuf.FieldDescriptorProto) bool {
51 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.DoubleValue"
52}
53
54func IsStdFloat(field *google_protobuf.FieldDescriptorProto) bool {
55 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.FloatValue"
56}
57
58func IsStdInt64(field *google_protobuf.FieldDescriptorProto) bool {
59 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.Int64Value"
60}
61
62func IsStdUInt64(field *google_protobuf.FieldDescriptorProto) bool {
63 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.UInt64Value"
64}
65
66func IsStdInt32(field *google_protobuf.FieldDescriptorProto) bool {
67 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.Int32Value"
68}
69
70func IsStdUInt32(field *google_protobuf.FieldDescriptorProto) bool {
71 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.UInt32Value"
72}
73
74func IsStdBool(field *google_protobuf.FieldDescriptorProto) bool {
75 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.BoolValue"
76}
77
78func IsStdString(field *google_protobuf.FieldDescriptorProto) bool {
79 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.StringValue"
80}
81
82func IsStdBytes(field *google_protobuf.FieldDescriptorProto) bool {
83 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.BytesValue"
84}
85
86func IsStdType(field *google_protobuf.FieldDescriptorProto) bool {
87 return (IsStdTime(field) || IsStdDuration(field) ||
88 IsStdDouble(field) || IsStdFloat(field) ||
89 IsStdInt64(field) || IsStdUInt64(field) ||
90 IsStdInt32(field) || IsStdUInt32(field) ||
91 IsStdBool(field) ||
92 IsStdString(field) || IsStdBytes(field))
93}
94
95func IsWktPtr(field *google_protobuf.FieldDescriptorProto) bool {
96 return proto.GetBoolExtension(field.Options, E_Wktpointer, false)
97}
98
99func NeedsNilCheck(proto3 bool, field *google_protobuf.FieldDescriptorProto) bool {
100 nullable := IsNullable(field)
101 if field.IsMessage() || IsCustomType(field) {
102 return nullable
103 }
104 if proto3 {
105 return false
106 }
107 return nullable || *field.Type == google_protobuf.FieldDescriptorProto_TYPE_BYTES
108}
109
110func IsCustomType(field *google_protobuf.FieldDescriptorProto) bool {
111 typ := GetCustomType(field)
112 if len(typ) > 0 {
113 return true
114 }
115 return false
116}
117
118func IsCastType(field *google_protobuf.FieldDescriptorProto) bool {
119 typ := GetCastType(field)
120 if len(typ) > 0 {
121 return true
122 }
123 return false
124}
125
126func IsCastKey(field *google_protobuf.FieldDescriptorProto) bool {
127 typ := GetCastKey(field)
128 if len(typ) > 0 {
129 return true
130 }
131 return false
132}
133
134func IsCastValue(field *google_protobuf.FieldDescriptorProto) bool {
135 typ := GetCastValue(field)
136 if len(typ) > 0 {
137 return true
138 }
139 return false
140}
141
142func HasEnumDecl(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool {
143 return proto.GetBoolExtension(enum.Options, E_Enumdecl, proto.GetBoolExtension(file.Options, E_EnumdeclAll, true))
144}
145
146func HasTypeDecl(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
147 return proto.GetBoolExtension(message.Options, E_Typedecl, proto.GetBoolExtension(file.Options, E_TypedeclAll, true))
148}
149
150func GetCustomType(field *google_protobuf.FieldDescriptorProto) string {
151 if field == nil {
152 return ""
153 }
154 if field.Options != nil {
155 v, err := proto.GetExtension(field.Options, E_Customtype)
156 if err == nil && v.(*string) != nil {
157 return *(v.(*string))
158 }
159 }
160 return ""
161}
162
163func GetCastType(field *google_protobuf.FieldDescriptorProto) string {
164 if field == nil {
165 return ""
166 }
167 if field.Options != nil {
168 v, err := proto.GetExtension(field.Options, E_Casttype)
169 if err == nil && v.(*string) != nil {
170 return *(v.(*string))
171 }
172 }
173 return ""
174}
175
176func GetCastKey(field *google_protobuf.FieldDescriptorProto) string {
177 if field == nil {
178 return ""
179 }
180 if field.Options != nil {
181 v, err := proto.GetExtension(field.Options, E_Castkey)
182 if err == nil && v.(*string) != nil {
183 return *(v.(*string))
184 }
185 }
186 return ""
187}
188
189func GetCastValue(field *google_protobuf.FieldDescriptorProto) string {
190 if field == nil {
191 return ""
192 }
193 if field.Options != nil {
194 v, err := proto.GetExtension(field.Options, E_Castvalue)
195 if err == nil && v.(*string) != nil {
196 return *(v.(*string))
197 }
198 }
199 return ""
200}
201
202func IsCustomName(field *google_protobuf.FieldDescriptorProto) bool {
203 name := GetCustomName(field)
204 if len(name) > 0 {
205 return true
206 }
207 return false
208}
209
210func IsEnumCustomName(field *google_protobuf.EnumDescriptorProto) bool {
211 name := GetEnumCustomName(field)
212 if len(name) > 0 {
213 return true
214 }
215 return false
216}
217
218func IsEnumValueCustomName(field *google_protobuf.EnumValueDescriptorProto) bool {
219 name := GetEnumValueCustomName(field)
220 if len(name) > 0 {
221 return true
222 }
223 return false
224}
225
226func GetCustomName(field *google_protobuf.FieldDescriptorProto) string {
227 if field == nil {
228 return ""
229 }
230 if field.Options != nil {
231 v, err := proto.GetExtension(field.Options, E_Customname)
232 if err == nil && v.(*string) != nil {
233 return *(v.(*string))
234 }
235 }
236 return ""
237}
238
239func GetEnumCustomName(field *google_protobuf.EnumDescriptorProto) string {
240 if field == nil {
241 return ""
242 }
243 if field.Options != nil {
244 v, err := proto.GetExtension(field.Options, E_EnumCustomname)
245 if err == nil && v.(*string) != nil {
246 return *(v.(*string))
247 }
248 }
249 return ""
250}
251
252func GetEnumValueCustomName(field *google_protobuf.EnumValueDescriptorProto) string {
253 if field == nil {
254 return ""
255 }
256 if field.Options != nil {
257 v, err := proto.GetExtension(field.Options, E_EnumvalueCustomname)
258 if err == nil && v.(*string) != nil {
259 return *(v.(*string))
260 }
261 }
262 return ""
263}
264
265func GetJsonTag(field *google_protobuf.FieldDescriptorProto) *string {
266 if field == nil {
267 return nil
268 }
269 if field.Options != nil {
270 v, err := proto.GetExtension(field.Options, E_Jsontag)
271 if err == nil && v.(*string) != nil {
272 return (v.(*string))
273 }
274 }
275 return nil
276}
277
278func GetMoreTags(field *google_protobuf.FieldDescriptorProto) *string {
279 if field == nil {
280 return nil
281 }
282 if field.Options != nil {
283 v, err := proto.GetExtension(field.Options, E_Moretags)
284 if err == nil && v.(*string) != nil {
285 return (v.(*string))
286 }
287 }
288 return nil
289}
290
291type EnableFunc func(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool
292
293func EnabledGoEnumPrefix(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool {
294 return proto.GetBoolExtension(enum.Options, E_GoprotoEnumPrefix, proto.GetBoolExtension(file.Options, E_GoprotoEnumPrefixAll, true))
295}
296
297func EnabledGoStringer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
298 return proto.GetBoolExtension(message.Options, E_GoprotoStringer, proto.GetBoolExtension(file.Options, E_GoprotoStringerAll, true))
299}
300
301func HasGoGetters(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
302 return proto.GetBoolExtension(message.Options, E_GoprotoGetters, proto.GetBoolExtension(file.Options, E_GoprotoGettersAll, true))
303}
304
305func IsUnion(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
306 return proto.GetBoolExtension(message.Options, E_Onlyone, proto.GetBoolExtension(file.Options, E_OnlyoneAll, false))
307}
308
309func HasGoString(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
310 return proto.GetBoolExtension(message.Options, E_Gostring, proto.GetBoolExtension(file.Options, E_GostringAll, false))
311}
312
313func HasEqual(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
314 return proto.GetBoolExtension(message.Options, E_Equal, proto.GetBoolExtension(file.Options, E_EqualAll, false))
315}
316
317func HasVerboseEqual(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
318 return proto.GetBoolExtension(message.Options, E_VerboseEqual, proto.GetBoolExtension(file.Options, E_VerboseEqualAll, false))
319}
320
321func IsStringer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
322 return proto.GetBoolExtension(message.Options, E_Stringer, proto.GetBoolExtension(file.Options, E_StringerAll, false))
323}
324
325func IsFace(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
326 return proto.GetBoolExtension(message.Options, E_Face, proto.GetBoolExtension(file.Options, E_FaceAll, false))
327}
328
329func HasDescription(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
330 return proto.GetBoolExtension(message.Options, E_Description, proto.GetBoolExtension(file.Options, E_DescriptionAll, false))
331}
332
333func HasPopulate(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
334 return proto.GetBoolExtension(message.Options, E_Populate, proto.GetBoolExtension(file.Options, E_PopulateAll, false))
335}
336
337func HasTestGen(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
338 return proto.GetBoolExtension(message.Options, E_Testgen, proto.GetBoolExtension(file.Options, E_TestgenAll, false))
339}
340
341func HasBenchGen(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
342 return proto.GetBoolExtension(message.Options, E_Benchgen, proto.GetBoolExtension(file.Options, E_BenchgenAll, false))
343}
344
345func IsMarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
346 return proto.GetBoolExtension(message.Options, E_Marshaler, proto.GetBoolExtension(file.Options, E_MarshalerAll, false))
347}
348
349func IsUnmarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
350 return proto.GetBoolExtension(message.Options, E_Unmarshaler, proto.GetBoolExtension(file.Options, E_UnmarshalerAll, false))
351}
352
353func IsStableMarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
354 return proto.GetBoolExtension(message.Options, E_StableMarshaler, proto.GetBoolExtension(file.Options, E_StableMarshalerAll, false))
355}
356
357func IsSizer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
358 return proto.GetBoolExtension(message.Options, E_Sizer, proto.GetBoolExtension(file.Options, E_SizerAll, false))
359}
360
361func IsProtoSizer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
362 return proto.GetBoolExtension(message.Options, E_Protosizer, proto.GetBoolExtension(file.Options, E_ProtosizerAll, false))
363}
364
365func IsGoEnumStringer(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool {
366 return proto.GetBoolExtension(enum.Options, E_GoprotoEnumStringer, proto.GetBoolExtension(file.Options, E_GoprotoEnumStringerAll, true))
367}
368
369func IsEnumStringer(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool {
370 return proto.GetBoolExtension(enum.Options, E_EnumStringer, proto.GetBoolExtension(file.Options, E_EnumStringerAll, false))
371}
372
373func IsUnsafeMarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
374 return proto.GetBoolExtension(message.Options, E_UnsafeMarshaler, proto.GetBoolExtension(file.Options, E_UnsafeMarshalerAll, false))
375}
376
377func IsUnsafeUnmarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
378 return proto.GetBoolExtension(message.Options, E_UnsafeUnmarshaler, proto.GetBoolExtension(file.Options, E_UnsafeUnmarshalerAll, false))
379}
380
381func HasExtensionsMap(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
382 return proto.GetBoolExtension(message.Options, E_GoprotoExtensionsMap, proto.GetBoolExtension(file.Options, E_GoprotoExtensionsMapAll, true))
383}
384
385func HasUnrecognized(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
386 return proto.GetBoolExtension(message.Options, E_GoprotoUnrecognized, proto.GetBoolExtension(file.Options, E_GoprotoUnrecognizedAll, true))
387}
388
389func IsProto3(file *google_protobuf.FileDescriptorProto) bool {
390 return file.GetSyntax() == "proto3"
391}
392
393func ImportsGoGoProto(file *google_protobuf.FileDescriptorProto) bool {
394 return proto.GetBoolExtension(file.Options, E_GogoprotoImport, true)
395}
396
397func HasCompare(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
398 return proto.GetBoolExtension(message.Options, E_Compare, proto.GetBoolExtension(file.Options, E_CompareAll, false))
399}
400
401func RegistersGolangProto(file *google_protobuf.FileDescriptorProto) bool {
402 return proto.GetBoolExtension(file.Options, E_GoprotoRegistration, false)
403}
404
405func HasMessageName(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
406 return proto.GetBoolExtension(message.Options, E_Messagename, proto.GetBoolExtension(file.Options, E_MessagenameAll, false))
407}
408
409func HasSizecache(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
410 return proto.GetBoolExtension(message.Options, E_GoprotoSizecache, proto.GetBoolExtension(file.Options, E_GoprotoSizecacheAll, true))
411}
412
413func HasUnkeyed(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool {
414 return proto.GetBoolExtension(message.Options, E_GoprotoUnkeyed, proto.GetBoolExtension(file.Options, E_GoprotoUnkeyedAll, true))
415}