MCPcopy
hub / github.com/go-gorm/gorm / setupValuerAndSetter

Method setupValuerAndSetter

schema/field.go:451–990  ·  schema/field.go::Field.setupValuerAndSetter

create valuer, setter when parse struct

(modelType reflect.Type)

Source from the content-addressed store, hash-verified

449
450// create valuer, setter when parse struct
451func (field *Field) setupValuerAndSetter(modelType reflect.Type) {
452 // Setup NewValuePool
453 field.setupNewValuePool()
454
455 // ValueOf returns field's value and if it is zero
456 fieldIndex := field.StructField.Index[0]
457 switch {
458 case len(field.StructField.Index) == 1 && fieldIndex >= 0:
459 field.ValueOf = func(ctx context.Context, v reflect.Value) (interface{}, bool) {
460 v = reflect.Indirect(v)
461 fieldValue := v.Field(fieldIndex)
462 return fieldValue.Interface(), fieldValue.IsZero()
463 }
464 default:
465 field.ValueOf = func(ctx context.Context, v reflect.Value) (interface{}, bool) {
466 v = reflect.Indirect(v)
467 for _, fieldIdx := range field.StructField.Index {
468 if fieldIdx >= 0 {
469 v = v.Field(fieldIdx)
470 } else {
471 v = v.Field(-fieldIdx - 1)
472
473 if !v.IsNil() {
474 v = v.Elem()
475 } else {
476 return nil, true
477 }
478 }
479 }
480
481 fv, zero := v.Interface(), v.IsZero()
482 return fv, zero
483 }
484 }
485
486 if field.Serializer != nil {
487 oldValuerOf := field.ValueOf
488 field.ValueOf = func(ctx context.Context, v reflect.Value) (interface{}, bool) {
489 value, zero := oldValuerOf(ctx, v)
490
491 s, ok := value.(SerializerValuerInterface)
492 if !ok {
493 s = field.Serializer
494 }
495
496 return &serializer{
497 Field: field,
498 SerializeValuer: s,
499 Destination: v,
500 Context: ctx,
501 fieldValue: value,
502 }, zero
503 }
504 }
505
506 // ReflectValueOf returns field's reflect value
507 switch {
508 case len(field.StructField.Index) == 1 && fieldIndex >= 0:

Callers 1

Calls 8

setupNewValuePoolMethod · 0.95
ToStringFunction · 0.92
ParseMethod · 0.80
SetMethod · 0.65
NewMethod · 0.65
TypeMethod · 0.65
ValueMethod · 0.65
ScanMethod · 0.65

Tested by

no test coverage detected