package request import ( errors2 "errors" "github.com/go-playground/validator/v10" "reflect" ) var validate *validator.Validate func ValidateAndHandleError(req interface{}) error { validate = validator.New() if err := validate.Struct(req); err != nil { formattedError := formatValidationError(err) return errors2.New(formattedError) } return nil } func formatValidationError(err error) string { if _, ok := err.(*validator.InvalidValidationError); ok { return err.Error() } var errorMessage string for _, err := range err.(validator.ValidationErrors) { switch err.Tag() { case "required": errorMessage += "The field '" + err.Field() + "' is required." case "min": if err.Kind() == reflect.Slice { errorMessage += "The field '" + err.Field() + "' must contain at least " + err.Param() + " items." } else { errorMessage += "The field '" + err.Field() + "' must be at least " + err.Param() + "." } case "oneof": errorMessage += "The field '" + err.Field() + "' must be one of [" + err.Param() + "]." case "email": errorMessage += "The field '" + err.Field() + "' must be a valid email address." case "len": errorMessage += "The field '" + err.Field() + "' must be exactly " + err.Param() + " characters long." default: errorMessage += "The field '" + err.Field() + "' is invalid." } errorMessage += " " } return errorMessage }