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 }