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