-
-
Save Adamkaram/275a01dc94b565f48d0844f91e7aece2 to your computer and use it in GitHub Desktop.
Use enum validation in golang with gin with custom error messages
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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