Skip to content

Commit bfb043b

Browse files
authored
Merge pull request #36 from Basekick-Labs/fix/map-nonstring-keys
fix(decode): support non-string map keys in interface{}
2 parents 549ca0d + 4e1434e commit bfb043b

1 file changed

Lines changed: 27 additions & 2 deletions

File tree

decode_map.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,27 @@ func (d *Decoder) decodeMapDefault() (interface{}, error) {
5252
if d.mapDecoder != nil {
5353
return d.mapDecoder(d)
5454
}
55-
return d.DecodeMap()
55+
56+
n, err := d.DecodeMapLen()
57+
if err != nil {
58+
return nil, err
59+
}
60+
if n == -1 {
61+
return nil, nil
62+
}
63+
if n == 0 {
64+
return make(map[string]interface{}), nil
65+
}
66+
67+
code, err := d.PeekCode()
68+
if err != nil {
69+
return nil, err
70+
}
71+
72+
if msgpcode.IsString(code) {
73+
return d.decodeMapStringInterfaceN(n)
74+
}
75+
return d.decodeTypedMapN(n)
5676
}
5777

5878
// DecodeMapLen decodes map length. Length is -1 when map is nil.
@@ -152,11 +172,13 @@ func (d *Decoder) DecodeMap() (map[string]interface{}, error) {
152172
if err != nil {
153173
return nil, err
154174
}
155-
156175
if n == -1 {
157176
return nil, nil
158177
}
178+
return d.decodeMapStringInterfaceN(n)
179+
}
159180

181+
func (d *Decoder) decodeMapStringInterfaceN(n int) (map[string]interface{}, error) {
160182
ln := n
161183
if d.flags&disableAllocLimitFlag == 0 && ln > maxMapSize {
162184
ln = maxMapSize
@@ -218,7 +240,10 @@ func (d *Decoder) DecodeTypedMap() (interface{}, error) {
218240
if n <= 0 {
219241
return nil, nil
220242
}
243+
return d.decodeTypedMapN(n)
244+
}
221245

246+
func (d *Decoder) decodeTypedMapN(n int) (interface{}, error) {
222247
key, err := d.decodeInterfaceCond()
223248
if err != nil {
224249
return nil, err

0 commit comments

Comments
 (0)