(b []byte, p unsafe.Pointer, st *structType)
| 736 | } |
| 737 | |
| 738 | func (e encoder) encodeStruct(b []byte, p unsafe.Pointer, st *structType) ([]byte, error) { |
| 739 | start := len(b) |
| 740 | var err error |
| 741 | var k string |
| 742 | var n int |
| 743 | b = append(b, '{') |
| 744 | |
| 745 | escapeHTML := (e.flags & EscapeHTML) != 0 |
| 746 | |
| 747 | for i := range st.fields { |
| 748 | f := &st.fields[i] |
| 749 | v := unsafe.Pointer(uintptr(p) + f.offset) |
| 750 | |
| 751 | if f.omitempty && f.empty(v) { |
| 752 | continue |
| 753 | } |
| 754 | |
| 755 | if escapeHTML { |
| 756 | k = f.html |
| 757 | } else { |
| 758 | k = f.json |
| 759 | } |
| 760 | |
| 761 | lengthBeforeKey := len(b) |
| 762 | |
| 763 | if n != 0 { |
| 764 | b = append(b, k...) |
| 765 | } else { |
| 766 | b = append(b, k[1:]...) |
| 767 | } |
| 768 | |
| 769 | if b, err = f.codec.encode(e, b, v); err != nil { |
| 770 | if err == (rollback{}) { |
| 771 | b = b[:lengthBeforeKey] |
| 772 | continue |
| 773 | } |
| 774 | return b[:start], err |
| 775 | } |
| 776 | |
| 777 | n++ |
| 778 | } |
| 779 | |
| 780 | b = append(b, '}') |
| 781 | return b, nil |
| 782 | } |
| 783 | |
| 784 | type rollback struct{} |
| 785 |
no test coverage detected