Update GormFieldValuer

This commit is contained in:
Jinzhu 2022-01-20 21:30:59 +08:00
parent 0ca42129fa
commit 061aea8d7e

View File

@ -409,8 +409,8 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
return field return field
} }
type GORMValuer interface { type GormFieldValuer interface {
GormValue(context.Context, *Field) (interface{}, error) GormFieldValue(context.Context, *Field) (interface{}, bool)
} }
// create valuer, setter when parse struct // create valuer, setter when parse struct
@ -420,12 +420,20 @@ func (field *Field) setupValuerAndSetter() {
case len(field.StructField.Index) == 1: case len(field.StructField.Index) == 1:
field.ValueOf = func(ctx context.Context, value reflect.Value) (interface{}, bool) { field.ValueOf = func(ctx context.Context, value reflect.Value) (interface{}, bool) {
fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]) fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0])
return fieldValue.Interface(), fieldValue.IsZero() fv, zero := fieldValue.Interface(), fieldValue.IsZero()
if vr, ok := fv.(GormFieldValuer); ok {
fv, zero = vr.GormFieldValue(ctx, field)
}
return fv, zero
} }
case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0: case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0:
field.ValueOf = func(ctx context.Context, value reflect.Value) (interface{}, bool) { field.ValueOf = func(ctx context.Context, value reflect.Value) (interface{}, bool) {
fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1]) fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1])
return fieldValue.Interface(), fieldValue.IsZero() fv, zero := fieldValue.Interface(), fieldValue.IsZero()
if vr, ok := fv.(GormFieldValuer); ok {
fv, zero = vr.GormFieldValue(ctx, field)
}
return fv, zero
} }
default: default:
field.ValueOf = func(ctx context.Context, value reflect.Value) (interface{}, bool) { field.ValueOf = func(ctx context.Context, value reflect.Value) (interface{}, bool) {
@ -448,7 +456,11 @@ func (field *Field) setupValuerAndSetter() {
} }
} }
} }
return v.Interface(), v.IsZero() fv, zero := v.Interface(), v.IsZero()
if vr, ok := fv.(GormFieldValuer); ok {
fv, zero = vr.GormFieldValue(ctx, field)
}
return fv, zero
} }
} }