github.com/whiteCcinn/protobuf-go@v1.0.9/types/dynamicpb/dynamic.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package dynamicpb creates protocol buffer messages using runtime type information. 6 package dynamicpb 7 8 import ( 9 "math" 10 11 "github.com/whiteCcinn/protobuf-go/internal/errors" 12 "github.com/whiteCcinn/protobuf-go/reflect/protoreflect" 13 "github.com/whiteCcinn/protobuf-go/runtime/protoiface" 14 "github.com/whiteCcinn/protobuf-go/runtime/protoimpl" 15 ) 16 17 // enum is a dynamic protoreflect.Enum. 18 type enum struct { 19 num protoreflect.EnumNumber 20 typ protoreflect.EnumType 21 } 22 23 func (e enum) Descriptor() protoreflect.EnumDescriptor { return e.typ.Descriptor() } 24 func (e enum) Type() protoreflect.EnumType { return e.typ } 25 func (e enum) Number() protoreflect.EnumNumber { return e.num } 26 27 // enumType is a dynamic protoreflect.EnumType. 28 type enumType struct { 29 desc protoreflect.EnumDescriptor 30 } 31 32 // NewEnumType creates a new EnumType with the provided descriptor. 33 // 34 // EnumTypes created by this package are equal if their descriptors are equal. 35 // That is, if ed1 == ed2, then NewEnumType(ed1) == NewEnumType(ed2). 36 // 37 // Enum values created by the EnumType are equal if their numbers are equal. 38 func NewEnumType(desc protoreflect.EnumDescriptor) protoreflect.EnumType { 39 return enumType{desc} 40 } 41 42 func (et enumType) New(n protoreflect.EnumNumber) protoreflect.Enum { return enum{n, et} } 43 func (et enumType) Descriptor() protoreflect.EnumDescriptor { return et.desc } 44 45 // extensionType is a dynamic protoreflect.ExtensionType. 46 type extensionType struct { 47 desc extensionTypeDescriptor 48 } 49 50 // A Message is a dynamically constructed protocol buffer message. 51 // 52 // Message implements the proto.Message interface, and may be used with all 53 // standard proto package functions such as Marshal, Unmarshal, and so forth. 54 // 55 // Message also implements the protoreflect.Message interface. See the protoreflect 56 // package documentation for that interface for how to get and set fields and 57 // otherwise interact with the contents of a Message. 58 // 59 // Reflection API functions which construct messages, such as NewField, 60 // return new dynamic messages of the appropriate type. Functions which take 61 // messages, such as Set for a message-value field, will accept any message 62 // with a compatible type. 63 // 64 // Operations which modify a Message are not safe for concurrent use. 65 type Message struct { 66 typ messageType 67 known map[protoreflect.FieldNumber]protoreflect.Value 68 ext map[protoreflect.FieldNumber]protoreflect.FieldDescriptor 69 unknown protoreflect.RawFields 70 } 71 72 var ( 73 _ protoreflect.Message = (*Message)(nil) 74 _ protoreflect.ProtoMessage = (*Message)(nil) 75 _ protoiface.MessageV1 = (*Message)(nil) 76 ) 77 78 // NewMessage creates a new message with the provided descriptor. 79 func NewMessage(desc protoreflect.MessageDescriptor) *Message { 80 return &Message{ 81 typ: messageType{desc}, 82 known: make(map[protoreflect.FieldNumber]protoreflect.Value), 83 ext: make(map[protoreflect.FieldNumber]protoreflect.FieldDescriptor), 84 } 85 } 86 87 // ProtoMessage implements the legacy message interface. 88 func (m *Message) ProtoMessage() {} 89 90 // ProtoReflect implements the protoreflect.ProtoMessage interface. 91 func (m *Message) ProtoReflect() protoreflect.Message { 92 return m 93 } 94 95 // String returns a string representation of a message. 96 func (m *Message) String() string { 97 return protoimpl.X.MessageStringOf(m) 98 } 99 100 // Reset clears the message to be empty, but preserves the dynamic message type. 101 func (m *Message) Reset() { 102 m.known = make(map[protoreflect.FieldNumber]protoreflect.Value) 103 m.ext = make(map[protoreflect.FieldNumber]protoreflect.FieldDescriptor) 104 m.unknown = nil 105 } 106 107 // Descriptor returns the message descriptor. 108 func (m *Message) Descriptor() protoreflect.MessageDescriptor { 109 return m.typ.desc 110 } 111 112 // Type returns the message type. 113 func (m *Message) Type() protoreflect.MessageType { 114 return m.typ 115 } 116 117 // New returns a newly allocated empty message with the same descriptor. 118 // See protoreflect.Message for details. 119 func (m *Message) New() protoreflect.Message { 120 return m.Type().New() 121 } 122 123 // Interface returns the message. 124 // See protoreflect.Message for details. 125 func (m *Message) Interface() protoreflect.ProtoMessage { 126 return m 127 } 128 129 // ProtoMethods is an internal detail of the protoreflect.Message interface. 130 // Users should never call this directly. 131 func (m *Message) ProtoMethods() *protoiface.Methods { 132 return nil 133 } 134 135 // Range visits every populated field in undefined order. 136 // See protoreflect.Message for details. 137 func (m *Message) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { 138 for num, v := range m.known { 139 fd := m.ext[num] 140 if fd == nil { 141 fd = m.Descriptor().Fields().ByNumber(num) 142 } 143 if !isSet(fd, v) { 144 continue 145 } 146 if !f(fd, v) { 147 return 148 } 149 } 150 } 151 152 // Has reports whether a field is populated. 153 // See protoreflect.Message for details. 154 func (m *Message) Has(fd protoreflect.FieldDescriptor) bool { 155 m.checkField(fd) 156 if fd.IsExtension() && m.ext[fd.Number()] != fd { 157 return false 158 } 159 v, ok := m.known[fd.Number()] 160 if !ok { 161 return false 162 } 163 return isSet(fd, v) 164 } 165 166 // Clear clears a field. 167 // See protoreflect.Message for details. 168 func (m *Message) Clear(fd protoreflect.FieldDescriptor) { 169 m.checkField(fd) 170 num := fd.Number() 171 delete(m.known, num) 172 delete(m.ext, num) 173 } 174 175 // Get returns the value of a field. 176 // See protoreflect.Message for details. 177 func (m *Message) Get(fd protoreflect.FieldDescriptor) protoreflect.Value { 178 m.checkField(fd) 179 num := fd.Number() 180 if fd.IsExtension() { 181 if fd != m.ext[num] { 182 return fd.(protoreflect.ExtensionTypeDescriptor).Type().Zero() 183 } 184 return m.known[num] 185 } 186 if v, ok := m.known[num]; ok { 187 switch { 188 case fd.IsMap(): 189 if v.Map().Len() > 0 { 190 return v 191 } 192 case fd.IsList(): 193 if v.List().Len() > 0 { 194 return v 195 } 196 default: 197 return v 198 } 199 } 200 switch { 201 case fd.IsMap(): 202 return protoreflect.ValueOfMap(&dynamicMap{desc: fd}) 203 case fd.IsList(): 204 return protoreflect.ValueOfList(emptyList{desc: fd}) 205 case fd.Message() != nil: 206 return protoreflect.ValueOfMessage(&Message{typ: messageType{fd.Message()}}) 207 case fd.Kind() == protoreflect.BytesKind: 208 return protoreflect.ValueOfBytes(append([]byte(nil), fd.Default().Bytes()...)) 209 default: 210 return fd.Default() 211 } 212 } 213 214 // Mutable returns a mutable reference to a repeated, map, or message field. 215 // See protoreflect.Message for details. 216 func (m *Message) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { 217 m.checkField(fd) 218 if !fd.IsMap() && !fd.IsList() && fd.Message() == nil { 219 panic(errors.New("%v: getting mutable reference to non-composite type", fd.FullName())) 220 } 221 if m.known == nil { 222 panic(errors.New("%v: modification of read-only message", fd.FullName())) 223 } 224 num := fd.Number() 225 if fd.IsExtension() { 226 if fd != m.ext[num] { 227 m.ext[num] = fd 228 m.known[num] = fd.(protoreflect.ExtensionTypeDescriptor).Type().New() 229 } 230 return m.known[num] 231 } 232 if v, ok := m.known[num]; ok { 233 return v 234 } 235 m.clearOtherOneofFields(fd) 236 m.known[num] = m.NewField(fd) 237 if fd.IsExtension() { 238 m.ext[num] = fd 239 } 240 return m.known[num] 241 } 242 243 // Set stores a value in a field. 244 // See protoreflect.Message for details. 245 func (m *Message) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) { 246 m.checkField(fd) 247 if m.known == nil { 248 panic(errors.New("%v: modification of read-only message", fd.FullName())) 249 } 250 if fd.IsExtension() { 251 isValid := true 252 switch { 253 case !fd.(protoreflect.ExtensionTypeDescriptor).Type().IsValidValue(v): 254 isValid = false 255 case fd.IsList(): 256 isValid = v.List().IsValid() 257 case fd.IsMap(): 258 isValid = v.Map().IsValid() 259 case fd.Message() != nil: 260 isValid = v.Message().IsValid() 261 } 262 if !isValid { 263 panic(errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface())) 264 } 265 m.ext[fd.Number()] = fd 266 } else { 267 typecheck(fd, v) 268 } 269 m.clearOtherOneofFields(fd) 270 m.known[fd.Number()] = v 271 } 272 273 func (m *Message) clearOtherOneofFields(fd protoreflect.FieldDescriptor) { 274 od := fd.ContainingOneof() 275 if od == nil { 276 return 277 } 278 num := fd.Number() 279 for i := 0; i < od.Fields().Len(); i++ { 280 if n := od.Fields().Get(i).Number(); n != num { 281 delete(m.known, n) 282 } 283 } 284 } 285 286 // NewField returns a new value for assignable to the field of a given descriptor. 287 // See protoreflect.Message for details. 288 func (m *Message) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { 289 m.checkField(fd) 290 switch { 291 case fd.IsExtension(): 292 return fd.(protoreflect.ExtensionTypeDescriptor).Type().New() 293 case fd.IsMap(): 294 return protoreflect.ValueOfMap(&dynamicMap{ 295 desc: fd, 296 mapv: make(map[interface{}]protoreflect.Value), 297 }) 298 case fd.IsList(): 299 return protoreflect.ValueOfList(&dynamicList{desc: fd}) 300 case fd.Message() != nil: 301 return protoreflect.ValueOfMessage(NewMessage(fd.Message()).ProtoReflect()) 302 default: 303 return fd.Default() 304 } 305 } 306 307 // WhichOneof reports which field in a oneof is populated, returning nil if none are populated. 308 // See protoreflect.Message for details. 309 func (m *Message) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { 310 for i := 0; i < od.Fields().Len(); i++ { 311 fd := od.Fields().Get(i) 312 if m.Has(fd) { 313 return fd 314 } 315 } 316 return nil 317 } 318 319 // GetUnknown returns the raw unknown fields. 320 // See protoreflect.Message for details. 321 func (m *Message) GetUnknown() protoreflect.RawFields { 322 return m.unknown 323 } 324 325 // SetUnknown sets the raw unknown fields. 326 // See protoreflect.Message for details. 327 func (m *Message) SetUnknown(r protoreflect.RawFields) { 328 if m.known == nil { 329 panic(errors.New("%v: modification of read-only message", m.typ.desc.FullName())) 330 } 331 m.unknown = r 332 } 333 334 // IsValid reports whether the message is valid. 335 // See protoreflect.Message for details. 336 func (m *Message) IsValid() bool { 337 return m.known != nil 338 } 339 340 func (m *Message) checkField(fd protoreflect.FieldDescriptor) { 341 if fd.IsExtension() && fd.ContainingMessage().FullName() == m.Descriptor().FullName() { 342 if _, ok := fd.(protoreflect.ExtensionTypeDescriptor); !ok { 343 panic(errors.New("%v: extension field descriptor does not implement ExtensionTypeDescriptor", fd.FullName())) 344 } 345 return 346 } 347 if fd.Parent() == m.Descriptor() { 348 return 349 } 350 fields := m.Descriptor().Fields() 351 index := fd.Index() 352 if index >= fields.Len() || fields.Get(index) != fd { 353 panic(errors.New("%v: field descriptor does not belong to this message", fd.FullName())) 354 } 355 } 356 357 type messageType struct { 358 desc protoreflect.MessageDescriptor 359 } 360 361 // NewMessageType creates a new MessageType with the provided descriptor. 362 // 363 // MessageTypes created by this package are equal if their descriptors are equal. 364 // That is, if md1 == md2, then NewMessageType(md1) == NewMessageType(md2). 365 func NewMessageType(desc protoreflect.MessageDescriptor) protoreflect.MessageType { 366 return messageType{desc} 367 } 368 369 func (mt messageType) New() protoreflect.Message { return NewMessage(mt.desc) } 370 func (mt messageType) Zero() protoreflect.Message { return &Message{typ: messageType{mt.desc}} } 371 func (mt messageType) Descriptor() protoreflect.MessageDescriptor { return mt.desc } 372 func (mt messageType) Enum(i int) protoreflect.EnumType { 373 if ed := mt.desc.Fields().Get(i).Enum(); ed != nil { 374 return NewEnumType(ed) 375 } 376 return nil 377 } 378 func (mt messageType) Message(i int) protoreflect.MessageType { 379 if md := mt.desc.Fields().Get(i).Message(); md != nil { 380 return NewMessageType(md) 381 } 382 return nil 383 } 384 385 type emptyList struct { 386 desc protoreflect.FieldDescriptor 387 } 388 389 func (x emptyList) Len() int { return 0 } 390 func (x emptyList) Get(n int) protoreflect.Value { panic(errors.New("out of range")) } 391 func (x emptyList) Set(n int, v protoreflect.Value) { 392 panic(errors.New("modification of immutable list")) 393 } 394 func (x emptyList) Append(v protoreflect.Value) { panic(errors.New("modification of immutable list")) } 395 func (x emptyList) AppendMutable() protoreflect.Value { 396 panic(errors.New("modification of immutable list")) 397 } 398 func (x emptyList) Truncate(n int) { panic(errors.New("modification of immutable list")) } 399 func (x emptyList) NewElement() protoreflect.Value { return newListEntry(x.desc) } 400 func (x emptyList) IsValid() bool { return false } 401 402 type dynamicList struct { 403 desc protoreflect.FieldDescriptor 404 list []protoreflect.Value 405 } 406 407 func (x *dynamicList) Len() int { 408 return len(x.list) 409 } 410 411 func (x *dynamicList) Get(n int) protoreflect.Value { 412 return x.list[n] 413 } 414 415 func (x *dynamicList) Set(n int, v protoreflect.Value) { 416 typecheckSingular(x.desc, v) 417 x.list[n] = v 418 } 419 420 func (x *dynamicList) Append(v protoreflect.Value) { 421 typecheckSingular(x.desc, v) 422 x.list = append(x.list, v) 423 } 424 425 func (x *dynamicList) AppendMutable() protoreflect.Value { 426 if x.desc.Message() == nil { 427 panic(errors.New("%v: invalid AppendMutable on list with non-message type", x.desc.FullName())) 428 } 429 v := x.NewElement() 430 x.Append(v) 431 return v 432 } 433 434 func (x *dynamicList) Truncate(n int) { 435 // Zero truncated elements to avoid keeping data live. 436 for i := n; i < len(x.list); i++ { 437 x.list[i] = protoreflect.Value{} 438 } 439 x.list = x.list[:n] 440 } 441 442 func (x *dynamicList) NewElement() protoreflect.Value { 443 return newListEntry(x.desc) 444 } 445 446 func (x *dynamicList) IsValid() bool { 447 return true 448 } 449 450 type dynamicMap struct { 451 desc protoreflect.FieldDescriptor 452 mapv map[interface{}]protoreflect.Value 453 } 454 455 func (x *dynamicMap) Get(k protoreflect.MapKey) protoreflect.Value { return x.mapv[k.Interface()] } 456 func (x *dynamicMap) Set(k protoreflect.MapKey, v protoreflect.Value) { 457 typecheckSingular(x.desc.MapKey(), k.Value()) 458 typecheckSingular(x.desc.MapValue(), v) 459 x.mapv[k.Interface()] = v 460 } 461 func (x *dynamicMap) Has(k protoreflect.MapKey) bool { return x.Get(k).IsValid() } 462 func (x *dynamicMap) Clear(k protoreflect.MapKey) { delete(x.mapv, k.Interface()) } 463 func (x *dynamicMap) Mutable(k protoreflect.MapKey) protoreflect.Value { 464 if x.desc.MapValue().Message() == nil { 465 panic(errors.New("%v: invalid Mutable on map with non-message value type", x.desc.FullName())) 466 } 467 v := x.Get(k) 468 if !v.IsValid() { 469 v = x.NewValue() 470 x.Set(k, v) 471 } 472 return v 473 } 474 func (x *dynamicMap) Len() int { return len(x.mapv) } 475 func (x *dynamicMap) NewValue() protoreflect.Value { 476 if md := x.desc.MapValue().Message(); md != nil { 477 return protoreflect.ValueOfMessage(NewMessage(md).ProtoReflect()) 478 } 479 return x.desc.MapValue().Default() 480 } 481 func (x *dynamicMap) IsValid() bool { 482 return x.mapv != nil 483 } 484 485 func (x *dynamicMap) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) { 486 for k, v := range x.mapv { 487 if !f(protoreflect.ValueOf(k).MapKey(), v) { 488 return 489 } 490 } 491 } 492 493 func isSet(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { 494 switch { 495 case fd.IsMap(): 496 return v.Map().Len() > 0 497 case fd.IsList(): 498 return v.List().Len() > 0 499 case fd.ContainingOneof() != nil: 500 return true 501 case fd.Syntax() == protoreflect.Proto3 && !fd.IsExtension(): 502 switch fd.Kind() { 503 case protoreflect.BoolKind: 504 return v.Bool() 505 case protoreflect.EnumKind: 506 return v.Enum() != 0 507 case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed32Kind, protoreflect.Sfixed64Kind: 508 return v.Int() != 0 509 case protoreflect.Uint32Kind, protoreflect.Uint64Kind, protoreflect.Fixed32Kind, protoreflect.Fixed64Kind: 510 return v.Uint() != 0 511 case protoreflect.FloatKind, protoreflect.DoubleKind: 512 return v.Float() != 0 || math.Signbit(v.Float()) 513 case protoreflect.StringKind: 514 return v.String() != "" 515 case protoreflect.BytesKind: 516 return len(v.Bytes()) > 0 517 } 518 } 519 return true 520 } 521 522 func typecheck(fd protoreflect.FieldDescriptor, v protoreflect.Value) { 523 if err := typeIsValid(fd, v); err != nil { 524 panic(err) 525 } 526 } 527 528 func typeIsValid(fd protoreflect.FieldDescriptor, v protoreflect.Value) error { 529 switch { 530 case !v.IsValid(): 531 return errors.New("%v: assigning invalid value", fd.FullName()) 532 case fd.IsMap(): 533 if mapv, ok := v.Interface().(*dynamicMap); !ok || mapv.desc != fd || !mapv.IsValid() { 534 return errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface()) 535 } 536 return nil 537 case fd.IsList(): 538 switch list := v.Interface().(type) { 539 case *dynamicList: 540 if list.desc == fd && list.IsValid() { 541 return nil 542 } 543 case emptyList: 544 if list.desc == fd && list.IsValid() { 545 return nil 546 } 547 } 548 return errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface()) 549 default: 550 return singularTypeIsValid(fd, v) 551 } 552 } 553 554 func typecheckSingular(fd protoreflect.FieldDescriptor, v protoreflect.Value) { 555 if err := singularTypeIsValid(fd, v); err != nil { 556 panic(err) 557 } 558 } 559 560 func singularTypeIsValid(fd protoreflect.FieldDescriptor, v protoreflect.Value) error { 561 vi := v.Interface() 562 var ok bool 563 switch fd.Kind() { 564 case protoreflect.BoolKind: 565 _, ok = vi.(bool) 566 case protoreflect.EnumKind: 567 // We could check against the valid set of enum values, but do not. 568 _, ok = vi.(protoreflect.EnumNumber) 569 case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: 570 _, ok = vi.(int32) 571 case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: 572 _, ok = vi.(uint32) 573 case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: 574 _, ok = vi.(int64) 575 case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: 576 _, ok = vi.(uint64) 577 case protoreflect.FloatKind: 578 _, ok = vi.(float32) 579 case protoreflect.DoubleKind: 580 _, ok = vi.(float64) 581 case protoreflect.StringKind: 582 _, ok = vi.(string) 583 case protoreflect.BytesKind: 584 _, ok = vi.([]byte) 585 case protoreflect.MessageKind, protoreflect.GroupKind: 586 var m protoreflect.Message 587 m, ok = vi.(protoreflect.Message) 588 if ok && m.Descriptor().FullName() != fd.Message().FullName() { 589 return errors.New("%v: assigning invalid message type %v", fd.FullName(), m.Descriptor().FullName()) 590 } 591 if dm, ok := vi.(*Message); ok && dm.known == nil { 592 return errors.New("%v: assigning invalid zero-value message", fd.FullName()) 593 } 594 } 595 if !ok { 596 return errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface()) 597 } 598 return nil 599 } 600 601 func newListEntry(fd protoreflect.FieldDescriptor) protoreflect.Value { 602 switch fd.Kind() { 603 case protoreflect.BoolKind: 604 return protoreflect.ValueOfBool(false) 605 case protoreflect.EnumKind: 606 return protoreflect.ValueOfEnum(fd.Enum().Values().Get(0).Number()) 607 case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: 608 return protoreflect.ValueOfInt32(0) 609 case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: 610 return protoreflect.ValueOfUint32(0) 611 case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: 612 return protoreflect.ValueOfInt64(0) 613 case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: 614 return protoreflect.ValueOfUint64(0) 615 case protoreflect.FloatKind: 616 return protoreflect.ValueOfFloat32(0) 617 case protoreflect.DoubleKind: 618 return protoreflect.ValueOfFloat64(0) 619 case protoreflect.StringKind: 620 return protoreflect.ValueOfString("") 621 case protoreflect.BytesKind: 622 return protoreflect.ValueOfBytes(nil) 623 case protoreflect.MessageKind, protoreflect.GroupKind: 624 return protoreflect.ValueOfMessage(NewMessage(fd.Message()).ProtoReflect()) 625 } 626 panic(errors.New("%v: unknown kind %v", fd.FullName(), fd.Kind())) 627 } 628 629 // NewExtensionType creates a new ExtensionType with the provided descriptor. 630 // 631 // Dynamic ExtensionTypes with the same descriptor compare as equal. That is, 632 // if xd1 == xd2, then NewExtensionType(xd1) == NewExtensionType(xd2). 633 // 634 // The InterfaceOf and ValueOf methods of the extension type are defined as: 635 // 636 // func (xt extensionType) ValueOf(iv interface{}) protoreflect.Value { 637 // return protoreflect.ValueOf(iv) 638 // } 639 // 640 // func (xt extensionType) InterfaceOf(v protoreflect.Value) interface{} { 641 // return v.Interface() 642 // } 643 // 644 // The Go type used by the proto.GetExtension and proto.SetExtension functions 645 // is determined by these methods, and is therefore equivalent to the Go type 646 // used to represent a protoreflect.Value. See the protoreflect.Value 647 // documentation for more details. 648 func NewExtensionType(desc protoreflect.ExtensionDescriptor) protoreflect.ExtensionType { 649 if xt, ok := desc.(protoreflect.ExtensionTypeDescriptor); ok { 650 desc = xt.Descriptor() 651 } 652 return extensionType{extensionTypeDescriptor{desc}} 653 } 654 655 func (xt extensionType) New() protoreflect.Value { 656 switch { 657 case xt.desc.IsMap(): 658 return protoreflect.ValueOfMap(&dynamicMap{ 659 desc: xt.desc, 660 mapv: make(map[interface{}]protoreflect.Value), 661 }) 662 case xt.desc.IsList(): 663 return protoreflect.ValueOfList(&dynamicList{desc: xt.desc}) 664 case xt.desc.Message() != nil: 665 return protoreflect.ValueOfMessage(NewMessage(xt.desc.Message())) 666 default: 667 return xt.desc.Default() 668 } 669 } 670 671 func (xt extensionType) Zero() protoreflect.Value { 672 switch { 673 case xt.desc.IsMap(): 674 return protoreflect.ValueOfMap(&dynamicMap{desc: xt.desc}) 675 case xt.desc.Cardinality() == protoreflect.Repeated: 676 return protoreflect.ValueOfList(emptyList{desc: xt.desc}) 677 case xt.desc.Message() != nil: 678 return protoreflect.ValueOfMessage(&Message{typ: messageType{xt.desc.Message()}}) 679 default: 680 return xt.desc.Default() 681 } 682 } 683 684 func (xt extensionType) TypeDescriptor() protoreflect.ExtensionTypeDescriptor { 685 return xt.desc 686 } 687 688 func (xt extensionType) ValueOf(iv interface{}) protoreflect.Value { 689 v := protoreflect.ValueOf(iv) 690 typecheck(xt.desc, v) 691 return v 692 } 693 694 func (xt extensionType) InterfaceOf(v protoreflect.Value) interface{} { 695 typecheck(xt.desc, v) 696 return v.Interface() 697 } 698 699 func (xt extensionType) IsValidInterface(iv interface{}) bool { 700 return typeIsValid(xt.desc, protoreflect.ValueOf(iv)) == nil 701 } 702 703 func (xt extensionType) IsValidValue(v protoreflect.Value) bool { 704 return typeIsValid(xt.desc, v) == nil 705 } 706 707 type extensionTypeDescriptor struct { 708 protoreflect.ExtensionDescriptor 709 } 710 711 func (xt extensionTypeDescriptor) Type() protoreflect.ExtensionType { 712 return extensionType{xt} 713 } 714 715 func (xt extensionTypeDescriptor) Descriptor() protoreflect.ExtensionDescriptor { 716 return xt.ExtensionDescriptor 717 }