From 28b5d44e11a5f3a33a3d8275ec30ec884fb3dc1e Mon Sep 17 00:00:00 2001
From: yusing <yusing@6uo.me>
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"})