From 8ad7bb9e0c4349be259a7c09c709402952198735 Mon Sep 17 00:00:00 2001 From: yusing Date: Sat, 11 Jan 2025 01:39:03 +0800 Subject: [PATCH] fix: slice deserialization should return all errors --- internal/utils/serialization.go | 9 ++++++++- internal/utils/serialization_test.go | 9 +-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/internal/utils/serialization.go b/internal/utils/serialization.go index 79affb1..9cda6c8 100644 --- a/internal/utils/serialization.go +++ b/internal/utils/serialization.go @@ -1,5 +1,7 @@ package utils +// FIXME: some times [%d] is not in correct order + import ( "encoding/json" "errors" @@ -277,17 +279,22 @@ func Convert(src reflect.Value, dst reflect.Value) E.Error { if dstT.Kind() != reflect.Slice { return ErrUnsupportedConversion.Subject(dstT.String() + " to " + srcT.String()) } + sliceErrs := E.NewBuilder("slice conversion errors") newSlice := reflect.MakeSlice(dstT, src.Len(), src.Len()) i := 0 for _, v := range src.Seq2() { tmp := New(dstT.Elem()).Elem() err := Convert(v, tmp) if err != nil { - return err.Subjectf("[%d]", i) + sliceErrs.Add(err.Subjectf("[%d]", i)) + continue } newSlice.Index(i).Set(tmp) i++ } + if err := sliceErrs.Error(); err != nil { + return err + } dst.Set(newSlice) return nil } diff --git a/internal/utils/serialization_test.go b/internal/utils/serialization_test.go index b45d95c..ba0801f 100644 --- a/internal/utils/serialization_test.go +++ b/internal/utils/serialization_test.go @@ -166,16 +166,9 @@ func TestStringToSlice(t *testing.T) { ExpectNoError(t, err) ExpectDeepEqual(t, dst, []string{"a", "b", "c"}) }) - t.Run("multiline", func(t *testing.T) { - dst := make([]string, 0) - convertible, err := ConvertString("- a\n- b\n- c", reflect.ValueOf(&dst)) - ExpectTrue(t, convertible) - ExpectNoError(t, err) - ExpectDeepEqual(t, dst, []string{"a", "b", "c"}) - }) t.Run("yaml-like", func(t *testing.T) { dst := make([]string, 0) - convertible, err := ConvertString(" - a\n - b\n - c", reflect.ValueOf(&dst)) + convertible, err := ConvertString("- a\n- b\n- c", reflect.ValueOf(&dst)) ExpectTrue(t, convertible) ExpectNoError(t, err) ExpectDeepEqual(t, dst, []string{"a", "b", "c"})