From 01704502c27f6247523f4d227c94f9311ec4acb4 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Wed, 25 May 2022 12:18:03 -0600 Subject: wip --- pkg/binstruct/l1.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'pkg/binstruct') diff --git a/pkg/binstruct/l1.go b/pkg/binstruct/l1.go index d90ecba..367dd28 100644 --- a/pkg/binstruct/l1.go +++ b/pkg/binstruct/l1.go @@ -7,9 +7,13 @@ import ( ) type Marshaler interface { + BinarySize() int64 MarshalBinary() []byte +} + +type Unmarshaler interface { + Marshaler UnmarshalBinary([]byte) - BinarySize() int64 } type handler interface { @@ -26,9 +30,9 @@ func (_ extHandler) Marshal(val interface{}) []byte { return val.(Marshaler).MarshalBinary() } func (e extHandler) Unmarshal(dat []byte) interface{} { - val := reflect.New(e.typ).Elem().Interface().(Marshaler) - val.UnmarshalBinary(dat) - return val + valPtr := reflect.New(e.typ).Interface().(Unmarshaler) + valPtr.UnmarshalBinary(dat) + return reflect.ValueOf(valPtr).Elem().Interface() } func (e extHandler) Size() int64 { val := reflect.New(e.typ).Elem().Interface().(Marshaler) @@ -53,7 +57,9 @@ func convert[T any](in interface{}) T { } func genHandler(typ reflect.Type) (handler, error) { - if _, ok := reflect.New(typ).Elem().Interface().(Marshaler); ok { + _, marOK := reflect.New(typ).Elem().Interface().(Marshaler) + _, unmarOK := reflect.New(typ).Interface().(Unmarshaler) + if marOK && unmarOK { return extHandler{ typ: typ, }, nil @@ -112,7 +118,7 @@ func genHandler(typ reflect.Type) (handler, error) { case reflect.Int8: return primitive{ unmarshal: func(dat []byte) interface{} { return int8(dat[0]) }, - marshal: func(val interface{}) []byte { return []byte{uint8(convert[int8](val))}}, + marshal: func(val interface{}) []byte { return []byte{uint8(convert[int8](val))} }, size: 1, }, nil case reflect.Int16: -- cgit v1.2.3-2-g168b