MCPcopy Create free account
hub / github.com/segmentio/encoding / structDecodeFuncOf

Function structDecodeFuncOf

proto/struct.go:288–411  ·  view source on GitHub ↗
(t reflect.Type, fields []structField)

Source from the content-addressed store, hash-verified

286}
287
288func structDecodeFuncOf(t reflect.Type, fields []structField) decodeFunc {
289 maxFieldNumber := fieldNumber(0)
290
291 for _, f := range fields {
292 if n := f.fieldNumber(); n > maxFieldNumber {
293 maxFieldNumber = n
294 }
295 }
296
297 fieldIndex := make([]*structField, maxFieldNumber+1)
298
299 for i := range fields {
300 f := &fields[i]
301 fieldIndex[f.fieldNumber()] = f
302 }
303
304 return func(b []byte, p unsafe.Pointer, flags flags) (int, error) {
305 flags = flags.without(toplevel)
306 offset := 0
307
308 for offset < len(b) {
309 fieldNumber, wireType, n, err := decodeTag(b[offset:])
310 offset += n
311 if err != nil {
312 return offset, err
313 }
314
315 i := int(fieldNumber)
316 f := (*structField)(nil)
317
318 if i >= 0 && i < len(fieldIndex) {
319 f = fieldIndex[i]
320 }
321
322 if f == nil {
323 skip := 0
324 size := uint64(0)
325 switch wireType {
326 case varint:
327 _, skip, err = decodeVarint(b[offset:])
328 case varlen:
329 size, skip, err = decodeVarint(b[offset:])
330 if err == nil {
331 if size > uint64(len(b)-skip) {
332 err = io.ErrUnexpectedEOF
333 } else {
334 skip += int(size)
335 }
336 }
337 case fixed32:
338 _, skip, err = decodeLE32(b[offset:])
339 case fixed64:
340 _, skip, err = decodeLE64(b[offset:])
341 default:
342 err = ErrWireTypeUnknown
343 }
344 if (offset + skip) <= len(b) {
345 offset += skip

Callers 1

structCodecOfFunction · 0.85

Calls 13

fieldNumberTypeAlias · 0.85
decodeTagFunction · 0.85
decodeVarintFunction · 0.85
decodeLE32Function · 0.85
decodeLE64Function · 0.85
fieldErrorFunction · 0.85
fieldNumberMethod · 0.80
wireTypeMethod · 0.80
embeddedMethod · 0.80
decodeMethod · 0.80
pointerMethod · 0.80
makeFlagsMethod · 0.80

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…