func (t *typeValidator) Validate(data interface{}) *Result { result := new(Result) result.Inc() if data == nil || reflect.DeepEqual(reflect.Zero(reflect.TypeOf(data)), reflect.ValueOf(data)) { if len(t.Type) > 0 && !t.Type.Contains("null") { // TODO: if a property is not required it also passes this return sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), "null")) } return result } // check if the type matches, should be used in every validator chain as first item val := reflect.Indirect(reflect.ValueOf(data)) schType, format := t.schemaInfoForType(data) isLowerInt := t.Format == "int64" && format == "int32" isLowerFloat := t.Format == "float64" && format == "float32" if val.Kind() != reflect.String && t.Format != "" && !(format == t.Format || isLowerInt || isLowerFloat) { return sErr(errors.InvalidType(t.Path, t.In, t.Format, format)) } if t.Format != "" && val.Kind() == reflect.String { return result } isFloatInt := schType == "number" && swag.IsFloat64AJSONInteger(val.Float()) && t.Type.Contains("integer") isIntFloat := schType == "integer" && t.Type.Contains("number") if !(t.Type.Contains(schType) || isFloatInt || isIntFloat) { return sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), schType)) } return result }
func invalidTypeError(param *spec.Parameter, data interface{}) *errors.Validation { tpe := param.Type if param.Format != "" { tpe = param.Format } return errors.InvalidType(param.Name, param.In, tpe, data) }
func (o *DeletePetParams) bindPetID(raw string, formats strfmt.Registry) error { value, err := swag.ConvertInt64(raw) if err != nil { return errors.InvalidType("petId", "path", "int64", raw) } o.PetID = value return nil }
func (o *GetEventByIDParams) bindID(raw string, formats strfmt.Registry) error { value, err := swag.ConvertInt64(raw) if err != nil { return errors.InvalidType("id", "path", "int64", raw) } o.ID = value return nil }
// FormatOf validates if a string matches a format in the format registry func FormatOf(path, in, format, data string, registry strfmt.Registry) *errors.Validation { if registry == nil { registry = strfmt.Default } if ok := registry.ContainsName(format); !ok { return errors.InvalidTypeName(format) } if ok := registry.Validates(format, data); !ok { return errors.InvalidType(path, in, format, data) } return nil }
func (o *UpdateOneParams) bindID(rawData []string, hasKey bool, formats strfmt.Registry) error { var raw string if len(rawData) > 0 { raw = rawData[len(rawData)-1] } value, err := swag.ConvertInt64(raw) if err != nil { return errors.InvalidType("id", "path", "int64", raw) } o.ID = value return nil }
func (o *ListTasksOK) readResponse(response client.Response, consumer httpkit.Consumer, formats strfmt.Registry) error { // response header X-Last-Task-Id xLastTaskId, err := swag.ConvertInt64(response.GetHeader("X-Last-Task-Id")) if err != nil { return errors.InvalidType("X-Last-Task-Id", "header", "int64", response.GetHeader("X-Last-Task-Id")) } o.XLastTaskID = xLastTaskId // response payload if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { return err } return nil }
func (o *GetTaskCommentsParams) bindSince(rawData []string, hasKey bool, formats strfmt.Registry) error { var raw string if len(rawData) > 0 { raw = rawData[len(rawData)-1] } if raw == "" { // empty values pass all other validations return nil } value, err := formats.Parse("date-time", raw) if err != nil { return errors.InvalidType("since", "query", "strfmt.DateTime", raw) } o.Since = *(value.(*strfmt.DateTime)) return nil }
func (o *ListEventsParams) bindLimit(rawData []string, hasKey bool, formats strfmt.Registry) error { var raw string if len(rawData) > 0 { raw = rawData[len(rawData)-1] } if raw == "" { // empty values pass all other validations return nil } value, err := swag.ConvertInt32(raw) if err != nil { return errors.InvalidType("limit", "query", "int32", raw) } o.Limit = &value return nil }
func (o *ListTasksParams) bindSinceID(rawData []string, hasKey bool, formats strfmt.Registry) error { var raw string if len(rawData) > 0 { raw = rawData[len(rawData)-1] } if raw == "" { // empty values pass all other validations return nil } value, err := swag.ConvertInt64(raw) if err != nil { return errors.InvalidType("sinceId", "query", "int64", raw) } o.SinceID = value return nil }
func (o *FindParams) bindLimit(rawData []string, hasKey bool, formats strfmt.Registry) error { if !hasKey { return errors.Required("limit", "formData") } var raw string if len(rawData) > 0 { raw = rawData[len(rawData)-1] } value, err := swag.ConvertInt32(raw) if err != nil { return errors.InvalidType("limit", "formData", "int32", raw) } o.Limit = value return nil }
func (o *ListTasksParams) bindPageSize(rawData []string, hasKey bool, formats strfmt.Registry) error { var raw string if len(rawData) > 0 { raw = rawData[len(rawData)-1] } if raw == "" { // empty values pass all other validations o.PageSize = 20 return nil } value, err := swag.ConvertInt32(raw) if err != nil { return errors.InvalidType("pageSize", "query", "int32", raw) } o.PageSize = value return nil }
func (o *GetOrderByIDParams) bindOrderID(rawData []string, hasKey bool, formats strfmt.Registry) error { var raw string if len(rawData) > 0 { raw = rawData[len(rawData)-1] } value, err := swag.ConvertInt64(raw) if err != nil { return errors.InvalidType("orderId", "path", "int64", raw) } o.OrderID = value if err := o.validateOrderID(formats); err != nil { return err } return nil }
func (o *FindParams) bindXRateLimit(rawData []string, hasKey bool, formats strfmt.Registry) error { if !hasKey { return errors.Required("X-Rate-Limit", "header") } var raw string if len(rawData) > 0 { raw = rawData[len(rawData)-1] } if err := validate.RequiredString("X-Rate-Limit", "header", raw); err != nil { return err } value, err := swag.ConvertInt32(raw) if err != nil { return errors.InvalidType("X-Rate-Limit", "header", "int32", raw) } o.XRateLimit = value return nil }
func (o *FindParams) bindTags(rawData []string, hasKey bool, formats strfmt.Registry) error { if !hasKey { return errors.Required("tags", "formData") } raw := rawData size := len(raw) if size == 0 { return nil } ic := raw isz := size var ir []int32 iValidateElement := func(i int, tagsI int32) *errors.Validation { return nil } for i := 0; i < isz; i++ { value, err := swag.ConvertInt32(ic[i]) if err != nil { return errors.InvalidType(fmt.Sprintf("%s.%v", "tags", i), "formData", "int32", ic[i]) } if err := iValidateElement(i, o.Tags[i]); err != nil { return err } ir = append(ir, value) } o.Tags = ir return nil }
func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue interface{}, data string) error { tpe := p.parameter.Type if p.parameter.Format != "" { tpe = p.parameter.Format } if data == "" && p.parameter.Required && p.parameter.Default == nil { return errors.Required(p.Name, p.parameter.In) } ok, err := p.tryUnmarshaler(target, defaultValue, data) if err != nil { return errors.InvalidType(p.Name, p.parameter.In, tpe, data) } if ok { return nil } defVal := reflect.Zero(target.Type()) if defaultValue != nil { defVal = reflect.ValueOf(defaultValue) } if tpe == "byte" { if data == "" { target.SetBytes(defVal.Bytes()) return nil } b, err := base64.StdEncoding.DecodeString(data) if err != nil { b, err = base64.URLEncoding.DecodeString(data) if err != nil { return errors.InvalidType(p.Name, p.parameter.In, tpe, data) } } target.SetBytes(b) return nil } switch target.Kind() { case reflect.Bool: if data == "" { target.SetBool(defVal.Bool()) return nil } b, err := swag.ConvertBool(data) if err != nil { return err } target.SetBool(b) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if data == "" { target.SetInt(defVal.Int()) return nil } i, err := strconv.ParseInt(data, 10, 64) if err != nil { return errors.InvalidType(p.Name, p.parameter.In, tpe, data) } if target.OverflowInt(i) { return errors.InvalidType(p.Name, p.parameter.In, tpe, data) } target.SetInt(i) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: if data == "" { target.SetUint(defVal.Uint()) return nil } u, err := strconv.ParseUint(data, 10, 64) if err != nil { return errors.InvalidType(p.Name, p.parameter.In, tpe, data) } if target.OverflowUint(u) { return errors.InvalidType(p.Name, p.parameter.In, tpe, data) } target.SetUint(u) case reflect.Float32, reflect.Float64: if data == "" { target.SetFloat(defVal.Float()) return nil } f, err := strconv.ParseFloat(data, 64) if err != nil { return errors.InvalidType(p.Name, p.parameter.In, tpe, data) } if target.OverflowFloat(f) { return errors.InvalidType(p.Name, p.parameter.In, tpe, data) } target.SetFloat(f) case reflect.String: value := data if value == "" { value = defVal.String() } // validate string target.SetString(value) case reflect.Ptr: if data == "" && defVal.Kind() == reflect.Ptr { target.Set(defVal) return nil } newVal := reflect.New(target.Type().Elem()) if err := p.setFieldValue(reflect.Indirect(newVal), defVal, data); err != nil { return err } target.Set(newVal) default: return errors.InvalidType(p.Name, p.parameter.In, tpe, data) } return nil }
func (p *untypedParamBinder) Bind(request *http.Request, routeParams RouteParams, consumer httpkit.Consumer, target reflect.Value) error { // fmt.Println("binding", p.name, "as", p.Type()) switch p.parameter.In { case "query": data, custom, err := p.readValue(request.URL.Query(), target) if err != nil { return err } if custom { return nil } return p.bindValue(data, target) case "header": data, custom, err := p.readValue(request.Header, target) if err != nil { return err } if custom { return nil } return p.bindValue(data, target) case "path": data, custom, err := p.readValue(routeParams, target) if err != nil { return err } if custom { return nil } return p.bindValue(data, target) case "formData": var err error var mt string mt, _, e := httpkit.ContentType(request.Header) if e != nil { // because of the interface conversion go thinks the error is not nil // so we first check for nil and then set the err var if it's not nil err = e } if err != nil { return errors.InvalidContentType("", []string{"multipart/form-data", "application/x-www-form-urlencoded"}) } if mt != "multipart/form-data" && mt != "application/x-www-form-urlencoded" { return errors.InvalidContentType(mt, []string{"multipart/form-data", "application/x-www-form-urlencoded"}) } if mt == "multipart/form-data" { if err := request.ParseMultipartForm(defaultMaxMemory); err != nil { return errors.NewParseError(p.Name, p.parameter.In, "", err) } } if err := request.ParseForm(); err != nil { return errors.NewParseError(p.Name, p.parameter.In, "", err) } if p.parameter.Type == "file" { file, header, err := request.FormFile(p.parameter.Name) if err != nil { return errors.NewParseError(p.Name, p.parameter.In, "", err) } target.Set(reflect.ValueOf(httpkit.File{Data: file, Header: header})) return nil } if request.MultipartForm != nil { data, custom, err := p.readValue(url.Values(request.MultipartForm.Value), target) if err != nil { return err } if custom { return nil } return p.bindValue(data, target) } data, custom, err := p.readValue(url.Values(request.PostForm), target) if err != nil { return err } if custom { return nil } return p.bindValue(data, target) case "body": newValue := reflect.New(target.Type()) if err := consumer.Consume(request.Body, newValue.Interface()); err != nil { if err == io.EOF && p.parameter.Default != nil { target.Set(reflect.ValueOf(p.parameter.Default)) return nil } tpe := p.parameter.Type if p.parameter.Format != "" { tpe = p.parameter.Format } return errors.InvalidType(p.Name, p.parameter.In, tpe, nil) } target.Set(reflect.Indirect(newValue)) return nil default: return errors.New(500, fmt.Sprintf("invalid parameter location %q", p.parameter.In)) } }