package validators import ( "errors" "fmt" "strings" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" ) type ( ErrorResponse struct { Error bool FailedField string Tag string } XValidator struct { validator *validator.Validate } ) var Validator *XValidator var validate = validator.New() func RegisterValidators() { Validator = &XValidator{ validator: validate, } regPassword(Validator) } func Validate(c *fiber.Ctx, data interface{}) error { if errs := Validator.validateFields(data); len(errs) > 0 && errs[0].Error { errMsgs := make([]string, 0) for _, err := range errs { errMsgs = append(errMsgs, fmt.Sprintf( "field '%s' needs to implement '%s' rule", err.FailedField, err.Tag, )) } return errors.New(strings.Join(errMsgs, " || ")) } return nil } func (v XValidator) validateFields(data interface{}) []ErrorResponse { validationErrors := []ErrorResponse{} errs := validate.Struct(data) if errs != nil { for _, err := range errs.(validator.ValidationErrors) { elem := ErrorResponse{ FailedField: err.Field(), Tag: err.ActualTag(), Error: true, } validationErrors = append(validationErrors, elem) } } return validationErrors }