Skip to content

Commit

Permalink
feat: add path prefix middleware name style
Browse files Browse the repository at this point in the history
  • Loading branch information
FGYFFFF committed Mar 21, 2023
1 parent 4db85f6 commit 72fff5f
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 53 deletions.
1 change: 1 addition & 0 deletions cmd/hz/config/argument.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ type Argument struct {
NoRecurse bool
HandlerByMethod bool
ForceNew bool
InternalMiddleware bool

CustomizeLayout string
CustomizeLayoutData string
Expand Down
32 changes: 17 additions & 15 deletions cmd/hz/generator/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,21 +47,23 @@ type Service struct {
}

type HttpPackageGenerator struct {
ConfigPath string
Backend meta.Backend
Options []Option
CmdType string
ProjPackage string
HandlerDir string
RouterDir string
ModelDir string
UseDir string
ClientDir string
IdlClientDir string
ForceClientDir string
NeedModel bool
HandlerByMethod bool
BaseDomain string
ConfigPath string
Backend meta.Backend
Options []Option
CmdType string
ProjPackage string
HandlerDir string
RouterDir string
ModelDir string
UseDir string
ClientDir string
IdlClientDir string
ForceClientDir string
BaseDomain string

NeedModel bool
HandlerByMethod bool
InternalMiddleware bool

loadedBackend Backend
curModel *model.Model
Expand Down
8 changes: 5 additions & 3 deletions cmd/hz/generator/package_tpl.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ import (
{{- .GroupName}}.{{.HttpMethod}}("{{.Path}}", append({{.HandlerMiddleware}}Mw(), {{.Handler}})...)
{{- end}}
{{- if ne (len .Children) 0}}
{{.MiddleWare}} := {{template "g" .}}.Group("{{.Path}}", {{.MiddleWare}}Mw()...)
{{.MiddleWare}} := {{template "g" .}}.Group("{{.Path}}", {{.GroupMiddleware}}Mw()...)
{{- end}}
{{- range $_, $router := .Children}}
{{- if ne .Handler ""}}
Expand Down Expand Up @@ -177,11 +177,13 @@ import (
)
{{define "M"}}
func {{.MiddleWare}}Mw() []app.HandlerFunc {
{{- if ne .Children.Len 0}}
func {{.GroupMiddleware}}Mw() []app.HandlerFunc {
// your code...
return nil
}
{{if ne .HandlerMiddleware .MiddleWare -}}
{{end}}
{{- if ne .Handler ""}}
{{if ne .HandlerMiddleware "_" -}}
func {{.HandlerMiddleware}}Mw() []app.HandlerFunc {
// your code...
Expand Down
65 changes: 49 additions & 16 deletions cmd/hz/generator/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,14 @@ type Router struct {
}

type RouterNode struct {
GroupName string
MiddleWare string
GroupName string // current group name(the parent middleware name), used to register route. example: {{.GroupName}}.{{HttpMethod}}
MiddleWare string // current node middleware, used to be group name for children.
HandlerMiddleware string
GroupMiddleware string
PathPrefix string

Path string
Parent *RouterNode
Children childrenRouterInfo

Handler string // {{HandlerPackage}}.{{HandlerName}}
Expand All @@ -60,8 +63,10 @@ func NewRouterTree() *RouterNode {
return &RouterNode{
GroupName: "root",
MiddleWare: "root",
GroupMiddleware: "root",
HandlerMiddleware: "_",
Path: "/",
Parent: nil,
}
}

Expand All @@ -87,8 +92,14 @@ func (routerNode *RouterNode) Update(method *HttpMethod, handlerType, handlerPkg
return nil
}

func (routerNode *RouterNode) RawHandlerName() string {
parts := strings.Split(routerNode.Handler, ".")
handlerName := parts[len(parts)-1]
return handlerName
}

// DyeGroupName traverses the routing tree in depth and names the middleware for each node.
func (routerNode *RouterNode) DyeGroupName() error {
func (routerNode *RouterNode) DyeGroupName(internalMiddleware bool) error {
groups := []string{"root"}

hook := func(layer int, node *RouterNode) error {
Expand All @@ -98,20 +109,24 @@ func (routerNode *RouterNode) DyeGroupName() error {
handlerMiddlewareName := ""
if len(pname) > 1 && pname[0] == '/' {
pname = pname[1:]
if node.Parent != nil {
node.PathPrefix = node.Parent.PathPrefix + "_" + util.ToGoFuncName(pname)
} else {
node.PathPrefix = "_" + util.ToGoFuncName(pname)
}
}
if len(node.Handler) != 0 {
handlerName := strings.Split(node.Handler, ".")
handlerMiddlewareName = handlerName[len(handlerName)-1]
handlerMiddlewareName = node.RawHandlerName()
// If it is a leaf node, then "group middleware name" and "handler middleware name" are the same
if len(node.Children) == 0 {
pname = handlerName[len(handlerName)-1]
pname = handlerMiddlewareName
}
}

pname = util.ConvertToMiddlewareName(pname)
handlerMiddlewareName = util.ConvertToMiddlewareName(handlerMiddlewareName)
pname = convertToMiddlewareName(pname)
handlerMiddlewareName = convertToMiddlewareName(handlerMiddlewareName)

if pname == handlerMiddlewareName {
if pname == handlerMiddlewareName { // leaf node
name, err := util.GetMiddlewareUniqueName(pname)
if err != nil {
return fmt.Errorf("get unique name for middleware '%s' failed, err: %v", name, err)
Expand All @@ -130,7 +145,16 @@ func (routerNode *RouterNode) DyeGroupName() error {
}
}
node.MiddleWare = "_" + pname
node.HandlerMiddleware = "_" + handlerMiddlewareName
if len(node.Handler) != 0 {
node.HandlerMiddleware = "_" + handlerMiddlewareName
if internalMiddleware {
node.HandlerMiddleware = "_" + node.RawHandlerName()
}
}
node.GroupMiddleware = node.MiddleWare
if internalMiddleware {
node.GroupMiddleware = node.PathPrefix
}
}
if layer >= len(groups)-1 {
groups = append(groups, node.MiddleWare)
Expand Down Expand Up @@ -168,7 +192,8 @@ func (routerNode *RouterNode) Insert(name string, method *HttpMethod, handlerTyp
cur := routerNode
for i, p := range paths {
c := &RouterNode{
Path: "/" + p,
Path: "/" + p,
Parent: cur,
}
if i == len(paths)-1 {
// generate handler by method
Expand Down Expand Up @@ -308,7 +333,7 @@ func (pkgGen *HttpPackageGenerator) updateRegister(pkg, rDir, pkgName string) er
}

func (pkgGen *HttpPackageGenerator) genRouter(pkg *HttpPackage, root *RouterNode, handlerPackage, routerDir, routerPackage string) error {
err := root.DyeGroupName()
err := root.DyeGroupName(pkgGen.InternalMiddleware)
if err != nil {
return err
}
Expand Down Expand Up @@ -360,10 +385,11 @@ func (pkgGen *HttpPackageGenerator) updateMiddlewareReg(router interface{}, midd
var middlewareList []string

_ = router.(Router).Router.DFS(0, func(layer int, node *RouterNode) error {
middlewareList = append(middlewareList, node.MiddleWare)
if len(node.MiddleWare) > 1 {
middlewareList = append(middlewareList, node.MiddleWare)
// non-leaf node will generate group middleware
if node.Children.Len() > 0 && len(node.GroupMiddleware) > 1 {
middlewareList = append(middlewareList, node.GroupMiddleware)
}
// the length of HandlerMiddleware will be greater than 1
if len(node.HandlerMiddleware) > 1 {
middlewareList = append(middlewareList, node.HandlerMiddleware)
}
Expand All @@ -376,7 +402,7 @@ func (pkgGen *HttpPackageGenerator) updateMiddlewareReg(router interface{}, midd
}

for _, mw := range middlewareList {
if bytes.Contains(file, []byte(mw+"Mw")) {
if bytes.Contains(file, []byte(mw)) {
continue
}
middlewareSingleTpl := pkgGen.tpls[middlewareSingleTplName]
Expand Down Expand Up @@ -407,3 +433,10 @@ func (pkgGen *HttpPackageGenerator) updateMiddlewareReg(router interface{}, midd

return nil
}

// convertToMiddlewareName converts a route path to a middleware name
func convertToMiddlewareName(path string) string {
path = util.ToVarName([]string{path})
path = strings.ToLower(path)
return path
}
15 changes: 8 additions & 7 deletions cmd/hz/protobuf/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -600,13 +600,14 @@ func (plugin *Plugin) genHttpPackage(ast *descriptorpb.FileDescriptorProto, deps
OutputDir: args.OutDir,
Excludes: args.Excludes,
},
ProjPackage: pkg,
Options: options,
HandlerByMethod: args.HandlerByMethod,
CmdType: args.CmdType,
IdlClientDir: plugin.IdlClientDir,
ForceClientDir: args.ForceClientDir,
BaseDomain: args.BaseDomain,
ProjPackage: pkg,
Options: options,
HandlerByMethod: args.HandlerByMethod,
CmdType: args.CmdType,
IdlClientDir: plugin.IdlClientDir,
ForceClientDir: args.ForceClientDir,
BaseDomain: args.BaseDomain,
InternalMiddleware: args.InternalMiddleware,
}

if args.ModelBackend != "" {
Expand Down
15 changes: 8 additions & 7 deletions cmd/hz/thrift/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,13 +138,14 @@ func (plugin *Plugin) Run() int {
OutputDir: args.OutDir,
Excludes: args.Excludes,
},
ProjPackage: pkg,
Options: options,
HandlerByMethod: args.HandlerByMethod,
CmdType: args.CmdType,
IdlClientDir: util.SubDir(modelDir, pkgInfo.Package),
ForceClientDir: args.ForceClientDir,
BaseDomain: args.BaseDomain,
ProjPackage: pkg,
Options: options,
HandlerByMethod: args.HandlerByMethod,
CmdType: args.CmdType,
IdlClientDir: util.SubDir(modelDir, pkgInfo.Package),
ForceClientDir: args.ForceClientDir,
BaseDomain: args.BaseDomain,
InternalMiddleware: args.InternalMiddleware,
}
if args.ModelBackend != "" {
sg.Backend = meta.Backend(args.ModelBackend)
Expand Down
18 changes: 13 additions & 5 deletions cmd/hz/util/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"net/url"
"path/filepath"
"reflect"
"regexp"
"strconv"
"strings"

Expand Down Expand Up @@ -307,7 +308,7 @@ func ToVarName(paths []string) string {
if c == ':' || c == '*' {
continue
}
if (c >= '0' && c <= '9' && i != 0) || (c >= 'a' && c <= 'z') || (c > 'A' && c <= 'Z') || (c == '_') {
if (c >= '0' && c <= '9' && i != 0) || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_') {
out = append(out, c)
} else {
out = append(out, '_')
Expand Down Expand Up @@ -421,8 +422,15 @@ func SubPackageDir(path string) string {
return path[:index]
}

func ConvertToMiddlewareName(name string) string {
name = ToVarName([]string{name})
name = strings.ToLower(name)
return name
var validFuncReg = regexp.MustCompile("[_0-9a-zA-Z]")

// ToGoFuncName converts a string to a function naming style for go
func ToGoFuncName(s string) string {
ss := []byte(s)
for i := range ss {
if !validFuncReg.Match([]byte{s[i]}) {
ss[i] = '_'
}
}
return string(ss)
}

0 comments on commit 72fff5f

Please sign in to comment.