summaryrefslogtreecommitdiff
path: root/pkg/bindings/util/util.go
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2021-02-15 06:35:58 -0500
committerGitHub <noreply@github.com>2021-02-15 06:35:58 -0500
commit30607d727895036d32aede44c1b4375849566433 (patch)
treea822268f84d97c14baff2be7ffa8c3db5ac48643 /pkg/bindings/util/util.go
parentdb56e19f6adf2d4096aa29a7159fafa1017371db (diff)
parent6ffd05d0bd688f71b424ab2f62e7cc4df0e8e751 (diff)
downloadpodman-30607d727895036d32aede44c1b4375849566433.tar.gz
podman-30607d727895036d32aede44c1b4375849566433.tar.bz2
podman-30607d727895036d32aede44c1b4375849566433.zip
Merge pull request #9348 from matejvasek/refactor_gen_code
Refactor generated code
Diffstat (limited to 'pkg/bindings/util/util.go')
-rw-r--r--pkg/bindings/util/util.go61
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
+}