github.com/jhump/protoreflect@v1.16.0/dynamic/dynamic_message.go (about)

     1  package dynamic
     2  
     3  import (
     4  	"bytes"
     5  	"compress/gzip"
     6  	"errors"
     7  	"fmt"
     8  	"reflect"
     9  	"sort"
    10  	"strings"
    11  
    12  	"github.com/golang/protobuf/proto"
    13  	protov2 "google.golang.org/protobuf/proto"
    14  	"google.golang.org/protobuf/reflect/protoreflect"
    15  	"google.golang.org/protobuf/types/descriptorpb"
    16  
    17  	"github.com/jhump/protoreflect/codec"
    18  	"github.com/jhump/protoreflect/desc"
    19  	"github.com/jhump/protoreflect/internal"
    20  )
    21  
    22  // ErrUnknownTagNumber is an error that is returned when an operation refers
    23  // to an unknown tag number.
    24  var ErrUnknownTagNumber = errors.New("unknown tag number")
    25  
    26  // UnknownTagNumberError is the same as ErrUnknownTagNumber.
    27  // Deprecated: use ErrUnknownTagNumber
    28  var UnknownTagNumberError = ErrUnknownTagNumber
    29  
    30  // ErrUnknownFieldName is an error that is returned when an operation refers
    31  // to an unknown field name.
    32  var ErrUnknownFieldName = errors.New("unknown field name")
    33  
    34  // UnknownFieldNameError is the same as ErrUnknownFieldName.
    35  // Deprecated: use ErrUnknownFieldName
    36  var UnknownFieldNameError = ErrUnknownFieldName
    37  
    38  // ErrFieldIsNotMap is an error that is returned when map-related operations
    39  // are attempted with fields that are not maps.
    40  var ErrFieldIsNotMap = errors.New("field is not a map type")
    41  
    42  // FieldIsNotMapError is the same as ErrFieldIsNotMap.
    43  // Deprecated: use ErrFieldIsNotMap
    44  var FieldIsNotMapError = ErrFieldIsNotMap
    45  
    46  // ErrFieldIsNotRepeated is an error that is returned when repeated field
    47  // operations are attempted with fields that are not repeated.
    48  var ErrFieldIsNotRepeated = errors.New("field is not repeated")
    49  
    50  // FieldIsNotRepeatedError is the same as ErrFieldIsNotRepeated.
    51  // Deprecated: use ErrFieldIsNotRepeated
    52  var FieldIsNotRepeatedError = ErrFieldIsNotRepeated
    53  
    54  // ErrIndexOutOfRange is an error that is returned when an invalid index is
    55  // provided when access a single element of a repeated field.
    56  var ErrIndexOutOfRange = errors.New("index is out of range")
    57  
    58  // IndexOutOfRangeError is the same as ErrIndexOutOfRange.
    59  // Deprecated: use ErrIndexOutOfRange
    60  var IndexOutOfRangeError = ErrIndexOutOfRange
    61  
    62  // ErrNumericOverflow is an error returned by operations that encounter a
    63  // numeric value that is too large, for example de-serializing a value into an
    64  // int32 field when the value is larger that can fit into a 32-bit value.
    65  var ErrNumericOverflow = errors.New("numeric value is out of range")
    66  
    67  // NumericOverflowError is the same as ErrNumericOverflow.
    68  // Deprecated: use ErrNumericOverflow
    69  var NumericOverflowError = ErrNumericOverflow
    70  
    71  var typeOfProtoMessage = reflect.TypeOf((*proto.Message)(nil)).Elem()
    72  var typeOfDynamicMessage = reflect.TypeOf((*Message)(nil))
    73  var typeOfBytes = reflect.TypeOf(([]byte)(nil))
    74  
    75  // Message is a dynamic protobuf message. Instead of a generated struct,
    76  // like most protobuf messages, this is a map of field number to values and
    77  // a message descriptor, which is used to validate the field values and
    78  // also to de-serialize messages (from the standard binary format, as well
    79  // as from the text format and from JSON).
    80  type Message struct {
    81  	md            *desc.MessageDescriptor
    82  	er            *ExtensionRegistry
    83  	mf            *MessageFactory
    84  	extraFields   map[int32]*desc.FieldDescriptor
    85  	values        map[int32]interface{}
    86  	unknownFields map[int32][]UnknownField
    87  }
    88  
    89  // UnknownField represents a field that was parsed from the binary wire
    90  // format for a message, but was not a recognized field number. Enough
    91  // information is preserved so that re-serializing the message won't lose
    92  // any of the unrecognized data.
    93  type UnknownField struct {
    94  	// Encoding indicates how the unknown field was encoded on the wire. If it
    95  	// is proto.WireBytes or proto.WireGroupStart then Contents will be set to
    96  	// the raw bytes. If it is proto.WireTypeFixed32 then the data is in the least
    97  	// significant 32 bits of Value. Otherwise, the data is in all 64 bits of
    98  	// Value.
    99  	Encoding int8
   100  	Contents []byte
   101  	Value    uint64
   102  }
   103  
   104  // NewMessage creates a new dynamic message for the type represented by the given
   105  // message descriptor. During de-serialization, a default MessageFactory is used to
   106  // instantiate any nested message fields and no extension fields will be parsed. To
   107  // use a custom MessageFactory or ExtensionRegistry, use MessageFactory.NewMessage.
   108  func NewMessage(md *desc.MessageDescriptor) *Message {
   109  	return NewMessageWithMessageFactory(md, nil)
   110  }
   111  
   112  // NewMessageWithExtensionRegistry creates a new dynamic message for the type
   113  // represented by the given message descriptor. During de-serialization, the given
   114  // ExtensionRegistry is used to parse extension fields and nested messages will be
   115  // instantiated using dynamic.NewMessageFactoryWithExtensionRegistry(er).
   116  func NewMessageWithExtensionRegistry(md *desc.MessageDescriptor, er *ExtensionRegistry) *Message {
   117  	mf := NewMessageFactoryWithExtensionRegistry(er)
   118  	return NewMessageWithMessageFactory(md, mf)
   119  }
   120  
   121  // NewMessageWithMessageFactory creates a new dynamic message for the type
   122  // represented by the given message descriptor. During de-serialization, the given
   123  // MessageFactory is used to instantiate nested messages.
   124  func NewMessageWithMessageFactory(md *desc.MessageDescriptor, mf *MessageFactory) *Message {
   125  	var er *ExtensionRegistry
   126  	if mf != nil {
   127  		er = mf.er
   128  	}
   129  	return &Message{
   130  		md: md,
   131  		mf: mf,
   132  		er: er,
   133  	}
   134  }
   135  
   136  // AsDynamicMessage converts the given message to a dynamic message. If the
   137  // given message is dynamic, it is returned. Otherwise, a dynamic message is
   138  // created using NewMessage.
   139  func AsDynamicMessage(msg proto.Message) (*Message, error) {
   140  	return AsDynamicMessageWithMessageFactory(msg, nil)
   141  }
   142  
   143  // AsDynamicMessageWithExtensionRegistry converts the given message to a dynamic
   144  // message. If the given message is dynamic, it is returned. Otherwise, a
   145  // dynamic message is created using NewMessageWithExtensionRegistry.
   146  func AsDynamicMessageWithExtensionRegistry(msg proto.Message, er *ExtensionRegistry) (*Message, error) {
   147  	mf := NewMessageFactoryWithExtensionRegistry(er)
   148  	return AsDynamicMessageWithMessageFactory(msg, mf)
   149  }
   150  
   151  // AsDynamicMessageWithMessageFactory converts the given message to a dynamic
   152  // message. If the given message is dynamic, it is returned. Otherwise, a
   153  // dynamic message is created using NewMessageWithMessageFactory.
   154  func AsDynamicMessageWithMessageFactory(msg proto.Message, mf *MessageFactory) (*Message, error) {
   155  	if dm, ok := msg.(*Message); ok {
   156  		return dm, nil
   157  	}
   158  	md, err := desc.LoadMessageDescriptorForMessage(msg)
   159  	if err != nil {
   160  		return nil, err
   161  	}
   162  	dm := NewMessageWithMessageFactory(md, mf)
   163  	err = dm.mergeFrom(msg)
   164  	if err != nil {
   165  		return nil, err
   166  	}
   167  	return dm, nil
   168  }
   169  
   170  // GetMessageDescriptor returns a descriptor for this message's type.
   171  func (m *Message) GetMessageDescriptor() *desc.MessageDescriptor {
   172  	return m.md
   173  }
   174  
   175  // GetKnownFields returns a slice of descriptors for all known fields. The
   176  // fields will not be in any defined order.
   177  func (m *Message) GetKnownFields() []*desc.FieldDescriptor {
   178  	if len(m.extraFields) == 0 {
   179  		return m.md.GetFields()
   180  	}
   181  	flds := make([]*desc.FieldDescriptor, len(m.md.GetFields()), len(m.md.GetFields())+len(m.extraFields))
   182  	copy(flds, m.md.GetFields())
   183  	for _, fld := range m.extraFields {
   184  		if !fld.IsExtension() {
   185  			flds = append(flds, fld)
   186  		}
   187  	}
   188  	return flds
   189  }
   190  
   191  // GetKnownExtensions returns a slice of descriptors for all extensions known by
   192  // the message's extension registry. The fields will not be in any defined order.
   193  func (m *Message) GetKnownExtensions() []*desc.FieldDescriptor {
   194  	if !m.md.IsExtendable() {
   195  		return nil
   196  	}
   197  	exts := m.er.AllExtensionsForType(m.md.GetFullyQualifiedName())
   198  	for _, fld := range m.extraFields {
   199  		if fld.IsExtension() {
   200  			exts = append(exts, fld)
   201  		}
   202  	}
   203  	return exts
   204  }
   205  
   206  // GetUnknownFields returns a slice of tag numbers for all unknown fields that
   207  // this message contains. The tags will not be in any defined order.
   208  func (m *Message) GetUnknownFields() []int32 {
   209  	flds := make([]int32, 0, len(m.unknownFields))
   210  	for tag := range m.unknownFields {
   211  		flds = append(flds, tag)
   212  	}
   213  	return flds
   214  }
   215  
   216  // Descriptor returns the serialized form of the file descriptor in which the
   217  // message was defined and a path to the message type therein. This mimics the
   218  // method of the same name on message types generated by protoc.
   219  func (m *Message) Descriptor() ([]byte, []int) {
   220  	// get encoded file descriptor
   221  	b, err := proto.Marshal(m.md.GetFile().AsProto())
   222  	if err != nil {
   223  		panic(fmt.Sprintf("failed to get encoded descriptor for %s: %v", m.md.GetFile().GetName(), err))
   224  	}
   225  	var zippedBytes bytes.Buffer
   226  	w := gzip.NewWriter(&zippedBytes)
   227  	if _, err := w.Write(b); err != nil {
   228  		panic(fmt.Sprintf("failed to get encoded descriptor for %s: %v", m.md.GetFile().GetName(), err))
   229  	}
   230  	if err := w.Close(); err != nil {
   231  		panic(fmt.Sprintf("failed to get an encoded descriptor for %s: %v", m.md.GetFile().GetName(), err))
   232  	}
   233  
   234  	// and path to message
   235  	path := []int{}
   236  	var d desc.Descriptor
   237  	name := m.md.GetFullyQualifiedName()
   238  	for d = m.md.GetParent(); d != nil; name, d = d.GetFullyQualifiedName(), d.GetParent() {
   239  		found := false
   240  		switch d := d.(type) {
   241  		case (*desc.FileDescriptor):
   242  			for i, md := range d.GetMessageTypes() {
   243  				if md.GetFullyQualifiedName() == name {
   244  					found = true
   245  					path = append(path, i)
   246  				}
   247  			}
   248  		case (*desc.MessageDescriptor):
   249  			for i, md := range d.GetNestedMessageTypes() {
   250  				if md.GetFullyQualifiedName() == name {
   251  					found = true
   252  					path = append(path, i)
   253  				}
   254  			}
   255  		}
   256  		if !found {
   257  			panic(fmt.Sprintf("failed to compute descriptor path for %s", m.md.GetFullyQualifiedName()))
   258  		}
   259  	}
   260  	// reverse the path
   261  	i := 0
   262  	j := len(path) - 1
   263  	for i < j {
   264  		path[i], path[j] = path[j], path[i]
   265  		i++
   266  		j--
   267  	}
   268  
   269  	return zippedBytes.Bytes(), path
   270  }
   271  
   272  // XXX_MessageName returns the fully qualified name of this message's type. This
   273  // allows dynamic messages to be used with proto.MessageName.
   274  func (m *Message) XXX_MessageName() string {
   275  	return m.md.GetFullyQualifiedName()
   276  }
   277  
   278  // FindFieldDescriptor returns a field descriptor for the given tag number. This
   279  // searches known fields in the descriptor, known fields discovered during calls
   280  // to GetField or SetField, and extension fields known by the message's extension
   281  // registry. It returns nil if the tag is unknown.
   282  func (m *Message) FindFieldDescriptor(tagNumber int32) *desc.FieldDescriptor {
   283  	fd := m.md.FindFieldByNumber(tagNumber)
   284  	if fd != nil {
   285  		return fd
   286  	}
   287  	fd = m.er.FindExtension(m.md.GetFullyQualifiedName(), tagNumber)
   288  	if fd != nil {
   289  		return fd
   290  	}
   291  	return m.extraFields[tagNumber]
   292  }
   293  
   294  // FindFieldDescriptorByName returns a field descriptor for the given field
   295  // name. This searches known fields in the descriptor, known fields discovered
   296  // during calls to GetField or SetField, and extension fields known by the
   297  // message's extension registry. It returns nil if the name is unknown. If the
   298  // given name refers to an extension, it should be fully qualified and may be
   299  // optionally enclosed in parentheses or brackets.
   300  func (m *Message) FindFieldDescriptorByName(name string) *desc.FieldDescriptor {
   301  	if name == "" {
   302  		return nil
   303  	}
   304  	fd := m.md.FindFieldByName(name)
   305  	if fd != nil {
   306  		return fd
   307  	}
   308  	mustBeExt := false
   309  	if name[0] == '(' {
   310  		if name[len(name)-1] != ')' {
   311  			// malformed name
   312  			return nil
   313  		}
   314  		mustBeExt = true
   315  		name = name[1 : len(name)-1]
   316  	} else if name[0] == '[' {
   317  		if name[len(name)-1] != ']' {
   318  			// malformed name
   319  			return nil
   320  		}
   321  		mustBeExt = true
   322  		name = name[1 : len(name)-1]
   323  	}
   324  	fd = m.er.FindExtensionByName(m.md.GetFullyQualifiedName(), name)
   325  	if fd != nil {
   326  		return fd
   327  	}
   328  	for _, fd := range m.extraFields {
   329  		if fd.IsExtension() && name == fd.GetFullyQualifiedName() {
   330  			return fd
   331  		} else if !mustBeExt && !fd.IsExtension() && name == fd.GetName() {
   332  			return fd
   333  		}
   334  	}
   335  
   336  	return nil
   337  }
   338  
   339  // FindFieldDescriptorByJSONName returns a field descriptor for the given JSON
   340  // name. This searches known fields in the descriptor, known fields discovered
   341  // during calls to GetField or SetField, and extension fields known by the
   342  // message's extension registry. If no field matches the given JSON name, it
   343  // will fall back to searching field names (e.g. FindFieldDescriptorByName). If
   344  // this also yields no match, nil is returned.
   345  func (m *Message) FindFieldDescriptorByJSONName(name string) *desc.FieldDescriptor {
   346  	if name == "" {
   347  		return nil
   348  	}
   349  	fd := m.md.FindFieldByJSONName(name)
   350  	if fd != nil {
   351  		return fd
   352  	}
   353  	mustBeExt := false
   354  	if name[0] == '(' {
   355  		if name[len(name)-1] != ')' {
   356  			// malformed name
   357  			return nil
   358  		}
   359  		mustBeExt = true
   360  		name = name[1 : len(name)-1]
   361  	} else if name[0] == '[' {
   362  		if name[len(name)-1] != ']' {
   363  			// malformed name
   364  			return nil
   365  		}
   366  		mustBeExt = true
   367  		name = name[1 : len(name)-1]
   368  	}
   369  	fd = m.er.FindExtensionByJSONName(m.md.GetFullyQualifiedName(), name)
   370  	if fd != nil {
   371  		return fd
   372  	}
   373  	for _, fd := range m.extraFields {
   374  		if fd.IsExtension() && name == fd.GetFullyQualifiedJSONName() {
   375  			return fd
   376  		} else if !mustBeExt && !fd.IsExtension() && name == fd.GetJSONName() {
   377  			return fd
   378  		}
   379  	}
   380  
   381  	// try non-JSON names
   382  	return m.FindFieldDescriptorByName(name)
   383  }
   384  
   385  func (m *Message) checkField(fd *desc.FieldDescriptor) error {
   386  	return checkField(fd, m.md)
   387  }
   388  
   389  func checkField(fd *desc.FieldDescriptor, md *desc.MessageDescriptor) error {
   390  	if fd.GetOwner().GetFullyQualifiedName() != md.GetFullyQualifiedName() {
   391  		return fmt.Errorf("given field, %s, is for wrong message type: %s; expecting %s", fd.GetName(), fd.GetOwner().GetFullyQualifiedName(), md.GetFullyQualifiedName())
   392  	}
   393  	if fd.IsExtension() && !md.IsExtension(fd.GetNumber()) {
   394  		return fmt.Errorf("given field, %s, is an extension but is not in message extension range: %v", fd.GetFullyQualifiedName(), md.GetExtensionRanges())
   395  	}
   396  	return nil
   397  }
   398  
   399  // GetField returns the value for the given field descriptor. It panics if an
   400  // error is encountered. See TryGetField.
   401  func (m *Message) GetField(fd *desc.FieldDescriptor) interface{} {
   402  	if v, err := m.TryGetField(fd); err != nil {
   403  		panic(err.Error())
   404  	} else {
   405  		return v
   406  	}
   407  }
   408  
   409  // TryGetField returns the value for the given field descriptor. An error is
   410  // returned if the given field descriptor does not belong to the right message
   411  // type.
   412  //
   413  // The Go type of the returned value, for scalar fields, is the same as protoc
   414  // would generate for the field (in a non-dynamic message). The table below
   415  // lists the scalar types and the corresponding Go types.
   416  //
   417  //	+-------------------------+-----------+
   418  //	|       Declared Type     |  Go Type  |
   419  //	+-------------------------+-----------+
   420  //	| int32, sint32, sfixed32 | int32     |
   421  //	| int64, sint64, sfixed64 | int64     |
   422  //	| uint32, fixed32         | uint32    |
   423  //	| uint64, fixed64         | uint64    |
   424  //	| float                   | float32   |
   425  //	| double                  | double32  |
   426  //	| bool                    | bool      |
   427  //	| string                  | string    |
   428  //	| bytes                   | []byte    |
   429  //	+-------------------------+-----------+
   430  //
   431  // Values for enum fields will always be int32 values. You can use the enum
   432  // descriptor associated with the field to lookup value names with those values.
   433  // Values for message type fields may be an instance of the generated type *or*
   434  // may be another *dynamic.Message that represents the type.
   435  //
   436  // If the given field is a map field, the returned type will be
   437  // map[interface{}]interface{}. The actual concrete types of keys and values is
   438  // as described above. If the given field is a (non-map) repeated field, the
   439  // returned type is always []interface{}; the type of the actual elements is as
   440  // described above.
   441  //
   442  // If this message has no value for the given field, its default value is
   443  // returned. If the message is defined in a file with "proto3" syntax, the
   444  // default is always the zero value for the field. The default value for map and
   445  // repeated fields is a nil map or slice (respectively). For field's whose types
   446  // is a message, the default value is an empty message for "proto2" syntax or a
   447  // nil message for "proto3" syntax. Note that the in the latter case, a non-nil
   448  // interface with a nil pointer is returned, not a nil interface. Also note that
   449  // whether the returned value is an empty message or nil depends on if *this*
   450  // message was defined as "proto3" syntax, not the message type referred to by
   451  // the field's type.
   452  //
   453  // If the given field descriptor is not known (e.g. not present in the message
   454  // descriptor) but corresponds to an unknown field, the unknown value will be
   455  // parsed and become known. The parsed value will be returned, or an error will
   456  // be returned if the unknown value cannot be parsed according to the field
   457  // descriptor's type information.
   458  func (m *Message) TryGetField(fd *desc.FieldDescriptor) (interface{}, error) {
   459  	if err := m.checkField(fd); err != nil {
   460  		return nil, err
   461  	}
   462  	return m.getField(fd)
   463  }
   464  
   465  // GetFieldByName returns the value for the field with the given name. It panics
   466  // if an error is encountered. See TryGetFieldByName.
   467  func (m *Message) GetFieldByName(name string) interface{} {
   468  	if v, err := m.TryGetFieldByName(name); err != nil {
   469  		panic(err.Error())
   470  	} else {
   471  		return v
   472  	}
   473  }
   474  
   475  // TryGetFieldByName returns the value for the field with the given name. An
   476  // error is returned if the given name is unknown. If the given name refers to
   477  // an extension field, it should be fully qualified and optionally enclosed in
   478  // parenthesis or brackets.
   479  //
   480  // If this message has no value for the given field, its default value is
   481  // returned. (See TryGetField for more info on types and default field values.)
   482  func (m *Message) TryGetFieldByName(name string) (interface{}, error) {
   483  	fd := m.FindFieldDescriptorByName(name)
   484  	if fd == nil {
   485  		return nil, UnknownFieldNameError
   486  	}
   487  	return m.getField(fd)
   488  }
   489  
   490  // GetFieldByNumber returns the value for the field with the given tag number.
   491  // It panics if an error is encountered. See TryGetFieldByNumber.
   492  func (m *Message) GetFieldByNumber(tagNumber int) interface{} {
   493  	if v, err := m.TryGetFieldByNumber(tagNumber); err != nil {
   494  		panic(err.Error())
   495  	} else {
   496  		return v
   497  	}
   498  }
   499  
   500  // TryGetFieldByNumber returns the value for the field with the given tag
   501  // number. An error is returned if the given tag is unknown.
   502  //
   503  // If this message has no value for the given field, its default value is
   504  // returned. (See TryGetField for more info on types and default field values.)
   505  func (m *Message) TryGetFieldByNumber(tagNumber int) (interface{}, error) {
   506  	fd := m.FindFieldDescriptor(int32(tagNumber))
   507  	if fd == nil {
   508  		return nil, UnknownTagNumberError
   509  	}
   510  	return m.getField(fd)
   511  }
   512  
   513  func (m *Message) getField(fd *desc.FieldDescriptor) (interface{}, error) {
   514  	return m.doGetField(fd, false)
   515  }
   516  
   517  func (m *Message) doGetField(fd *desc.FieldDescriptor, nilIfAbsent bool) (interface{}, error) {
   518  	res := m.values[fd.GetNumber()]
   519  	if res == nil {
   520  		var err error
   521  		if res, err = m.parseUnknownField(fd); err != nil {
   522  			return nil, err
   523  		}
   524  		if res == nil {
   525  			if nilIfAbsent {
   526  				return nil, nil
   527  			} else {
   528  				def := fd.GetDefaultValue()
   529  				if def != nil {
   530  					return def, nil
   531  				}
   532  				// GetDefaultValue only returns nil for message types
   533  				md := fd.GetMessageType()
   534  				if m.md.IsProto3() {
   535  					return nilMessage(md), nil
   536  				} else {
   537  					// for proto2, return default instance of message
   538  					return m.mf.NewMessage(md), nil
   539  				}
   540  			}
   541  		}
   542  	}
   543  	rt := reflect.TypeOf(res)
   544  	if rt.Kind() == reflect.Map {
   545  		// make defensive copies to prevent caller from storing illegal keys and values
   546  		m := res.(map[interface{}]interface{})
   547  		res := map[interface{}]interface{}{}
   548  		for k, v := range m {
   549  			res[k] = v
   550  		}
   551  		return res, nil
   552  	} else if rt.Kind() == reflect.Slice && rt != typeOfBytes {
   553  		// make defensive copies to prevent caller from storing illegal elements
   554  		sl := res.([]interface{})
   555  		res := make([]interface{}, len(sl))
   556  		copy(res, sl)
   557  		return res, nil
   558  	}
   559  	return res, nil
   560  }
   561  
   562  func nilMessage(md *desc.MessageDescriptor) interface{} {
   563  	// try to return a proper nil pointer
   564  	msgType := proto.MessageType(md.GetFullyQualifiedName())
   565  	if msgType != nil && msgType.Implements(typeOfProtoMessage) {
   566  		return reflect.Zero(msgType).Interface().(proto.Message)
   567  	}
   568  	// fallback to nil dynamic message pointer
   569  	return (*Message)(nil)
   570  }
   571  
   572  // HasField returns true if this message has a value for the given field. If the
   573  // given field is not valid (e.g. belongs to a different message type), false is
   574  // returned. If this message is defined in a file with "proto3" syntax, this
   575  // will return false even if a field was explicitly assigned its zero value (the
   576  // zero values for a field are intentionally indistinguishable from absent).
   577  func (m *Message) HasField(fd *desc.FieldDescriptor) bool {
   578  	if err := m.checkField(fd); err != nil {
   579  		return false
   580  	}
   581  	return m.HasFieldNumber(int(fd.GetNumber()))
   582  }
   583  
   584  // HasFieldName returns true if this message has a value for a field with the
   585  // given name. If the given name is unknown, this returns false.
   586  func (m *Message) HasFieldName(name string) bool {
   587  	fd := m.FindFieldDescriptorByName(name)
   588  	if fd == nil {
   589  		return false
   590  	}
   591  	return m.HasFieldNumber(int(fd.GetNumber()))
   592  }
   593  
   594  // HasFieldNumber returns true if this message has a value for a field with the
   595  // given tag number. If the given tag is unknown, this returns false.
   596  func (m *Message) HasFieldNumber(tagNumber int) bool {
   597  	if _, ok := m.values[int32(tagNumber)]; ok {
   598  		return true
   599  	}
   600  	_, ok := m.unknownFields[int32(tagNumber)]
   601  	return ok
   602  }
   603  
   604  // SetField sets the value for the given field descriptor to the given value. It
   605  // panics if an error is encountered. See TrySetField.
   606  func (m *Message) SetField(fd *desc.FieldDescriptor, val interface{}) {
   607  	if err := m.TrySetField(fd, val); err != nil {
   608  		panic(err.Error())
   609  	}
   610  }
   611  
   612  // TrySetField sets the value for the given field descriptor to the given value.
   613  // An error is returned if the given field descriptor does not belong to the
   614  // right message type or if the given value is not a correct/compatible type for
   615  // the given field.
   616  //
   617  // The Go type expected for a field  is the same as TryGetField would return for
   618  // the field. So message values can be supplied as either the correct generated
   619  // message type or as a *dynamic.Message.
   620  //
   621  // Since it is cumbersome to work with dynamic messages, some concessions are
   622  // made to simplify usage regarding types:
   623  //
   624  //  1. If a numeric type is provided that can be converted *without loss or
   625  //     overflow*, it is accepted. This allows for setting int64 fields using int
   626  //     or int32 values. Similarly for uint64 with uint and uint32 values and for
   627  //     float64 fields with float32 values.
   628  //  2. The value can be a named type, as long as its underlying type is correct.
   629  //  3. Map and repeated fields can be set using any kind of concrete map or
   630  //     slice type, as long as the values within are all of the correct type. So
   631  //     a field defined as a 'map<string, int32>` can be set using a
   632  //     map[string]int32, a map[string]interface{}, or even a
   633  //     map[interface{}]interface{}.
   634  //  4. Finally, dynamic code that chooses to not treat maps as a special-case
   635  //     find that they can set map fields using a slice where each element is a
   636  //     message that matches the implicit map-entry field message type.
   637  //
   638  // If the given field descriptor is not known (e.g. not present in the message
   639  // descriptor) it will become known. Subsequent operations using tag numbers or
   640  // names will be able to resolve the newly-known type. If the message has a
   641  // value for the unknown value, it is cleared, replaced by the given known
   642  // value.
   643  func (m *Message) TrySetField(fd *desc.FieldDescriptor, val interface{}) error {
   644  	if err := m.checkField(fd); err != nil {
   645  		return err
   646  	}
   647  	return m.setField(fd, val)
   648  }
   649  
   650  // SetFieldByName sets the value for the field with the given name to the given
   651  // value. It panics if an error is encountered. See TrySetFieldByName.
   652  func (m *Message) SetFieldByName(name string, val interface{}) {
   653  	if err := m.TrySetFieldByName(name, val); err != nil {
   654  		panic(err.Error())
   655  	}
   656  }
   657  
   658  // TrySetFieldByName sets the value for the field with the given name to the
   659  // given value. An error is returned if the given name is unknown or if the
   660  // given value has an incorrect type. If the given name refers to an extension
   661  // field, it should be fully qualified and optionally enclosed in parenthesis or
   662  // brackets.
   663  //
   664  // (See TrySetField for more info on types.)
   665  func (m *Message) TrySetFieldByName(name string, val interface{}) error {
   666  	fd := m.FindFieldDescriptorByName(name)
   667  	if fd == nil {
   668  		return UnknownFieldNameError
   669  	}
   670  	return m.setField(fd, val)
   671  }
   672  
   673  // SetFieldByNumber sets the value for the field with the given tag number to
   674  // the given value. It panics if an error is encountered. See
   675  // TrySetFieldByNumber.
   676  func (m *Message) SetFieldByNumber(tagNumber int, val interface{}) {
   677  	if err := m.TrySetFieldByNumber(tagNumber, val); err != nil {
   678  		panic(err.Error())
   679  	}
   680  }
   681  
   682  // TrySetFieldByNumber sets the value for the field with the given tag number to
   683  // the given value. An error is returned if the given tag is unknown or if the
   684  // given value has an incorrect type.
   685  //
   686  // (See TrySetField for more info on types.)
   687  func (m *Message) TrySetFieldByNumber(tagNumber int, val interface{}) error {
   688  	fd := m.FindFieldDescriptor(int32(tagNumber))
   689  	if fd == nil {
   690  		return UnknownTagNumberError
   691  	}
   692  	return m.setField(fd, val)
   693  }
   694  
   695  func (m *Message) setField(fd *desc.FieldDescriptor, val interface{}) error {
   696  	var err error
   697  	if val, err = validFieldValue(fd, val); err != nil {
   698  		return err
   699  	}
   700  	m.internalSetField(fd, val)
   701  	return nil
   702  }
   703  
   704  func (m *Message) internalSetField(fd *desc.FieldDescriptor, val interface{}) {
   705  	if fd.IsRepeated() {
   706  		// Unset fields and zero-length fields are indistinguishable, in both
   707  		// proto2 and proto3 syntax
   708  		if reflect.ValueOf(val).Len() == 0 {
   709  			if m.values != nil {
   710  				delete(m.values, fd.GetNumber())
   711  			}
   712  			return
   713  		}
   714  	} else if m.md.IsProto3() && fd.GetOneOf() == nil {
   715  		// proto3 considers fields that are set to their zero value as unset
   716  		// (we already handled repeated fields above)
   717  		var equal bool
   718  		if b, ok := val.([]byte); ok {
   719  			// can't compare slices, so we have to special-case []byte values
   720  			equal = ok && bytes.Equal(b, fd.GetDefaultValue().([]byte))
   721  		} else {
   722  			defVal := fd.GetDefaultValue()
   723  			equal = defVal == val
   724  			if !equal && defVal == nil {
   725  				// above just checks if value is the nil interface,
   726  				// but we should also test if the given value is a
   727  				// nil pointer
   728  				rv := reflect.ValueOf(val)
   729  				if rv.Kind() == reflect.Ptr && rv.IsNil() {
   730  					equal = true
   731  				}
   732  			}
   733  		}
   734  		if equal {
   735  			if m.values != nil {
   736  				delete(m.values, fd.GetNumber())
   737  			}
   738  			return
   739  		}
   740  	}
   741  	if m.values == nil {
   742  		m.values = map[int32]interface{}{}
   743  	}
   744  	m.values[fd.GetNumber()] = val
   745  	// if this field is part of a one-of, make sure all other one-of choices are cleared
   746  	od := fd.GetOneOf()
   747  	if od != nil {
   748  		for _, other := range od.GetChoices() {
   749  			if other.GetNumber() != fd.GetNumber() {
   750  				delete(m.values, other.GetNumber())
   751  			}
   752  		}
   753  	}
   754  	// also clear any unknown fields
   755  	if m.unknownFields != nil {
   756  		delete(m.unknownFields, fd.GetNumber())
   757  	}
   758  	// and add this field if it was previously unknown
   759  	if existing := m.FindFieldDescriptor(fd.GetNumber()); existing == nil {
   760  		m.addField(fd)
   761  	}
   762  }
   763  
   764  func (m *Message) addField(fd *desc.FieldDescriptor) {
   765  	if m.extraFields == nil {
   766  		m.extraFields = map[int32]*desc.FieldDescriptor{}
   767  	}
   768  	m.extraFields[fd.GetNumber()] = fd
   769  }
   770  
   771  // ClearField removes any value for the given field. It panics if an error is
   772  // encountered. See TryClearField.
   773  func (m *Message) ClearField(fd *desc.FieldDescriptor) {
   774  	if err := m.TryClearField(fd); err != nil {
   775  		panic(err.Error())
   776  	}
   777  }
   778  
   779  // TryClearField removes any value for the given field. An error is returned if
   780  // the given field descriptor does not belong to the right message type.
   781  func (m *Message) TryClearField(fd *desc.FieldDescriptor) error {
   782  	if err := m.checkField(fd); err != nil {
   783  		return err
   784  	}
   785  	m.clearField(fd)
   786  	return nil
   787  }
   788  
   789  // ClearFieldByName removes any value for the field with the given name. It
   790  // panics if an error is encountered. See TryClearFieldByName.
   791  func (m *Message) ClearFieldByName(name string) {
   792  	if err := m.TryClearFieldByName(name); err != nil {
   793  		panic(err.Error())
   794  	}
   795  }
   796  
   797  // TryClearFieldByName removes any value for the field with the given name. An
   798  // error is returned if the given name is unknown. If the given name refers to
   799  // an extension field, it should be fully qualified and optionally enclosed in
   800  // parenthesis or brackets.
   801  func (m *Message) TryClearFieldByName(name string) error {
   802  	fd := m.FindFieldDescriptorByName(name)
   803  	if fd == nil {
   804  		return UnknownFieldNameError
   805  	}
   806  	m.clearField(fd)
   807  	return nil
   808  }
   809  
   810  // ClearFieldByNumber removes any value for the field with the given tag number.
   811  // It panics if an error is encountered. See TryClearFieldByNumber.
   812  func (m *Message) ClearFieldByNumber(tagNumber int) {
   813  	if err := m.TryClearFieldByNumber(tagNumber); err != nil {
   814  		panic(err.Error())
   815  	}
   816  }
   817  
   818  // TryClearFieldByNumber removes any value for the field with the given tag
   819  // number. An error is returned if the given tag is unknown.
   820  func (m *Message) TryClearFieldByNumber(tagNumber int) error {
   821  	fd := m.FindFieldDescriptor(int32(tagNumber))
   822  	if fd == nil {
   823  		return UnknownTagNumberError
   824  	}
   825  	m.clearField(fd)
   826  	return nil
   827  }
   828  
   829  func (m *Message) clearField(fd *desc.FieldDescriptor) {
   830  	// clear value
   831  	if m.values != nil {
   832  		delete(m.values, fd.GetNumber())
   833  	}
   834  	// also clear any unknown fields
   835  	if m.unknownFields != nil {
   836  		delete(m.unknownFields, fd.GetNumber())
   837  	}
   838  	// and add this field if it was previously unknown
   839  	if existing := m.FindFieldDescriptor(fd.GetNumber()); existing == nil {
   840  		m.addField(fd)
   841  	}
   842  }
   843  
   844  // GetOneOfField returns which of the given one-of's fields is set and the
   845  // corresponding value. It panics if an error is encountered. See
   846  // TryGetOneOfField.
   847  func (m *Message) GetOneOfField(od *desc.OneOfDescriptor) (*desc.FieldDescriptor, interface{}) {
   848  	if fd, val, err := m.TryGetOneOfField(od); err != nil {
   849  		panic(err.Error())
   850  	} else {
   851  		return fd, val
   852  	}
   853  }
   854  
   855  // TryGetOneOfField returns which of the given one-of's fields is set and the
   856  // corresponding value. An error is returned if the given one-of belongs to the
   857  // wrong message type. If the given one-of has no field set, this method will
   858  // return nil, nil.
   859  //
   860  // The type of the value, if one is set, is the same as would be returned by
   861  // TryGetField using the returned field descriptor.
   862  //
   863  // Like with TryGetField, if the given one-of contains any fields that are not
   864  // known (e.g. not present in this message's descriptor), they will become known
   865  // and any unknown value will be parsed (and become a known value on success).
   866  func (m *Message) TryGetOneOfField(od *desc.OneOfDescriptor) (*desc.FieldDescriptor, interface{}, error) {
   867  	if od.GetOwner().GetFullyQualifiedName() != m.md.GetFullyQualifiedName() {
   868  		return nil, nil, fmt.Errorf("given one-of, %s, is for wrong message type: %s; expecting %s", od.GetName(), od.GetOwner().GetFullyQualifiedName(), m.md.GetFullyQualifiedName())
   869  	}
   870  	for _, fd := range od.GetChoices() {
   871  		val, err := m.doGetField(fd, true)
   872  		if err != nil {
   873  			return nil, nil, err
   874  		}
   875  		if val != nil {
   876  			return fd, val, nil
   877  		}
   878  	}
   879  	return nil, nil, nil
   880  }
   881  
   882  // ClearOneOfField removes any value for any of the given one-of's fields. It
   883  // panics if an error is encountered. See TryClearOneOfField.
   884  func (m *Message) ClearOneOfField(od *desc.OneOfDescriptor) {
   885  	if err := m.TryClearOneOfField(od); err != nil {
   886  		panic(err.Error())
   887  	}
   888  }
   889  
   890  // TryClearOneOfField removes any value for any of the given one-of's fields. An
   891  // error is returned if the given one-of descriptor does not belong to the right
   892  // message type.
   893  func (m *Message) TryClearOneOfField(od *desc.OneOfDescriptor) error {
   894  	if od.GetOwner().GetFullyQualifiedName() != m.md.GetFullyQualifiedName() {
   895  		return fmt.Errorf("given one-of, %s, is for wrong message type: %s; expecting %s", od.GetName(), od.GetOwner().GetFullyQualifiedName(), m.md.GetFullyQualifiedName())
   896  	}
   897  	for _, fd := range od.GetChoices() {
   898  		m.clearField(fd)
   899  	}
   900  	return nil
   901  }
   902  
   903  // GetMapField returns the value for the given map field descriptor and given
   904  // key. It panics if an error is encountered. See TryGetMapField.
   905  func (m *Message) GetMapField(fd *desc.FieldDescriptor, key interface{}) interface{} {
   906  	if v, err := m.TryGetMapField(fd, key); err != nil {
   907  		panic(err.Error())
   908  	} else {
   909  		return v
   910  	}
   911  }
   912  
   913  // TryGetMapField returns the value for the given map field descriptor and given
   914  // key. An error is returned if the given field descriptor does not belong to
   915  // the right message type or if it is not a map field.
   916  //
   917  // If the map field does not contain the requested key, this method returns
   918  // nil, nil. The Go type of the value returned mirrors the type that protoc
   919  // would generate for the field. (See TryGetField for more details on types).
   920  //
   921  // If the given field descriptor is not known (e.g. not present in the message
   922  // descriptor) but corresponds to an unknown field, the unknown value will be
   923  // parsed and become known. The parsed value will be searched for the requested
   924  // key and any value returned. An error will be returned if the unknown value
   925  // cannot be parsed according to the field descriptor's type information.
   926  func (m *Message) TryGetMapField(fd *desc.FieldDescriptor, key interface{}) (interface{}, error) {
   927  	if err := m.checkField(fd); err != nil {
   928  		return nil, err
   929  	}
   930  	return m.getMapField(fd, key)
   931  }
   932  
   933  // GetMapFieldByName returns the value for the map field with the given name and
   934  // given key. It panics if an error is encountered. See TryGetMapFieldByName.
   935  func (m *Message) GetMapFieldByName(name string, key interface{}) interface{} {
   936  	if v, err := m.TryGetMapFieldByName(name, key); err != nil {
   937  		panic(err.Error())
   938  	} else {
   939  		return v
   940  	}
   941  }
   942  
   943  // TryGetMapFieldByName returns the value for the map field with the given name
   944  // and given key. An error is returned if the given name is unknown or if it
   945  // names a field that is not a map field.
   946  //
   947  // If this message has no value for the given field or the value has no value
   948  // for the requested key, then this method returns nil, nil.
   949  //
   950  // (See TryGetField for more info on types.)
   951  func (m *Message) TryGetMapFieldByName(name string, key interface{}) (interface{}, error) {
   952  	fd := m.FindFieldDescriptorByName(name)
   953  	if fd == nil {
   954  		return nil, UnknownFieldNameError
   955  	}
   956  	return m.getMapField(fd, key)
   957  }
   958  
   959  // GetMapFieldByNumber returns the value for the map field with the given tag
   960  // number and given key. It panics if an error is encountered. See
   961  // TryGetMapFieldByNumber.
   962  func (m *Message) GetMapFieldByNumber(tagNumber int, key interface{}) interface{} {
   963  	if v, err := m.TryGetMapFieldByNumber(tagNumber, key); err != nil {
   964  		panic(err.Error())
   965  	} else {
   966  		return v
   967  	}
   968  }
   969  
   970  // TryGetMapFieldByNumber returns the value for the map field with the given tag
   971  // number and given key. An error is returned if the given tag is unknown or if
   972  // it indicates a field that is not a map field.
   973  //
   974  // If this message has no value for the given field or the value has no value
   975  // for the requested key, then this method returns nil, nil.
   976  //
   977  // (See TryGetField for more info on types.)
   978  func (m *Message) TryGetMapFieldByNumber(tagNumber int, key interface{}) (interface{}, error) {
   979  	fd := m.FindFieldDescriptor(int32(tagNumber))
   980  	if fd == nil {
   981  		return nil, UnknownTagNumberError
   982  	}
   983  	return m.getMapField(fd, key)
   984  }
   985  
   986  func (m *Message) getMapField(fd *desc.FieldDescriptor, key interface{}) (interface{}, error) {
   987  	if !fd.IsMap() {
   988  		return nil, FieldIsNotMapError
   989  	}
   990  	kfd := fd.GetMessageType().GetFields()[0]
   991  	ki, err := validElementFieldValue(kfd, key, false)
   992  	if err != nil {
   993  		return nil, err
   994  	}
   995  	mp := m.values[fd.GetNumber()]
   996  	if mp == nil {
   997  		if mp, err = m.parseUnknownField(fd); err != nil {
   998  			return nil, err
   999  		} else if mp == nil {
  1000  			return nil, nil
  1001  		}
  1002  	}
  1003  	return mp.(map[interface{}]interface{})[ki], nil
  1004  }
  1005  
  1006  // ForEachMapFieldEntry executes the given function for each entry in the map
  1007  // value for the given field descriptor. It stops iteration if the function
  1008  // returns false. It panics if an error is encountered. See
  1009  // TryForEachMapFieldEntry.
  1010  func (m *Message) ForEachMapFieldEntry(fd *desc.FieldDescriptor, fn func(key, val interface{}) bool) {
  1011  	if err := m.TryForEachMapFieldEntry(fd, fn); err != nil {
  1012  		panic(err.Error())
  1013  	}
  1014  }
  1015  
  1016  // TryForEachMapFieldEntry executes the given function for each entry in the map
  1017  // value for the given field descriptor. An error is returned if the given field
  1018  // descriptor does not belong to the right message type or if it is not a  map
  1019  // field.
  1020  //
  1021  // Iteration ends either when all entries have been examined or when the given
  1022  // function returns false. So the function is expected to return true for normal
  1023  // iteration and false to break out. If this message has no value for the given
  1024  // field, it returns without invoking the given function.
  1025  //
  1026  // The Go type of the key and value supplied to the function mirrors the type
  1027  // that protoc would generate for the field. (See TryGetField for more details
  1028  // on types).
  1029  //
  1030  // If the given field descriptor is not known (e.g. not present in the message
  1031  // descriptor) but corresponds to an unknown field, the unknown value will be
  1032  // parsed and become known. The parsed value will be searched for the requested
  1033  // key and any value returned. An error will be returned if the unknown value
  1034  // cannot be parsed according to the field descriptor's type information.
  1035  func (m *Message) TryForEachMapFieldEntry(fd *desc.FieldDescriptor, fn func(key, val interface{}) bool) error {
  1036  	if err := m.checkField(fd); err != nil {
  1037  		return err
  1038  	}
  1039  	return m.forEachMapFieldEntry(fd, fn)
  1040  }
  1041  
  1042  // ForEachMapFieldEntryByName executes the given function for each entry in the
  1043  // map value for the field with the given name. It stops iteration if the
  1044  // function returns false. It panics if an error is encountered. See
  1045  // TryForEachMapFieldEntryByName.
  1046  func (m *Message) ForEachMapFieldEntryByName(name string, fn func(key, val interface{}) bool) {
  1047  	if err := m.TryForEachMapFieldEntryByName(name, fn); err != nil {
  1048  		panic(err.Error())
  1049  	}
  1050  }
  1051  
  1052  // TryForEachMapFieldEntryByName executes the given function for each entry in
  1053  // the map value for the field with the given name. It stops iteration if the
  1054  // function returns false. An error is returned if the given name is unknown or
  1055  // if it names a field that is not a map field.
  1056  //
  1057  // If this message has no value for the given field, it returns without ever
  1058  // invoking the given function.
  1059  //
  1060  // (See TryGetField for more info on types supplied to the function.)
  1061  func (m *Message) TryForEachMapFieldEntryByName(name string, fn func(key, val interface{}) bool) error {
  1062  	fd := m.FindFieldDescriptorByName(name)
  1063  	if fd == nil {
  1064  		return UnknownFieldNameError
  1065  	}
  1066  	return m.forEachMapFieldEntry(fd, fn)
  1067  }
  1068  
  1069  // ForEachMapFieldEntryByNumber executes the given function for each entry in
  1070  // the map value for the field with the given tag number. It stops iteration if
  1071  // the function returns false. It panics if an error is encountered. See
  1072  // TryForEachMapFieldEntryByNumber.
  1073  func (m *Message) ForEachMapFieldEntryByNumber(tagNumber int, fn func(key, val interface{}) bool) {
  1074  	if err := m.TryForEachMapFieldEntryByNumber(tagNumber, fn); err != nil {
  1075  		panic(err.Error())
  1076  	}
  1077  }
  1078  
  1079  // TryForEachMapFieldEntryByNumber executes the given function for each entry in
  1080  // the map value for the field with the given tag number. It stops iteration if
  1081  // the function returns false. An error is returned if the given tag is unknown
  1082  // or if it indicates a field that is not a map field.
  1083  //
  1084  // If this message has no value for the given field, it returns without ever
  1085  // invoking the given function.
  1086  //
  1087  // (See TryGetField for more info on types supplied to the function.)
  1088  func (m *Message) TryForEachMapFieldEntryByNumber(tagNumber int, fn func(key, val interface{}) bool) error {
  1089  	fd := m.FindFieldDescriptor(int32(tagNumber))
  1090  	if fd == nil {
  1091  		return UnknownTagNumberError
  1092  	}
  1093  	return m.forEachMapFieldEntry(fd, fn)
  1094  }
  1095  
  1096  func (m *Message) forEachMapFieldEntry(fd *desc.FieldDescriptor, fn func(key, val interface{}) bool) error {
  1097  	if !fd.IsMap() {
  1098  		return FieldIsNotMapError
  1099  	}
  1100  	mp := m.values[fd.GetNumber()]
  1101  	if mp == nil {
  1102  		if mp, err := m.parseUnknownField(fd); err != nil {
  1103  			return err
  1104  		} else if mp == nil {
  1105  			return nil
  1106  		}
  1107  	}
  1108  	for k, v := range mp.(map[interface{}]interface{}) {
  1109  		if !fn(k, v) {
  1110  			break
  1111  		}
  1112  	}
  1113  	return nil
  1114  }
  1115  
  1116  // PutMapField sets the value for the given map field descriptor and given key
  1117  // to the given value. It panics if an error is encountered. See TryPutMapField.
  1118  func (m *Message) PutMapField(fd *desc.FieldDescriptor, key interface{}, val interface{}) {
  1119  	if err := m.TryPutMapField(fd, key, val); err != nil {
  1120  		panic(err.Error())
  1121  	}
  1122  }
  1123  
  1124  // TryPutMapField sets the value for the given map field descriptor and given
  1125  // key to the given value. An error is returned if the given field descriptor
  1126  // does not belong to the right message type, if the given field is not a map
  1127  // field, or if the given value is not a correct/compatible type for the given
  1128  // field.
  1129  //
  1130  // The Go type expected for a field  is the same as required by TrySetField for
  1131  // a field with the same type as the map's value type.
  1132  //
  1133  // If the given field descriptor is not known (e.g. not present in the message
  1134  // descriptor) it will become known. Subsequent operations using tag numbers or
  1135  // names will be able to resolve the newly-known type. If the message has a
  1136  // value for the unknown value, it is cleared, replaced by the given known
  1137  // value.
  1138  func (m *Message) TryPutMapField(fd *desc.FieldDescriptor, key interface{}, val interface{}) error {
  1139  	if err := m.checkField(fd); err != nil {
  1140  		return err
  1141  	}
  1142  	return m.putMapField(fd, key, val)
  1143  }
  1144  
  1145  // PutMapFieldByName sets the value for the map field with the given name and
  1146  // given key to the given value. It panics if an error is encountered. See
  1147  // TryPutMapFieldByName.
  1148  func (m *Message) PutMapFieldByName(name string, key interface{}, val interface{}) {
  1149  	if err := m.TryPutMapFieldByName(name, key, val); err != nil {
  1150  		panic(err.Error())
  1151  	}
  1152  }
  1153  
  1154  // TryPutMapFieldByName sets the value for the map field with the given name and
  1155  // the given key to the given value. An error is returned if the given name is
  1156  // unknown, if it names a field that is not a map, or if the given value has an
  1157  // incorrect type.
  1158  //
  1159  // (See TrySetField for more info on types.)
  1160  func (m *Message) TryPutMapFieldByName(name string, key interface{}, val interface{}) error {
  1161  	fd := m.FindFieldDescriptorByName(name)
  1162  	if fd == nil {
  1163  		return UnknownFieldNameError
  1164  	}
  1165  	return m.putMapField(fd, key, val)
  1166  }
  1167  
  1168  // PutMapFieldByNumber sets the value for the map field with the given tag
  1169  // number and given key to the given value. It panics if an error is
  1170  // encountered. See TryPutMapFieldByNumber.
  1171  func (m *Message) PutMapFieldByNumber(tagNumber int, key interface{}, val interface{}) {
  1172  	if err := m.TryPutMapFieldByNumber(tagNumber, key, val); err != nil {
  1173  		panic(err.Error())
  1174  	}
  1175  }
  1176  
  1177  // TryPutMapFieldByNumber sets the value for the map field with the given tag
  1178  // number and the given key to the given value. An error is returned if the
  1179  // given tag is unknown, if it indicates a field that is not a map, or if the
  1180  // given value has an incorrect type.
  1181  //
  1182  // (See TrySetField for more info on types.)
  1183  func (m *Message) TryPutMapFieldByNumber(tagNumber int, key interface{}, val interface{}) error {
  1184  	fd := m.FindFieldDescriptor(int32(tagNumber))
  1185  	if fd == nil {
  1186  		return UnknownTagNumberError
  1187  	}
  1188  	return m.putMapField(fd, key, val)
  1189  }
  1190  
  1191  func (m *Message) putMapField(fd *desc.FieldDescriptor, key interface{}, val interface{}) error {
  1192  	if !fd.IsMap() {
  1193  		return FieldIsNotMapError
  1194  	}
  1195  	kfd := fd.GetMessageType().GetFields()[0]
  1196  	ki, err := validElementFieldValue(kfd, key, false)
  1197  	if err != nil {
  1198  		return err
  1199  	}
  1200  	vfd := fd.GetMessageType().GetFields()[1]
  1201  	vi, err := validElementFieldValue(vfd, val, true)
  1202  	if err != nil {
  1203  		return err
  1204  	}
  1205  	mp := m.values[fd.GetNumber()]
  1206  	if mp == nil {
  1207  		if mp, err = m.parseUnknownField(fd); err != nil {
  1208  			return err
  1209  		} else if mp == nil {
  1210  			m.internalSetField(fd, map[interface{}]interface{}{ki: vi})
  1211  			return nil
  1212  		}
  1213  	}
  1214  	mp.(map[interface{}]interface{})[ki] = vi
  1215  	return nil
  1216  }
  1217  
  1218  // RemoveMapField changes the value for the given field descriptor by removing
  1219  // any value associated with the given key. It panics if an error is
  1220  // encountered. See TryRemoveMapField.
  1221  func (m *Message) RemoveMapField(fd *desc.FieldDescriptor, key interface{}) {
  1222  	if err := m.TryRemoveMapField(fd, key); err != nil {
  1223  		panic(err.Error())
  1224  	}
  1225  }
  1226  
  1227  // TryRemoveMapField changes the value for the given field descriptor by
  1228  // removing any value associated with the given key. An error is returned if the
  1229  // given field descriptor does not belong to the right message type or if the
  1230  // given field is not a map field.
  1231  //
  1232  // If the given field descriptor is not known (e.g. not present in the message
  1233  // descriptor) it will become known. Subsequent operations using tag numbers or
  1234  // names will be able to resolve the newly-known type. If the message has a
  1235  // value for the unknown value, it is parsed and any value for the given key
  1236  // removed.
  1237  func (m *Message) TryRemoveMapField(fd *desc.FieldDescriptor, key interface{}) error {
  1238  	if err := m.checkField(fd); err != nil {
  1239  		return err
  1240  	}
  1241  	return m.removeMapField(fd, key)
  1242  }
  1243  
  1244  // RemoveMapFieldByName changes the value for the field with the given name by
  1245  // removing any value associated with the given key. It panics if an error is
  1246  // encountered. See TryRemoveMapFieldByName.
  1247  func (m *Message) RemoveMapFieldByName(name string, key interface{}) {
  1248  	if err := m.TryRemoveMapFieldByName(name, key); err != nil {
  1249  		panic(err.Error())
  1250  	}
  1251  }
  1252  
  1253  // TryRemoveMapFieldByName changes the value for the field with the given name
  1254  // by removing any value associated with the given key. An error is returned if
  1255  // the given name is unknown or if it names a field that is not a map.
  1256  func (m *Message) TryRemoveMapFieldByName(name string, key interface{}) error {
  1257  	fd := m.FindFieldDescriptorByName(name)
  1258  	if fd == nil {
  1259  		return UnknownFieldNameError
  1260  	}
  1261  	return m.removeMapField(fd, key)
  1262  }
  1263  
  1264  // RemoveMapFieldByNumber changes the value for the field with the given tag
  1265  // number by removing any value associated with the given key. It panics if an
  1266  // error is encountered. See TryRemoveMapFieldByNumber.
  1267  func (m *Message) RemoveMapFieldByNumber(tagNumber int, key interface{}) {
  1268  	if err := m.TryRemoveMapFieldByNumber(tagNumber, key); err != nil {
  1269  		panic(err.Error())
  1270  	}
  1271  }
  1272  
  1273  // TryRemoveMapFieldByNumber changes the value for the field with the given tag
  1274  // number by removing any value associated with the given key. An error is
  1275  // returned if the given tag is unknown or if it indicates a field that is not
  1276  // a map.
  1277  func (m *Message) TryRemoveMapFieldByNumber(tagNumber int, key interface{}) error {
  1278  	fd := m.FindFieldDescriptor(int32(tagNumber))
  1279  	if fd == nil {
  1280  		return UnknownTagNumberError
  1281  	}
  1282  	return m.removeMapField(fd, key)
  1283  }
  1284  
  1285  func (m *Message) removeMapField(fd *desc.FieldDescriptor, key interface{}) error {
  1286  	if !fd.IsMap() {
  1287  		return FieldIsNotMapError
  1288  	}
  1289  	kfd := fd.GetMessageType().GetFields()[0]
  1290  	ki, err := validElementFieldValue(kfd, key, false)
  1291  	if err != nil {
  1292  		return err
  1293  	}
  1294  	mp := m.values[fd.GetNumber()]
  1295  	if mp == nil {
  1296  		if mp, err = m.parseUnknownField(fd); err != nil {
  1297  			return err
  1298  		} else if mp == nil {
  1299  			return nil
  1300  		}
  1301  	}
  1302  	res := mp.(map[interface{}]interface{})
  1303  	delete(res, ki)
  1304  	if len(res) == 0 {
  1305  		delete(m.values, fd.GetNumber())
  1306  	}
  1307  	return nil
  1308  }
  1309  
  1310  // FieldLength returns the number of elements in this message for the given
  1311  // field descriptor. It panics if an error is encountered. See TryFieldLength.
  1312  func (m *Message) FieldLength(fd *desc.FieldDescriptor) int {
  1313  	l, err := m.TryFieldLength(fd)
  1314  	if err != nil {
  1315  		panic(err.Error())
  1316  	}
  1317  	return l
  1318  }
  1319  
  1320  // TryFieldLength returns the number of elements in this message for the given
  1321  // field descriptor. An error is returned if the given field descriptor does not
  1322  // belong to the right message type or if it is neither a map field nor a
  1323  // repeated field.
  1324  func (m *Message) TryFieldLength(fd *desc.FieldDescriptor) (int, error) {
  1325  	if err := m.checkField(fd); err != nil {
  1326  		return 0, err
  1327  	}
  1328  	return m.fieldLength(fd)
  1329  }
  1330  
  1331  // FieldLengthByName returns the number of elements in this message for the
  1332  // field with the given name. It panics if an error is encountered. See
  1333  // TryFieldLengthByName.
  1334  func (m *Message) FieldLengthByName(name string) int {
  1335  	l, err := m.TryFieldLengthByName(name)
  1336  	if err != nil {
  1337  		panic(err.Error())
  1338  	}
  1339  	return l
  1340  }
  1341  
  1342  // TryFieldLengthByName returns the number of elements in this message for the
  1343  // field with the given name. An error is returned if the given name is unknown
  1344  // or if the named field is neither a map field nor a repeated field.
  1345  func (m *Message) TryFieldLengthByName(name string) (int, error) {
  1346  	fd := m.FindFieldDescriptorByName(name)
  1347  	if fd == nil {
  1348  		return 0, UnknownFieldNameError
  1349  	}
  1350  	return m.fieldLength(fd)
  1351  }
  1352  
  1353  // FieldLengthByNumber returns the number of elements in this message for the
  1354  // field with the given tag number. It panics if an error is encountered. See
  1355  // TryFieldLengthByNumber.
  1356  func (m *Message) FieldLengthByNumber(tagNumber int32) int {
  1357  	l, err := m.TryFieldLengthByNumber(tagNumber)
  1358  	if err != nil {
  1359  		panic(err.Error())
  1360  	}
  1361  	return l
  1362  }
  1363  
  1364  // TryFieldLengthByNumber returns the number of elements in this message for the
  1365  // field with the given tag number. An error is returned if the given tag is
  1366  // unknown or if the named field is neither a map field nor a repeated field.
  1367  func (m *Message) TryFieldLengthByNumber(tagNumber int32) (int, error) {
  1368  	fd := m.FindFieldDescriptor(int32(tagNumber))
  1369  	if fd == nil {
  1370  		return 0, UnknownTagNumberError
  1371  	}
  1372  	return m.fieldLength(fd)
  1373  }
  1374  
  1375  func (m *Message) fieldLength(fd *desc.FieldDescriptor) (int, error) {
  1376  	if !fd.IsRepeated() {
  1377  		return 0, FieldIsNotRepeatedError
  1378  	}
  1379  	val := m.values[fd.GetNumber()]
  1380  	if val == nil {
  1381  		var err error
  1382  		if val, err = m.parseUnknownField(fd); err != nil {
  1383  			return 0, err
  1384  		} else if val == nil {
  1385  			return 0, nil
  1386  		}
  1387  	}
  1388  	if sl, ok := val.([]interface{}); ok {
  1389  		return len(sl), nil
  1390  	} else if mp, ok := val.(map[interface{}]interface{}); ok {
  1391  		return len(mp), nil
  1392  	}
  1393  	return 0, nil
  1394  }
  1395  
  1396  // GetRepeatedField returns the value for the given repeated field descriptor at
  1397  // the given index. It panics if an error is encountered. See
  1398  // TryGetRepeatedField.
  1399  func (m *Message) GetRepeatedField(fd *desc.FieldDescriptor, index int) interface{} {
  1400  	if v, err := m.TryGetRepeatedField(fd, index); err != nil {
  1401  		panic(err.Error())
  1402  	} else {
  1403  		return v
  1404  	}
  1405  }
  1406  
  1407  // TryGetRepeatedField returns the value for the given repeated field descriptor
  1408  // at the given index. An error is returned if the given field descriptor does
  1409  // not belong to the right message type, if it is not a repeated field, or if
  1410  // the given index is out of range (less than zero or greater than or equal to
  1411  // the length of the repeated field). Also, even though map fields technically
  1412  // are repeated fields, if the given field is a map field an error will result:
  1413  // map representation does not lend itself to random access by index.
  1414  //
  1415  // The Go type of the value returned mirrors the type that protoc would generate
  1416  // for the field's element type. (See TryGetField for more details on types).
  1417  //
  1418  // If the given field descriptor is not known (e.g. not present in the message
  1419  // descriptor) but corresponds to an unknown field, the unknown value will be
  1420  // parsed and become known. The value at the given index in the parsed value
  1421  // will be returned. An error will be returned if the unknown value cannot be
  1422  // parsed according to the field descriptor's type information.
  1423  func (m *Message) TryGetRepeatedField(fd *desc.FieldDescriptor, index int) (interface{}, error) {
  1424  	if index < 0 {
  1425  		return nil, IndexOutOfRangeError
  1426  	}
  1427  	if err := m.checkField(fd); err != nil {
  1428  		return nil, err
  1429  	}
  1430  	return m.getRepeatedField(fd, index)
  1431  }
  1432  
  1433  // GetRepeatedFieldByName returns the value for the repeated field with the
  1434  // given name at the given index. It panics if an error is encountered. See
  1435  // TryGetRepeatedFieldByName.
  1436  func (m *Message) GetRepeatedFieldByName(name string, index int) interface{} {
  1437  	if v, err := m.TryGetRepeatedFieldByName(name, index); err != nil {
  1438  		panic(err.Error())
  1439  	} else {
  1440  		return v
  1441  	}
  1442  }
  1443  
  1444  // TryGetRepeatedFieldByName returns the value for the repeated field with the
  1445  // given name at the given index. An error is returned if the given name is
  1446  // unknown, if it names a field that is not a repeated field (or is a map
  1447  // field), or if the given index is out of range (less than zero or greater
  1448  // than or equal to the length of the repeated field).
  1449  //
  1450  // (See TryGetField for more info on types.)
  1451  func (m *Message) TryGetRepeatedFieldByName(name string, index int) (interface{}, error) {
  1452  	if index < 0 {
  1453  		return nil, IndexOutOfRangeError
  1454  	}
  1455  	fd := m.FindFieldDescriptorByName(name)
  1456  	if fd == nil {
  1457  		return nil, UnknownFieldNameError
  1458  	}
  1459  	return m.getRepeatedField(fd, index)
  1460  }
  1461  
  1462  // GetRepeatedFieldByNumber returns the value for the repeated field with the
  1463  // given tag number at the given index. It panics if an error is encountered.
  1464  // See TryGetRepeatedFieldByNumber.
  1465  func (m *Message) GetRepeatedFieldByNumber(tagNumber int, index int) interface{} {
  1466  	if v, err := m.TryGetRepeatedFieldByNumber(tagNumber, index); err != nil {
  1467  		panic(err.Error())
  1468  	} else {
  1469  		return v
  1470  	}
  1471  }
  1472  
  1473  // TryGetRepeatedFieldByNumber returns the value for the repeated field with the
  1474  // given tag number at the given index. An error is returned if the given tag is
  1475  // unknown, if it indicates a field that is not a repeated field (or is a map
  1476  // field), or if the given index is out of range (less than zero or greater than
  1477  // or equal to the length of the repeated field).
  1478  //
  1479  // (See TryGetField for more info on types.)
  1480  func (m *Message) TryGetRepeatedFieldByNumber(tagNumber int, index int) (interface{}, error) {
  1481  	if index < 0 {
  1482  		return nil, IndexOutOfRangeError
  1483  	}
  1484  	fd := m.FindFieldDescriptor(int32(tagNumber))
  1485  	if fd == nil {
  1486  		return nil, UnknownTagNumberError
  1487  	}
  1488  	return m.getRepeatedField(fd, index)
  1489  }
  1490  
  1491  func (m *Message) getRepeatedField(fd *desc.FieldDescriptor, index int) (interface{}, error) {
  1492  	if fd.IsMap() || !fd.IsRepeated() {
  1493  		return nil, FieldIsNotRepeatedError
  1494  	}
  1495  	sl := m.values[fd.GetNumber()]
  1496  	if sl == nil {
  1497  		var err error
  1498  		if sl, err = m.parseUnknownField(fd); err != nil {
  1499  			return nil, err
  1500  		} else if sl == nil {
  1501  			return nil, IndexOutOfRangeError
  1502  		}
  1503  	}
  1504  	res := sl.([]interface{})
  1505  	if index >= len(res) {
  1506  		return nil, IndexOutOfRangeError
  1507  	}
  1508  	return res[index], nil
  1509  }
  1510  
  1511  // AddRepeatedField appends the given value to the given repeated field. It
  1512  // panics if an error is encountered. See TryAddRepeatedField.
  1513  func (m *Message) AddRepeatedField(fd *desc.FieldDescriptor, val interface{}) {
  1514  	if err := m.TryAddRepeatedField(fd, val); err != nil {
  1515  		panic(err.Error())
  1516  	}
  1517  }
  1518  
  1519  // TryAddRepeatedField appends the given value to the given repeated field. An
  1520  // error is returned if the given field descriptor does not belong to the right
  1521  // message type, if the given field is not repeated, or if the given value is
  1522  // not a correct/compatible type for the given field. If the given field is a
  1523  // map field, the call will succeed if the given value is an instance of the
  1524  // map's entry message type.
  1525  //
  1526  // The Go type expected for a field  is the same as required by TrySetField for
  1527  // a non-repeated field of the same type.
  1528  //
  1529  // If the given field descriptor is not known (e.g. not present in the message
  1530  // descriptor) it will become known. Subsequent operations using tag numbers or
  1531  // names will be able to resolve the newly-known type. If the message has a
  1532  // value for the unknown value, it is parsed and the given value is appended to
  1533  // it.
  1534  func (m *Message) TryAddRepeatedField(fd *desc.FieldDescriptor, val interface{}) error {
  1535  	if err := m.checkField(fd); err != nil {
  1536  		return err
  1537  	}
  1538  	return m.addRepeatedField(fd, val)
  1539  }
  1540  
  1541  // AddRepeatedFieldByName appends the given value to the repeated field with the
  1542  // given name. It panics if an error is encountered. See
  1543  // TryAddRepeatedFieldByName.
  1544  func (m *Message) AddRepeatedFieldByName(name string, val interface{}) {
  1545  	if err := m.TryAddRepeatedFieldByName(name, val); err != nil {
  1546  		panic(err.Error())
  1547  	}
  1548  }
  1549  
  1550  // TryAddRepeatedFieldByName appends the given value to the repeated field with
  1551  // the given name. An error is returned if the given name is unknown, if it
  1552  // names a field that is not repeated, or if the given value has an incorrect
  1553  // type.
  1554  //
  1555  // (See TrySetField for more info on types.)
  1556  func (m *Message) TryAddRepeatedFieldByName(name string, val interface{}) error {
  1557  	fd := m.FindFieldDescriptorByName(name)
  1558  	if fd == nil {
  1559  		return UnknownFieldNameError
  1560  	}
  1561  	return m.addRepeatedField(fd, val)
  1562  }
  1563  
  1564  // AddRepeatedFieldByNumber appends the given value to the repeated field with
  1565  // the given tag number. It panics if an error is encountered. See
  1566  // TryAddRepeatedFieldByNumber.
  1567  func (m *Message) AddRepeatedFieldByNumber(tagNumber int, val interface{}) {
  1568  	if err := m.TryAddRepeatedFieldByNumber(tagNumber, val); err != nil {
  1569  		panic(err.Error())
  1570  	}
  1571  }
  1572  
  1573  // TryAddRepeatedFieldByNumber appends the given value to the repeated field
  1574  // with the given tag number. An error is returned if the given tag is unknown,
  1575  // if it indicates a field that is not repeated, or if the given value has an
  1576  // incorrect type.
  1577  //
  1578  // (See TrySetField for more info on types.)
  1579  func (m *Message) TryAddRepeatedFieldByNumber(tagNumber int, val interface{}) error {
  1580  	fd := m.FindFieldDescriptor(int32(tagNumber))
  1581  	if fd == nil {
  1582  		return UnknownTagNumberError
  1583  	}
  1584  	return m.addRepeatedField(fd, val)
  1585  }
  1586  
  1587  func (m *Message) addRepeatedField(fd *desc.FieldDescriptor, val interface{}) error {
  1588  	if !fd.IsRepeated() {
  1589  		return FieldIsNotRepeatedError
  1590  	}
  1591  	val, err := validElementFieldValue(fd, val, false)
  1592  	if err != nil {
  1593  		return err
  1594  	}
  1595  
  1596  	if fd.IsMap() {
  1597  		// We're lenient. Just as we allow setting a map field to a slice of entry messages, we also allow
  1598  		// adding entries one at a time (as if the field were a normal repeated field).
  1599  		msg := val.(proto.Message)
  1600  		dm, err := asDynamicMessage(msg, fd.GetMessageType(), m.mf)
  1601  		if err != nil {
  1602  			return err
  1603  		}
  1604  		k, err := dm.TryGetFieldByNumber(1)
  1605  		if err != nil {
  1606  			return err
  1607  		}
  1608  		v, err := dm.TryGetFieldByNumber(2)
  1609  		if err != nil {
  1610  			return err
  1611  		}
  1612  		return m.putMapField(fd, k, v)
  1613  	}
  1614  
  1615  	sl := m.values[fd.GetNumber()]
  1616  	if sl == nil {
  1617  		if sl, err = m.parseUnknownField(fd); err != nil {
  1618  			return err
  1619  		} else if sl == nil {
  1620  			sl = []interface{}{}
  1621  		}
  1622  	}
  1623  	res := sl.([]interface{})
  1624  	res = append(res, val)
  1625  	m.internalSetField(fd, res)
  1626  	return nil
  1627  }
  1628  
  1629  // SetRepeatedField sets the value for the given repeated field descriptor and
  1630  // given index to the given value. It panics if an error is encountered. See
  1631  // SetRepeatedField.
  1632  func (m *Message) SetRepeatedField(fd *desc.FieldDescriptor, index int, val interface{}) {
  1633  	if err := m.TrySetRepeatedField(fd, index, val); err != nil {
  1634  		panic(err.Error())
  1635  	}
  1636  }
  1637  
  1638  // TrySetRepeatedField sets the value for the given repeated field descriptor
  1639  // and given index to the given value. An error is returned if the given field
  1640  // descriptor does not belong to the right message type, if the given field is
  1641  // not repeated, or if the given value is not a correct/compatible type for the
  1642  // given field. Also, even though map fields technically are repeated fields, if
  1643  // the given field is a map field an error will result: map representation does
  1644  // not lend itself to random access by index.
  1645  //
  1646  // The Go type expected for a field  is the same as required by TrySetField for
  1647  // a non-repeated field of the same type.
  1648  //
  1649  // If the given field descriptor is not known (e.g. not present in the message
  1650  // descriptor) it will become known. Subsequent operations using tag numbers or
  1651  // names will be able to resolve the newly-known type. If the message has a
  1652  // value for the unknown value, it is parsed and the element at the given index
  1653  // is replaced with the given value.
  1654  func (m *Message) TrySetRepeatedField(fd *desc.FieldDescriptor, index int, val interface{}) error {
  1655  	if index < 0 {
  1656  		return IndexOutOfRangeError
  1657  	}
  1658  	if err := m.checkField(fd); err != nil {
  1659  		return err
  1660  	}
  1661  	return m.setRepeatedField(fd, index, val)
  1662  }
  1663  
  1664  // SetRepeatedFieldByName sets the value for the repeated field with the given
  1665  // name and given index to the given value. It panics if an error is
  1666  // encountered. See TrySetRepeatedFieldByName.
  1667  func (m *Message) SetRepeatedFieldByName(name string, index int, val interface{}) {
  1668  	if err := m.TrySetRepeatedFieldByName(name, index, val); err != nil {
  1669  		panic(err.Error())
  1670  	}
  1671  }
  1672  
  1673  // TrySetRepeatedFieldByName sets the value for the repeated field with the
  1674  // given name and the given index to the given value. An error is returned if
  1675  // the given name is unknown, if it names a field that is not repeated (or is a
  1676  // map field), or if the given value has an incorrect type.
  1677  //
  1678  // (See TrySetField for more info on types.)
  1679  func (m *Message) TrySetRepeatedFieldByName(name string, index int, val interface{}) error {
  1680  	if index < 0 {
  1681  		return IndexOutOfRangeError
  1682  	}
  1683  	fd := m.FindFieldDescriptorByName(name)
  1684  	if fd == nil {
  1685  		return UnknownFieldNameError
  1686  	}
  1687  	return m.setRepeatedField(fd, index, val)
  1688  }
  1689  
  1690  // SetRepeatedFieldByNumber sets the value for the repeated field with the given
  1691  // tag number and given index to the given value. It panics if an error is
  1692  // encountered. See TrySetRepeatedFieldByNumber.
  1693  func (m *Message) SetRepeatedFieldByNumber(tagNumber int, index int, val interface{}) {
  1694  	if err := m.TrySetRepeatedFieldByNumber(tagNumber, index, val); err != nil {
  1695  		panic(err.Error())
  1696  	}
  1697  }
  1698  
  1699  // TrySetRepeatedFieldByNumber sets the value for the repeated field with the
  1700  // given tag number and the given index to the given value. An error is returned
  1701  // if the given tag is unknown, if it indicates a field that is not repeated (or
  1702  // is a map field), or if the given value has an incorrect type.
  1703  //
  1704  // (See TrySetField for more info on types.)
  1705  func (m *Message) TrySetRepeatedFieldByNumber(tagNumber int, index int, val interface{}) error {
  1706  	if index < 0 {
  1707  		return IndexOutOfRangeError
  1708  	}
  1709  	fd := m.FindFieldDescriptor(int32(tagNumber))
  1710  	if fd == nil {
  1711  		return UnknownTagNumberError
  1712  	}
  1713  	return m.setRepeatedField(fd, index, val)
  1714  }
  1715  
  1716  func (m *Message) setRepeatedField(fd *desc.FieldDescriptor, index int, val interface{}) error {
  1717  	if fd.IsMap() || !fd.IsRepeated() {
  1718  		return FieldIsNotRepeatedError
  1719  	}
  1720  	val, err := validElementFieldValue(fd, val, false)
  1721  	if err != nil {
  1722  		return err
  1723  	}
  1724  	sl := m.values[fd.GetNumber()]
  1725  	if sl == nil {
  1726  		if sl, err = m.parseUnknownField(fd); err != nil {
  1727  			return err
  1728  		} else if sl == nil {
  1729  			return IndexOutOfRangeError
  1730  		}
  1731  	}
  1732  	res := sl.([]interface{})
  1733  	if index >= len(res) {
  1734  		return IndexOutOfRangeError
  1735  	}
  1736  	res[index] = val
  1737  	return nil
  1738  }
  1739  
  1740  // GetUnknownField gets the value(s) for the given unknown tag number. If this
  1741  // message has no unknown fields with the given tag, nil is returned.
  1742  func (m *Message) GetUnknownField(tagNumber int32) []UnknownField {
  1743  	if u, ok := m.unknownFields[tagNumber]; ok {
  1744  		return u
  1745  	} else {
  1746  		return nil
  1747  	}
  1748  }
  1749  
  1750  func (m *Message) parseUnknownField(fd *desc.FieldDescriptor) (interface{}, error) {
  1751  	unks, ok := m.unknownFields[fd.GetNumber()]
  1752  	if !ok {
  1753  		return nil, nil
  1754  	}
  1755  	var v interface{}
  1756  	var sl []interface{}
  1757  	var mp map[interface{}]interface{}
  1758  	if fd.IsMap() {
  1759  		mp = map[interface{}]interface{}{}
  1760  	}
  1761  	var err error
  1762  	for _, unk := range unks {
  1763  		var val interface{}
  1764  		if unk.Encoding == proto.WireBytes || unk.Encoding == proto.WireStartGroup {
  1765  			val, err = codec.DecodeLengthDelimitedField(fd, unk.Contents, m.mf)
  1766  		} else {
  1767  			val, err = codec.DecodeScalarField(fd, unk.Value)
  1768  		}
  1769  		if err != nil {
  1770  			return nil, err
  1771  		}
  1772  		if fd.IsMap() {
  1773  			newEntry := val.(*Message)
  1774  			kk, err := newEntry.TryGetFieldByNumber(1)
  1775  			if err != nil {
  1776  				return nil, err
  1777  			}
  1778  			vv, err := newEntry.TryGetFieldByNumber(2)
  1779  			if err != nil {
  1780  				return nil, err
  1781  			}
  1782  			mp[kk] = vv
  1783  			v = mp
  1784  		} else if fd.IsRepeated() {
  1785  			t := reflect.TypeOf(val)
  1786  			if t.Kind() == reflect.Slice && t != typeOfBytes {
  1787  				// append slices if we unmarshalled a packed repeated field
  1788  				newVals := val.([]interface{})
  1789  				sl = append(sl, newVals...)
  1790  			} else {
  1791  				sl = append(sl, val)
  1792  			}
  1793  			v = sl
  1794  		} else {
  1795  			v = val
  1796  		}
  1797  	}
  1798  	m.internalSetField(fd, v)
  1799  	return v, nil
  1800  }
  1801  
  1802  func validFieldValue(fd *desc.FieldDescriptor, val interface{}) (interface{}, error) {
  1803  	return validFieldValueForRv(fd, reflect.ValueOf(val))
  1804  }
  1805  
  1806  func validFieldValueForRv(fd *desc.FieldDescriptor, val reflect.Value) (interface{}, error) {
  1807  	if fd.IsMap() && val.Kind() == reflect.Map {
  1808  		return validFieldValueForMapField(fd, val)
  1809  	}
  1810  
  1811  	if fd.IsRepeated() { // this will also catch map fields where given value was not a map
  1812  		if val.Kind() != reflect.Array && val.Kind() != reflect.Slice {
  1813  			if fd.IsMap() {
  1814  				return nil, fmt.Errorf("value for map field must be a map; instead was %v", val.Type())
  1815  			} else {
  1816  				return nil, fmt.Errorf("value for repeated field must be a slice; instead was %v", val.Type())
  1817  			}
  1818  		}
  1819  
  1820  		if fd.IsMap() {
  1821  			// value should be a slice of entry messages that we need convert into a map[interface{}]interface{}
  1822  			m := map[interface{}]interface{}{}
  1823  			for i := 0; i < val.Len(); i++ {
  1824  				e, err := validElementFieldValue(fd, val.Index(i).Interface(), false)
  1825  				if err != nil {
  1826  					return nil, err
  1827  				}
  1828  				msg := e.(proto.Message)
  1829  				dm, err := asDynamicMessage(msg, fd.GetMessageType(), nil)
  1830  				if err != nil {
  1831  					return nil, err
  1832  				}
  1833  				k, err := dm.TryGetFieldByNumber(1)
  1834  				if err != nil {
  1835  					return nil, err
  1836  				}
  1837  				v, err := dm.TryGetFieldByNumber(2)
  1838  				if err != nil {
  1839  					return nil, err
  1840  				}
  1841  				m[k] = v
  1842  			}
  1843  			return m, nil
  1844  		}
  1845  
  1846  		// make a defensive copy while checking contents (also converts to []interface{})
  1847  		s := make([]interface{}, val.Len())
  1848  		for i := 0; i < val.Len(); i++ {
  1849  			ev := val.Index(i)
  1850  			if ev.Kind() == reflect.Interface {
  1851  				// unwrap it
  1852  				ev = reflect.ValueOf(ev.Interface())
  1853  			}
  1854  			e, err := validElementFieldValueForRv(fd, ev, false)
  1855  			if err != nil {
  1856  				return nil, err
  1857  			}
  1858  			s[i] = e
  1859  		}
  1860  
  1861  		return s, nil
  1862  	}
  1863  
  1864  	return validElementFieldValueForRv(fd, val, false)
  1865  }
  1866  
  1867  func asDynamicMessage(m proto.Message, md *desc.MessageDescriptor, mf *MessageFactory) (*Message, error) {
  1868  	if dm, ok := m.(*Message); ok {
  1869  		return dm, nil
  1870  	}
  1871  	dm := NewMessageWithMessageFactory(md, mf)
  1872  	if err := dm.mergeFrom(m); err != nil {
  1873  		return nil, err
  1874  	}
  1875  	return dm, nil
  1876  }
  1877  
  1878  func validElementFieldValue(fd *desc.FieldDescriptor, val interface{}, allowNilMessage bool) (interface{}, error) {
  1879  	return validElementFieldValueForRv(fd, reflect.ValueOf(val), allowNilMessage)
  1880  }
  1881  
  1882  func validElementFieldValueForRv(fd *desc.FieldDescriptor, val reflect.Value, allowNilMessage bool) (interface{}, error) {
  1883  	t := fd.GetType()
  1884  	if !val.IsValid() {
  1885  		return nil, typeError(fd, nil)
  1886  	}
  1887  
  1888  	switch t {
  1889  	case descriptorpb.FieldDescriptorProto_TYPE_SFIXED32,
  1890  		descriptorpb.FieldDescriptorProto_TYPE_INT32,
  1891  		descriptorpb.FieldDescriptorProto_TYPE_SINT32,
  1892  		descriptorpb.FieldDescriptorProto_TYPE_ENUM:
  1893  		return toInt32(reflect.Indirect(val), fd)
  1894  
  1895  	case descriptorpb.FieldDescriptorProto_TYPE_SFIXED64,
  1896  		descriptorpb.FieldDescriptorProto_TYPE_INT64,
  1897  		descriptorpb.FieldDescriptorProto_TYPE_SINT64:
  1898  		return toInt64(reflect.Indirect(val), fd)
  1899  
  1900  	case descriptorpb.FieldDescriptorProto_TYPE_FIXED32,
  1901  		descriptorpb.FieldDescriptorProto_TYPE_UINT32:
  1902  		return toUint32(reflect.Indirect(val), fd)
  1903  
  1904  	case descriptorpb.FieldDescriptorProto_TYPE_FIXED64,
  1905  		descriptorpb.FieldDescriptorProto_TYPE_UINT64:
  1906  		return toUint64(reflect.Indirect(val), fd)
  1907  
  1908  	case descriptorpb.FieldDescriptorProto_TYPE_FLOAT:
  1909  		return toFloat32(reflect.Indirect(val), fd)
  1910  
  1911  	case descriptorpb.FieldDescriptorProto_TYPE_DOUBLE:
  1912  		return toFloat64(reflect.Indirect(val), fd)
  1913  
  1914  	case descriptorpb.FieldDescriptorProto_TYPE_BOOL:
  1915  		return toBool(reflect.Indirect(val), fd)
  1916  
  1917  	case descriptorpb.FieldDescriptorProto_TYPE_BYTES:
  1918  		return toBytes(reflect.Indirect(val), fd)
  1919  
  1920  	case descriptorpb.FieldDescriptorProto_TYPE_STRING:
  1921  		return toString(reflect.Indirect(val), fd)
  1922  
  1923  	case descriptorpb.FieldDescriptorProto_TYPE_MESSAGE,
  1924  		descriptorpb.FieldDescriptorProto_TYPE_GROUP:
  1925  		m, err := asMessage(val, fd.GetFullyQualifiedName())
  1926  		// check that message is correct type
  1927  		if err != nil {
  1928  			return nil, err
  1929  		}
  1930  		var msgType string
  1931  		if dm, ok := m.(*Message); ok {
  1932  			if allowNilMessage && dm == nil {
  1933  				// if dm == nil, we'll panic below, so early out if that is allowed
  1934  				// (only allowed for map values, to indicate an entry w/ no value)
  1935  				return m, nil
  1936  			}
  1937  			msgType = dm.GetMessageDescriptor().GetFullyQualifiedName()
  1938  		} else {
  1939  			msgType = proto.MessageName(m)
  1940  		}
  1941  		if msgType != fd.GetMessageType().GetFullyQualifiedName() {
  1942  			return nil, fmt.Errorf("message field %s requires value of type %s; received %s", fd.GetFullyQualifiedName(), fd.GetMessageType().GetFullyQualifiedName(), msgType)
  1943  		}
  1944  		return m, nil
  1945  
  1946  	default:
  1947  		return nil, fmt.Errorf("unable to handle unrecognized field type: %v", fd.GetType())
  1948  	}
  1949  }
  1950  
  1951  func toInt32(v reflect.Value, fd *desc.FieldDescriptor) (int32, error) {
  1952  	if v.Kind() == reflect.Int32 {
  1953  		return int32(v.Int()), nil
  1954  	}
  1955  	return 0, typeError(fd, v.Type())
  1956  }
  1957  
  1958  func toUint32(v reflect.Value, fd *desc.FieldDescriptor) (uint32, error) {
  1959  	if v.Kind() == reflect.Uint32 {
  1960  		return uint32(v.Uint()), nil
  1961  	}
  1962  	return 0, typeError(fd, v.Type())
  1963  }
  1964  
  1965  func toFloat32(v reflect.Value, fd *desc.FieldDescriptor) (float32, error) {
  1966  	if v.Kind() == reflect.Float32 {
  1967  		return float32(v.Float()), nil
  1968  	}
  1969  	return 0, typeError(fd, v.Type())
  1970  }
  1971  
  1972  func toInt64(v reflect.Value, fd *desc.FieldDescriptor) (int64, error) {
  1973  	if v.Kind() == reflect.Int64 || v.Kind() == reflect.Int || v.Kind() == reflect.Int32 {
  1974  		return v.Int(), nil
  1975  	}
  1976  	return 0, typeError(fd, v.Type())
  1977  }
  1978  
  1979  func toUint64(v reflect.Value, fd *desc.FieldDescriptor) (uint64, error) {
  1980  	if v.Kind() == reflect.Uint64 || v.Kind() == reflect.Uint || v.Kind() == reflect.Uint32 {
  1981  		return v.Uint(), nil
  1982  	}
  1983  	return 0, typeError(fd, v.Type())
  1984  }
  1985  
  1986  func toFloat64(v reflect.Value, fd *desc.FieldDescriptor) (float64, error) {
  1987  	if v.Kind() == reflect.Float64 || v.Kind() == reflect.Float32 {
  1988  		return v.Float(), nil
  1989  	}
  1990  	return 0, typeError(fd, v.Type())
  1991  }
  1992  
  1993  func toBool(v reflect.Value, fd *desc.FieldDescriptor) (bool, error) {
  1994  	if v.Kind() == reflect.Bool {
  1995  		return v.Bool(), nil
  1996  	}
  1997  	return false, typeError(fd, v.Type())
  1998  }
  1999  
  2000  func toBytes(v reflect.Value, fd *desc.FieldDescriptor) ([]byte, error) {
  2001  	if v.Kind() == reflect.Slice && v.Type().Elem().Kind() == reflect.Uint8 {
  2002  		return v.Bytes(), nil
  2003  	}
  2004  	return nil, typeError(fd, v.Type())
  2005  }
  2006  
  2007  func toString(v reflect.Value, fd *desc.FieldDescriptor) (string, error) {
  2008  	if v.Kind() == reflect.String {
  2009  		return v.String(), nil
  2010  	}
  2011  	return "", typeError(fd, v.Type())
  2012  }
  2013  
  2014  func typeError(fd *desc.FieldDescriptor, t reflect.Type) error {
  2015  	return fmt.Errorf(
  2016  		"%s field %s is not compatible with value of type %v",
  2017  		getTypeString(fd), fd.GetFullyQualifiedName(), t)
  2018  }
  2019  
  2020  func getTypeString(fd *desc.FieldDescriptor) string {
  2021  	return strings.ToLower(fd.GetType().String())
  2022  }
  2023  
  2024  func asMessage(v reflect.Value, fieldName string) (proto.Message, error) {
  2025  	t := v.Type()
  2026  	// we need a pointer to a struct that implements proto.Message
  2027  	if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct || !t.Implements(typeOfProtoMessage) {
  2028  		return nil, fmt.Errorf("message field %s requires is not compatible with value of type %v", fieldName, v.Type())
  2029  	}
  2030  	return v.Interface().(proto.Message), nil
  2031  }
  2032  
  2033  // Reset resets this message to an empty message. It removes all values set in
  2034  // the message.
  2035  func (m *Message) Reset() {
  2036  	for k := range m.values {
  2037  		delete(m.values, k)
  2038  	}
  2039  	for k := range m.unknownFields {
  2040  		delete(m.unknownFields, k)
  2041  	}
  2042  }
  2043  
  2044  // String returns this message rendered in compact text format.
  2045  func (m *Message) String() string {
  2046  	b, err := m.MarshalText()
  2047  	if err != nil {
  2048  		panic(fmt.Sprintf("Failed to create string representation of message: %s", err.Error()))
  2049  	}
  2050  	return string(b)
  2051  }
  2052  
  2053  // ProtoMessage is present to satisfy the proto.Message interface.
  2054  func (m *Message) ProtoMessage() {
  2055  }
  2056  
  2057  // ConvertTo converts this dynamic message into the given message. This is
  2058  // shorthand for resetting then merging:
  2059  //
  2060  //	target.Reset()
  2061  //	m.MergeInto(target)
  2062  func (m *Message) ConvertTo(target proto.Message) error {
  2063  	if err := m.checkType(target); err != nil {
  2064  		return err
  2065  	}
  2066  
  2067  	target.Reset()
  2068  	return m.mergeInto(target, defaultDeterminism)
  2069  }
  2070  
  2071  // ConvertToDeterministic converts this dynamic message into the given message.
  2072  // It is just like ConvertTo, but it attempts to produce deterministic results.
  2073  // That means that if the target is a generated message (not another dynamic
  2074  // message) and the current runtime is unaware of any fields or extensions that
  2075  // are present in m, they will be serialized into the target's unrecognized
  2076  // fields deterministically.
  2077  func (m *Message) ConvertToDeterministic(target proto.Message) error {
  2078  	if err := m.checkType(target); err != nil {
  2079  		return err
  2080  	}
  2081  
  2082  	target.Reset()
  2083  	return m.mergeInto(target, true)
  2084  }
  2085  
  2086  // ConvertFrom converts the given message into this dynamic message. This is
  2087  // shorthand for resetting then merging:
  2088  //
  2089  //	m.Reset()
  2090  //	m.MergeFrom(target)
  2091  func (m *Message) ConvertFrom(target proto.Message) error {
  2092  	if err := m.checkType(target); err != nil {
  2093  		return err
  2094  	}
  2095  
  2096  	m.Reset()
  2097  	return m.mergeFrom(target)
  2098  }
  2099  
  2100  // MergeInto merges this dynamic message into the given message. All field
  2101  // values in this message will be set on the given message. For map fields,
  2102  // entries are added to the given message (if the given message has existing
  2103  // values for like keys, they are overwritten). For slice fields, elements are
  2104  // added.
  2105  //
  2106  // If the given message has a different set of known fields, it is possible for
  2107  // some known fields in this message to be represented as unknown fields in the
  2108  // given message after merging, and vice versa.
  2109  func (m *Message) MergeInto(target proto.Message) error {
  2110  	if err := m.checkType(target); err != nil {
  2111  		return err
  2112  	}
  2113  	return m.mergeInto(target, defaultDeterminism)
  2114  }
  2115  
  2116  // MergeIntoDeterministic merges this dynamic message into the given message.
  2117  // It is just like MergeInto, but it attempts to produce deterministic results.
  2118  // That means that if the target is a generated message (not another dynamic
  2119  // message) and the current runtime is unaware of any fields or extensions that
  2120  // are present in m, they will be serialized into the target's unrecognized
  2121  // fields deterministically.
  2122  func (m *Message) MergeIntoDeterministic(target proto.Message) error {
  2123  	if err := m.checkType(target); err != nil {
  2124  		return err
  2125  	}
  2126  	return m.mergeInto(target, true)
  2127  }
  2128  
  2129  // MergeFrom merges the given message into this dynamic message. All field
  2130  // values in the given message will be set on this message. For map fields,
  2131  // entries are added to this message (if this message has existing values for
  2132  // like keys, they are overwritten). For slice fields, elements are added.
  2133  //
  2134  // If the given message has a different set of known fields, it is possible for
  2135  // some known fields in that message to be represented as unknown fields in this
  2136  // message after merging, and vice versa.
  2137  func (m *Message) MergeFrom(source proto.Message) error {
  2138  	if err := m.checkType(source); err != nil {
  2139  		return err
  2140  	}
  2141  	return m.mergeFrom(source)
  2142  }
  2143  
  2144  // Merge implements the proto.Merger interface so that dynamic messages are
  2145  // compatible with the proto.Merge function. It delegates to MergeFrom but will
  2146  // panic on error as the proto.Merger interface doesn't allow for returning an
  2147  // error.
  2148  //
  2149  // Unlike nearly all other methods, this method can work if this message's type
  2150  // is not defined (such as instantiating the message without using NewMessage).
  2151  // This is strictly so that dynamic message's are compatible with the
  2152  // proto.Clone function, which instantiates a new message via reflection (thus
  2153  // its message descriptor will not be set) and than calls Merge.
  2154  func (m *Message) Merge(source proto.Message) {
  2155  	if m.md == nil {
  2156  		// To support proto.Clone, initialize the descriptor from the source.
  2157  		if dm, ok := source.(*Message); ok {
  2158  			m.md = dm.md
  2159  			// also make sure the clone uses the same message factory and
  2160  			// extensions and also knows about the same extra fields (if any)
  2161  			m.mf = dm.mf
  2162  			m.er = dm.er
  2163  			m.extraFields = dm.extraFields
  2164  		} else if md, err := desc.LoadMessageDescriptorForMessage(source); err != nil {
  2165  			panic(err.Error())
  2166  		} else {
  2167  			m.md = md
  2168  		}
  2169  	}
  2170  
  2171  	if err := m.MergeFrom(source); err != nil {
  2172  		panic(err.Error())
  2173  	}
  2174  }
  2175  
  2176  func (m *Message) checkType(target proto.Message) error {
  2177  	if dm, ok := target.(*Message); ok {
  2178  		if dm.md.GetFullyQualifiedName() != m.md.GetFullyQualifiedName() {
  2179  			return fmt.Errorf("given message has wrong type: %q; expecting %q", dm.md.GetFullyQualifiedName(), m.md.GetFullyQualifiedName())
  2180  		}
  2181  		return nil
  2182  	}
  2183  
  2184  	msgName := proto.MessageName(target)
  2185  	if msgName != m.md.GetFullyQualifiedName() {
  2186  		return fmt.Errorf("given message has wrong type: %q; expecting %q", msgName, m.md.GetFullyQualifiedName())
  2187  	}
  2188  	return nil
  2189  }
  2190  
  2191  func (m *Message) mergeInto(pm proto.Message, deterministic bool) error {
  2192  	if dm, ok := pm.(*Message); ok {
  2193  		return dm.mergeFrom(m)
  2194  	}
  2195  
  2196  	target := reflect.ValueOf(pm)
  2197  	if target.Kind() == reflect.Ptr {
  2198  		target = target.Elem()
  2199  	}
  2200  
  2201  	// track tags for which the dynamic message has data but the given
  2202  	// message doesn't know about it
  2203  	unknownTags := map[int32]struct{}{}
  2204  	for tag := range m.values {
  2205  		unknownTags[tag] = struct{}{}
  2206  	}
  2207  
  2208  	// check that we can successfully do the merge
  2209  	structProps := proto.GetProperties(reflect.TypeOf(pm).Elem())
  2210  	for _, prop := range structProps.Prop {
  2211  		if prop.Tag == 0 {
  2212  			continue // one-of or special field (such as XXX_unrecognized, etc.)
  2213  		}
  2214  		tag := int32(prop.Tag)
  2215  		v, ok := m.values[tag]
  2216  		if !ok {
  2217  			continue
  2218  		}
  2219  		if unknownTags != nil {
  2220  			delete(unknownTags, tag)
  2221  		}
  2222  		f := target.FieldByName(prop.Name)
  2223  		ft := f.Type()
  2224  		val := reflect.ValueOf(v)
  2225  		if !canConvert(val, ft) {
  2226  			return fmt.Errorf("cannot convert %v to %v", val.Type(), ft)
  2227  		}
  2228  	}
  2229  	// check one-of fields
  2230  	for _, oop := range structProps.OneofTypes {
  2231  		prop := oop.Prop
  2232  		tag := int32(prop.Tag)
  2233  		v, ok := m.values[tag]
  2234  		if !ok {
  2235  			continue
  2236  		}
  2237  		if unknownTags != nil {
  2238  			delete(unknownTags, tag)
  2239  		}
  2240  		stf, ok := oop.Type.Elem().FieldByName(prop.Name)
  2241  		if !ok {
  2242  			return fmt.Errorf("one-of field indicates struct field name %s, but type %v has no such field", prop.Name, oop.Type.Elem())
  2243  		}
  2244  		ft := stf.Type
  2245  		val := reflect.ValueOf(v)
  2246  		if !canConvert(val, ft) {
  2247  			return fmt.Errorf("cannot convert %v to %v", val.Type(), ft)
  2248  		}
  2249  	}
  2250  	// and check extensions, too
  2251  	for tag, ext := range proto.RegisteredExtensions(pm) {
  2252  		v, ok := m.values[tag]
  2253  		if !ok {
  2254  			continue
  2255  		}
  2256  		if unknownTags != nil {
  2257  			delete(unknownTags, tag)
  2258  		}
  2259  		ft := reflect.TypeOf(ext.ExtensionType)
  2260  		val := reflect.ValueOf(v)
  2261  		if !canConvert(val, ft) {
  2262  			return fmt.Errorf("cannot convert %v to %v", val.Type(), ft)
  2263  		}
  2264  	}
  2265  
  2266  	// now actually perform the merge
  2267  	for _, prop := range structProps.Prop {
  2268  		v, ok := m.values[int32(prop.Tag)]
  2269  		if !ok {
  2270  			continue
  2271  		}
  2272  		f := target.FieldByName(prop.Name)
  2273  		if err := mergeVal(reflect.ValueOf(v), f, deterministic); err != nil {
  2274  			return err
  2275  		}
  2276  	}
  2277  	// merge one-ofs
  2278  	for _, oop := range structProps.OneofTypes {
  2279  		prop := oop.Prop
  2280  		tag := int32(prop.Tag)
  2281  		v, ok := m.values[tag]
  2282  		if !ok {
  2283  			continue
  2284  		}
  2285  		oov := reflect.New(oop.Type.Elem())
  2286  		f := oov.Elem().FieldByName(prop.Name)
  2287  		if err := mergeVal(reflect.ValueOf(v), f, deterministic); err != nil {
  2288  			return err
  2289  		}
  2290  		target.Field(oop.Field).Set(oov)
  2291  	}
  2292  	// merge extensions, too
  2293  	for tag, ext := range proto.RegisteredExtensions(pm) {
  2294  		v, ok := m.values[tag]
  2295  		if !ok {
  2296  			continue
  2297  		}
  2298  		e := reflect.New(reflect.TypeOf(ext.ExtensionType)).Elem()
  2299  		if err := mergeVal(reflect.ValueOf(v), e, deterministic); err != nil {
  2300  			return err
  2301  		}
  2302  		if err := proto.SetExtension(pm, ext, e.Interface()); err != nil {
  2303  			// shouldn't happen since we already checked that the extension type was compatible above
  2304  			return err
  2305  		}
  2306  	}
  2307  
  2308  	// if we have fields that the given message doesn't know about, add to its unknown fields
  2309  	if len(unknownTags) > 0 {
  2310  		var b codec.Buffer
  2311  		b.SetDeterministic(deterministic)
  2312  		if deterministic {
  2313  			// if we need to emit things deterministically, sort the
  2314  			// extensions by their tag number
  2315  			sortedUnknownTags := make([]int32, 0, len(unknownTags))
  2316  			for tag := range unknownTags {
  2317  				sortedUnknownTags = append(sortedUnknownTags, tag)
  2318  			}
  2319  			sort.Slice(sortedUnknownTags, func(i, j int) bool {
  2320  				return sortedUnknownTags[i] < sortedUnknownTags[j]
  2321  			})
  2322  			for _, tag := range sortedUnknownTags {
  2323  				fd := m.FindFieldDescriptor(tag)
  2324  				if err := b.EncodeFieldValue(fd, m.values[tag]); err != nil {
  2325  					return err
  2326  				}
  2327  			}
  2328  		} else {
  2329  			for tag := range unknownTags {
  2330  				fd := m.FindFieldDescriptor(tag)
  2331  				if err := b.EncodeFieldValue(fd, m.values[tag]); err != nil {
  2332  					return err
  2333  				}
  2334  			}
  2335  		}
  2336  
  2337  		internal.SetUnrecognized(pm, b.Bytes())
  2338  	}
  2339  
  2340  	// finally, convey unknown fields into the given message by letting it unmarshal them
  2341  	// (this will append to its unknown fields if not known; if somehow the given message recognizes
  2342  	// a field even though the dynamic message did not, it will get correctly unmarshalled)
  2343  	if unknownTags != nil && len(m.unknownFields) > 0 {
  2344  		var b codec.Buffer
  2345  		_ = m.marshalUnknownFields(&b)
  2346  		_ = proto.UnmarshalMerge(b.Bytes(), pm)
  2347  	}
  2348  
  2349  	return nil
  2350  }
  2351  
  2352  func canConvert(src reflect.Value, target reflect.Type) bool {
  2353  	if src.Kind() == reflect.Interface {
  2354  		src = reflect.ValueOf(src.Interface())
  2355  	}
  2356  	srcType := src.Type()
  2357  	// we allow convertible types instead of requiring exact types so that calling
  2358  	// code can, for example, assign an enum constant to an enum field. In that case,
  2359  	// one type is the enum type (a sub-type of int32) and the other may be the int32
  2360  	// type. So we automatically do the conversion in that case.
  2361  	if srcType.ConvertibleTo(target) {
  2362  		return true
  2363  	} else if target.Kind() == reflect.Ptr && srcType.ConvertibleTo(target.Elem()) {
  2364  		return true
  2365  	} else if target.Kind() == reflect.Slice {
  2366  		if srcType.Kind() != reflect.Slice {
  2367  			return false
  2368  		}
  2369  		et := target.Elem()
  2370  		for i := 0; i < src.Len(); i++ {
  2371  			if !canConvert(src.Index(i), et) {
  2372  				return false
  2373  			}
  2374  		}
  2375  		return true
  2376  	} else if target.Kind() == reflect.Map {
  2377  		if srcType.Kind() != reflect.Map {
  2378  			return false
  2379  		}
  2380  		return canConvertMap(src, target)
  2381  	} else if srcType == typeOfDynamicMessage && target.Implements(typeOfProtoMessage) {
  2382  		z := reflect.Zero(target).Interface()
  2383  		msgType := proto.MessageName(z.(proto.Message))
  2384  		return msgType == src.Interface().(*Message).GetMessageDescriptor().GetFullyQualifiedName()
  2385  	} else {
  2386  		return false
  2387  	}
  2388  }
  2389  
  2390  func mergeVal(src, target reflect.Value, deterministic bool) error {
  2391  	if src.Kind() == reflect.Interface && !src.IsNil() {
  2392  		src = src.Elem()
  2393  	}
  2394  	srcType := src.Type()
  2395  	targetType := target.Type()
  2396  	if srcType.ConvertibleTo(targetType) {
  2397  		if targetType.Implements(typeOfProtoMessage) && !target.IsNil() {
  2398  			Merge(target.Interface().(proto.Message), src.Convert(targetType).Interface().(proto.Message))
  2399  		} else {
  2400  			target.Set(src.Convert(targetType))
  2401  		}
  2402  	} else if targetType.Kind() == reflect.Ptr && srcType.ConvertibleTo(targetType.Elem()) {
  2403  		if !src.CanAddr() {
  2404  			target.Set(reflect.New(targetType.Elem()))
  2405  			target.Elem().Set(src.Convert(targetType.Elem()))
  2406  		} else {
  2407  			target.Set(src.Addr().Convert(targetType))
  2408  		}
  2409  	} else if targetType.Kind() == reflect.Slice {
  2410  		l := target.Len()
  2411  		newL := l + src.Len()
  2412  		if target.Cap() < newL {
  2413  			// expand capacity of the slice and copy
  2414  			newSl := reflect.MakeSlice(targetType, newL, newL)
  2415  			for i := 0; i < target.Len(); i++ {
  2416  				newSl.Index(i).Set(target.Index(i))
  2417  			}
  2418  			target.Set(newSl)
  2419  		} else {
  2420  			target.SetLen(newL)
  2421  		}
  2422  		for i := 0; i < src.Len(); i++ {
  2423  			dest := target.Index(l + i)
  2424  			if dest.Kind() == reflect.Ptr {
  2425  				dest.Set(reflect.New(dest.Type().Elem()))
  2426  			}
  2427  			if err := mergeVal(src.Index(i), dest, deterministic); err != nil {
  2428  				return err
  2429  			}
  2430  		}
  2431  	} else if targetType.Kind() == reflect.Map {
  2432  		return mergeMapVal(src, target, targetType, deterministic)
  2433  	} else if srcType == typeOfDynamicMessage && targetType.Implements(typeOfProtoMessage) {
  2434  		dm := src.Interface().(*Message)
  2435  		if target.IsNil() {
  2436  			target.Set(reflect.New(targetType.Elem()))
  2437  		}
  2438  		m := target.Interface().(proto.Message)
  2439  		if err := dm.mergeInto(m, deterministic); err != nil {
  2440  			return err
  2441  		}
  2442  	} else {
  2443  		return fmt.Errorf("cannot convert %v to %v", srcType, targetType)
  2444  	}
  2445  	return nil
  2446  }
  2447  
  2448  func (m *Message) mergeFrom(pm proto.Message) error {
  2449  	if dm, ok := pm.(*Message); ok {
  2450  		// if given message is also a dynamic message, we merge differently
  2451  		for tag, v := range dm.values {
  2452  			fd := m.FindFieldDescriptor(tag)
  2453  			if fd == nil {
  2454  				fd = dm.FindFieldDescriptor(tag)
  2455  			}
  2456  			if err := mergeField(m, fd, v); err != nil {
  2457  				return err
  2458  			}
  2459  		}
  2460  		return nil
  2461  	}
  2462  
  2463  	pmrv := reflect.ValueOf(pm)
  2464  	if pmrv.IsNil() {
  2465  		// nil is an empty message, so nothing to do
  2466  		return nil
  2467  	}
  2468  
  2469  	// check that we can successfully do the merge
  2470  	src := pmrv.Elem()
  2471  	values := map[*desc.FieldDescriptor]interface{}{}
  2472  	props := proto.GetProperties(reflect.TypeOf(pm).Elem())
  2473  	if props == nil {
  2474  		return fmt.Errorf("could not determine message properties to merge for %v", reflect.TypeOf(pm).Elem())
  2475  	}
  2476  
  2477  	// regular fields
  2478  	for _, prop := range props.Prop {
  2479  		if prop.Tag == 0 {
  2480  			continue // one-of or special field (such as XXX_unrecognized, etc.)
  2481  		}
  2482  		fd := m.FindFieldDescriptor(int32(prop.Tag))
  2483  		if fd == nil {
  2484  			// Our descriptor has different fields than this message object. So
  2485  			// try to reflect on the message object's fields.
  2486  			md, err := desc.LoadMessageDescriptorForMessage(pm)
  2487  			if err != nil {
  2488  				return err
  2489  			}
  2490  			fd = md.FindFieldByNumber(int32(prop.Tag))
  2491  			if fd == nil {
  2492  				return fmt.Errorf("message descriptor %q did not contain field for tag %d (%q)", md.GetFullyQualifiedName(), prop.Tag, prop.Name)
  2493  			}
  2494  		}
  2495  		rv := src.FieldByName(prop.Name)
  2496  		if (rv.Kind() == reflect.Ptr || rv.Kind() == reflect.Slice) && rv.IsNil() {
  2497  			continue
  2498  		}
  2499  		if v, err := validFieldValueForRv(fd, rv); err != nil {
  2500  			return err
  2501  		} else {
  2502  			values[fd] = v
  2503  		}
  2504  	}
  2505  
  2506  	// one-of fields
  2507  	for _, oop := range props.OneofTypes {
  2508  		oov := src.Field(oop.Field).Elem()
  2509  		if !oov.IsValid() || oov.Type() != oop.Type {
  2510  			// this field is unset (in other words, one-of message field is not currently set to this option)
  2511  			continue
  2512  		}
  2513  		prop := oop.Prop
  2514  		rv := oov.Elem().FieldByName(prop.Name)
  2515  		fd := m.FindFieldDescriptor(int32(prop.Tag))
  2516  		if fd == nil {
  2517  			// Our descriptor has different fields than this message object. So
  2518  			// try to reflect on the message object's fields.
  2519  			md, err := desc.LoadMessageDescriptorForMessage(pm)
  2520  			if err != nil {
  2521  				return err
  2522  			}
  2523  			fd = md.FindFieldByNumber(int32(prop.Tag))
  2524  			if fd == nil {
  2525  				return fmt.Errorf("message descriptor %q did not contain field for tag %d (%q in one-of %q)", md.GetFullyQualifiedName(), prop.Tag, prop.Name, src.Type().Field(oop.Field).Name)
  2526  			}
  2527  		}
  2528  		if v, err := validFieldValueForRv(fd, rv); err != nil {
  2529  			return err
  2530  		} else {
  2531  			values[fd] = v
  2532  		}
  2533  	}
  2534  
  2535  	// extension fields
  2536  	rexts, _ := proto.ExtensionDescs(pm)
  2537  	for _, ed := range rexts {
  2538  		v, _ := proto.GetExtension(pm, ed)
  2539  		if v == nil {
  2540  			continue
  2541  		}
  2542  		if ed.ExtensionType == nil {
  2543  			// unrecognized extension: we'll handle that below when we
  2544  			// handle other unrecognized fields
  2545  			continue
  2546  		}
  2547  		fd := m.er.FindExtension(m.md.GetFullyQualifiedName(), ed.Field)
  2548  		if fd == nil {
  2549  			var err error
  2550  			if fd, err = desc.LoadFieldDescriptorForExtension(ed); err != nil {
  2551  				return err
  2552  			}
  2553  		}
  2554  		if v, err := validFieldValue(fd, v); err != nil {
  2555  			return err
  2556  		} else {
  2557  			values[fd] = v
  2558  		}
  2559  	}
  2560  
  2561  	// With API v2, it is possible that the new protoreflect interfaces
  2562  	// were used to store an extension, which means it can't be returned
  2563  	// by proto.ExtensionDescs and it's also not in the unrecognized data.
  2564  	// So we have a separate loop to trawl through it...
  2565  	var err error
  2566  	proto.MessageReflect(pm).Range(func(fld protoreflect.FieldDescriptor, val protoreflect.Value) bool {
  2567  		if !fld.IsExtension() {
  2568  			// normal field... we already got it above
  2569  			return true
  2570  		}
  2571  		xt := fld.(protoreflect.ExtensionTypeDescriptor)
  2572  		if _, ok := xt.Type().(*proto.ExtensionDesc); ok {
  2573  			// known extension... we already got it above
  2574  			return true
  2575  		}
  2576  		var fd *desc.FieldDescriptor
  2577  		fd, err = desc.WrapField(fld)
  2578  		if err != nil {
  2579  			return false
  2580  		}
  2581  		v := convertProtoReflectValue(val)
  2582  		if v, err = validFieldValue(fd, v); err != nil {
  2583  			return false
  2584  		}
  2585  		values[fd] = v
  2586  		return true
  2587  	})
  2588  	if err != nil {
  2589  		return err
  2590  	}
  2591  
  2592  	// unrecognized extensions fields:
  2593  	//   In API v2 of proto, some extensions may NEITHER be included in ExtensionDescs
  2594  	//   above NOR included in unrecognized fields below. These are extensions that use
  2595  	//   a custom extension type (not a generated one -- i.e. not a linked in extension).
  2596  	mr := proto.MessageReflect(pm)
  2597  	var extBytes []byte
  2598  	var retErr error
  2599  	mr.Range(func(fld protoreflect.FieldDescriptor, val protoreflect.Value) bool {
  2600  		if !fld.IsExtension() {
  2601  			// normal field, already processed above
  2602  			return true
  2603  		}
  2604  		if extd, ok := fld.(protoreflect.ExtensionTypeDescriptor); ok {
  2605  			if _, ok := extd.Type().(*proto.ExtensionDesc); ok {
  2606  				// normal known extension, already processed above
  2607  				return true
  2608  			}
  2609  		}
  2610  
  2611  		// marshal the extension to bytes and then handle as unknown field below
  2612  		mr.New()
  2613  		mr.Set(fld, val)
  2614  		extBytes, retErr = protov2.MarshalOptions{}.MarshalAppend(extBytes, mr.Interface())
  2615  		return retErr == nil
  2616  	})
  2617  	if retErr != nil {
  2618  		return retErr
  2619  	}
  2620  
  2621  	// now actually perform the merge
  2622  	for fd, v := range values {
  2623  		if err := mergeField(m, fd, v); err != nil {
  2624  			return err
  2625  		}
  2626  	}
  2627  
  2628  	if len(extBytes) > 0 {
  2629  		// treating unrecognized extensions like unknown fields: best-effort
  2630  		// ignore any error returned: pulling in unknown fields is best-effort
  2631  		_ = m.UnmarshalMerge(extBytes)
  2632  	}
  2633  
  2634  	data := internal.GetUnrecognized(pm)
  2635  	if len(data) > 0 {
  2636  		// ignore any error returned: pulling in unknown fields is best-effort
  2637  		_ = m.UnmarshalMerge(data)
  2638  	}
  2639  
  2640  	return nil
  2641  }
  2642  
  2643  func convertProtoReflectValue(v protoreflect.Value) interface{} {
  2644  	val := v.Interface()
  2645  	switch val := val.(type) {
  2646  	case protoreflect.Message:
  2647  		return val.Interface()
  2648  	case protoreflect.Map:
  2649  		mp := make(map[interface{}]interface{}, val.Len())
  2650  		val.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool {
  2651  			mp[convertProtoReflectValue(k.Value())] = convertProtoReflectValue(v)
  2652  			return true
  2653  		})
  2654  		return mp
  2655  	case protoreflect.List:
  2656  		sl := make([]interface{}, val.Len())
  2657  		for i := 0; i < val.Len(); i++ {
  2658  			sl[i] = convertProtoReflectValue(val.Get(i))
  2659  		}
  2660  		return sl
  2661  	case protoreflect.EnumNumber:
  2662  		return int32(val)
  2663  	default:
  2664  		return val
  2665  	}
  2666  }
  2667  
  2668  // Validate checks that all required fields are present. It returns an error if any are absent.
  2669  func (m *Message) Validate() error {
  2670  	missingFields := m.findMissingFields()
  2671  	if len(missingFields) == 0 {
  2672  		return nil
  2673  	}
  2674  	return fmt.Errorf("some required fields missing: %v", strings.Join(missingFields, ", "))
  2675  }
  2676  
  2677  func (m *Message) findMissingFields() []string {
  2678  	if m.md.IsProto3() {
  2679  		// proto3 does not allow required fields
  2680  		return nil
  2681  	}
  2682  	var missingFields []string
  2683  	for _, fd := range m.md.GetFields() {
  2684  		if fd.IsRequired() {
  2685  			if _, ok := m.values[fd.GetNumber()]; !ok {
  2686  				missingFields = append(missingFields, fd.GetName())
  2687  			}
  2688  		}
  2689  	}
  2690  	return missingFields
  2691  }
  2692  
  2693  // ValidateRecursive checks that all required fields are present and also
  2694  // recursively validates all fields who are also messages. It returns an error
  2695  // if any required fields, in this message or nested within, are absent.
  2696  func (m *Message) ValidateRecursive() error {
  2697  	return m.validateRecursive("")
  2698  }
  2699  
  2700  func (m *Message) validateRecursive(prefix string) error {
  2701  	if missingFields := m.findMissingFields(); len(missingFields) > 0 {
  2702  		for i := range missingFields {
  2703  			missingFields[i] = fmt.Sprintf("%s%s", prefix, missingFields[i])
  2704  		}
  2705  		return fmt.Errorf("some required fields missing: %v", strings.Join(missingFields, ", "))
  2706  	}
  2707  
  2708  	for tag, fld := range m.values {
  2709  		fd := m.FindFieldDescriptor(tag)
  2710  		var chprefix string
  2711  		var md *desc.MessageDescriptor
  2712  		checkMsg := func(pm proto.Message) error {
  2713  			var dm *Message
  2714  			if d, ok := pm.(*Message); ok {
  2715  				dm = d
  2716  			} else if pm != nil {
  2717  				dm = m.mf.NewDynamicMessage(md)
  2718  				if err := dm.ConvertFrom(pm); err != nil {
  2719  					return nil
  2720  				}
  2721  			}
  2722  			if dm == nil {
  2723  				return nil
  2724  			}
  2725  			if err := dm.validateRecursive(chprefix); err != nil {
  2726  				return err
  2727  			}
  2728  			return nil
  2729  		}
  2730  		isMap := fd.IsMap()
  2731  		if isMap && fd.GetMapValueType().GetMessageType() != nil {
  2732  			md = fd.GetMapValueType().GetMessageType()
  2733  			mp := fld.(map[interface{}]interface{})
  2734  			for k, v := range mp {
  2735  				chprefix = fmt.Sprintf("%s%s[%v].", prefix, getName(fd), k)
  2736  				if err := checkMsg(v.(proto.Message)); err != nil {
  2737  					return err
  2738  				}
  2739  			}
  2740  		} else if !isMap && fd.GetMessageType() != nil {
  2741  			md = fd.GetMessageType()
  2742  			if fd.IsRepeated() {
  2743  				sl := fld.([]interface{})
  2744  				for i, v := range sl {
  2745  					chprefix = fmt.Sprintf("%s%s[%d].", prefix, getName(fd), i)
  2746  					if err := checkMsg(v.(proto.Message)); err != nil {
  2747  						return err
  2748  					}
  2749  				}
  2750  			} else {
  2751  				chprefix = fmt.Sprintf("%s%s.", prefix, getName(fd))
  2752  				if err := checkMsg(fld.(proto.Message)); err != nil {
  2753  					return err
  2754  				}
  2755  			}
  2756  		}
  2757  	}
  2758  
  2759  	return nil
  2760  }
  2761  
  2762  func getName(fd *desc.FieldDescriptor) string {
  2763  	if fd.IsExtension() {
  2764  		return fmt.Sprintf("(%s)", fd.GetFullyQualifiedName())
  2765  	} else {
  2766  		return fd.GetName()
  2767  	}
  2768  }
  2769  
  2770  // knownFieldTags return tags of present and recognized fields, in sorted order.
  2771  func (m *Message) knownFieldTags() []int {
  2772  	if len(m.values) == 0 {
  2773  		return []int(nil)
  2774  	}
  2775  
  2776  	keys := make([]int, len(m.values))
  2777  	i := 0
  2778  	for k := range m.values {
  2779  		keys[i] = int(k)
  2780  		i++
  2781  	}
  2782  
  2783  	sort.Ints(keys)
  2784  	return keys
  2785  }
  2786  
  2787  // allKnownFieldTags return tags of present and recognized fields, including
  2788  // those that are unset, in sorted order. This only includes extensions that are
  2789  // present. Known but not-present extensions are not included in the returned
  2790  // set of tags.
  2791  func (m *Message) allKnownFieldTags() []int {
  2792  	fds := m.md.GetFields()
  2793  	keys := make([]int, 0, len(fds)+len(m.extraFields))
  2794  
  2795  	for k := range m.values {
  2796  		keys = append(keys, int(k))
  2797  	}
  2798  
  2799  	// also include known fields that are not present
  2800  	for _, fd := range fds {
  2801  		if _, ok := m.values[fd.GetNumber()]; !ok {
  2802  			keys = append(keys, int(fd.GetNumber()))
  2803  		}
  2804  	}
  2805  	for _, fd := range m.extraFields {
  2806  		if !fd.IsExtension() { // skip extensions that are not present
  2807  			if _, ok := m.values[fd.GetNumber()]; !ok {
  2808  				keys = append(keys, int(fd.GetNumber()))
  2809  			}
  2810  		}
  2811  	}
  2812  
  2813  	sort.Ints(keys)
  2814  	return keys
  2815  }
  2816  
  2817  // unknownFieldTags return tags of present but unrecognized fields, in sorted order.
  2818  func (m *Message) unknownFieldTags() []int {
  2819  	if len(m.unknownFields) == 0 {
  2820  		return []int(nil)
  2821  	}
  2822  	keys := make([]int, len(m.unknownFields))
  2823  	i := 0
  2824  	for k := range m.unknownFields {
  2825  		keys[i] = int(k)
  2826  		i++
  2827  	}
  2828  	sort.Ints(keys)
  2829  	return keys
  2830  }