Skip to content

Feat/support x extension swagger - #5739

Draft
ljluestc wants to merge 1 commit into
zeromicro:masterfrom
ljluestc:feat/support-x-extension-swagger
Draft

ljluestc wants to merge 1 commit into
zeromicro:masterfrom
ljluestc:feat/support-x-extension-swagger

Conversation

@ljluestc

Copy link
Copy Markdown

feat(api/swagger): 在 .api 文件中支持自定义 x- 扩展字段并生成 Swagger

关联 issue:go-zero/go-zero#5628

摘要

本改动让 API 作者可以直接在 .api 文件里声明自定义 Swagger 扩展字段(x-*),语法是在路由的 @handler 之前添加 @x-<key> 注解:

service order {
    @doc "Create Order"
    @x-log-enabled true
    @x-rate-limit "100/min"
    @x-owners `["alice","bob"]`
    @handler createOrder
    post /order/create (CreateOrderRequest) returns (CreateOrderResponse)
}

生成的 Swagger JSON 会在 operation 上带上这些扩展字段:

"post": {
    "x-log-enabled": true,
    "x-rate-limit": "100/min",
    "x-owners": ["alice", "bob"]
}

改动内容

  • 词法扫描tools/goctl/pkg/parser/api/scanner/scanner.go):识别 @x-<key> 词法单元。
  • Token / ASTtools/goctl/pkg/parser/api/token/token.gotools/goctl/pkg/parser/api/ast/servicestatement.go):新增 AT_X token 类型,以及 AtXStmt / AtXAnnotations AST 节点。
  • 解析器tools/goctl/pkg/parser/api/parser/parser.go):在 @handler 前解析零个或多个 @x-* 注解,并在 ParseForUintTest 中暴露该能力。
  • 分析器 / spectools/goctl/pkg/parser/api/parser/analyzer.gotools/goctl/api/spec/spec.go):将注解写入 spec.Route.Extensions,并移除一处重复的 @doc 转换。
  • Swagger 生成tools/goctl/api/swagger/swagger.gotools/goctl/api/swagger/path.go):将扩展值解析为布尔值、数字、字符串或 JSON 数组/对象,并写入 spec.Operation.Extensions
  • 测试tools/goctl/pkg/parser/api/parser/parser_test.gotools/goctl/api/swagger/swagger_test.go):覆盖独立 @x-* 解析、service 级解析以及端到端 Swagger 生成,包括字符串、布尔、数字、JSON 数组/对象等取值。

扩展字段值解析规则

按以下顺序解析值:

  1. JSON 数组或对象(支持双引号字符串和反引号 raw string)。
  2. 带引号或反引号的字符串字面量。
  3. 布尔字面量(true / false)。
  4. 数字字面量(如 303.14)。
  5. 其它情况按普通字符串返回。

验证

cd tools/goctl
go test ./pkg/parser/api/... ./api/swagger/...
go build ./...

所有测试通过,构建成功。

…ration from .api files

Implements go-zero/go-zero#5628 by adding @x-<key> annotations before @handler, wiring them through the parser/analyzer/spec into the Swagger operation extensions, and supporting boolean/numeric/string/JSON-array/object values.
@ljluestc
ljluestc force-pushed the feat/support-x-extension-swagger branch from 2cea78a to 3d73395 Compare August 23, 2026 22:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant