Skip to content

mengdu/ginutil

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ginutil

Standardized Gin parameter binding.

package main

import (
  "context"
  "fmt"

  "github.com/gin-gonic/gin"
  "github.com/mengdu/ginutil"
)

type Foo struct{}

type HelloReq struct {
  Name string `query:"name" binding:"required,min=1,max=10"` // e.g: ?name=Tom
}

func (f Foo) Hello(ctx context.Context, req *HelloReq) (string, error) {
  return fmt.Sprintf("Hello, %s!", req.Name), nil
}

func apiReply(c *gin.Context, err error, v any) {
  if err != nil {
    c.JSON(500, gin.H{"ret": -1, "msg": err.Error()})
    return
  }
  c.JSON(200, gin.H{"data": v})
}

func main() {
  srv := gin.New()
  foo := Foo{}

  srv.GET("/hello", ginutil.Handle(apiReply, foo.Hello))

  if err := srv.Run("localhost:8080"); err != nil {
    panic(err)
  }
}

Binding request parameters

// binding from uri string
type UriReq = ginutil.Uri[struct {
  A string `uri:"a" binding:"required"` // use `uri` tag for field binding
  B int    `uri:"b" binding:"min=2,max=10"`
}]

// binding from query string
type QueryReq = ginutil.Query[struct {
  A string `query:"a" binding:"required"` // use `query` tag for field binding
  B int    `query:"b" binding:"min=2,max=10"`
}]

// binding from header
type HeaderReq = ginutil.Header[struct {
  A string `header:"a" binding:"required"` // use `header` tag for field binding
  B int    `header:"b" binding:"min=2,max=10"`
}]

// binding from `application/x-www-form-urlencoded` body
type FormReq = ginutil.Form[struct {
  A string `form:"a" binding:"required"` // use `form` tag for field binding
  B int    `form:"b" binding:"min=2,max=10"`
}]

// binding from `application/form-data` body
type UploadFormReq = ginutil.FormData[struct {
  Key  string                `form:"key" binding:"required"` // use `form` tag for field binding
  File *multipart.FileHeader `form:"file" binding:"required"` // file
}]

// binding from `application/json` body
type JsonReq = ginutil.JSON[struct {
  A string `json:"a" binding:"required"` // use `json` tag for field binding
  B int    `json:"b" binding:"min=2,max=10"`
}]

// binding from `application/xml` body
type XmlReq = ginutil.XML[struct {
  A string `xml:"a" binding:"required"` // use `xml` tag for field binding
  B int    `xml:"b" binding:"min=2,max=10"`
}]

About

Standardized Gin parameter binding.

Resources

License

Stars

Watchers

Forks

Contributors

Languages