(b []byte, p unsafe.Pointer, st *structType)
| 313 | return b, nil |
| 314 | } |
| 315 | func (d decoder) decodeStruct(b []byte, p unsafe.Pointer, st *structType) ([]byte, error) { |
| 316 | n, isMap, b, err := parseStructLen(b) |
| 317 | if err != nil { |
| 318 | return b, err |
| 319 | } |
| 320 | if n == -1 { |
| 321 | return b, nil |
| 322 | } |
| 323 | if !isMap { |
| 324 | if n != len(st.fields) { |
| 325 | return b, fmt.Errorf("msgp: got %d fields decoding struct, wanted %d", n, len(st.fields)) |
| 326 | } |
| 327 | for i := range st.fields { |
| 328 | f := &st.fields[i] |
| 329 | if b, err = f.codec.decode(d, b, unsafe.Pointer(uintptr(p)+f.offset)); err != nil { |
| 330 | return b, err |
| 331 | } |
| 332 | } |
| 333 | return b, nil |
| 334 | } |
| 335 | for i := 0; i < n; i++ { |
| 336 | var field *structField |
| 337 | field, b, err = d.decodeStructField(b, st) |
| 338 | if err != nil { |
| 339 | return b, err |
| 340 | } |
| 341 | if field == nil { |
| 342 | b, err = Skip(b) |
| 343 | if err != nil { |
| 344 | return b, err |
| 345 | } |
| 346 | continue |
| 347 | } |
| 348 | b, err = field.codec.decode(d, b, unsafe.Pointer(uintptr(p)+field.offset)) |
| 349 | if err != nil { |
| 350 | return b, fmt.Errorf("msgp: decoding %q failed: %w", field.name, err) |
| 351 | } |
| 352 | } |
| 353 | return b, nil |
| 354 | } |
| 355 | func (d decoder) decodeStructField(b []byte, st *structType) (*structField, []byte, error) { |
| 356 | if fieldID, b, err := d.decodeStructFieldID(b); err == nil { |
| 357 | field := st.fieldByID(fieldID) |
no test coverage detected