| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // Copyright 2017 Manu Martinez-Almeida. All rights reserved.
- // Use of this source code is governed by a MIT style
- // license that can be found in the LICENSE file.
- package binding
- import (
- "fmt"
- "reflect"
- "strings"
- "sync"
- "github.com/go-playground/validator/v10"
- )
- type defaultValidator struct {
- once sync.Once
- validate *validator.Validate
- }
- type sliceValidateError []error
- func (err sliceValidateError) Error() string {
- var errMsgs []string
- for i, e := range err {
- if e == nil {
- continue
- }
- errMsgs = append(errMsgs, fmt.Sprintf("[%d]: %s", i, e.Error()))
- }
- return strings.Join(errMsgs, "\n")
- }
- var _ StructValidator = &defaultValidator{}
- // ValidateStruct receives any kind of type, but only performed struct or pointer to struct type.
- func (v *defaultValidator) ValidateStruct(obj interface{}) error {
- if obj == nil {
- return nil
- }
- value := reflect.ValueOf(obj)
- switch value.Kind() {
- case reflect.Ptr:
- return v.ValidateStruct(value.Elem().Interface())
- case reflect.Struct:
- return v.validateStruct(obj)
- case reflect.Slice, reflect.Array:
- count := value.Len()
- validateRet := make(sliceValidateError, 0)
- for i := 0; i < count; i++ {
- if err := v.ValidateStruct(value.Index(i).Interface()); err != nil {
- validateRet = append(validateRet, err)
- }
- }
- if len(validateRet) == 0 {
- return nil
- }
- return validateRet
- default:
- return nil
- }
- }
- // validateStruct receives struct type
- func (v *defaultValidator) validateStruct(obj interface{}) error {
- v.lazyinit()
- return v.validate.Struct(obj)
- }
- // Engine returns the underlying validator engine which powers the default
- // Validator instance. This is useful if you want to register custom validations
- // or struct level validations. See validator GoDoc for more info -
- // https://godoc.org/gopkg.in/go-playground/validator.v8
- func (v *defaultValidator) Engine() interface{} {
- v.lazyinit()
- return v.validate
- }
- func (v *defaultValidator) lazyinit() {
- v.once.Do(func() {
- v.validate = validator.New()
- v.validate.SetTagName("binding")
- })
- }
|