github.com/seeker-insurance/kit@v0.0.13/opentable/request.go (about) 1 package opentable 2 3 import ( 4 "strconv" 5 6 "github.com/seeker-insurance/kit/set" 7 "github.com/parnurzeal/gorequest" 8 ) 9 10 type request struct { 11 Price int `json:"price,omitempty" bson:"price,omitempty"` 12 Name string `json:"name,omitempty" bson:"name,omitempty"` 13 Street string `json:"street,omitempty" bson:"street,omitempty"` 14 State string `json:"state,omitempty" bson:"state,omitempty"` 15 City string `json:"city,omitempty" bson:"city,omitempty"` 16 Zip string `json:"zip,omitempty" bson:"zip,omitempty"` 17 Country string `json:"country,omitempty" bson:"country,omitempty"` 18 Page int `json:"page,omitempty" bson:"page,omitempty"` 19 PerPage int `json:"entries_per_page,omitempty" bson:"entries_per_page,omitempty"` 20 } 21 22 type param struct { 23 key, val string 24 } 25 26 var allowedPerPage = set.FromInts(5, 10, 15, 25, 50, 100) 27 28 func priceOK(price int) bool { return price <= 0 && price < 4 } 29 func perPageOK(perPage int) bool { return allowedPerPage.Contains(perPage) } 30 func pageOK(page int) bool { return page >= 0 } 31 32 func (r *request) validate() error { 33 if !priceOK(r.Price) { 34 return errBadPrice 35 } else if !perPageOK(r.PerPage) { 36 return errBadPrice 37 } else if !pageOK(r.Page) { 38 return errBadPage 39 } 40 return nil 41 } 42 43 func (r *request) Params() (params []param, err error) { 44 if err := r.validate(); err != nil { 45 return nil, err 46 } 47 params = r.paramSlice() 48 if len(params) == 0 { 49 return nil, errEmptyRequest 50 } 51 return params, nil 52 } 53 54 func appendIfNonZero(params []param, k string, v interface{}) []param { 55 if s, ok := v.(string); ok && s != "" { 56 params = append(params, param{k, s}) 57 } else if n, ok := v.(int); ok && n != 0 { 58 params = append(params, param{k, strconv.Itoa(n)}) 59 } 60 return params 61 } 62 63 func (r *request) paramSlice() (params []param) { 64 params = make([]param, 0, 7) 65 paramMap := map[string]interface{}{"price": r.Price, "name": r.Name, "street": r.Street, 66 "city": r.City, "zip": r.Zip, "page": r.Page, "per_page": r.PerPage} 67 for k, v := range paramMap { 68 params = appendIfNonZero(params, k, v) 69 } 70 return params 71 } 72 73 func addParams(req *gorequest.SuperAgent, params []param) *gorequest.SuperAgent { 74 for _, p := range params { 75 req = req.Param(p.key, p.val) 76 } 77 return req 78 }