Merge pull request #46057 from mengqiy/improvePatchTypeError

Automatic merge from submit-queue

improve type assertion error

Per discussion https://github.com/kubernetes/kubernetes/pull/45980#issuecomment-302524829.

```release-note
NONE
```
This commit is contained in:
Kubernetes Submit Queue 2017-05-22 11:51:10 -07:00 committed by GitHub
commit 4d6ef25f64
3 changed files with 29 additions and 16 deletions

View File

@ -19,6 +19,7 @@ package mergepatch
import (
"errors"
"fmt"
"reflect"
)
var (
@ -31,8 +32,25 @@ func ErrNoMergeKey(m map[string]interface{}, k string) error {
return fmt.Errorf("map: %v does not contain declared merge key: %s", m, k)
}
func ErrBadArgType(expected, actual string) error {
return fmt.Errorf("expected a %s, but received a %s", expected, actual)
func ErrBadArgType(expected, actual interface{}) error {
return fmt.Errorf("expected a %s, but received a %s",
reflect.TypeOf(expected),
reflect.TypeOf(actual))
}
func ErrBadArgKind(expected, actual interface{}) error {
var expectedKindString, actualKindString string
if expected == nil {
expectedKindString = "nil"
} else {
expectedKindString = reflect.TypeOf(expected).Kind().String()
}
if actual == nil {
actualKindString = "nil"
} else {
actualKindString = reflect.TypeOf(actual).Kind().String()
}
return fmt.Errorf("expected a %s, but received a %s", expectedKindString, actualKindString)
}
func ErrBadPatchType(t interface{}, m map[string]interface{}) error {

View File

@ -505,8 +505,7 @@ func diffListsOfMaps(original, modified []interface{}, t reflect.Type, mergeKey
func getMapAndMergeKeyValueByIndex(index int, mergeKey string, listOfMaps []interface{}) (map[string]interface{}, interface{}, error) {
m, ok := listOfMaps[index].(map[string]interface{})
if !ok {
t := reflect.TypeOf(listOfMaps[index])
return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.Kind().String())
return nil, nil, mergepatch.ErrBadArgType(m, listOfMaps[index])
}
val, ok := m[mergeKey]
@ -568,7 +567,7 @@ func StrategicMergeMapPatch(original, patch JSONMap, dataStruct interface{}) (JS
func getTagStructType(dataStruct interface{}) (reflect.Type, error) {
if dataStruct == nil {
return nil, mergepatch.ErrBadArgType("struct", "nil")
return nil, mergepatch.ErrBadArgKind(struct{}{}, nil)
}
t := reflect.TypeOf(dataStruct)
@ -577,7 +576,7 @@ func getTagStructType(dataStruct interface{}) (reflect.Type, error) {
}
if t.Kind() != reflect.Struct {
return nil, mergepatch.ErrBadArgType("struct", t.Kind().String())
return nil, mergepatch.ErrBadArgKind(struct{}{}, dataStruct)
}
return t, nil
@ -1419,13 +1418,11 @@ func CreateDeleteDirective(mergeKey string, mergeKeyValue interface{}) map[strin
func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[string]interface{}, error) {
typedOriginal, ok := original.(map[string]interface{})
if !ok {
t := reflect.TypeOf(original)
return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.String())
return nil, nil, mergepatch.ErrBadArgType(typedOriginal, original)
}
typedPatch, ok := patch.(map[string]interface{})
if !ok {
t := reflect.TypeOf(patch)
return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.String())
return nil, nil, mergepatch.ErrBadArgType(typedPatch, patch)
}
return typedOriginal, typedPatch, nil
}
@ -1433,13 +1430,11 @@ func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[
func sliceTypeAssertion(original, patch interface{}) ([]interface{}, []interface{}, error) {
typedOriginal, ok := original.([]interface{})
if !ok {
t := reflect.TypeOf(original)
return nil, nil, mergepatch.ErrBadArgType("[]interface{}", t.String())
return nil, nil, mergepatch.ErrBadArgType(typedOriginal, original)
}
typedPatch, ok := patch.([]interface{})
if !ok {
t := reflect.TypeOf(patch)
return nil, nil, mergepatch.ErrBadArgType("[]interface{}", t.String())
return nil, nil, mergepatch.ErrBadArgType(typedPatch, patch)
}
return typedOriginal, typedPatch, nil
}

View File

@ -1998,9 +1998,9 @@ func TestStrategicMergePatch(t *testing.T) {
testStrategicMergePatchWithCustomArguments(t, "bad patch",
"{}", "<THIS IS NOT JSON>", mergeItem, mergepatch.ErrBadJSONDoc)
testStrategicMergePatchWithCustomArguments(t, "bad struct",
"{}", "{}", []byte("<THIS IS NOT A STRUCT>"), mergepatch.ErrBadArgType("struct", "slice"))
"{}", "{}", []byte("<THIS IS NOT A STRUCT>"), mergepatch.ErrBadArgKind(struct{}{}, []byte{}))
testStrategicMergePatchWithCustomArguments(t, "nil struct",
"{}", "{}", nil, mergepatch.ErrBadArgType("struct", "nil"))
"{}", "{}", nil, mergepatch.ErrBadArgKind(struct{}{}, nil))
tc := StrategicMergePatchTestCases{}
err := yaml.Unmarshal(createStrategicMergePatchTestCaseData, &tc)