From f23a857a560b3113a11de9ad5a61b44b4cdad0dc Mon Sep 17 00:00:00 2001 From: Galen Abell Date: Thu, 6 Jan 2022 15:12:09 +0100 Subject: [PATCH] store: fix shrinking slice during store This allows storing a larger slice into a smaller slice, which would previously be an invalid operation. Fixes #287 --- dbus.go | 9 ++------- store_test.go | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/dbus.go b/dbus.go index e9d014f9..c188d104 100644 --- a/dbus.go +++ b/dbus.go @@ -277,13 +277,8 @@ func storeSliceIntoInterface(dest, src reflect.Value) error { func storeSliceIntoSlice(dest, src reflect.Value) error { if dest.IsNil() || dest.Len() < src.Len() { dest.Set(reflect.MakeSlice(dest.Type(), src.Len(), src.Cap())) - } - if dest.Len() != src.Len() { - return fmt.Errorf( - "dbus.Store: type mismatch: "+ - "slices are different lengths "+ - "need: %d have: %d", - src.Len(), dest.Len()) + } else if dest.Len() > src.Len() { + dest.Set(dest.Slice(0, src.Len())) } for i := 0; i < src.Len(); i++ { err := store(dest.Index(i), getVariantValue(src.Index(i))) diff --git a/store_test.go b/store_test.go index 2f2162ba..732c366a 100644 --- a/store_test.go +++ b/store_test.go @@ -97,3 +97,18 @@ func TestStoreNested(t *testing.T) { dest, src) } } + +func TestStoreSmallerSliceToLargerSlice(t *testing.T) { + src := []string{"baz"} + dest := []interface{}{"foo", "bar"} + err := Store([]interface{}{src}, &dest) + if err != nil { + t.Fatal(err) + } + if len(dest) != 1 { + t.Fatal("Expected dest slice to shrink") + } + if dest[0].(string) != "baz" { + t.Fatal("Wrong element saved in dest slice") + } +}