diff options
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())) + } +} |