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