From d3b49c3d235b670ba7fb2d5558dfa48033f7b9d8 Mon Sep 17 00:00:00 2001 From: iseki Date: Tue, 22 Jul 2025 17:01:56 +0800 Subject: [PATCH] feat: make a more detailed error message during field value setting failed --- schema/field.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/schema/field.go b/schema/field.go index 72e4b42b..88ae1c44 100644 --- a/schema/field.go +++ b/schema/field.go @@ -944,6 +944,22 @@ func (field *Field) setupValuerAndSetter() { } } } + var oldSetter = field.Set + field.Set = func(ctx context.Context, value reflect.Value, v interface{}) (err error) { + err = oldSetter(ctx, value, v) + if err == nil { + return + } + var errMessage = err.Error() + // It's ugly and unrobust, but it's required since the fallbackSetter create error by fmt.Errorf directly and here are some nested setter calls. + // Without string manipulation, there's no way to avoid a duplicated error message. + // Also, adding many fmt.Errorf calls in all setter implementations is not a good idea, apparently. + if strings.Contains(errMessage, "to field "+field.Name) { + return + } + err = fmt.Errorf("failed to set value to field %s: %w", field.Name, err) + return + } if field.Serializer != nil { var (