(m protoreflect.Message, seen map[protoreflect.FieldNumber]bool)
| 169 | } |
| 170 | |
| 171 | func (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 |
no test coverage detected