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 <dream4kingxt@163.com>
This commit is contained in:
@@ -95,20 +95,20 @@ service user-api {
|
|||||||
)
|
)
|
||||||
@server(
|
@server(
|
||||||
handler: GetUserHandler
|
handler: GetUserHandler
|
||||||
folder: user
|
group: user
|
||||||
)
|
)
|
||||||
get /api/user/:name(getRequest) returns(getResponse)
|
get /api/user/:name(getRequest) returns(getResponse)
|
||||||
|
|
||||||
@server(
|
@server(
|
||||||
handler: CreateUserHandler
|
handler: CreateUserHandler
|
||||||
folder: user
|
group: user
|
||||||
)
|
)
|
||||||
post /api/users/create(createRequest)
|
post /api/users/create(createRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
@server(
|
@server(
|
||||||
jwt: Auth
|
jwt: Auth
|
||||||
folder: profile
|
group: profile
|
||||||
)
|
)
|
||||||
service user-api {
|
service user-api {
|
||||||
@doc(summary: user title)
|
@doc(summary: user title)
|
||||||
@@ -135,7 +135,7 @@ service user-api {
|
|||||||
|
|
||||||
1. info部分:描述了api基本信息,比如Auth,api是哪个用途。
|
1. info部分:描述了api基本信息,比如Auth,api是哪个用途。
|
||||||
2. type部分:type类型声明和golang语法兼容。
|
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,
|
service里面包含api路由,比如上面第一组service的第一个路由,doc用来描述此路由的用途,GetProfileHandler表示处理这个路由的handler,
|
||||||
`get /api/profile/:name(getRequest) returns(getResponse)` 中get代表api的请求方式(get/post/put/delete), `/api/profile/:name` 描述了路由path,`:name`通过
|
`get /api/profile/:name(getRequest) returns(getResponse)` 中get代表api的请求方式(get/post/put/delete), `/api/profile/:name` 描述了路由path,`:name`通过
|
||||||
请求getRequest里面的属性赋值,getResponse为返回的结构体,这两个类型都定义在2描述的类型中。
|
请求getRequest里面的属性赋值,getResponse为返回的结构体,这两个类型都定义在2描述的类型中。
|
||||||
|
|||||||
@@ -1,33 +1,33 @@
|
|||||||
type (
|
type (
|
||||||
addReq struct {
|
addReq struct {
|
||||||
book string `form:"book"`
|
book string `form:"book"`
|
||||||
price int64 `form:"price"`
|
price int64 `form:"price"`
|
||||||
}
|
}
|
||||||
|
|
||||||
addResp struct {
|
addResp struct {
|
||||||
ok bool `json:"ok"`
|
ok bool `json:"ok"`
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
checkReq struct {
|
checkReq struct {
|
||||||
book string `form:"book"`
|
book string `form:"book"`
|
||||||
}
|
}
|
||||||
|
|
||||||
checkResp struct {
|
checkResp struct {
|
||||||
found bool `json:"found"`
|
found bool `json:"found"`
|
||||||
price int64 `json:"price"`
|
price int64 `json:"price"`
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
service bookstore-api {
|
service bookstore-api {
|
||||||
@server(
|
@server(
|
||||||
handler: AddHandler
|
handler: AddHandler
|
||||||
)
|
)
|
||||||
get /add(addReq) returns(addResp)
|
get /add (addReq) returns (addResp)
|
||||||
|
|
||||||
@server(
|
@server(
|
||||||
handler: CheckHandler
|
handler: CheckHandler
|
||||||
)
|
)
|
||||||
get /check(checkReq) returns(checkResp)
|
get /check (checkReq) returns (checkResp)
|
||||||
}
|
}
|
||||||
@@ -183,9 +183,9 @@ func getHandlerBaseName(handler string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getHandlerFolderPath(group spec.Group, route spec.Route) 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 {
|
if !ok {
|
||||||
folder, ok = apiutil.GetAnnotationValue(group.Annotations, "server", folderProperty)
|
folder, ok = apiutil.GetAnnotationValue(group.Annotations, "server", groupProperty)
|
||||||
if !ok {
|
if !ok {
|
||||||
return handlerDir
|
return handlerDir
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,9 +113,9 @@ func genLogicByRoute(dir string, group spec.Group, route spec.Route) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getLogicFolderPath(group spec.Group, route spec.Route) string {
|
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 {
|
if !ok {
|
||||||
folder, ok = util.GetAnnotationValue(group.Annotations, "server", folderProperty)
|
folder, ok = util.GetAnnotationValue(group.Annotations, "server", groupProperty)
|
||||||
if !ok {
|
if !ok {
|
||||||
return logicDir
|
return logicDir
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,9 +136,9 @@ func genRouteImports(parentPkg string, api *spec.ApiSpec) string {
|
|||||||
importSet.AddStr(fmt.Sprintf("\"%s\"", util.JoinPackages(parentPkg, contextDir)))
|
importSet.AddStr(fmt.Sprintf("\"%s\"", util.JoinPackages(parentPkg, contextDir)))
|
||||||
for _, group := range api.Service.Groups {
|
for _, group := range api.Service.Groups {
|
||||||
for _, route := range group.Routes {
|
for _, route := range group.Routes {
|
||||||
folder, ok := apiutil.GetAnnotationValue(route.Annotations, "server", folderProperty)
|
folder, ok := apiutil.GetAnnotationValue(route.Annotations, "server", groupProperty)
|
||||||
if !ok {
|
if !ok {
|
||||||
folder, ok = apiutil.GetAnnotationValue(group.Annotations, "server", folderProperty)
|
folder, ok = apiutil.GetAnnotationValue(group.Annotations, "server", groupProperty)
|
||||||
if !ok {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -165,11 +165,11 @@ func getRoutes(api *spec.ApiSpec) ([]group, error) {
|
|||||||
return nil, fmt.Errorf("missing handler annotation for route %q", r.Path)
|
return nil, fmt.Errorf("missing handler annotation for route %q", r.Path)
|
||||||
}
|
}
|
||||||
handler = getHandlerBaseName(handler) + "Handler(serverCtx)"
|
handler = getHandlerBaseName(handler) + "Handler(serverCtx)"
|
||||||
folder, ok := apiutil.GetAnnotationValue(r.Annotations, "server", folderProperty)
|
folder, ok := apiutil.GetAnnotationValue(r.Annotations, "server", groupProperty)
|
||||||
if ok {
|
if ok {
|
||||||
handler = folder + "." + strings.ToUpper(handler[:1]) + handler[1:]
|
handler = folder + "." + strings.ToUpper(handler[:1]) + handler[1:]
|
||||||
} else {
|
} else {
|
||||||
folder, ok = apiutil.GetAnnotationValue(g.Annotations, "server", folderProperty)
|
folder, ok = apiutil.GetAnnotationValue(g.Annotations, "server", groupProperty)
|
||||||
if ok {
|
if ok {
|
||||||
handler = folder + "." + strings.ToUpper(handler[:1]) + handler[1:]
|
handler = folder + "." + strings.ToUpper(handler[:1]) + handler[1:]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package gogen
|
package gogen
|
||||||
|
|
||||||
const (
|
const (
|
||||||
interval = "internal/"
|
interval = "internal/"
|
||||||
typesPacket = "types"
|
typesPacket = "types"
|
||||||
configDir = interval + "config"
|
configDir = interval + "config"
|
||||||
contextDir = interval + "svc"
|
contextDir = interval + "svc"
|
||||||
handlerDir = interval + "handler"
|
handlerDir = interval + "handler"
|
||||||
logicDir = interval + "logic"
|
logicDir = interval + "logic"
|
||||||
typesDir = interval + typesPacket
|
typesDir = interval + typesPacket
|
||||||
folderProperty = "folder"
|
groupProperty = "group"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -88,15 +88,17 @@ func (p *serviceEntityParser) parseLine(line string, api *spec.ApiSpec, annos []
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(fields) < 3 {
|
if len(fields) < 2 {
|
||||||
return defaultErr
|
return defaultErr
|
||||||
}
|
}
|
||||||
|
|
||||||
method := fields[0]
|
method := fields[0]
|
||||||
path := fields[1]
|
path := fields[1]
|
||||||
req := fields[2]
|
var req string
|
||||||
var resp string
|
var resp string
|
||||||
|
|
||||||
|
if len(fields) > 2 {
|
||||||
|
req = fields[2]
|
||||||
|
}
|
||||||
if stringx.Contains(fields, returnsTag) {
|
if stringx.Contains(fields, returnsTag) {
|
||||||
if fields[len(fields)-1] != returnsTag {
|
if fields[len(fields)-1] != returnsTag {
|
||||||
resp = fields[len(fields)-1]
|
resp = fields[len(fields)-1]
|
||||||
|
|||||||
@@ -90,21 +90,20 @@ func MatchStruct(api string) (*ApiStruct, error) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(line, "import") {
|
if isImportBeginLine(line) {
|
||||||
parseImport = true
|
parseImport = true
|
||||||
}
|
}
|
||||||
if parseImport && (strings.HasPrefix(line, "type") || strings.HasPrefix(line, "@server") ||
|
if parseImport && (isTypeBeginLine(line) || isServiceBeginLine(line)) {
|
||||||
strings.HasPrefix(line, "service")) {
|
|
||||||
parseImport = false
|
parseImport = false
|
||||||
result.Imports = segment
|
result.Imports = segment
|
||||||
segment = line + "\n"
|
segment = line + "\n"
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(line, "type") {
|
if isTypeBeginLine(line) {
|
||||||
parseType = true
|
parseType = true
|
||||||
}
|
}
|
||||||
if strings.HasPrefix(line, "@server") || strings.HasPrefix(line, "service") {
|
if isServiceBeginLine(line) {
|
||||||
if parseType {
|
if parseType {
|
||||||
parseType = false
|
parseType = false
|
||||||
result.StructBody = segment
|
result.StructBody = segment
|
||||||
@@ -122,3 +121,15 @@ func MatchStruct(api string) (*ApiStruct, error) {
|
|||||||
result.Service = segment
|
result.Service = segment
|
||||||
return &result, nil
|
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, "{"))
|
||||||
|
}
|
||||||
|
|||||||
@@ -82,20 +82,20 @@ service user-api {
|
|||||||
)
|
)
|
||||||
@server(
|
@server(
|
||||||
handler: GetUserHandler
|
handler: GetUserHandler
|
||||||
folder: user
|
group: user
|
||||||
)
|
)
|
||||||
get /api/user/:name(getRequest) returns(getResponse)
|
get /api/user/:name(getRequest) returns(getResponse)
|
||||||
|
|
||||||
@server(
|
@server(
|
||||||
handler: CreateUserHandler
|
handler: CreateUserHandler
|
||||||
folder: user
|
group: user
|
||||||
)
|
)
|
||||||
post /api/users/create(createRequest)
|
post /api/users/create(createRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
@server(
|
@server(
|
||||||
jwt: Auth
|
jwt: Auth
|
||||||
folder: profile
|
group: profile
|
||||||
)
|
)
|
||||||
service user-api {
|
service user-api {
|
||||||
@doc(summary: user title)
|
@doc(summary: user title)
|
||||||
@@ -121,7 +121,7 @@ service user-api {
|
|||||||
|
|
||||||
1. info部分:描述了api基本信息,比如Auth,api是哪个用途。
|
1. info部分:描述了api基本信息,比如Auth,api是哪个用途。
|
||||||
2. type部分:type类型声明和golang语法兼容。
|
2. type部分:type类型声明和golang语法兼容。
|
||||||
3. service部分:service代表一组服务,一个服务可以由多组名称相同的service组成,可以针对每一组service配置folder属性来指定service生成所在子目录。
|
3. service部分:service代表一组服务,一个服务可以由多组名称相同的service组成,可以针对每一组service配置group属性来指定service生成所在子目录。
|
||||||
service里面包含api路由,比如上面第一组service的第一个路由,doc用来描述此路由的用途,GetProfileHandler表示处理这个路由的handler,
|
service里面包含api路由,比如上面第一组service的第一个路由,doc用来描述此路由的用途,GetProfileHandler表示处理这个路由的handler,
|
||||||
`get /api/profile/:name(getRequest) returns(getResponse)` 中get代表api的请求方式(get/post/put/delete), `/api/profile/:name` 描述了路由path,`:name`通过
|
`get /api/profile/:name(getRequest) returns(getResponse)` 中get代表api的请求方式(get/post/put/delete), `/api/profile/:name` 描述了路由path,`:name`通过
|
||||||
请求getRequest里面的属性赋值,getResponse为返回的结构体,这两个类型都定义在2描述的类型中。
|
请求getRequest里面的属性赋值,getResponse为返回的结构体,这两个类型都定义在2描述的类型中。
|
||||||
|
|||||||
Reference in New Issue
Block a user