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  }