io: add support for pointer receivers in WriteArray()

It's actually preferable to have pointer receivers for serializable types, so
this should be supported.
This commit is contained in:
Roman Khimov 2019-12-09 16:57:25 +03:00
parent 052ba1e94f
commit b542a5e7a0
2 changed files with 26 additions and 1 deletions

View file

@ -48,9 +48,12 @@ func (w *BinWriter) WriteArray(arr interface{}) {
w.WriteVarUint(uint64(val.Len())) w.WriteVarUint(uint64(val.Len()))
for i := 0; i < val.Len(); i++ { for i := 0; i < val.Len(); i++ {
el, ok := val.Index(i).Interface().(encodable) el, ok := val.Index(i).Interface().(encodable)
if !ok {
el, ok = val.Index(i).Addr().Interface().(encodable)
if !ok { if !ok {
panic(typ.String() + " is not encodable") panic(typ.String() + " is not encodable")
} }
}
el.EncodeBinary(w) el.EncodeBinary(w)
} }

View file

@ -229,6 +229,18 @@ func (t *testSerializable) DecodeBinary(r *BinReader) {
r.ReadLE(t) r.ReadLE(t)
} }
type testPtrSerializable uint16
// EncodeBinary implements io.Serializable interface.
func (t *testPtrSerializable) EncodeBinary(w *BinWriter) {
w.WriteLE(t)
}
// DecodeBinary implements io.Serializable interface.
func (t *testPtrSerializable) DecodeBinary(r *BinReader) {
r.ReadLE(t)
}
func TestBinWriter_WriteArray(t *testing.T) { func TestBinWriter_WriteArray(t *testing.T) {
var arr [3]testSerializable var arr [3]testSerializable
for i := range arr { for i := range arr {
@ -272,6 +284,16 @@ func TestBinWriter_WriteArray(t *testing.T) {
w.Reset() w.Reset()
w.Err = errors.New("error") w.Err = errors.New("error")
require.Panics(t, func() { w.WriteArray(make(chan testSerializable)) }) require.Panics(t, func() { w.WriteArray(make(chan testSerializable)) })
// Ptr receiver test
var arrPtr [3]testPtrSerializable
for i := range arrPtr {
arrPtr[i] = testPtrSerializable(i)
}
w.Reset()
w.WriteArray(arr[:])
require.NoError(t, w.Err)
require.Equal(t, expected, w.Bytes())
} }
func TestBinReader_ReadArray(t *testing.T) { func TestBinReader_ReadArray(t *testing.T) {