diff options
Diffstat (limited to 'vendor/github.com/go-openapi/validate/validator.go')
-rw-r--r-- | vendor/github.com/go-openapi/validate/validator.go | 1051 |
1 files changed, 0 insertions, 1051 deletions
diff --git a/vendor/github.com/go-openapi/validate/validator.go b/vendor/github.com/go-openapi/validate/validator.go deleted file mode 100644 index c083aecc9..000000000 --- a/vendor/github.com/go-openapi/validate/validator.go +++ /dev/null @@ -1,1051 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package validate - -import ( - "fmt" - "reflect" - - "github.com/go-openapi/errors" - "github.com/go-openapi/spec" - "github.com/go-openapi/strfmt" -) - -// An EntityValidator is an interface for things that can validate entities -type EntityValidator interface { - Validate(interface{}) *Result -} - -type valueValidator interface { - SetPath(path string) - Applies(interface{}, reflect.Kind) bool - Validate(interface{}) *Result -} - -type itemsValidator struct { - items *spec.Items - root interface{} - path string - in string - validators [6]valueValidator - KnownFormats strfmt.Registry - Options *SchemaValidatorOptions -} - -func newItemsValidator(path, in string, items *spec.Items, root interface{}, formats strfmt.Registry, opts *SchemaValidatorOptions) *itemsValidator { - if opts == nil { - opts = new(SchemaValidatorOptions) - } - - var iv *itemsValidator - if opts.recycleValidators { - iv = pools.poolOfItemsValidators.BorrowValidator() - } else { - iv = new(itemsValidator) - } - - iv.path = path - iv.in = in - iv.items = items - iv.root = root - iv.KnownFormats = formats - iv.Options = opts - iv.validators = [6]valueValidator{ - iv.typeValidator(), - iv.stringValidator(), - iv.formatValidator(), - iv.numberValidator(), - iv.sliceValidator(), - iv.commonValidator(), - } - return iv -} - -func (i *itemsValidator) Validate(index int, data interface{}) *Result { - if i.Options.recycleValidators { - defer func() { - i.redeemChildren() - i.redeem() - }() - } - - tpe := reflect.TypeOf(data) - kind := tpe.Kind() - var result *Result - if i.Options.recycleResult { - result = pools.poolOfResults.BorrowResult() - } else { - result = new(Result) - } - - path := fmt.Sprintf("%s.%d", i.path, index) - - for idx, validator := range i.validators { - if !validator.Applies(i.root, kind) { - if i.Options.recycleValidators { - // Validate won't be called, so relinquish this validator - if redeemableChildren, ok := validator.(interface{ redeemChildren() }); ok { - redeemableChildren.redeemChildren() - } - if redeemable, ok := validator.(interface{ redeem() }); ok { - redeemable.redeem() - } - i.validators[idx] = nil // prevents further (unsafe) usage - } - - continue - } - - validator.SetPath(path) - err := validator.Validate(data) - if i.Options.recycleValidators { - i.validators[idx] = nil // prevents further (unsafe) usage - } - if err != nil { - result.Inc() - if err.HasErrors() { - result.Merge(err) - - break - } - - result.Merge(err) - } - } - - return result -} - -func (i *itemsValidator) typeValidator() valueValidator { - return newTypeValidator( - i.path, - i.in, - spec.StringOrArray([]string{i.items.Type}), - i.items.Nullable, - i.items.Format, - i.Options, - ) -} - -func (i *itemsValidator) commonValidator() valueValidator { - return newBasicCommonValidator( - "", - i.in, - i.items.Default, - i.items.Enum, - i.Options, - ) -} - -func (i *itemsValidator) sliceValidator() valueValidator { - return newBasicSliceValidator( - "", - i.in, - i.items.Default, - i.items.MaxItems, - i.items.MinItems, - i.items.UniqueItems, - i.items.Items, - i.root, - i.KnownFormats, - i.Options, - ) -} - -func (i *itemsValidator) numberValidator() valueValidator { - return newNumberValidator( - "", - i.in, - i.items.Default, - i.items.MultipleOf, - i.items.Maximum, - i.items.ExclusiveMaximum, - i.items.Minimum, - i.items.ExclusiveMinimum, - i.items.Type, - i.items.Format, - i.Options, - ) -} - -func (i *itemsValidator) stringValidator() valueValidator { - return newStringValidator( - "", - i.in, - i.items.Default, - false, // Required - false, // AllowEmpty - i.items.MaxLength, - i.items.MinLength, - i.items.Pattern, - i.Options, - ) -} - -func (i *itemsValidator) formatValidator() valueValidator { - return newFormatValidator( - "", - i.in, - i.items.Format, - i.KnownFormats, - i.Options, - ) -} - -func (i *itemsValidator) redeem() { - pools.poolOfItemsValidators.RedeemValidator(i) -} - -func (i *itemsValidator) redeemChildren() { - for idx, validator := range i.validators { - if validator == nil { - continue - } - if redeemableChildren, ok := validator.(interface{ redeemChildren() }); ok { - redeemableChildren.redeemChildren() - } - if redeemable, ok := validator.(interface{ redeem() }); ok { - redeemable.redeem() - } - i.validators[idx] = nil // free up allocated children if not in pool - } -} - -type basicCommonValidator struct { - Path string - In string - Default interface{} - Enum []interface{} - Options *SchemaValidatorOptions -} - -func newBasicCommonValidator(path, in string, def interface{}, enum []interface{}, opts *SchemaValidatorOptions) *basicCommonValidator { - if opts == nil { - opts = new(SchemaValidatorOptions) - } - - var b *basicCommonValidator - if opts.recycleValidators { - b = pools.poolOfBasicCommonValidators.BorrowValidator() - } else { - b = new(basicCommonValidator) - } - - b.Path = path - b.In = in - b.Default = def - b.Enum = enum - b.Options = opts - - return b -} - -func (b *basicCommonValidator) SetPath(path string) { - b.Path = path -} - -func (b *basicCommonValidator) Applies(source interface{}, _ reflect.Kind) bool { - switch source.(type) { - case *spec.Parameter, *spec.Schema, *spec.Header: - return true - default: - return false - } -} - -func (b *basicCommonValidator) Validate(data interface{}) (res *Result) { - if b.Options.recycleValidators { - defer func() { - b.redeem() - }() - } - - if len(b.Enum) == 0 { - return nil - } - - for _, enumValue := range b.Enum { - actualType := reflect.TypeOf(enumValue) - if actualType == nil { // Safeguard - continue - } - - expectedValue := reflect.ValueOf(data) - if expectedValue.IsValid() && - expectedValue.Type().ConvertibleTo(actualType) && - reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), enumValue) { - return nil - } - } - - return errorHelp.sErr(errors.EnumFail(b.Path, b.In, data, b.Enum), b.Options.recycleResult) -} - -func (b *basicCommonValidator) redeem() { - pools.poolOfBasicCommonValidators.RedeemValidator(b) -} - -// A HeaderValidator has very limited subset of validations to apply -type HeaderValidator struct { - name string - header *spec.Header - validators [6]valueValidator - KnownFormats strfmt.Registry - Options *SchemaValidatorOptions -} - -// NewHeaderValidator creates a new header validator object -func NewHeaderValidator(name string, header *spec.Header, formats strfmt.Registry, options ...Option) *HeaderValidator { - opts := new(SchemaValidatorOptions) - for _, o := range options { - o(opts) - } - - return newHeaderValidator(name, header, formats, opts) -} - -func newHeaderValidator(name string, header *spec.Header, formats strfmt.Registry, opts *SchemaValidatorOptions) *HeaderValidator { - if opts == nil { - opts = new(SchemaValidatorOptions) - } - - var p *HeaderValidator - if opts.recycleValidators { - p = pools.poolOfHeaderValidators.BorrowValidator() - } else { - p = new(HeaderValidator) - } - - p.name = name - p.header = header - p.KnownFormats = formats - p.Options = opts - p.validators = [6]valueValidator{ - newTypeValidator( - name, - "header", - spec.StringOrArray([]string{header.Type}), - header.Nullable, - header.Format, - p.Options, - ), - p.stringValidator(), - p.formatValidator(), - p.numberValidator(), - p.sliceValidator(), - p.commonValidator(), - } - - return p -} - -// Validate the value of the header against its schema -func (p *HeaderValidator) Validate(data interface{}) *Result { - if p.Options.recycleValidators { - defer func() { - p.redeemChildren() - p.redeem() - }() - } - - if data == nil { - return nil - } - - var result *Result - if p.Options.recycleResult { - result = pools.poolOfResults.BorrowResult() - } else { - result = new(Result) - } - - tpe := reflect.TypeOf(data) - kind := tpe.Kind() - - for idx, validator := range p.validators { - if !validator.Applies(p.header, kind) { - if p.Options.recycleValidators { - // Validate won't be called, so relinquish this validator - if redeemableChildren, ok := validator.(interface{ redeemChildren() }); ok { - redeemableChildren.redeemChildren() - } - if redeemable, ok := validator.(interface{ redeem() }); ok { - redeemable.redeem() - } - p.validators[idx] = nil // prevents further (unsafe) usage - } - - continue - } - - err := validator.Validate(data) - if p.Options.recycleValidators { - p.validators[idx] = nil // prevents further (unsafe) usage - } - if err != nil { - if err.HasErrors() { - result.Merge(err) - break - } - result.Merge(err) - } - } - - return result -} - -func (p *HeaderValidator) commonValidator() valueValidator { - return newBasicCommonValidator( - p.name, - "response", - p.header.Default, - p.header.Enum, - p.Options, - ) -} - -func (p *HeaderValidator) sliceValidator() valueValidator { - return newBasicSliceValidator( - p.name, - "response", - p.header.Default, - p.header.MaxItems, - p.header.MinItems, - p.header.UniqueItems, - p.header.Items, - p.header, - p.KnownFormats, - p.Options, - ) -} - -func (p *HeaderValidator) numberValidator() valueValidator { - return newNumberValidator( - p.name, - "response", - p.header.Default, - p.header.MultipleOf, - p.header.Maximum, - p.header.ExclusiveMaximum, - p.header.Minimum, - p.header.ExclusiveMinimum, - p.header.Type, - p.header.Format, - p.Options, - ) -} - -func (p *HeaderValidator) stringValidator() valueValidator { - return newStringValidator( - p.name, - "response", - p.header.Default, - true, - false, - p.header.MaxLength, - p.header.MinLength, - p.header.Pattern, - p.Options, - ) -} - -func (p *HeaderValidator) formatValidator() valueValidator { - return newFormatValidator( - p.name, - "response", - p.header.Format, - p.KnownFormats, - p.Options, - ) -} - -func (p *HeaderValidator) redeem() { - pools.poolOfHeaderValidators.RedeemValidator(p) -} - -func (p *HeaderValidator) redeemChildren() { - for idx, validator := range p.validators { - if validator == nil { - continue - } - if redeemableChildren, ok := validator.(interface{ redeemChildren() }); ok { - redeemableChildren.redeemChildren() - } - if redeemable, ok := validator.(interface{ redeem() }); ok { - redeemable.redeem() - } - p.validators[idx] = nil // free up allocated children if not in pool - } -} - -// A ParamValidator has very limited subset of validations to apply -type ParamValidator struct { - param *spec.Parameter - validators [6]valueValidator - KnownFormats strfmt.Registry - Options *SchemaValidatorOptions -} - -// NewParamValidator creates a new param validator object -func NewParamValidator(param *spec.Parameter, formats strfmt.Registry, options ...Option) *ParamValidator { - opts := new(SchemaValidatorOptions) - for _, o := range options { - o(opts) - } - - return newParamValidator(param, formats, opts) -} - -func newParamValidator(param *spec.Parameter, formats strfmt.Registry, opts *SchemaValidatorOptions) *ParamValidator { - if opts == nil { - opts = new(SchemaValidatorOptions) - } - - var p *ParamValidator - if opts.recycleValidators { - p = pools.poolOfParamValidators.BorrowValidator() - } else { - p = new(ParamValidator) - } - - p.param = param - p.KnownFormats = formats - p.Options = opts - p.validators = [6]valueValidator{ - newTypeValidator( - param.Name, - param.In, - spec.StringOrArray([]string{param.Type}), - param.Nullable, - param.Format, - p.Options, - ), - p.stringValidator(), - p.formatValidator(), - p.numberValidator(), - p.sliceValidator(), - p.commonValidator(), - } - - return p -} - -// Validate the data against the description of the parameter -func (p *ParamValidator) Validate(data interface{}) *Result { - if data == nil { - return nil - } - - var result *Result - if p.Options.recycleResult { - result = pools.poolOfResults.BorrowResult() - } else { - result = new(Result) - } - - tpe := reflect.TypeOf(data) - kind := tpe.Kind() - - if p.Options.recycleValidators { - defer func() { - p.redeemChildren() - p.redeem() - }() - } - - // TODO: validate type - for idx, validator := range p.validators { - if !validator.Applies(p.param, kind) { - if p.Options.recycleValidators { - // Validate won't be called, so relinquish this validator - if redeemableChildren, ok := validator.(interface{ redeemChildren() }); ok { - redeemableChildren.redeemChildren() - } - if redeemable, ok := validator.(interface{ redeem() }); ok { - redeemable.redeem() - } - p.validators[idx] = nil // prevents further (unsafe) usage - } - - continue - } - - err := validator.Validate(data) - if p.Options.recycleValidators { - p.validators[idx] = nil // prevents further (unsafe) usage - } - if err != nil { - if err.HasErrors() { - result.Merge(err) - break - } - result.Merge(err) - } - } - - return result -} - -func (p *ParamValidator) commonValidator() valueValidator { - return newBasicCommonValidator( - p.param.Name, - p.param.In, - p.param.Default, - p.param.Enum, - p.Options, - ) -} - -func (p *ParamValidator) sliceValidator() valueValidator { - return newBasicSliceValidator( - p.param.Name, - p.param.In, - p.param.Default, - p.param.MaxItems, - p.param.MinItems, - p.param.UniqueItems, - p.param.Items, - p.param, - p.KnownFormats, - p.Options, - ) -} - -func (p *ParamValidator) numberValidator() valueValidator { - return newNumberValidator( - p.param.Name, - p.param.In, - p.param.Default, - p.param.MultipleOf, - p.param.Maximum, - p.param.ExclusiveMaximum, - p.param.Minimum, - p.param.ExclusiveMinimum, - p.param.Type, - p.param.Format, - p.Options, - ) -} - -func (p *ParamValidator) stringValidator() valueValidator { - return newStringValidator( - p.param.Name, - p.param.In, - p.param.Default, - p.param.Required, - p.param.AllowEmptyValue, - p.param.MaxLength, - p.param.MinLength, - p.param.Pattern, - p.Options, - ) -} - -func (p *ParamValidator) formatValidator() valueValidator { - return newFormatValidator( - p.param.Name, - p.param.In, - p.param.Format, - p.KnownFormats, - p.Options, - ) -} - -func (p *ParamValidator) redeem() { - pools.poolOfParamValidators.RedeemValidator(p) -} - -func (p *ParamValidator) redeemChildren() { - for idx, validator := range p.validators { - if validator == nil { - continue - } - if redeemableChildren, ok := validator.(interface{ redeemChildren() }); ok { - redeemableChildren.redeemChildren() - } - if redeemable, ok := validator.(interface{ redeem() }); ok { - redeemable.redeem() - } - p.validators[idx] = nil // free up allocated children if not in pool - } -} - -type basicSliceValidator struct { - Path string - In string - Default interface{} - MaxItems *int64 - MinItems *int64 - UniqueItems bool - Items *spec.Items - Source interface{} - KnownFormats strfmt.Registry - Options *SchemaValidatorOptions -} - -func newBasicSliceValidator( - path, in string, - def interface{}, maxItems, minItems *int64, uniqueItems bool, items *spec.Items, - source interface{}, formats strfmt.Registry, - opts *SchemaValidatorOptions) *basicSliceValidator { - if opts == nil { - opts = new(SchemaValidatorOptions) - } - - var s *basicSliceValidator - if opts.recycleValidators { - s = pools.poolOfBasicSliceValidators.BorrowValidator() - } else { - s = new(basicSliceValidator) - } - - s.Path = path - s.In = in - s.Default = def - s.MaxItems = maxItems - s.MinItems = minItems - s.UniqueItems = uniqueItems - s.Items = items - s.Source = source - s.KnownFormats = formats - s.Options = opts - - return s -} - -func (s *basicSliceValidator) SetPath(path string) { - s.Path = path -} - -func (s *basicSliceValidator) Applies(source interface{}, kind reflect.Kind) bool { - switch source.(type) { - case *spec.Parameter, *spec.Items, *spec.Header: - return kind == reflect.Slice - default: - return false - } -} - -func (s *basicSliceValidator) Validate(data interface{}) *Result { - if s.Options.recycleValidators { - defer func() { - s.redeem() - }() - } - 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 errorHelp.sErr(err, s.Options.recycleResult) - } - } - - if s.MaxItems != nil { - if err := MaxItems(s.Path, s.In, size, *s.MaxItems); err != nil { - return errorHelp.sErr(err, s.Options.recycleResult) - } - } - - if s.UniqueItems { - if err := UniqueItems(s.Path, s.In, data); err != nil { - return errorHelp.sErr(err, s.Options.recycleResult) - } - } - - if s.Items == nil { - return nil - } - - for i := 0; i < int(size); i++ { - itemsValidator := newItemsValidator(s.Path, s.In, s.Items, s.Source, s.KnownFormats, s.Options) - ele := val.Index(i) - if err := itemsValidator.Validate(i, ele.Interface()); err != nil { - if err.HasErrors() { - return err - } - if err.wantsRedeemOnMerge { - pools.poolOfResults.RedeemResult(err) - } - } - } - - return nil -} - -func (s *basicSliceValidator) redeem() { - pools.poolOfBasicSliceValidators.RedeemValidator(s) -} - -type numberValidator struct { - Path string - In string - Default interface{} - MultipleOf *float64 - Maximum *float64 - ExclusiveMaximum bool - Minimum *float64 - ExclusiveMinimum bool - // Allows for more accurate behavior regarding integers - Type string - Format string - Options *SchemaValidatorOptions -} - -func newNumberValidator( - path, in string, def interface{}, - multipleOf, maximum *float64, exclusiveMaximum bool, minimum *float64, exclusiveMinimum bool, - typ, format string, - opts *SchemaValidatorOptions) *numberValidator { - if opts == nil { - opts = new(SchemaValidatorOptions) - } - - var n *numberValidator - if opts.recycleValidators { - n = pools.poolOfNumberValidators.BorrowValidator() - } else { - n = new(numberValidator) - } - - n.Path = path - n.In = in - n.Default = def - n.MultipleOf = multipleOf - n.Maximum = maximum - n.ExclusiveMaximum = exclusiveMaximum - n.Minimum = minimum - n.ExclusiveMinimum = exclusiveMinimum - n.Type = typ - n.Format = format - n.Options = opts - - return n -} - -func (n *numberValidator) SetPath(path string) { - n.Path = path -} - -func (n *numberValidator) Applies(source interface{}, kind reflect.Kind) bool { - switch source.(type) { - case *spec.Parameter, *spec.Schema, *spec.Items, *spec.Header: - isInt := kind >= reflect.Int && kind <= reflect.Uint64 - isFloat := kind == reflect.Float32 || kind == reflect.Float64 - return isInt || isFloat - default: - return false - } -} - -// 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 { - if n.Options.recycleValidators { - defer func() { - n.redeem() - }() - } - - var res, resMultiple, resMinimum, resMaximum *Result - if n.Options.recycleResult { - res = pools.poolOfResults.BorrowResult() - } else { - res = 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 { - resMultiple = pools.poolOfResults.BorrowResult() - - // 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, n.Options.recycleResult)) - } - } 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, n.Options.recycleResult)) - } - } - } - - if n.Maximum != nil { - resMaximum = pools.poolOfResults.BorrowResult() - - // 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, n.Options.recycleResult)) - } - } 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, n.Options.recycleResult)) - } - } - } - - if n.Minimum != nil { - resMinimum = pools.poolOfResults.BorrowResult() - - // 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, n.Options.recycleResult)) - } - } 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, n.Options.recycleResult)) - } - } - } - res.Merge(resMultiple, resMinimum, resMaximum) - res.Inc() - - return res -} - -func (n *numberValidator) redeem() { - pools.poolOfNumberValidators.RedeemValidator(n) -} - -type stringValidator struct { - Path string - In string - Default interface{} - Required bool - AllowEmptyValue bool - MaxLength *int64 - MinLength *int64 - Pattern string - Options *SchemaValidatorOptions -} - -func newStringValidator( - path, in string, - def interface{}, required, allowEmpty bool, maxLength, minLength *int64, pattern string, - opts *SchemaValidatorOptions) *stringValidator { - if opts == nil { - opts = new(SchemaValidatorOptions) - } - - var s *stringValidator - if opts.recycleValidators { - s = pools.poolOfStringValidators.BorrowValidator() - } else { - s = new(stringValidator) - } - - s.Path = path - s.In = in - s.Default = def - s.Required = required - s.AllowEmptyValue = allowEmpty - s.MaxLength = maxLength - s.MinLength = minLength - s.Pattern = pattern - s.Options = opts - - return s -} - -func (s *stringValidator) SetPath(path string) { - s.Path = path -} - -func (s *stringValidator) Applies(source interface{}, kind reflect.Kind) bool { - switch source.(type) { - case *spec.Parameter, *spec.Schema, *spec.Items, *spec.Header: - return kind == reflect.String - default: - return false - } -} - -func (s *stringValidator) Validate(val interface{}) *Result { - if s.Options.recycleValidators { - defer func() { - s.redeem() - }() - } - - data, ok := val.(string) - if !ok { - return errorHelp.sErr(errors.InvalidType(s.Path, s.In, stringType, val), s.Options.recycleResult) - } - - if s.Required && !s.AllowEmptyValue && (s.Default == nil || s.Default == "") { - if err := RequiredString(s.Path, s.In, data); err != nil { - return errorHelp.sErr(err, s.Options.recycleResult) - } - } - - if s.MaxLength != nil { - if err := MaxLength(s.Path, s.In, data, *s.MaxLength); err != nil { - return errorHelp.sErr(err, s.Options.recycleResult) - } - } - - if s.MinLength != nil { - if err := MinLength(s.Path, s.In, data, *s.MinLength); err != nil { - return errorHelp.sErr(err, s.Options.recycleResult) - } - } - - if s.Pattern != "" { - if err := Pattern(s.Path, s.In, data, s.Pattern); err != nil { - return errorHelp.sErr(err, s.Options.recycleResult) - } - } - return nil -} - -func (s *stringValidator) redeem() { - pools.poolOfStringValidators.RedeemValidator(s) -} |