MCPcopy
hub / github.com/golang/protobuf / unmarshalExtensionOrAny

Method unmarshalExtensionOrAny

proto/text_decode.go:171–256  ·  view source on GitHub ↗
(m protoreflect.Message, seen map[protoreflect.FieldNumber]bool)

Source from the content-addressed store, hash-verified

169}
170
171func (p *textParser) unmarshalExtensionOrAny(m protoreflect.Message, seen map[protoreflect.FieldNumber]bool) error {
172 name, err := p.consumeExtensionOrAnyName()
173 if err != nil {
174 return err
175 }
176
177 // If it contains a slash, it's an Any type URL.
178 if slashIdx := strings.LastIndex(name, "/"); slashIdx >= 0 {
179 tok := p.next()
180 if tok.err != nil {
181 return tok.err
182 }
183 // consume an optional colon
184 if tok.value == ":" {
185 tok = p.next()
186 if tok.err != nil {
187 return tok.err
188 }
189 }
190
191 var terminator string
192 switch tok.value {
193 case "<":
194 terminator = ">"
195 case "{":
196 terminator = "}"
197 default:
198 return p.errorf("expected '{' or '<', found %q", tok.value)
199 }
200
201 mt, err := protoregistry.GlobalTypes.FindMessageByURL(name)
202 if err != nil {
203 return p.errorf("unrecognized message %q in google.protobuf.Any", name[slashIdx+len("/"):])
204 }
205 m2 := mt.New()
206 if err := p.unmarshalMessage(m2, terminator); err != nil {
207 return err
208 }
209 b, err := protoV2.Marshal(m2.Interface())
210 if err != nil {
211 return p.errorf("failed to marshal message of type %q: %v", name[slashIdx+len("/"):], err)
212 }
213
214 urlFD := m.Descriptor().Fields().ByName("type_url")
215 valFD := m.Descriptor().Fields().ByName("value")
216 if seen[urlFD.Number()] {
217 return p.errorf("Any message unpacked multiple times, or %q already set", urlFD.Name())
218 }
219 if seen[valFD.Number()] {
220 return p.errorf("Any message unpacked multiple times, or %q already set", valFD.Name())
221 }
222 m.Set(urlFD, protoreflect.ValueOfString(name))
223 m.Set(valFD, protoreflect.ValueOfBytes(b))
224 seen[urlFD.Number()] = true
225 seen[valFD.Number()] = true
226 return nil
227 }
228

Callers 1

unmarshalMessageMethod · 0.95

Calls 15

nextMethod · 0.95
errorfMethod · 0.95
unmarshalMessageMethod · 0.95
checkForColonMethod · 0.95
unmarshalValueMethod · 0.95
FindMessageByURLMethod · 0.80
InterfaceMethod · 0.80
HasMethod · 0.80
isMessageSetFunction · 0.70
MarshalMethod · 0.65

Tested by

no test coverage detected