Skip to content

Commit

Permalink
Support decode slice scanner
Browse files Browse the repository at this point in the history
  • Loading branch information
jinzhu committed Sep 29, 2016
1 parent 3f26d04 commit e7e4066
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 28 deletions.
7 changes: 7 additions & 0 deletions resource/meta.go
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ func (meta *Meta) Initialize() error {
if metaValue == nil {
return
}

var (
value = metaValue.Value
fieldName = meta.FieldName
Expand Down Expand Up @@ -307,6 +308,12 @@ func (meta *Meta) Initialize() error {
}
default:
if scanner, ok := field.Addr().Interface().(sql.Scanner); ok {
if value == nil && len(metaValue.MetaValues.Values) > 0 {
field.Set(reflect.Zero(field.Type()))
decodeMetaValuesToField(meta.Resource, field, metaValue.MetaValues, context)
return
}

if scanner.Scan(value) != nil {
scanner.Scan(utils.ToString(value))
}
Expand Down
37 changes: 37 additions & 0 deletions resource/meta_value.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package resource

import (
"reflect"

"github.com/qor/qor"
)

// MetaValues is slice of MetaValue
type MetaValues struct {
Values []*MetaValue
Expand All @@ -25,3 +31,34 @@ type MetaValue struct {
Meta Metaor
error error
}

func decodeMetaValuesToField(res Resourcer, field reflect.Value, metaValues *MetaValues, context *qor.Context) {
if field.Kind() == reflect.Struct {
value := reflect.New(field.Type())
associationProcessor := DecodeToResource(res, value.Interface(), metaValues, context)
associationProcessor.Start()
if !associationProcessor.SkipLeft {
field.Set(value.Elem())
}
} else if field.Kind() == reflect.Slice {
var fieldType = field.Type().Elem()
var isPtr bool
if fieldType.Kind() == reflect.Ptr {
fieldType = fieldType.Elem()
isPtr = true
}

value := reflect.New(fieldType)
associationProcessor := DecodeToResource(res, value.Interface(), metaValues, context)
associationProcessor.Start()
if !associationProcessor.SkipLeft {
if !reflect.DeepEqual(reflect.Zero(fieldType).Interface(), value.Elem().Interface()) {
if isPtr {
field.Set(reflect.Append(field, value))
} else {
field.Set(reflect.Append(field, value.Elem()))
}
}
}
}
}
29 changes: 1 addition & 28 deletions resource/processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,34 +91,7 @@ func (processor *processor) decode() (errors []error) {
}

field := reflect.Indirect(reflect.ValueOf(processor.Result)).FieldByName(meta.GetFieldName())
if field.Kind() == reflect.Struct {
value := reflect.New(field.Type())
associationProcessor := DecodeToResource(res, value.Interface(), metaValue.MetaValues, processor.Context)
associationProcessor.Start()
if !associationProcessor.SkipLeft {
field.Set(value.Elem())
}
} else if field.Kind() == reflect.Slice {
var fieldType = field.Type().Elem()
var isPtr bool
if fieldType.Kind() == reflect.Ptr {
fieldType = fieldType.Elem()
isPtr = true
}

value := reflect.New(fieldType)
associationProcessor := DecodeToResource(res, value.Interface(), metaValue.MetaValues, processor.Context)
associationProcessor.Start()
if !associationProcessor.SkipLeft {
if !reflect.DeepEqual(reflect.Zero(fieldType).Interface(), value.Elem().Interface()) {
if isPtr {
field.Set(reflect.Append(field, value))
} else {
field.Set(reflect.Append(field, value.Elem()))
}
}
}
}
decodeMetaValuesToField(res, field, metaValue.MetaValues, processor.Context)
}

return
Expand Down

0 comments on commit e7e4066

Please sign in to comment.