/
encode_struct.go
42 lines (37 loc) · 987 Bytes
/
encode_struct.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package reflection
import (
"github.com/thrift-iterator/go/protocol"
"github.com/thrift-iterator/go/spi"
"unsafe"
)
type structEncoder struct {
fields []structEncoderField
}
type structEncoderField struct {
offset uintptr
fieldId protocol.FieldId
encoder internalEncoder
}
func (encoder *structEncoder) encode(ptr unsafe.Pointer, stream spi.Stream) {
stream.WriteStructHeader()
for _, field := range encoder.fields {
fieldPtr := unsafe.Pointer(uintptr(ptr) + field.offset)
switch field.encoder.(type) {
case *pointerEncoder, *sliceEncoder:
if *(*unsafe.Pointer)(fieldPtr) == nil {
continue
}
case *mapEncoder:
if *(*unsafe.Pointer)(fieldPtr) == nil {
continue
}
fieldPtr = *(*unsafe.Pointer)(fieldPtr)
}
stream.WriteStructField(field.encoder.thriftType(), field.fieldId)
field.encoder.encode(fieldPtr, stream)
}
stream.WriteStructFieldStop()
}
func (encoder *structEncoder) thriftType() protocol.TType {
return protocol.TypeStruct
}