function-chaining-style input validation library for Go and Gin web framework
var (
// x-www-form-urlencoded
firstname = v.Form("firstname").Required().String()
// url parameter
Lastname = v.Param("lastname").Optional().String()
// query string
age = v.Query("age").Required().Int()
// form-data
Height = v.FormData("height").Optional().Float32()
// mutipart/form-data
profilePic = v.Multipart("profile_picture").Required().File()
)
// String formating (coming soon):
var (
email = v.Form("email").Required().String().Format("email")
userID = v.Form("user_id").Required().String().Format("numeric")
postcode = v.Form("postcode").Required().String().Format("numeric").Min(10).Max(20)
)
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"example-project/validation"
"example-project/repository"
)
func CreateUser(c *gin.Context) {
v := validation.FromRequest(c)
var (
firstname = v.FormData("firstname").Required().String()
lastname = v.FormData("lastname").Required().String()
phoneNumber = v.FormData("phone_number").Required().String()
countryCode = v.FormData("country_code").Required().String()
email = v.FormData("email").Required().String()
password = v.FormData("password").Required().String()
profilePic = v.Multipart("profile_picture").Optional().File()
)
if err := v.Done(); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
newUser, err := repository.CreateUser(
firstname,
lastname,
phoneNumber,
countryCode,
email,
password,
profilePic.,
)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "failed to create new user",
})
return
}
c.JSON(http.StatusCreated, gin.H{
"result": newUser,
})
}
func main() {
r := gin.New()
v1 := r.Group("/api/v1")
{
v1.POST("/users", CreateUser)
}
r.Run(":9000")
}
#