@@ -15,57 +15,85 @@ func isSlice(v any) bool {
1515 return reflect .TypeOf (v ).Kind () == reflect .Slice
1616}
1717
18- func isValueAndTypeAreSlice (typ any , value any ) bool {
19- return isSlice (typ ) && isSlice (value )
20- }
18+ func convertValuesForSlice (zero any , anyValues []any ) (any , error ) {
19+ if zero == nil {
20+ return nil , errors .New ("zero cannot be nil" )
21+ }
2122
22- func convertValuesForSlice (typ any , anyValues []any ) any {
23- elem := reflect .TypeOf (typ ).Elem ().Elem ()
23+ elem := reflect .TypeOf (zero ).Elem ()
2424 switch kind := elem .Kind (); kind {
2525 case reflect .Bool :
2626 values := make ([]bool , 0 , len (anyValues ))
2727 for _ , v := range anyValues {
28- values = append (values , v .(bool ))
28+ vv , ok := v .(bool )
29+ if ! ok {
30+ return nil , fmt .Errorf ("failed to assert %v (%T) as bool" , v , v )
31+ }
32+ values = append (values , vv )
2933 }
30- return values
34+ return values , nil
3135 case reflect .Int :
3236 values := make ([]int , 0 , len (anyValues ))
3337 for _ , v := range anyValues {
34- values = append (values , v .(int ))
38+ vv , ok := v .(int )
39+ if ! ok {
40+ return nil , fmt .Errorf ("failed to assert %v (%T) as int" , v , v )
41+ }
42+ values = append (values , vv )
3543 }
36- return values
44+ return values , nil
3745 case reflect .Int64 :
3846 values := make ([]int64 , 0 , len (anyValues ))
3947 for _ , v := range anyValues {
40- values = append (values , v .(int64 ))
48+ vv , ok := v .(int64 )
49+ if ! ok {
50+ return nil , fmt .Errorf ("failed to assert %v (%T) as int64" , v , v )
51+ }
52+ values = append (values , vv )
4153 }
42- return values
54+ return values , nil
4355 case reflect .Uint :
4456 values := make ([]uint , 0 , len (anyValues ))
4557 for _ , v := range anyValues {
46- values = append (values , v .(uint ))
58+ vv , ok := v .(uint )
59+ if ! ok {
60+ return nil , fmt .Errorf ("failed to assert %v (%T) as uint" , v , v )
61+ }
62+ values = append (values , vv )
4763 }
48- return values
64+ return values , nil
4965 case reflect .Uint64 :
5066 values := make ([]uint64 , 0 , len (anyValues ))
5167 for _ , v := range anyValues {
52- values = append (values , v .(uint64 ))
68+ vv , ok := v .(uint64 )
69+ if ! ok {
70+ return nil , fmt .Errorf ("failed to assert %v (%T) as uint64" , v , v )
71+ }
72+ values = append (values , vv )
5373 }
54- return values
74+ return values , nil
5575 case reflect .Float64 :
5676 values := make ([]float64 , 0 , len (anyValues ))
5777 for _ , v := range anyValues {
58- values = append (values , v .(float64 ))
78+ vv , ok := v .(float64 )
79+ if ! ok {
80+ return nil , fmt .Errorf ("failed to assert %v (%T) as float64" , v , v )
81+ }
82+ values = append (values , vv )
5983 }
60- return values
84+ return values , nil
6185 case reflect .String :
6286 values := make ([]string , 0 , len (anyValues ))
6387 for _ , v := range anyValues {
64- values = append (values , v .(string ))
88+ vv , ok := v .(string )
89+ if ! ok {
90+ return nil , fmt .Errorf ("failed to assert %v (%T) as string" , v , v )
91+ }
92+ values = append (values , vv )
6593 }
66- return values
94+ return values , nil
6795 default :
68- panic ( fmt .Errorf ("unsupported type to convert: %s" , kind ) )
96+ return nil , fmt .Errorf ("unsupported type to convert: %s" , kind )
6997 }
7098}
7199
@@ -180,3 +208,27 @@ func decodeValue(decoder *json.Decoder) (any, error) {
180208 }
181209 return handleToken (token )
182210}
211+
212+ func assertType [T any ](value any ) (T , error ) {
213+ var zero T
214+ if isSlice (zero ) {
215+ v , ok := value .([]any )
216+ if ! ok {
217+ return zero , fmt .Errorf ("failed to assert %v (%T) as slice" , value , value )
218+ }
219+ values , err := convertValuesForSlice (zero , v )
220+ if err != nil {
221+ return zero , fmt .Errorf ("failed to convert slice: %w" , err )
222+ }
223+ typedValues , ok := any (values ).(T )
224+ if ! ok {
225+ return zero , fmt .Errorf ("failed to convert typed slice (%T)" , values )
226+ }
227+ return typedValues , nil
228+ }
229+ v , ok := value .(T )
230+ if ! ok {
231+ return zero , fmt .Errorf ("failed to assert %v (%T) as %T" , value , value , zero )
232+ }
233+ return v , nil
234+ }
0 commit comments