github.com/goravel/framework@v1.13.9/validation/validator.go (about)

     1  package validation
     2  
     3  import (
     4  	"net/url"
     5  
     6  	"github.com/gookit/validate"
     7  
     8  	httpvalidate "github.com/goravel/framework/contracts/validation"
     9  )
    10  
    11  func init() {
    12  	validate.Config(func(opt *validate.GlobalOption) {
    13  		opt.StopOnError = false
    14  		opt.SkipOnEmpty = true
    15  	})
    16  }
    17  
    18  type Validator struct {
    19  	instance *validate.Validation
    20  	data     validate.DataFace
    21  }
    22  
    23  func NewValidator(instance *validate.Validation, data validate.DataFace) *Validator {
    24  	instance.Validate()
    25  
    26  	return &Validator{instance: instance, data: data}
    27  }
    28  
    29  func (v *Validator) Bind(ptr any) error {
    30  	var data any
    31  	if _, ok := v.data.Src().(url.Values); ok {
    32  		values := make(map[string]any)
    33  		for key, value := range v.data.Src().(url.Values) {
    34  			if len(value) > 0 {
    35  				values[key] = value[0]
    36  			}
    37  		}
    38  
    39  		formData, ok := v.data.(*validate.FormData)
    40  		if ok {
    41  			for key, value := range formData.Files {
    42  				values[key] = value
    43  			}
    44  		}
    45  
    46  		data = values
    47  	} else {
    48  		data = v.data.Src()
    49  	}
    50  
    51  	bts, err := validate.Marshal(data)
    52  	if err != nil {
    53  		return err
    54  	}
    55  
    56  	return validate.Unmarshal(bts, ptr)
    57  }
    58  
    59  func (v *Validator) Errors() httpvalidate.Errors {
    60  	if v.instance.Errors == nil || len(v.instance.Errors) == 0 {
    61  		return nil
    62  	}
    63  
    64  	return NewErrors(v.instance.Errors)
    65  }
    66  
    67  func (v *Validator) Fails() bool {
    68  	return v.instance.IsFail()
    69  }