Skip to content

Commit 5bebe60

Browse files
authored
Better error message in case of conversion error (#3402)
## Changes Improve error message when converting typed struct to dynamic. ## Why Currently different functions share the message body, so you don't know which field failed to convert. Real example when working on #3390 test acceptance/bundle/deploy/jobs/double-underscore-keys triggers this error condition: Before this change "bundle deploy" fails with: ``` Warn: unable to convert typed configuration to dynamic configuration: unhandled type: string Error: exit error: unhandled type: string ``` After: ``` Warn: unable to convert typed configuration to dynamic configuration: cannot convert int field to dynamic type "string": src=4611686018427387911 ref="4611686018427387911" Error: exit error: cannot convert int field to dynamic type "string": src=4611686018427387911 ref="4611686018427387911" ``` ## Tests Manually, by applying this commit on #3390
1 parent dc55c62 commit 5bebe60

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

libs/dyn/convert/from_typed.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func fromTypedStruct(src reflect.Value, ref dyn.Value, options ...fromTypedOptio
9696
}
9797
case dyn.KindMap, dyn.KindNil:
9898
default:
99-
return dyn.InvalidValue, fmt.Errorf("unhandled type: %s", ref.Kind())
99+
return dyn.InvalidValue, fmt.Errorf("cannot convert struct field to dynamic type %#v: src=%#v ref=%#v", ref.Kind().String(), src, ref.AsAny())
100100
}
101101

102102
refm, _ := ref.AsMap()
@@ -161,7 +161,7 @@ func fromTypedMap(src reflect.Value, ref dyn.Value) (dyn.Value, error) {
161161
}
162162
case dyn.KindMap, dyn.KindNil:
163163
default:
164-
return dyn.InvalidValue, fmt.Errorf("unhandled type: %s", ref.Kind())
164+
return dyn.InvalidValue, fmt.Errorf("cannot convert map field to dynamic type %#v: src=%#v ref=%#v", ref.Kind().String(), src, ref.AsAny())
165165
}
166166

167167
// Return nil if the map is nil.
@@ -209,7 +209,7 @@ func fromTypedSlice(src reflect.Value, ref dyn.Value) (dyn.Value, error) {
209209
}
210210
case dyn.KindSequence, dyn.KindNil:
211211
default:
212-
return dyn.InvalidValue, fmt.Errorf("unhandled type: %s", ref.Kind())
212+
return dyn.InvalidValue, fmt.Errorf("cannot convert slice field to dynamic type %#v: src=%#v ref=%#v", ref.Kind().String(), src, ref.AsAny())
213213
}
214214

215215
// Return nil if the slice is nil.
@@ -257,7 +257,7 @@ func fromTypedString(src reflect.Value, ref dyn.Value, options ...fromTypedOptio
257257
return dyn.V(src.String()), nil
258258
}
259259

260-
return dyn.InvalidValue, fmt.Errorf("unhandled type: %s", ref.Kind())
260+
return dyn.InvalidValue, fmt.Errorf("cannot convert string field to dynamic type %#v: src=%#v ref=%#v", ref.Kind().String(), src, ref.AsAny())
261261
}
262262

263263
func fromTypedBool(src reflect.Value, ref dyn.Value, options ...fromTypedOptions) (dyn.Value, error) {
@@ -282,7 +282,7 @@ func fromTypedBool(src reflect.Value, ref dyn.Value, options ...fromTypedOptions
282282
}
283283
}
284284

285-
return dyn.InvalidValue, fmt.Errorf("unhandled type: %s", ref.Kind())
285+
return dyn.InvalidValue, fmt.Errorf("cannot convert bool field to dynamic type %#v: src=%#v ref=%#v", ref.Kind().String(), src, ref.AsAny())
286286
}
287287

288288
func fromTypedInt(src reflect.Value, ref dyn.Value, options ...fromTypedOptions) (dyn.Value, error) {
@@ -307,7 +307,7 @@ func fromTypedInt(src reflect.Value, ref dyn.Value, options ...fromTypedOptions)
307307
}
308308
}
309309

310-
return dyn.InvalidValue, fmt.Errorf("unhandled type: %s", ref.Kind())
310+
return dyn.InvalidValue, fmt.Errorf("cannot convert int field to dynamic type %#v: src=%#v ref=%#v", ref.Kind().String(), src, ref.AsAny())
311311
}
312312

313313
func fromTypedFloat(src reflect.Value, ref dyn.Value, options ...fromTypedOptions) (dyn.Value, error) {
@@ -332,7 +332,7 @@ func fromTypedFloat(src reflect.Value, ref dyn.Value, options ...fromTypedOption
332332
}
333333
}
334334

335-
return dyn.InvalidValue, fmt.Errorf("unhandled type: %s", ref.Kind())
335+
return dyn.InvalidValue, fmt.Errorf("cannot convert float field to dynamic type %#v: src=%#v ref=%#v", ref.Kind().String(), src, ref.AsAny())
336336
}
337337

338338
func getForceSendFields(v reflect.Value) []string {

0 commit comments

Comments
 (0)