Update a few dependencies
github.com/go-openapi/* github.com/asaskevich/govalidator
This commit is contained in:
158
vendor/github.com/go-openapi/validate/validator.go
generated
vendored
158
vendor/github.com/go-openapi/validate/validator.go
generated
vendored
@@ -16,7 +16,6 @@ package validate
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"reflect"
|
||||
|
||||
"github.com/go-openapi/errors"
|
||||
@@ -112,6 +111,8 @@ func (i *itemsValidator) numberValidator() valueValidator {
|
||||
ExclusiveMaximum: i.items.ExclusiveMaximum,
|
||||
Minimum: i.items.Minimum,
|
||||
ExclusiveMinimum: i.items.ExclusiveMinimum,
|
||||
Type: i.items.Type,
|
||||
Format: i.items.Format,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,17 +159,16 @@ func (b *basicCommonValidator) Validate(data interface{}) (res *Result) {
|
||||
if len(b.Enum) > 0 {
|
||||
for _, enumValue := range b.Enum {
|
||||
actualType := reflect.TypeOf(enumValue)
|
||||
if actualType == nil {
|
||||
continue
|
||||
}
|
||||
expectedValue := reflect.ValueOf(data)
|
||||
if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) {
|
||||
if reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), enumValue) {
|
||||
return nil
|
||||
if actualType != nil { // Safeguard
|
||||
expectedValue := reflect.ValueOf(data)
|
||||
if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) {
|
||||
if reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), enumValue) {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return sErr(errors.EnumFail(b.Path, b.In, data, b.Enum))
|
||||
return errorHelp.sErr(errors.EnumFail(b.Path, b.In, data, b.Enum))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -252,6 +252,8 @@ func (p *HeaderValidator) numberValidator() valueValidator {
|
||||
ExclusiveMaximum: p.header.ExclusiveMaximum,
|
||||
Minimum: p.header.Minimum,
|
||||
ExclusiveMinimum: p.header.ExclusiveMinimum,
|
||||
Type: p.header.Type,
|
||||
Format: p.header.Format,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -357,6 +359,8 @@ func (p *ParamValidator) numberValidator() valueValidator {
|
||||
ExclusiveMaximum: p.param.ExclusiveMaximum,
|
||||
Minimum: p.param.Minimum,
|
||||
ExclusiveMinimum: p.param.ExclusiveMinimum,
|
||||
Type: p.param.Type,
|
||||
Format: p.param.Format,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -408,29 +412,25 @@ func (s *basicSliceValidator) Applies(source interface{}, kind reflect.Kind) boo
|
||||
return false
|
||||
}
|
||||
|
||||
func sErr(err errors.Error) *Result {
|
||||
return &Result{Errors: []error{err}}
|
||||
}
|
||||
|
||||
func (s *basicSliceValidator) Validate(data interface{}) *Result {
|
||||
val := reflect.ValueOf(data)
|
||||
|
||||
size := int64(val.Len())
|
||||
if s.MinItems != nil {
|
||||
if err := MinItems(s.Path, s.In, size, *s.MinItems); err != nil {
|
||||
return sErr(err)
|
||||
return errorHelp.sErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
if s.MaxItems != nil {
|
||||
if err := MaxItems(s.Path, s.In, size, *s.MaxItems); err != nil {
|
||||
return sErr(err)
|
||||
return errorHelp.sErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
if s.UniqueItems {
|
||||
if err := UniqueItems(s.Path, s.In, data); err != nil {
|
||||
return sErr(err)
|
||||
return errorHelp.sErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -470,6 +470,9 @@ type numberValidator struct {
|
||||
ExclusiveMaximum bool
|
||||
Minimum *float64
|
||||
ExclusiveMinimum bool
|
||||
// Allows for more accurate behavior regarding integers
|
||||
Type string
|
||||
Format string
|
||||
}
|
||||
|
||||
func (n *numberValidator) SetPath(path string) {
|
||||
@@ -482,51 +485,98 @@ func (n *numberValidator) Applies(source interface{}, kind reflect.Kind) bool {
|
||||
isInt := kind >= reflect.Int && kind <= reflect.Uint64
|
||||
isFloat := kind == reflect.Float32 || kind == reflect.Float64
|
||||
r := isInt || isFloat
|
||||
if Debug {
|
||||
log.Printf("schema props validator for %q applies %t for %T (kind: %v)\n", n.Path, r, source, kind)
|
||||
}
|
||||
debugLog("schema props validator for %q applies %t for %T (kind: %v) isInt=%t, isFloat=%t\n", n.Path, r, source, kind, isInt, isFloat)
|
||||
return r
|
||||
}
|
||||
if Debug {
|
||||
log.Printf("schema props validator for %q applies %t for %T (kind: %v)\n", n.Path, false, source, kind)
|
||||
}
|
||||
debugLog("schema props validator for %q applies %t for %T (kind: %v)\n", n.Path, false, source, kind)
|
||||
return false
|
||||
}
|
||||
|
||||
func (n *numberValidator) convertToFloat(val interface{}) float64 {
|
||||
v := reflect.ValueOf(val)
|
||||
switch v.Kind() {
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
return float64(v.Int())
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
||||
return float64(v.Uint())
|
||||
case reflect.Float32, reflect.Float64:
|
||||
return v.Float()
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// Validate provides a validator for generic JSON numbers,
|
||||
//
|
||||
// By default, numbers are internally represented as float64.
|
||||
// Formats float, or float32 may alter this behavior by mapping to float32.
|
||||
// A special validation process is followed for integers, with optional "format":
|
||||
// this is an attempt to provide a validation with native types.
|
||||
//
|
||||
// NOTE: since the constraint specified (boundary, multipleOf) is unmarshalled
|
||||
// as float64, loss of information remains possible (e.g. on very large integers).
|
||||
//
|
||||
// Since this value directly comes from the unmarshalling, it is not possible
|
||||
// at this stage of processing to check further and guarantee the correctness of such values.
|
||||
//
|
||||
// Normally, the JSON Number.MAX_SAFE_INTEGER (resp. Number.MIN_SAFE_INTEGER)
|
||||
// would check we do not get such a loss.
|
||||
//
|
||||
// If this is the case, replace AddErrors() by AddWarnings() and IsValid() by !HasWarnings().
|
||||
//
|
||||
// TODO: consider replacing boundary check errors by simple warnings.
|
||||
//
|
||||
// TODO: default boundaries with MAX_SAFE_INTEGER are not checked (specific to json.Number?)
|
||||
func (n *numberValidator) Validate(val interface{}) *Result {
|
||||
data := n.convertToFloat(val)
|
||||
res := new(Result)
|
||||
|
||||
resMultiple := new(Result)
|
||||
resMinimum := new(Result)
|
||||
resMaximum := new(Result)
|
||||
|
||||
// Used only to attempt to validate constraint on value,
|
||||
// even though value or constraint specified do not match type and format
|
||||
data := valueHelp.asFloat64(val)
|
||||
|
||||
// Is the provided value within the range of the specified numeric type and format?
|
||||
res.AddErrors(IsValueValidAgainstRange(val, n.Type, n.Format, "Checked", n.Path))
|
||||
|
||||
if n.MultipleOf != nil {
|
||||
if err := MultipleOf(n.Path, n.In, data, *n.MultipleOf); err != nil {
|
||||
return sErr(err)
|
||||
// Is the constraint specifier within the range of the specific numeric type and format?
|
||||
resMultiple.AddErrors(IsValueValidAgainstRange(*n.MultipleOf, n.Type, n.Format, "MultipleOf", n.Path))
|
||||
if resMultiple.IsValid() {
|
||||
// Constraint validated with compatible types
|
||||
if err := MultipleOfNativeType(n.Path, n.In, val, *n.MultipleOf); err != nil {
|
||||
resMultiple.Merge(errorHelp.sErr(err))
|
||||
}
|
||||
} else {
|
||||
// Constraint nevertheless validated, converted as general number
|
||||
if err := MultipleOf(n.Path, n.In, data, *n.MultipleOf); err != nil {
|
||||
resMultiple.Merge(errorHelp.sErr(err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if n.Maximum != nil {
|
||||
if err := Maximum(n.Path, n.In, data, *n.Maximum, n.ExclusiveMaximum); err != nil {
|
||||
return sErr(err)
|
||||
// Is the constraint specifier within the range of the specific numeric type and format?
|
||||
resMaximum.AddErrors(IsValueValidAgainstRange(*n.Maximum, n.Type, n.Format, "Maximum boundary", n.Path))
|
||||
if resMaximum.IsValid() {
|
||||
// Constraint validated with compatible types
|
||||
if err := MaximumNativeType(n.Path, n.In, val, *n.Maximum, n.ExclusiveMaximum); err != nil {
|
||||
resMaximum.Merge(errorHelp.sErr(err))
|
||||
}
|
||||
} else {
|
||||
// Constraint nevertheless validated, converted as general number
|
||||
if err := Maximum(n.Path, n.In, data, *n.Maximum, n.ExclusiveMaximum); err != nil {
|
||||
resMaximum.Merge(errorHelp.sErr(err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if n.Minimum != nil {
|
||||
if err := Minimum(n.Path, n.In, data, *n.Minimum, n.ExclusiveMinimum); err != nil {
|
||||
return sErr(err)
|
||||
// Is the constraint specifier within the range of the specific numeric type and format?
|
||||
resMinimum.AddErrors(IsValueValidAgainstRange(*n.Minimum, n.Type, n.Format, "Minimum boundary", n.Path))
|
||||
if resMinimum.IsValid() {
|
||||
// Constraint validated with compatible types
|
||||
if err := MinimumNativeType(n.Path, n.In, val, *n.Minimum, n.ExclusiveMinimum); err != nil {
|
||||
resMinimum.Merge(errorHelp.sErr(err))
|
||||
}
|
||||
} else {
|
||||
// Constraint nevertheless validated, converted as general number
|
||||
if err := Minimum(n.Path, n.In, data, *n.Minimum, n.ExclusiveMinimum); err != nil {
|
||||
resMinimum.Merge(errorHelp.sErr(err))
|
||||
}
|
||||
}
|
||||
}
|
||||
result := new(Result)
|
||||
result.Inc()
|
||||
return result
|
||||
res.Merge(resMultiple, resMinimum, resMaximum)
|
||||
res.Inc()
|
||||
return res
|
||||
}
|
||||
|
||||
type stringValidator struct {
|
||||
@@ -548,44 +598,40 @@ func (s *stringValidator) Applies(source interface{}, kind reflect.Kind) bool {
|
||||
switch source.(type) {
|
||||
case *spec.Parameter, *spec.Schema, *spec.Items, *spec.Header:
|
||||
r := kind == reflect.String
|
||||
if Debug {
|
||||
log.Printf("string validator for %q applies %t for %T (kind: %v)\n", s.Path, r, source, kind)
|
||||
}
|
||||
debugLog("string validator for %q applies %t for %T (kind: %v)\n", s.Path, r, source, kind)
|
||||
return r
|
||||
}
|
||||
if Debug {
|
||||
log.Printf("string validator for %q applies %t for %T (kind: %v)\n", s.Path, false, source, kind)
|
||||
}
|
||||
debugLog("string validator for %q applies %t for %T (kind: %v)\n", s.Path, false, source, kind)
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *stringValidator) Validate(val interface{}) *Result {
|
||||
data, ok := val.(string)
|
||||
if !ok {
|
||||
return sErr(errors.InvalidType(s.Path, s.In, "string", val))
|
||||
return errorHelp.sErr(errors.InvalidType(s.Path, s.In, "string", val))
|
||||
}
|
||||
|
||||
if s.Required && !s.AllowEmptyValue && (s.Default == nil || s.Default == "") {
|
||||
if err := RequiredString(s.Path, s.In, data); err != nil {
|
||||
return sErr(err)
|
||||
return errorHelp.sErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
if s.MaxLength != nil {
|
||||
if err := MaxLength(s.Path, s.In, data, *s.MaxLength); err != nil {
|
||||
return sErr(err)
|
||||
return errorHelp.sErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
if s.MinLength != nil {
|
||||
if err := MinLength(s.Path, s.In, data, *s.MinLength); err != nil {
|
||||
return sErr(err)
|
||||
return errorHelp.sErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
if s.Pattern != "" {
|
||||
if err := Pattern(s.Path, s.In, data, s.Pattern); err != nil {
|
||||
return sErr(err)
|
||||
return errorHelp.sErr(err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
Reference in New Issue
Block a user