diff options
author | Matej Vasek <mvasek@redhat.com> | 2021-02-10 15:38:34 +0100 |
---|---|---|
committer | Matej Vasek <mvasek@redhat.com> | 2021-02-14 15:44:22 +0100 |
commit | 6ffd05d0bd688f71b424ab2f62e7cc4df0e8e751 (patch) | |
tree | a4640b2b8799533fb31fbb78219941e1dd86efdb /pkg/bindings/util | |
parent | 1d15ed708f2d7c6dab5ee90415acb156973ac1a4 (diff) | |
download | podman-6ffd05d0bd688f71b424ab2f62e7cc4df0e8e751.tar.gz podman-6ffd05d0bd688f71b424ab2f62e7cc4df0e8e751.tar.bz2 podman-6ffd05d0bd688f71b424ab2f62e7cc4df0e8e751.zip |
[NO TESTS NEEDED] Refactor generated code
Extracted common functionality to util function.
Signed-off-by: Matej Vasek <mvasek@redhat.com>
Diffstat (limited to 'pkg/bindings/util')
-rw-r--r-- | pkg/bindings/util/util.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/pkg/bindings/util/util.go b/pkg/bindings/util/util.go index 403846355..6296fc22f 100644 --- a/pkg/bindings/util/util.go +++ b/pkg/bindings/util/util.go @@ -1,8 +1,13 @@ package util import ( + "errors" + "net/url" "reflect" "strconv" + "strings" + + jsoniter "github.com/json-iterator/go" ) func IsSimpleType(f reflect.Value) bool { @@ -28,3 +33,59 @@ func SimpleTypeToParam(f reflect.Value) string { } panic("the input parameter is not a simple type") } + +func Changed(o interface{}, fieldName string) bool { + r := reflect.ValueOf(o) + value := reflect.Indirect(r).FieldByName(fieldName) + return !value.IsNil() +} + +func ToParams(o interface{}) (url.Values, error) { + params := url.Values{} + if o == nil || reflect.ValueOf(o).IsNil() { + return params, nil + } + json := jsoniter.ConfigCompatibleWithStandardLibrary + s := reflect.ValueOf(o) + if reflect.Ptr == s.Kind() { + s = s.Elem() + } + sType := s.Type() + for i := 0; i < s.NumField(); i++ { + fieldName := sType.Field(i).Name + if !Changed(o, fieldName) { + continue + } + fieldName = strings.ToLower(fieldName) + f := s.Field(i) + if reflect.Ptr == f.Kind() { + f = f.Elem() + } + switch { + case IsSimpleType(f): + params.Set(fieldName, SimpleTypeToParam(f)) + case f.Kind() == reflect.Slice: + for i := 0; i < f.Len(); i++ { + elem := f.Index(i) + if IsSimpleType(elem) { + params.Add(fieldName, SimpleTypeToParam(elem)) + } else { + return nil, errors.New("slices must contain only simple types") + } + } + case f.Kind() == reflect.Map: + lowerCaseKeys := make(map[string][]string) + iter := f.MapRange() + for iter.Next() { + lowerCaseKeys[iter.Key().Interface().(string)] = iter.Value().Interface().([]string) + } + s, err := json.MarshalToString(lowerCaseKeys) + if err != nil { + return nil, err + } + + params.Set(fieldName, s) + } + } + return params, nil +} |