Skip to content

Instantly share code, notes, and snippets.

@ElegantSoft
Created September 23, 2020 01:17
Show Gist options
  • Save ElegantSoft/a4f42dc3231a480ac100adb496e73564 to your computer and use it in GitHub Desktop.
Save ElegantSoft/a4f42dc3231a480ac100adb496e73564 to your computer and use it in GitHub Desktop.
Use enum validation in golang with gin with custom error messages
// user model
type User struct {
gorm.Model
Name string `json:"name" binding:"required" gorm:"not null:true"`
Phone string `json:"phone" binding:"required"`
Email string `json:"email" binding:"required,email" gorm:"not null:true"`
Password string `json:"password" binding:"required,min=8" gorm:"not null:true"`
Gender string `json:"gender" binding:"Enum=male_female" gorm:"type:gender;not null:true;default:male"` // add binding Enum=male_female
}
// create custom validation
func Enum(
fl validator.FieldLevel,
) bool {
enumString := fl.Param() // get string male_female
value := fl.Field().String() // the actual field
enumSlice := strings.Split(enumString, "_") // convert to slice
for _, v := range enumSlice {
if value == v {
return true
}
}
return false
}
// register the validation in main function
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
_ = v.RegisterValidation("Enum", Enum)
}
// you can now easily validate
var user User
if err := ctx.ShouldBind(&user); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": ValidateErrors(err)}) // ValidateErrors is custom error handler to display custom message
return
}
// custom validation error messages
func ValidateErrors(requestError error) string {
return validate(requestError.(validator.ValidationErrors))
}
func validate(errors validator.ValidationErrors) string {
resultErrors := ""
for _, err := range errors {
switch err.Tag() {
case "required":
resultErrors += err.Field() + " is required\n "
case "email":
resultErrors += err.Field() + " must me valid email\n "
case "min":
resultErrors += err.Field() + " must be " + err.Param() + " length at least\n"
case "Enum":
replacer := *strings.NewReplacer("_", ",")
resultErrors += err.Field() + " must be one of " + replacer.Replace(err.Param())
default:
resultErrors += "error in filed " + err.Tag()
}
}
return resultErrors
}
// example of error returns {
// "error": "Name is required\n Phone is required\n Email must me valid email\n Password must be 8 length at least\nGender must be one of male,female"
// }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment