extends unlimit levels support

This commit is contained in:
Lunny Xiao 2015-11-25 17:54:33 +08:00
parent 286763cd3a
commit acb6f00daf
1 changed files with 17 additions and 37 deletions

View File

@ -1,7 +1,6 @@
package core
import (
"errors"
"fmt"
"reflect"
"strings"
@ -122,50 +121,31 @@ func (col *Column) ValueOfV(dataStruct *reflect.Value) (*reflect.Value, error) {
}
if dataStruct.Type().Kind() == reflect.Map {
var keyValue reflect.Value
if len(col.fieldPath) == 1 {
keyValue = reflect.ValueOf(col.FieldName)
} else if len(col.fieldPath) == 2 {
keyValue = reflect.ValueOf(col.fieldPath[1])
} else {
return nil, fmt.Errorf("Unsupported mutliderive %v", col.FieldName)
}
keyValue := reflect.ValueOf(col.fieldPath[len(col.fieldPath)-1])
fieldValue = dataStruct.MapIndex(keyValue)
return &fieldValue, nil
}
if len(col.fieldPath) == 1 {
fieldValue = dataStruct.FieldByName(col.FieldName)
} else if len(col.fieldPath) == 2 {
parentField := dataStruct.FieldByName(col.fieldPath[0])
if parentField.IsValid() {
if parentField.Kind() == reflect.Struct {
fieldValue = parentField.FieldByName(col.fieldPath[1])
} else if parentField.Kind() == reflect.Ptr {
if parentField.IsNil() {
parentField.Set(reflect.New(parentField.Type().Elem()))
fieldValue = parentField.Elem().FieldByName(col.fieldPath[1])
} else {
parentField = parentField.Elem()
if parentField.IsValid() {
fieldValue = parentField.FieldByName(col.fieldPath[1])
level := len(col.fieldPath)
fieldValue = dataStruct.FieldByName(col.fieldPath[0])
for i := 0; i < level-1; i++ {
if !fieldValue.IsValid() {
break
}
if fieldValue.Kind() == reflect.Struct {
fieldValue = fieldValue.FieldByName(col.fieldPath[i+1])
} else if fieldValue.Kind() == reflect.Ptr {
if fieldValue.IsNil() {
fieldValue.Set(reflect.New(fieldValue.Type().Elem()))
}
fieldValue = fieldValue.Elem().FieldByName(col.fieldPath[i+1])
} else {
return nil, fmt.Errorf("field %v is not valid", col.FieldName)
}
}
}
} else {
// so we can use a different struct as conditions
fieldValue = dataStruct.FieldByName(col.fieldPath[1])
}
} else {
return nil, fmt.Errorf("Unsupported mutliderive %v", col.FieldName)
}
if !fieldValue.IsValid() {
return nil, errors.New("no find field matched")
return nil, fmt.Errorf("field %v is not valid", col.FieldName)
}
return &fieldValue, nil