unmarshalMessage unmarshals into the given protoreflect.Message.
(m protoreflect.Message, checkDelims bool)
| 104 | |
| 105 | // unmarshalMessage unmarshals into the given protoreflect.Message. |
| 106 | func (d decoder) unmarshalMessage(m protoreflect.Message, checkDelims bool) error { |
| 107 | messageDesc := m.Descriptor() |
| 108 | if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { |
| 109 | return errors.New("no support for proto1 MessageSets") |
| 110 | } |
| 111 | |
| 112 | if messageDesc.FullName() == genid.Any_message_fullname { |
| 113 | return d.unmarshalAny(m, checkDelims) |
| 114 | } |
| 115 | |
| 116 | if checkDelims { |
| 117 | tok, err := d.Read() |
| 118 | if err != nil { |
| 119 | return err |
| 120 | } |
| 121 | |
| 122 | if tok.Kind() != text.MessageOpen { |
| 123 | return d.unexpectedTokenError(tok) |
| 124 | } |
| 125 | } |
| 126 | |
| 127 | var seenNums set.Ints |
| 128 | var seenOneofs set.Ints |
| 129 | fieldDescs := messageDesc.Fields() |
| 130 | |
| 131 | for { |
| 132 | // Read field name. |
| 133 | tok, err := d.Read() |
| 134 | if err != nil { |
| 135 | return err |
| 136 | } |
| 137 | switch typ := tok.Kind(); typ { |
| 138 | case text.Name: |
| 139 | // Continue below. |
| 140 | case text.EOF: |
| 141 | if checkDelims { |
| 142 | return text.ErrUnexpectedEOF |
| 143 | } |
| 144 | return nil |
| 145 | default: |
| 146 | if checkDelims && typ == text.MessageClose { |
| 147 | return nil |
| 148 | } |
| 149 | return d.unexpectedTokenError(tok) |
| 150 | } |
| 151 | |
| 152 | // Resolve the field descriptor. |
| 153 | var name protoreflect.Name |
| 154 | var fd protoreflect.FieldDescriptor |
| 155 | var xt protoreflect.ExtensionType |
| 156 | var xtErr error |
| 157 | var isFieldNumberName bool |
| 158 | |
| 159 | switch tok.NameKind() { |
| 160 | case text.IdentName: |
| 161 | name = protoreflect.Name(tok.IdentName()) |
| 162 | fd = fieldDescs.ByTextName(string(name)) |
| 163 |
no test coverage detected