mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-06 02:34:03 +00:00
handle structs
This commit is contained in:
parent
6c32e071f4
commit
f9bca7bc7d
@ -54,6 +54,10 @@ func isPointerKind(kind reflect.Kind) bool {
|
|||||||
return kind == reflect.Ptr
|
return kind == reflect.Ptr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isStructKind(kind reflect.Kind) bool {
|
||||||
|
return kind == reflect.Struct
|
||||||
|
}
|
||||||
|
|
||||||
func isValueKind(kind reflect.Kind) bool {
|
func isValueKind(kind reflect.Kind) bool {
|
||||||
switch kind {
|
switch kind {
|
||||||
case reflect.String, reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16,
|
case reflect.String, reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16,
|
||||||
@ -105,9 +109,17 @@ func Convert(obj runtime.Object) (url.Values, error) {
|
|||||||
return nil, fmt.Errorf("expecting a pointer or interface")
|
return nil, fmt.Errorf("expecting a pointer or interface")
|
||||||
}
|
}
|
||||||
st := sv.Type()
|
st := sv.Type()
|
||||||
if st.Kind() != reflect.Struct {
|
if !isStructKind(st.Kind()) {
|
||||||
return nil, fmt.Errorf("expecting a pointer to a struct")
|
return nil, fmt.Errorf("expecting a pointer to a struct")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check all object fields
|
||||||
|
convertStruct(result, st, sv)
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertStruct(result url.Values, st reflect.Type, sv reflect.Value) {
|
||||||
for i := 0; i < st.NumField(); i++ {
|
for i := 0; i < st.NumField(); i++ {
|
||||||
field := sv.Field(i)
|
field := sv.Field(i)
|
||||||
tag, omitempty := jsonTag(st.Field(i))
|
tag, omitempty := jsonTag(st.Field(i))
|
||||||
@ -123,6 +135,7 @@ func Convert(obj runtime.Object) (url.Values, error) {
|
|||||||
field = reflect.Indirect(field)
|
field = reflect.Indirect(field)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case isValueKind(kind):
|
case isValueKind(kind):
|
||||||
addParam(result, tag, omitempty, field)
|
addParam(result, tag, omitempty, field)
|
||||||
@ -130,7 +143,8 @@ func Convert(obj runtime.Object) (url.Values, error) {
|
|||||||
if isValueKind(ft.Elem().Kind()) {
|
if isValueKind(ft.Elem().Kind()) {
|
||||||
addListOfParams(result, tag, omitempty, field)
|
addListOfParams(result, tag, omitempty, field)
|
||||||
}
|
}
|
||||||
|
case isStructKind(kind) && !(zeroValue(field) && omitempty):
|
||||||
|
convertStruct(result, ft, field)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result, nil
|
|
||||||
}
|
}
|
||||||
|
@ -111,12 +111,12 @@ func TestConvert(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: &foo{
|
input: &foo{
|
||||||
Str: "ignore embedded struct",
|
Str: "don't ignore embedded struct",
|
||||||
Foobar: bar{
|
Foobar: bar{
|
||||||
Float1: 5.0,
|
Float1: 5.0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: url.Values{"str": {"ignore embedded struct"}},
|
expected: url.Values{"str": {"don't ignore embedded struct"}, "float1": {"5"}, "float2": {"0"}},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Ignore untagged fields
|
// Ignore untagged fields
|
||||||
@ -149,7 +149,7 @@ func TestConvert(t *testing.T) {
|
|||||||
input: &baz{
|
input: &baz{
|
||||||
Bptr: boolp(true),
|
Bptr: boolp(true),
|
||||||
},
|
},
|
||||||
expected: url.Values{"ptr": {"<nil>"}, "bptr": {"true"}},
|
expected: url.Values{"ptr": {""}, "bptr": {"true"}},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: &baz{
|
input: &baz{
|
||||||
|
Loading…
Reference in New Issue
Block a user