Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
c7949febf2
|
|||
15a4b2a713 | |||
493c6ebae8 | |||
fb847b03af |
@@ -25,7 +25,7 @@ func Wrap(w *GinWrapper, fn WHandlerFunc) gin.HandlerFunc {
|
|||||||
Str("trace", stackTrace).
|
Str("trace", stackTrace).
|
||||||
Build()
|
Build()
|
||||||
|
|
||||||
wrap = APIError(g, err)
|
wrap = Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if g.Writer.Written() {
|
if g.Writer.Written() {
|
||||||
|
@@ -52,7 +52,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailURI).
|
WithType(exerr.TypeBindFailURI).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.uri)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.uri)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailQuery).
|
WithType(exerr.TypeBindFailQuery).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.query)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.query)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,13 +73,13 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailJSON).
|
WithType(exerr.TypeBindFailJSON).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.body)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.body)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err := exerr.New(exerr.TypeBindFailJSON, "missing JSON body").
|
err := exerr.New(exerr.TypeBindFailJSON, "missing JSON body").
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.body)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.body)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,13 +90,13 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailFormData).
|
WithType(exerr.TypeBindFailFormData).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err := exerr.New(exerr.TypeBindFailFormData, "missing form body").
|
err := exerr.New(exerr.TypeBindFailFormData, "missing form body").
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailHeader).
|
WithType(exerr.TypeBindFailHeader).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.query)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.query)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -170,12 +170,18 @@ func Redirect(sc int, newURL string) HTTPResponse {
|
|||||||
return &redirectHTTPResponse{statusCode: sc, url: newURL}
|
return &redirectHTTPResponse{statusCode: sc, url: newURL}
|
||||||
}
|
}
|
||||||
|
|
||||||
func APIError(g *gin.Context, e error) HTTPResponse {
|
func Error(e error) HTTPResponse {
|
||||||
return &jsonAPIErrResponse{
|
return &jsonAPIErrResponse{
|
||||||
err: exerr.FromError(e),
|
err: exerr.FromError(e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NotImplemented(g *gin.Context) HTTPResponse {
|
func ErrWrap(e error, errorType exerr.ErrorType, msg string) HTTPResponse {
|
||||||
return APIError(g, exerr.New(exerr.TypeNotImplemented, "").Build())
|
return &jsonAPIErrResponse{
|
||||||
|
err: exerr.FromError(exerr.Wrap(e, msg).WithType(errorType).Build()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotImplemented() HTTPResponse {
|
||||||
|
return Error(exerr.New(exerr.TypeNotImplemented, "").Build())
|
||||||
}
|
}
|
||||||
|
@@ -5,6 +5,7 @@ import (
|
|||||||
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
||||||
"gogs.mikescher.com/BlackForestBytes/goext/rext"
|
"gogs.mikescher.com/BlackForestBytes/goext/rext"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"path"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
@@ -20,6 +21,7 @@ var anyMethods = []string{
|
|||||||
type GinRoutesWrapper struct {
|
type GinRoutesWrapper struct {
|
||||||
wrapper *GinWrapper
|
wrapper *GinWrapper
|
||||||
routes gin.IRouter
|
routes gin.IRouter
|
||||||
|
absPath string
|
||||||
defaultHandler []gin.HandlerFunc
|
defaultHandler []gin.HandlerFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,15 +30,26 @@ type GinRouteBuilder struct {
|
|||||||
|
|
||||||
method string
|
method string
|
||||||
relPath string
|
relPath string
|
||||||
|
absPath string
|
||||||
handlers []gin.HandlerFunc
|
handlers []gin.HandlerFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinWrapper) Routes() *GinRoutesWrapper {
|
func (w *GinWrapper) Routes() *GinRoutesWrapper {
|
||||||
return &GinRoutesWrapper{wrapper: w, routes: w.engine}
|
return &GinRoutesWrapper{
|
||||||
|
wrapper: w,
|
||||||
|
routes: w.engine,
|
||||||
|
absPath: "",
|
||||||
|
defaultHandler: make([]gin.HandlerFunc, 0),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) Group(relativePath string) *GinRoutesWrapper {
|
func (w *GinRoutesWrapper) Group(relativePath string) *GinRoutesWrapper {
|
||||||
return &GinRoutesWrapper{wrapper: w.wrapper, routes: w.routes.Group(relativePath), defaultHandler: langext.ArrCopy(w.defaultHandler)}
|
return &GinRoutesWrapper{
|
||||||
|
wrapper: w.wrapper,
|
||||||
|
routes: w.routes.Group(relativePath),
|
||||||
|
defaultHandler: langext.ArrCopy(w.defaultHandler),
|
||||||
|
absPath: joinPaths(w.absPath, relativePath),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) Use(middleware ...gin.HandlerFunc) *GinRoutesWrapper {
|
func (w *GinRoutesWrapper) Use(middleware ...gin.HandlerFunc) *GinRoutesWrapper {
|
||||||
@@ -46,39 +59,49 @@ func (w *GinRoutesWrapper) Use(middleware ...gin.HandlerFunc) *GinRoutesWrapper
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) GET(relativePath string) *GinRouteBuilder {
|
func (w *GinRoutesWrapper) GET(relativePath string) *GinRouteBuilder {
|
||||||
return &GinRouteBuilder{routes: w, method: http.MethodGet, relPath: relativePath, handlers: langext.ArrCopy(w.defaultHandler)}
|
return w._route(http.MethodGet, relativePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) POST(relativePath string) *GinRouteBuilder {
|
func (w *GinRoutesWrapper) POST(relativePath string) *GinRouteBuilder {
|
||||||
return &GinRouteBuilder{routes: w, method: http.MethodPost, relPath: relativePath, handlers: langext.ArrCopy(w.defaultHandler)}
|
return w._route(http.MethodPost, relativePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) DELETE(relativePath string) *GinRouteBuilder {
|
func (w *GinRoutesWrapper) DELETE(relativePath string) *GinRouteBuilder {
|
||||||
return &GinRouteBuilder{routes: w, method: http.MethodDelete, relPath: relativePath, handlers: langext.ArrCopy(w.defaultHandler)}
|
return w._route(http.MethodDelete, relativePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) PATCH(relativePath string) *GinRouteBuilder {
|
func (w *GinRoutesWrapper) PATCH(relativePath string) *GinRouteBuilder {
|
||||||
return &GinRouteBuilder{routes: w, method: http.MethodPatch, relPath: relativePath, handlers: langext.ArrCopy(w.defaultHandler)}
|
return w._route(http.MethodPatch, relativePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) PUT(relativePath string) *GinRouteBuilder {
|
func (w *GinRoutesWrapper) PUT(relativePath string) *GinRouteBuilder {
|
||||||
return &GinRouteBuilder{routes: w, method: http.MethodPut, relPath: relativePath, handlers: langext.ArrCopy(w.defaultHandler)}
|
return w._route(http.MethodPut, relativePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) OPTIONS(relativePath string) *GinRouteBuilder {
|
func (w *GinRoutesWrapper) OPTIONS(relativePath string) *GinRouteBuilder {
|
||||||
return &GinRouteBuilder{routes: w, method: http.MethodOptions, relPath: relativePath, handlers: langext.ArrCopy(w.defaultHandler)}
|
return w._route(http.MethodOptions, relativePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) HEAD(relativePath string) *GinRouteBuilder {
|
func (w *GinRoutesWrapper) HEAD(relativePath string) *GinRouteBuilder {
|
||||||
return &GinRouteBuilder{routes: w, method: http.MethodHead, relPath: relativePath, handlers: langext.ArrCopy(w.defaultHandler)}
|
return w._route(http.MethodHead, relativePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) COUNT(relativePath string) *GinRouteBuilder {
|
func (w *GinRoutesWrapper) COUNT(relativePath string) *GinRouteBuilder {
|
||||||
return &GinRouteBuilder{routes: w, method: "COUNT", relPath: relativePath, handlers: langext.ArrCopy(w.defaultHandler)}
|
return w._route("COUNT", relativePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRoutesWrapper) Any(relativePath string) *GinRouteBuilder {
|
func (w *GinRoutesWrapper) Any(relativePath string) *GinRouteBuilder {
|
||||||
return &GinRouteBuilder{routes: w, method: "*", relPath: relativePath, handlers: langext.ArrCopy(w.defaultHandler)}
|
return w._route("*", relativePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *GinRoutesWrapper) _route(method string, relativePath string) *GinRouteBuilder {
|
||||||
|
return &GinRouteBuilder{
|
||||||
|
routes: w,
|
||||||
|
method: method,
|
||||||
|
relPath: relativePath,
|
||||||
|
absPath: joinPaths(w.absPath, relativePath),
|
||||||
|
handlers: langext.ArrCopy(w.defaultHandler),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinRouteBuilder) Use(middleware ...gin.HandlerFunc) *GinRouteBuilder {
|
func (w *GinRouteBuilder) Use(middleware ...gin.HandlerFunc) *GinRouteBuilder {
|
||||||
@@ -147,3 +170,23 @@ func nameOfFunction(f any) string {
|
|||||||
|
|
||||||
return fname
|
return fname
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// joinPaths is copied verbatim from gin@v1.9.1/gin.go
|
||||||
|
func joinPaths(absolutePath, relativePath string) string {
|
||||||
|
if relativePath == "" {
|
||||||
|
return absolutePath
|
||||||
|
}
|
||||||
|
|
||||||
|
finalPath := path.Join(absolutePath, relativePath)
|
||||||
|
if lastChar(relativePath) == '/' && lastChar(finalPath) != '/' {
|
||||||
|
return finalPath + "/"
|
||||||
|
}
|
||||||
|
return finalPath
|
||||||
|
}
|
||||||
|
|
||||||
|
func lastChar(str string) uint8 {
|
||||||
|
if str == "" {
|
||||||
|
panic("The length of the string can't be 0")
|
||||||
|
}
|
||||||
|
return str[len(str)-1]
|
||||||
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
package goext
|
package goext
|
||||||
|
|
||||||
const GoextVersion = "0.0.206"
|
const GoextVersion = "0.0.210"
|
||||||
|
|
||||||
const GoextVersionTimestamp = "2023-07-24T18:50:14+0200"
|
const GoextVersionTimestamp = "2023-07-25T11:16:11+0200"
|
||||||
|
Reference in New Issue
Block a user