From e7d46aa6e26360c581b47ad97d5bf01c065fad3d Mon Sep 17 00:00:00 2001 From: kingxt Date: Tue, 29 Sep 2020 11:14:52 +0800 Subject: [PATCH] refactor and rename folder to group (#106) * rebase upstream * rebase * trim no need line * trim no need line * trim no need line * update doc * remove update * remove no need * remove no need * goctl add jwt support * goctl add jwt support * goctl add jwt support * goctl support import * goctl support import * support return () * support return () * revert * format api * refactor and rename folder to group Co-authored-by: kingxt --- doc/goctl.md | 8 +++---- example/bookstore/api/bookstore.api | 32 +++++++++++++------------- tools/goctl/api/gogen/genhandlers.go | 4 ++-- tools/goctl/api/gogen/genlogic.go | 4 ++-- tools/goctl/api/gogen/genroutes.go | 8 +++---- tools/goctl/api/gogen/vars.go | 16 ++++++------- tools/goctl/api/parser/servicestate.go | 8 ++++--- tools/goctl/api/parser/util.go | 21 +++++++++++++---- tools/goctl/goctl.md | 8 +++---- 9 files changed, 61 insertions(+), 48 deletions(-) diff --git a/doc/goctl.md b/doc/goctl.md index fcaa1145..519fb606 100644 --- a/doc/goctl.md +++ b/doc/goctl.md @@ -95,20 +95,20 @@ service user-api { ) @server( handler: GetUserHandler - folder: user + group: user ) get /api/user/:name(getRequest) returns(getResponse) @server( handler: CreateUserHandler - folder: user + group: user ) post /api/users/create(createRequest) } @server( jwt: Auth - folder: profile + group: profile ) service user-api { @doc(summary: user title) @@ -135,7 +135,7 @@ service user-api { 1. info部分:描述了api基本信息,比如Auth,api是哪个用途。 2. type部分:type类型声明和golang语法兼容。 -3. service部分:service代表一组服务,一个服务可以由多组名称相同的service组成,可以针对每一组service配置jwt和auth认证,另外通过folder属性可以指定service生成所在子目录。 +3. service部分:service代表一组服务,一个服务可以由多组名称相同的service组成,可以针对每一组service配置jwt和auth认证,另外通过group属性可以指定service生成所在子目录。 service里面包含api路由,比如上面第一组service的第一个路由,doc用来描述此路由的用途,GetProfileHandler表示处理这个路由的handler, `get /api/profile/:name(getRequest) returns(getResponse)` 中get代表api的请求方式(get/post/put/delete), `/api/profile/:name` 描述了路由path,`:name`通过 请求getRequest里面的属性赋值,getResponse为返回的结构体,这两个类型都定义在2描述的类型中。 diff --git a/example/bookstore/api/bookstore.api b/example/bookstore/api/bookstore.api index 1bdd31d9..009f4531 100644 --- a/example/bookstore/api/bookstore.api +++ b/example/bookstore/api/bookstore.api @@ -1,33 +1,33 @@ type ( - addReq struct { - book string `form:"book"` - price int64 `form:"price"` - } + addReq struct { + book string `form:"book"` + price int64 `form:"price"` + } - addResp struct { - ok bool `json:"ok"` - } + addResp struct { + ok bool `json:"ok"` + } ) type ( - checkReq struct { - book string `form:"book"` - } + checkReq struct { + book string `form:"book"` + } - checkResp struct { - found bool `json:"found"` - price int64 `json:"price"` - } + checkResp struct { + found bool `json:"found"` + price int64 `json:"price"` + } ) service bookstore-api { @server( handler: AddHandler ) - get /add(addReq) returns(addResp) + get /add (addReq) returns (addResp) @server( handler: CheckHandler ) - get /check(checkReq) returns(checkResp) + get /check (checkReq) returns (checkResp) } \ No newline at end of file diff --git a/tools/goctl/api/gogen/genhandlers.go b/tools/goctl/api/gogen/genhandlers.go index 8647d23f..b30d04ce 100644 --- a/tools/goctl/api/gogen/genhandlers.go +++ b/tools/goctl/api/gogen/genhandlers.go @@ -183,9 +183,9 @@ func getHandlerBaseName(handler string) string { } func getHandlerFolderPath(group spec.Group, route spec.Route) string { - folder, ok := apiutil.GetAnnotationValue(route.Annotations, "server", folderProperty) + folder, ok := apiutil.GetAnnotationValue(route.Annotations, "server", groupProperty) if !ok { - folder, ok = apiutil.GetAnnotationValue(group.Annotations, "server", folderProperty) + folder, ok = apiutil.GetAnnotationValue(group.Annotations, "server", groupProperty) if !ok { return handlerDir } diff --git a/tools/goctl/api/gogen/genlogic.go b/tools/goctl/api/gogen/genlogic.go index e6284487..ff569de8 100644 --- a/tools/goctl/api/gogen/genlogic.go +++ b/tools/goctl/api/gogen/genlogic.go @@ -113,9 +113,9 @@ func genLogicByRoute(dir string, group spec.Group, route spec.Route) error { } func getLogicFolderPath(group spec.Group, route spec.Route) string { - folder, ok := util.GetAnnotationValue(route.Annotations, "server", folderProperty) + folder, ok := util.GetAnnotationValue(route.Annotations, "server", groupProperty) if !ok { - folder, ok = util.GetAnnotationValue(group.Annotations, "server", folderProperty) + folder, ok = util.GetAnnotationValue(group.Annotations, "server", groupProperty) if !ok { return logicDir } diff --git a/tools/goctl/api/gogen/genroutes.go b/tools/goctl/api/gogen/genroutes.go index 4e745626..bceea619 100644 --- a/tools/goctl/api/gogen/genroutes.go +++ b/tools/goctl/api/gogen/genroutes.go @@ -136,9 +136,9 @@ func genRouteImports(parentPkg string, api *spec.ApiSpec) string { importSet.AddStr(fmt.Sprintf("\"%s\"", util.JoinPackages(parentPkg, contextDir))) for _, group := range api.Service.Groups { for _, route := range group.Routes { - folder, ok := apiutil.GetAnnotationValue(route.Annotations, "server", folderProperty) + folder, ok := apiutil.GetAnnotationValue(route.Annotations, "server", groupProperty) if !ok { - folder, ok = apiutil.GetAnnotationValue(group.Annotations, "server", folderProperty) + folder, ok = apiutil.GetAnnotationValue(group.Annotations, "server", groupProperty) if !ok { continue } @@ -165,11 +165,11 @@ func getRoutes(api *spec.ApiSpec) ([]group, error) { return nil, fmt.Errorf("missing handler annotation for route %q", r.Path) } handler = getHandlerBaseName(handler) + "Handler(serverCtx)" - folder, ok := apiutil.GetAnnotationValue(r.Annotations, "server", folderProperty) + folder, ok := apiutil.GetAnnotationValue(r.Annotations, "server", groupProperty) if ok { handler = folder + "." + strings.ToUpper(handler[:1]) + handler[1:] } else { - folder, ok = apiutil.GetAnnotationValue(g.Annotations, "server", folderProperty) + folder, ok = apiutil.GetAnnotationValue(g.Annotations, "server", groupProperty) if ok { handler = folder + "." + strings.ToUpper(handler[:1]) + handler[1:] } diff --git a/tools/goctl/api/gogen/vars.go b/tools/goctl/api/gogen/vars.go index 17656f1b..6a43fc83 100644 --- a/tools/goctl/api/gogen/vars.go +++ b/tools/goctl/api/gogen/vars.go @@ -1,12 +1,12 @@ package gogen const ( - interval = "internal/" - typesPacket = "types" - configDir = interval + "config" - contextDir = interval + "svc" - handlerDir = interval + "handler" - logicDir = interval + "logic" - typesDir = interval + typesPacket - folderProperty = "folder" + interval = "internal/" + typesPacket = "types" + configDir = interval + "config" + contextDir = interval + "svc" + handlerDir = interval + "handler" + logicDir = interval + "logic" + typesDir = interval + typesPacket + groupProperty = "group" ) diff --git a/tools/goctl/api/parser/servicestate.go b/tools/goctl/api/parser/servicestate.go index a73a67d7..59f5cdcc 100644 --- a/tools/goctl/api/parser/servicestate.go +++ b/tools/goctl/api/parser/servicestate.go @@ -88,15 +88,17 @@ func (p *serviceEntityParser) parseLine(line string, api *spec.ApiSpec, annos [] } } - if len(fields) < 3 { + if len(fields) < 2 { return defaultErr } - method := fields[0] path := fields[1] - req := fields[2] + var req string var resp string + if len(fields) > 2 { + req = fields[2] + } if stringx.Contains(fields, returnsTag) { if fields[len(fields)-1] != returnsTag { resp = fields[len(fields)-1] diff --git a/tools/goctl/api/parser/util.go b/tools/goctl/api/parser/util.go index d03fb8c1..6c5413ef 100644 --- a/tools/goctl/api/parser/util.go +++ b/tools/goctl/api/parser/util.go @@ -90,21 +90,20 @@ func MatchStruct(api string) (*ApiStruct, error) { continue } - if strings.HasPrefix(line, "import") { + if isImportBeginLine(line) { parseImport = true } - if parseImport && (strings.HasPrefix(line, "type") || strings.HasPrefix(line, "@server") || - strings.HasPrefix(line, "service")) { + if parseImport && (isTypeBeginLine(line) || isServiceBeginLine(line)) { parseImport = false result.Imports = segment segment = line + "\n" continue } - if strings.HasPrefix(line, "type") { + if isTypeBeginLine(line) { parseType = true } - if strings.HasPrefix(line, "@server") || strings.HasPrefix(line, "service") { + if isServiceBeginLine(line) { if parseType { parseType = false result.StructBody = segment @@ -122,3 +121,15 @@ func MatchStruct(api string) (*ApiStruct, error) { result.Service = segment return &result, nil } + +func isImportBeginLine(line string) bool { + return strings.HasPrefix(line, "import") && strings.HasSuffix(line, ".api") +} + +func isTypeBeginLine(line string) bool { + return strings.HasPrefix(line, "type") +} + +func isServiceBeginLine(line string) bool { + return strings.HasPrefix(line, "@server(") || (strings.HasPrefix(line, "service") && strings.HasSuffix(line, "{")) +} diff --git a/tools/goctl/goctl.md b/tools/goctl/goctl.md index 6c31d2d9..4f06c64a 100644 --- a/tools/goctl/goctl.md +++ b/tools/goctl/goctl.md @@ -82,20 +82,20 @@ service user-api { ) @server( handler: GetUserHandler - folder: user + group: user ) get /api/user/:name(getRequest) returns(getResponse) @server( handler: CreateUserHandler - folder: user + group: user ) post /api/users/create(createRequest) } @server( jwt: Auth - folder: profile + group: profile ) service user-api { @doc(summary: user title) @@ -121,7 +121,7 @@ service user-api { 1. info部分:描述了api基本信息,比如Auth,api是哪个用途。 2. type部分:type类型声明和golang语法兼容。 -3. service部分:service代表一组服务,一个服务可以由多组名称相同的service组成,可以针对每一组service配置folder属性来指定service生成所在子目录。 +3. service部分:service代表一组服务,一个服务可以由多组名称相同的service组成,可以针对每一组service配置group属性来指定service生成所在子目录。 service里面包含api路由,比如上面第一组service的第一个路由,doc用来描述此路由的用途,GetProfileHandler表示处理这个路由的handler, `get /api/profile/:name(getRequest) returns(getResponse)` 中get代表api的请求方式(get/post/put/delete), `/api/profile/:name` 描述了路由path,`:name`通过 请求getRequest里面的属性赋值,getResponse为返回的结构体,这两个类型都定义在2描述的类型中。