package http import ( "fmt" "reflect" "github.com/go-playground/validator/v10" ) type fieldError struct { Field string Message string } func NewValidator() *validator.Validate { validate := validator.New() validate.RegisterTagNameFunc(func(fld reflect.StructField) string { if fld.Tag.Get("validation_name") != "" { return fld.Tag.Get("validation_name") } else { return fld.Tag.Get("json") } }) return validate } func validationErrorFormater(errs validator.ValidationErrors) []fieldError { fieldErrs := make([]fieldError, 0) if errs != nil { for _, err := range errs { fieldErrs = append( fieldErrs, fieldError{ Field: err.Field(), Message: msgForTag(err.Tag(), err.Field(), err.Param()), }, ) } return fieldErrs } return nil } func msgForTag(tag, field, param string) string { switch tag { case "required": return fmt.Sprintf("%s is required", field) case "email": return "email is invalid" case "min": return fmt.Sprintf("The length of %s must be at least %s", field, param) case "max": return fmt.Sprintf("The length of %s must be at most %s", field, param) default: return fmt.Sprintf("%s is invalid", field) } }