github.com/timoth-y/kicksware-api/order-service@v0.0.0-20201002192818-87b546a7ae5a/api/rest/params.go (about)

     1  package rest
     2  
     3  import (
     4  	"net/http"
     5  	"reflect"
     6  	"strconv"
     7  	"strings"
     8  	"unsafe"
     9  
    10  	"github.com/fatih/structs"
    11  
    12  	"github.com/timoth-y/kicksware-api/service-common/core/meta"
    13  )
    14  
    15  func NewRequestParams(r *http.Request) *meta.RequestParams {
    16  	p := &meta.RequestParams{}
    17  	query := r.URL.Query()
    18  	properties := structs.Names(p)
    19  	for _, prop := range properties {
    20  		value := query.Get(strings.ToLower(prop))
    21  		if value == "" {
    22  			continue
    23  		}
    24  		field := reflect.ValueOf(p).Elem().FieldByName(prop)
    25  		switch field.Kind().String() {
    26  		case "string":
    27  			setPrivateField(field, value)
    28  		case "int", "float":
    29  			if num, err := strconv.ParseInt(value, 10, 32); err == nil {
    30  				setPrivateField(field, int(num))
    31  			}
    32  		case "bool":
    33  			if sign, err := strconv.ParseBool(value); err == nil {
    34  				setPrivateField(field, sign)
    35  			}
    36  		default:
    37  			setPrivateField(field, value)
    38  		}
    39  	}
    40  	if r.URL.User != nil {
    41  		p.SetUserID(r.URL.User.Username())
    42  	}
    43  
    44  	return p
    45  }
    46  
    47  
    48  func setPrivateField(field reflect.Value, value interface{}) {
    49  	reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).
    50  		Elem().
    51  		Set(reflect.ValueOf(value))
    52  }