github.com/angryronald/go-kit@v0.0.0-20240505173814-ff2bd9c79dbf/generic/http/client/client.utils.go (about)

     1  package client
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"reflect"
     7  )
     8  
     9  // ParseQueryParams .
    10  func ParseQueryParams(path string, params interface{}) string {
    11  	baseURL, _ := url.Parse(path)
    12  	filterParams := baseURL.Query()
    13  	rval := reflect.Indirect(reflect.ValueOf(params))
    14  	rtype := rval.Type()
    15  
    16  	for i := 0; i < rval.NumField(); i++ {
    17  		tag := rtype.Field(i).Tag.Get("json")
    18  		switch rval.Field(i).Kind() {
    19  		case reflect.Slice:
    20  			val := rval.Field(i)
    21  			if !val.IsNil() {
    22  				for i := 0; i < val.Len(); i++ {
    23  					filterParams.Add(tag, fmt.Sprintf("%v", val.Index(i)))
    24  				}
    25  			}
    26  			break
    27  
    28  		case reflect.String:
    29  			val := rval.Field(i).String()
    30  			if val != "" {
    31  				filterParams.Add(tag, fmt.Sprintf("%v", val))
    32  			}
    33  			break
    34  
    35  		case reflect.Ptr:
    36  			if rval.Field(i).Elem().IsValid() {
    37  				val := rval.Field(i)
    38  				filterParams.Add(tag, fmt.Sprintf("%v", val))
    39  			}
    40  			break
    41  
    42  		default:
    43  			val := rval.Field(i)
    44  			filterParams.Add(tag, fmt.Sprintf("%v", val))
    45  			break
    46  		}
    47  	}
    48  
    49  	baseURL.RawQuery = filterParams.Encode()
    50  
    51  	return baseURL.String()
    52  }