Skip to content

Commit 48944a2

Browse files
committed
fix/struct: support pointer in struct
1 parent ce71fe0 commit 48944a2

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

codec_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,38 @@ func TestMarshalObject(t *testing.T) {
199199
}
200200
}
201201

202+
func TestMarshalObjectPointer(t *testing.T) {
203+
flag := false
204+
input := &exampleData{
205+
Name: "yomo",
206+
Noise: float32(456),
207+
Therm: thermometer{Temperature: float32(30), Humidity: float32(40)},
208+
}
209+
210+
codec := NewCodec(0x30)
211+
inputBuf, err := codec.Marshal(input)
212+
assert.NoError(t, err)
213+
testPrintf("inputBuf=%v\n", utils.FormatBytes(inputBuf))
214+
215+
testDecoder(0x30, inputBuf, func(v []byte) (interface{}, error) {
216+
flag = true
217+
testPrintf("v=%#x\n", v)
218+
var mold exampleData
219+
err := ToObject(v, &mold)
220+
assert.NoError(t, err, fmt.Sprintf("decode error:%v", err))
221+
testPrintf("mold=%v\n", mold)
222+
assert.Equal(t, input.Name, mold.Name)
223+
assert.Equal(t, input.Noise, mold.Noise)
224+
assert.Equal(t, input.Therm.Temperature, mold.Therm.Temperature)
225+
assert.Equal(t, input.Therm.Humidity, mold.Therm.Humidity)
226+
return mold, err
227+
})
228+
229+
if !flag {
230+
t.Error("The key 0x30 is not observed")
231+
}
232+
}
233+
202234
func TestMarshalObjectSlice(t *testing.T) {
203235
flag := false
204236
input := exampleSlice{

structure_encoder.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (e *structEncoderImpl) encode(input interface{}, signals []*PrimitivePacket
9696
var inputVal reflect.Value
9797

9898
if input != nil {
99-
inputVal = reflect.ValueOf(input)
99+
inputVal = reflect.Indirect(reflect.ValueOf(input))
100100
if inputVal.Kind() == reflect.Ptr && inputVal.IsNil() {
101101
input = nil
102102
}
@@ -115,9 +115,9 @@ func (e *structEncoderImpl) encode(input interface{}, signals []*PrimitivePacket
115115
inputKind := inputVal.Kind()
116116
switch inputKind {
117117
case reflect.Struct:
118-
nodeEncoder = e.encodeStruct(reflect.ValueOf(input), NewNodePacketEncoder(int(e.observe)))
118+
nodeEncoder = e.encodeStruct(inputVal, NewNodePacketEncoder(int(e.observe)))
119119
case reflect.Slice:
120-
nodeEncoder = e.encodeSlice(reflect.ValueOf(input), NewNodePacketEncoder(int(e.observe)))
120+
nodeEncoder = e.encodeSlice(inputVal, NewNodePacketEncoder(int(e.observe)))
121121
default:
122122
return nil, fmt.Errorf("unsupported type: %s", inputKind)
123123
}

0 commit comments

Comments
 (0)