mirror of
https://github.com/Icinga/icingadb.git
synced 2026-05-28 04:35:54 -04:00
PackAny(): pack [I]byte as string in map keys as well
This commit is contained in:
parent
c8fa629f32
commit
a6da8ab90a
2 changed files with 29 additions and 3 deletions
|
|
@ -101,10 +101,30 @@ func packValue(in reflect.Value, out io.Writer) error {
|
|||
{
|
||||
iter := in.MapRange()
|
||||
for iter.Next() {
|
||||
// Not just stringify the key (below), but also pack it (here) - panics on disallowed type.
|
||||
_ = packValue(iter.Key(), ioutil.Discard)
|
||||
var packedKey []byte
|
||||
if key := iter.Key(); key.Kind() == reflect.Array {
|
||||
if typ := key.Type(); typ.Elem() == tByte {
|
||||
if !key.CanAddr() {
|
||||
vNewElem := reflect.New(typ).Elem()
|
||||
vNewElem.Set(key)
|
||||
key = vNewElem
|
||||
}
|
||||
|
||||
sorted = append(sorted, kv{[]byte(fmt.Sprint(iter.Key().Interface())), iter.Value()})
|
||||
packedKey = key.Slice(0, key.Len()).Interface().([]byte)
|
||||
} else {
|
||||
// Not just stringify the key (below), but also pack it (here) - panics on disallowed type.
|
||||
_ = packValue(iter.Key(), ioutil.Discard)
|
||||
|
||||
packedKey = []byte(fmt.Sprint(key.Interface()))
|
||||
}
|
||||
} else {
|
||||
// Not just stringify the key (below), but also pack it (here) - panics on disallowed type.
|
||||
_ = packValue(iter.Key(), ioutil.Discard)
|
||||
|
||||
packedKey = []byte(fmt.Sprint(key.Interface()))
|
||||
}
|
||||
|
||||
sorted = append(sorted, kv{packedKey, iter.Value()})
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -113,6 +113,12 @@ func TestPackAny(t *testing.T) {
|
|||
3, 0x40, 0x45, 0, 0, 0, 0, 0, 0,
|
||||
})
|
||||
|
||||
assertPackAny(t, map[[1]byte]bool{[1]byte{42}: true}, []byte{
|
||||
6, 0, 0, 0, 0, 0, 0, 0, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 1, 42,
|
||||
2,
|
||||
})
|
||||
|
||||
assertPackAnyPanic(t, map[struct{}]struct{}{{}: {}}, 9)
|
||||
|
||||
assertPackAny(t, (*string)(nil), []byte{0})
|
||||
|
|
|
|||
Loading…
Reference in a new issue