Add Serializer Value method

This commit is contained in:
Jinzhu 2022-02-15 20:31:28 +08:00
parent bf85076f0e
commit 0b039497c4
2 changed files with 28 additions and 5 deletions

View File

@ -478,6 +478,29 @@ func (field *Field) setupValuerAndSetter() {
return fv, zero
}
if field.Serializer != nil {
oldValuerOf := field.ValueOf
field.ValueOf = func(ctx context.Context, v reflect.Value) (interface{}, bool) {
value, zero := oldValuerOf(ctx, v)
if zero {
return value, zero
}
serializer, ok := value.(SerializerInterface)
if !ok {
serializer = field.Serializer
}
return Serializer{
Field: field,
Interface: serializer,
Destination: v,
Context: ctx,
fieldValue: value,
}, false
}
}
// ReflectValueOf returns field's reflect value
field.ReflectValueOf = func(ctx context.Context, v reflect.Value) reflect.Value {
v = reflect.Indirect(v)

View File

@ -29,6 +29,7 @@ type Serializer struct {
Destination reflect.Value
Context context.Context
value interface{}
fieldValue interface{}
}
// Scan implements sql.Scanner interface
@ -39,13 +40,13 @@ func (s *Serializer) Scan(value interface{}) error {
// Value implements driver.Valuer interface
func (s Serializer) Value() (driver.Value, error) {
return s.Interface.Value(s.Context, s.Field, s.Destination)
return s.Interface.Value(s.Context, s.Field, s.Destination, s.fieldValue)
}
// SerializerInterface serializer interface
type SerializerInterface interface {
Scan(ctx context.Context, field *Field, dst reflect.Value, dbValue interface{}) error
Value(ctx context.Context, field *Field, dst reflect.Value) (interface{}, error)
Value(ctx context.Context, field *Field, dst reflect.Value, fieldValue interface{}) (interface{}, error)
}
// JSONSerializer json serializer
@ -75,9 +76,8 @@ func (JSONSerializer) Scan(ctx context.Context, field *Field, dst reflect.Value,
}
// Value implements serializer interface
func (JSONSerializer) Value(ctx context.Context, field *Field, dst reflect.Value) (interface{}, error) {
fv, _ := field.ValueOf(ctx, dst)
return fv, nil
func (JSONSerializer) Value(ctx context.Context, field *Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) {
return fieldValue, nil
}
// CreateClausesInterface create clauses interface