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 package core
import ( import (
"errors"
"fmt" "fmt"
"reflect" "reflect"
"strings" "strings"
@ -122,50 +121,31 @@ func (col *Column) ValueOfV(dataStruct *reflect.Value) (*reflect.Value, error) {
} }
if dataStruct.Type().Kind() == reflect.Map { if dataStruct.Type().Kind() == reflect.Map {
var keyValue reflect.Value keyValue := reflect.ValueOf(col.fieldPath[len(col.fieldPath)-1])
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)
}
fieldValue = dataStruct.MapIndex(keyValue) fieldValue = dataStruct.MapIndex(keyValue)
return &fieldValue, nil return &fieldValue, nil
} }
if len(col.fieldPath) == 1 { level := len(col.fieldPath)
fieldValue = dataStruct.FieldByName(col.FieldName) fieldValue = dataStruct.FieldByName(col.fieldPath[0])
} else if len(col.fieldPath) == 2 { for i := 0; i < level-1; i++ {
parentField := dataStruct.FieldByName(col.fieldPath[0]) if !fieldValue.IsValid() {
if parentField.IsValid() { break
if parentField.Kind() == reflect.Struct { }
fieldValue = parentField.FieldByName(col.fieldPath[1]) if fieldValue.Kind() == reflect.Struct {
} else if parentField.Kind() == reflect.Ptr { fieldValue = fieldValue.FieldByName(col.fieldPath[i+1])
if parentField.IsNil() { } else if fieldValue.Kind() == reflect.Ptr {
parentField.Set(reflect.New(parentField.Type().Elem())) if fieldValue.IsNil() {
fieldValue = parentField.Elem().FieldByName(col.fieldPath[1]) fieldValue.Set(reflect.New(fieldValue.Type().Elem()))
} else { }
parentField = parentField.Elem() fieldValue = fieldValue.Elem().FieldByName(col.fieldPath[i+1])
if parentField.IsValid() { } else {
fieldValue = parentField.FieldByName(col.fieldPath[1]) return nil, fmt.Errorf("field %v is not valid", col.FieldName)
} 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() { 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 return &fieldValue, nil