query.go raw

   1  package parameter
   2  
   3  import (
   4  	"fmt"
   5  	"net"
   6  	"net/url"
   7  	"reflect"
   8  	"time"
   9  
  10  	"github.com/scaleway/scaleway-sdk-go/scw"
  11  )
  12  
  13  // AddToQuery add a key/value pair to an URL query
  14  func AddToQuery(query url.Values, key string, value any) {
  15  	elemValue := reflect.ValueOf(value)
  16  
  17  	if elemValue.Kind() == reflect.Invalid || elemValue.Kind() == reflect.Ptr && elemValue.IsNil() {
  18  		return
  19  	}
  20  
  21  	for elemValue.Kind() == reflect.Ptr {
  22  		elemValue = reflect.ValueOf(value).Elem()
  23  	}
  24  
  25  	elemType := elemValue.Type()
  26  	switch {
  27  	case elemType == reflect.TypeOf(net.IP{}):
  28  		query.Add(key, value.(*net.IP).String())
  29  	case elemType == reflect.TypeOf(net.IPNet{}):
  30  		query.Add(key, value.(*net.IPNet).String())
  31  	case elemType == reflect.TypeOf(scw.IPNet{}):
  32  		query.Add(key, value.(*scw.IPNet).String())
  33  	case elemType.Kind() == reflect.Slice:
  34  		for i := 0; i < elemValue.Len(); i++ {
  35  			query.Add(key, fmt.Sprint(elemValue.Index(i).Interface()))
  36  		}
  37  	case elemType == reflect.TypeOf(time.Time{}):
  38  		query.Add(key, value.(*time.Time).Format(time.RFC3339))
  39  	default:
  40  		query.Add(key, fmt.Sprint(elemValue.Interface()))
  41  	}
  42  }
  43