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 }