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 }
// MultipleOf validates if the provided number is a multiple of the factor func MultipleOf(path, in string, data, factor float64) *errors.Validation { if !swag.IsFloat64AJSONInteger(data / factor) { return errors.NotMultipleOf(path, in, factor) } return nil }