diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-05-30 12:00:39 -0400 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-05-30 12:00:39 -0400 |
commit | 8576e5f207f9d3b7c6324ed71a3ca6a005f9ae7c (patch) | |
tree | 1ff3001f73011a96aa603ec2eda7d29ce4885d47 /pkg/binstruct/marshal.go | |
parent | 04d6677e52352a7e3ec791e3e817cfe3865e7d6d (diff) |
ahhhh
Diffstat (limited to 'pkg/binstruct/marshal.go')
-rw-r--r-- | pkg/binstruct/marshal.go | 36 |
1 files changed, 36 insertions, 0 deletions
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())) + } +} |