github.com/gogo/protobuf@v1.3.2/gogoproto/helper.go (about) 1 // 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 29 package gogoproto 30 31 import google_protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" 32 import proto "github.com/gogo/protobuf/proto" 33 34 func IsEmbed(field *google_protobuf.FieldDescriptorProto) bool { 35 return proto.GetBoolExtension(field.Options, E_Embed, false) 36 } 37 38 func IsNullable(field *google_protobuf.FieldDescriptorProto) bool { 39 return proto.GetBoolExtension(field.Options, E_Nullable, true) 40 } 41 42 func IsStdTime(field *google_protobuf.FieldDescriptorProto) bool { 43 return proto.GetBoolExtension(field.Options, E_Stdtime, false) 44 } 45 46 func IsStdDuration(field *google_protobuf.FieldDescriptorProto) bool { 47 return proto.GetBoolExtension(field.Options, E_Stdduration, false) 48 } 49 50 func IsStdDouble(field *google_protobuf.FieldDescriptorProto) bool { 51 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.DoubleValue" 52 } 53 54 func IsStdFloat(field *google_protobuf.FieldDescriptorProto) bool { 55 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.FloatValue" 56 } 57 58 func IsStdInt64(field *google_protobuf.FieldDescriptorProto) bool { 59 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.Int64Value" 60 } 61 62 func IsStdUInt64(field *google_protobuf.FieldDescriptorProto) bool { 63 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.UInt64Value" 64 } 65 66 func IsStdInt32(field *google_protobuf.FieldDescriptorProto) bool { 67 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.Int32Value" 68 } 69 70 func IsStdUInt32(field *google_protobuf.FieldDescriptorProto) bool { 71 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.UInt32Value" 72 } 73 74 func IsStdBool(field *google_protobuf.FieldDescriptorProto) bool { 75 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.BoolValue" 76 } 77 78 func IsStdString(field *google_protobuf.FieldDescriptorProto) bool { 79 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.StringValue" 80 } 81 82 func IsStdBytes(field *google_protobuf.FieldDescriptorProto) bool { 83 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.BytesValue" 84 } 85 86 func 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 95 func IsWktPtr(field *google_protobuf.FieldDescriptorProto) bool { 96 return proto.GetBoolExtension(field.Options, E_Wktpointer, false) 97 } 98 99 func 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 110 func IsCustomType(field *google_protobuf.FieldDescriptorProto) bool { 111 typ := GetCustomType(field) 112 if len(typ) > 0 { 113 return true 114 } 115 return false 116 } 117 118 func IsCastType(field *google_protobuf.FieldDescriptorProto) bool { 119 typ := GetCastType(field) 120 if len(typ) > 0 { 121 return true 122 } 123 return false 124 } 125 126 func IsCastKey(field *google_protobuf.FieldDescriptorProto) bool { 127 typ := GetCastKey(field) 128 if len(typ) > 0 { 129 return true 130 } 131 return false 132 } 133 134 func IsCastValue(field *google_protobuf.FieldDescriptorProto) bool { 135 typ := GetCastValue(field) 136 if len(typ) > 0 { 137 return true 138 } 139 return false 140 } 141 142 func 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 146 func 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 150 func 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 163 func 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 176 func 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 189 func 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 202 func IsCustomName(field *google_protobuf.FieldDescriptorProto) bool { 203 name := GetCustomName(field) 204 if len(name) > 0 { 205 return true 206 } 207 return false 208 } 209 210 func IsEnumCustomName(field *google_protobuf.EnumDescriptorProto) bool { 211 name := GetEnumCustomName(field) 212 if len(name) > 0 { 213 return true 214 } 215 return false 216 } 217 218 func IsEnumValueCustomName(field *google_protobuf.EnumValueDescriptorProto) bool { 219 name := GetEnumValueCustomName(field) 220 if len(name) > 0 { 221 return true 222 } 223 return false 224 } 225 226 func 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 239 func 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 252 func 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 265 func 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 278 func 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 291 type EnableFunc func(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool 292 293 func 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 297 func 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 301 func 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 305 func 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 309 func 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 313 func 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 317 func 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 321 func 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 325 func 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 329 func 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 333 func 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 337 func 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 341 func 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 345 func 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 349 func 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 353 func 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 357 func 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 361 func 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 365 func 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 369 func 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 373 func 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 377 func 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 381 func 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 385 func 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 389 func IsProto3(file *google_protobuf.FileDescriptorProto) bool { 390 return file.GetSyntax() == "proto3" 391 } 392 393 func ImportsGoGoProto(file *google_protobuf.FileDescriptorProto) bool { 394 return proto.GetBoolExtension(file.Options, E_GogoprotoImport, true) 395 } 396 397 func 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 401 func RegistersGolangProto(file *google_protobuf.FileDescriptorProto) bool { 402 return proto.GetBoolExtension(file.Options, E_GoprotoRegistration, false) 403 } 404 405 func 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 409 func 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 413 func 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 }