From 8576e5f207f9d3b7c6324ed71a3ca6a005f9ae7c Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 30 May 2022 12:00:39 -0400 Subject: ahhhh --- pkg/binstruct/marshal.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 pkg/binstruct/marshal.go (limited to 'pkg/binstruct/marshal.go') diff --git a/pkg/binstruct/marshal.go b/pkg/binstruct/marshal.go new file mode 100644 index 0000000..c8158a4 --- /dev/null +++ b/pkg/binstruct/marshal.go @@ -0,0 +1,36 @@ +package binstruct + +import ( + "fmt" + "reflect" +) + +type Marshaler interface { + MarshalBinary() ([]byte, error) +} + +func Marshal(obj any) ([]byte, error) { + if mar, ok := obj.(Marshaler); ok { + return mar.MarshalBinary() + } + val := reflect.ValueOf(obj) + switch val.Kind() { + case reflect.Ptr: + return Marshal(val.Elem().Interface()) + case reflect.Array: + var ret []byte + for i := 0; i < val.Len(); i++ { + bs, err := Marshal(val.Index(i).Interface()) + ret = append(ret, bs...) + if err != nil { + return ret, err + } + } + return ret, nil + case reflect.Struct: + // TODO + default: + panic(fmt.Errorf("type=%v does not implement binfmt.Marshaler and kind=%v is not a supported statically-sized kind", + val.Type(), val.Kind())) + } +} -- cgit v1.2.3-2-g168b