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())) } }