diff --git a/tools/goctl/api/parser/g4/ast/api.go b/tools/goctl/api/parser/g4/ast/api.go index 2694c6d2..7b2ab929 100644 --- a/tools/goctl/api/parser/g4/ast/api.go +++ b/tools/goctl/api/parser/g4/ast/api.go @@ -9,6 +9,7 @@ import ( ) const prefixKey = "prefix" +const groupKey = "group" // Api describes syntax for api type Api struct { @@ -52,12 +53,16 @@ func (v *ApiVisitor) acceptService(root, final *Api) { } v.duplicateServerItemCheck(service) - var prefix string + var prefix, group string if service.AtServer != nil { p := service.AtServer.Kv.Get(prefixKey) if p != nil { prefix = p.Text() } + g := service.AtServer.Kv.Get(groupKey) + if g != nil { + group = g.Text() + } } for _, route := range service.ServiceApi.ServiceRoute { uniqueRoute := fmt.Sprintf("%s %s", route.Route.Method.Text(), path.Join(prefix, route.Route.Path.Text())) @@ -92,10 +97,14 @@ func (v *ApiVisitor) acceptService(root, final *Api) { v.panic(handlerExpr, "mismatched handler") } - if _, ok := final.handlerM[handlerExpr.Text()]; ok { + handlerKey := handlerExpr.Text() + if len(group) > 0 { + handlerKey = fmt.Sprintf("%s/%s", group, handlerExpr.Text()) + } + if _, ok := final.handlerM[handlerKey]; ok { v.panic(handlerExpr, fmt.Sprintf("duplicate handler '%s'", handlerExpr.Text())) } - final.handlerM[handlerExpr.Text()] = Holder + final.handlerM[handlerKey] = Holder } final.Service = append(final.Service, service) } diff --git a/tools/goctl/api/parser/g4/ast/apiparser.go b/tools/goctl/api/parser/g4/ast/apiparser.go index b0c9c6a5..6f57646b 100644 --- a/tools/goctl/api/parser/g4/ast/apiparser.go +++ b/tools/goctl/api/parser/g4/ast/apiparser.go @@ -240,12 +240,16 @@ func (p *Parser) valid(mainApi, nestedApi *Api) error { func (p *Parser) duplicateRouteCheck(nestedApi *Api, mainHandlerMap, mainRouteMap map[string]PlaceHolder) error { for _, each := range nestedApi.Service { - var prefix string + var prefix, group string if each.AtServer != nil { p := each.AtServer.Kv.Get(prefixKey) if p != nil { prefix = p.Text() } + g := each.AtServer.Kv.Get(groupKey) + if p != nil { + group = g.Text() + } } for _, r := range each.ServiceApi.ServiceRoute { handler := r.GetHandler() @@ -253,9 +257,13 @@ func (p *Parser) duplicateRouteCheck(nestedApi *Api, mainHandlerMap, mainRouteMa return fmt.Errorf("%s handler not exist near line %d", nestedApi.LinePrefix, r.Route.Method.Line()) } - if _, ok := mainHandlerMap[handler.Text()]; ok { + handlerKey := handler.Text() + if len(group) > 0 { + handlerKey = fmt.Sprintf("%s/%s", group, handler.Text()) + } + if _, ok := mainHandlerMap[handlerKey]; ok { return fmt.Errorf("%s line %d:%d duplicate handler '%s'", - nestedApi.LinePrefix, handler.Line(), handler.Column(), handler.Text()) + nestedApi.LinePrefix, handler.Line(), handler.Column(), handlerKey) } p := fmt.Sprintf("%s://%s", r.Route.Method.Text(), path.Join(prefix, r.Route.Path.Text()))