From 819219cdcf20009176ac22d72d697b2cd48b9be0 Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Sun, 7 Jan 2024 22:33:04 -0500 Subject: [PATCH] fix: we need to define custom array encoding and decoding api due to non-standard message packing in the dart implementation --- utils/array.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 utils/array.go diff --git a/utils/array.go b/utils/array.go new file mode 100644 index 0000000..1117687 --- /dev/null +++ b/utils/array.go @@ -0,0 +1,62 @@ +package utils + +import ( + "errors" + "github.com/vmihailenco/msgpack/v5" + "net/url" +) + +func EncodeMsgpackArray(enc *msgpack.Encoder, array interface{}) error { + switch v := array.(type) { + case []*url.URL: + // Handle []*url.URL slice + err := enc.EncodeInt(int64(len(v))) + if err != nil { + return err + } + for _, item := range v { + err = enc.Encode(item) + if err != nil { + return err + } + } + return nil + default: + // Handle generic case + arr, ok := array.([]interface{}) + if !ok { + return errors.New("unsupported type for EncodeMsgpackArray") + } + err := enc.EncodeInt(int64(len(arr))) + if err != nil { + return err + } + for _, item := range arr { + err = enc.Encode(item) + if err != nil { + return err + } + } + return nil + } +} + +func DecodeMsgpackArray(dec *msgpack.Decoder) ([]interface{}, error) { + arrayLen, err := dec.DecodeInt() + if err != nil { + return nil, err + } + + array := make([]interface{}, arrayLen) + + for i := 0; i < int(arrayLen); i++ { + item, err := dec.DecodeInterface() + if err != nil { + return nil, err + } + + array[i] = item + } + + return array, nil +}