From 0b039497c4bef21cc740a6851338e7101af5a4e1 Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Tue, 15 Feb 2022 20:31:28 +0800 Subject: [PATCH] Add Serializer Value method --- schema/field.go | 23 +++++++++++++++++++++++ schema/interfaces.go | 10 +++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/schema/field.go b/schema/field.go index 683e8492..2865e5c9 100644 --- a/schema/field.go +++ b/schema/field.go @@ -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) diff --git a/schema/interfaces.go b/schema/interfaces.go index 0a233f09..f83ba9c1 100644 --- a/schema/interfaces.go +++ b/schema/interfaces.go @@ -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