diff --git a/column.go b/column.go index 52468aa2..98d22c22 100644 --- a/column.go +++ b/column.go @@ -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]) - } 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]) + 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 { - 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