(v reflect.Value, d Decoder)
| 671 | } |
| 672 | |
| 673 | func decodeStruct(v reflect.Value, d Decoder) error { |
| 674 | fs, err := fieldCache.Fields(v.Type()) |
| 675 | if err != nil { |
| 676 | return err |
| 677 | } |
| 678 | d.DecodeMap(func(key string, d2 Decoder, exactMatch bool) bool { |
| 679 | if err != nil { |
| 680 | return false |
| 681 | } |
| 682 | var f *fields.Field |
| 683 | if exactMatch { |
| 684 | f = fs.MatchExact(key) |
| 685 | } else { |
| 686 | f = fs.MatchFold(key) |
| 687 | } |
| 688 | if f == nil { |
| 689 | err = gcerr.Newf(gcerr.InvalidArgument, nil, "no field matching %q in %s", key, v.Type()) |
| 690 | return false |
| 691 | } |
| 692 | fv, ok := fieldByIndexCreate(v, f.Index) |
| 693 | if !ok { |
| 694 | err = gcerr.Newf(gcerr.InvalidArgument, nil, |
| 695 | "setting field %q in %s: cannot create embedded pointer field of unexported type", |
| 696 | key, v.Type()) |
| 697 | return false |
| 698 | } |
| 699 | err = decode(fv, d2) |
| 700 | return err == nil |
| 701 | }) |
| 702 | return err |
| 703 | } |
| 704 | |
| 705 | // fieldByIndexCreate retrieves the the field of v at the given index if present, |
| 706 | // creating embedded struct pointers where necessary. |
no test coverage detected