Compare commits

...

6 Commits

Author SHA1 Message Date
dependabot[bot]
af17f9b8ab chore(deps): bump github.com/go-openapi/spec in /tools/goctl
Bumps [github.com/go-openapi/spec](https://github.com/go-openapi/spec) from 0.21.1-0.20250328170532-a3928469592e to 0.22.9.
- [Release notes](https://github.com/go-openapi/spec/releases)
- [Commits](https://github.com/go-openapi/spec/commits/v0.22.9)

---
updated-dependencies:
- dependency-name: github.com/go-openapi/spec
  dependency-version: 0.22.9
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-21 19:52:52 +00:00
dependabot[bot]
84313f2e92 chore(deps): bump actions/setup-go from 6 to 7 (#5694)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-21 01:16:50 +00:00
lxffong
394ffcc19a fix(swagger): expand inline pointer members (#5664)
Co-authored-by: kevin <wanjunfeng@gmail.com>
2026-07-20 00:20:41 +08:00
Kevin Wan
565bcb3f21 feat(goctl): support custom Swagger response status (#5691)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-19 23:57:26 +08:00
dependabot[bot]
6a6b81ef20 chore(deps): bump go.mongodb.org/mongo-driver/v2 from 2.7.0 to 2.8.0 (#5688) 2026-07-17 19:27:27 +08:00
dependabot[bot]
35a7ca9d98 chore(deps): bump github.com/pelletier/go-toml/v2 from 2.4.2 to 2.4.3 (#5678) 2026-07-12 17:07:04 +08:00
16 changed files with 314 additions and 68 deletions

View File

@@ -15,7 +15,7 @@ jobs:
uses: actions/checkout@v7
- name: Set up Go 1.x
uses: actions/setup-go@v6
uses: actions/setup-go@v7
with:
go-version-file: go.mod
check-latest: true
@@ -55,7 +55,7 @@ jobs:
uses: actions/checkout@v7
- name: Set up Go 1.x
uses: actions/setup-go@v6
uses: actions/setup-go@v7
with:
# make sure Go version compatible with go-zero
go-version-file: go.mod

View File

@@ -6,7 +6,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-go@v6
- uses: actions/setup-go@v7
with:
go-version-file: go.mod
check-latest: true

View File

@@ -13,7 +13,7 @@ jobs:
- uses: actions/checkout@v7
- name: Set up Go
uses: actions/setup-go@v6
uses: actions/setup-go@v7
with:
go-version: '1.21'

4
go.mod
View File

@@ -15,7 +15,7 @@ require (
github.com/jackc/pgx/v5 v5.8.0
github.com/jhump/protoreflect v1.18.0
github.com/modelcontextprotocol/go-sdk v1.4.0
github.com/pelletier/go-toml/v2 v2.4.2
github.com/pelletier/go-toml/v2 v2.4.3
github.com/prometheus/client_golang v1.23.2
github.com/redis/go-redis/v9 v9.21.0
github.com/spaolacci/murmur3 v1.1.0
@@ -23,7 +23,7 @@ require (
github.com/titanous/json5 v1.0.0
go.etcd.io/etcd/api/v3 v3.5.21
go.etcd.io/etcd/client/v3 v3.5.21
go.mongodb.org/mongo-driver/v2 v2.7.0
go.mongodb.org/mongo-driver/v2 v2.8.0
go.opentelemetry.io/otel v1.40.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0

8
go.sum
View File

@@ -147,8 +147,8 @@ github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg=
github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c=
github.com/pelletier/go-toml/v2 v2.4.2 h1:M2fKKbmyvI+hGId/D0W64qDBMVhJnNR10O5gIbMc//Q=
github.com/pelletier/go-toml/v2 v2.4.2/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pelletier/go-toml/v2 v2.4.3 h1:GTRvJQutkOSftxIFD5xw9aepkYNuPWmVJpffdDPYVpY=
github.com/pelletier/go-toml/v2 v2.4.3/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 h1:KPpdlQLZcHfTMQRi6bFQ7ogNO0ltFT4PmtwTLW4W+14=
github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -224,8 +224,8 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoB
go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs=
go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY=
go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU=
go.mongodb.org/mongo-driver/v2 v2.7.0 h1:RO+zqavD2/GCL3cxOMyZhx6R9Irzr8/6gsoqx5tcY/c=
go.mongodb.org/mongo-driver/v2 v2.7.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0=
go.mongodb.org/mongo-driver/v2 v2.8.0 h1:CxWDGQYY8QQwNjAl/aq2sfWakdnWZynnqJ9F4DhHbP8=
go.mongodb.org/mongo-driver/v2 v2.8.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=

View File

@@ -54,6 +54,8 @@ const (
propertyKeyDeprecated = "deprecated"
propertyKeyPrefix = "prefix"
propertyKeyAuthType = "authType"
propertyKeyRespCode = "respCode"
propertyKeyResponses = "responses"
propertyKeyHost = "host"
propertyKeyBasePath = "basePath"
propertyKeyWrapCodeMsg = "wrapCodeMsg"

View File

@@ -82,6 +82,7 @@ type (
service Swagger {
@doc (
description: "form demo"
respCode: "201" // HTTP status code corresponding to Swagger
)
@handler form
post /form (FormReq) returns (FormResp)
@@ -102,6 +103,27 @@ type (
Language string `json:"language"`
Gender string `json:"gender"`
}
EmbeddedUser {
UserId int `json:"userId,example=10"`
Username string `json:"username,example=keson.an"`
}
EmbeddedAudit {
TraceId string `json:"traceId,example=trace-001"`
CreatedBy string `json:"createdBy,optional,example=system"`
}
EmbeddedProfile {
EmbeddedUser
*EmbeddedAudit
Nickname string `json:"nickname,optional,example=keson"`
}
EmbeddedJsonReq {
EmbeddedProfile
RequestId string `json:"requestId,example=req-001"`
}
EmbeddedJsonResp {
EmbeddedProfile
Success bool `json:"success,example=true"`
}
ComplexJsonLevel2 {
// basic
Integer int `json:"integer,example=1"`
@@ -237,5 +259,10 @@ service Swagger {
)
@handler jsonComplex
post /json/complex (ComplexJsonReq) returns (ComplexJsonResp)
}
@doc (
description: "embedded json request body API"
)
@handler jsonEmbedded
post /json/embedded (EmbeddedJsonReq) returns (EmbeddedJsonResp)
}

View File

@@ -60,7 +60,7 @@
}
],
"responses": {
"200": {
"201": {
"description": "",
"schema": {
"type": "object",

View File

@@ -84,6 +84,7 @@ type (
service Swagger {
@doc (
description: "form 接口"
respCode: "201" // 对应 Swagger 的 HTTP 状态码
)
@handler form
post /form (FormReq) returns (FormResp)
@@ -244,4 +245,3 @@ service Swagger {
@handler jsonComplex
post /json/complex (ComplexJsonReq) returns (ComplexJsonResp)
}

View File

@@ -60,7 +60,7 @@
}
],
"responses": {
"200": {
"201": {
"description": "",
"schema": {
"type": "object",

View File

@@ -2,64 +2,108 @@ package swagger
import (
"net/http"
"strconv"
"strings"
"github.com/go-openapi/spec"
apiSpec "github.com/zeromicro/go-zero/tools/goctl/api/spec"
)
func jsonResponseFromType(ctx Context, atDoc apiSpec.AtDoc, tp apiSpec.Type) *spec.Responses {
statusCode := responseStatusCode(atDoc)
var response spec.Response
if tp == nil {
return &spec.Responses{
ResponsesProps: spec.ResponsesProps{
StatusCodeResponses: map[int]spec.Response{
http.StatusOK: {
ResponseProps: spec.ResponseProps{
Description: "",
Schema: &spec.Schema{},
},
},
},
response = spec.Response{
ResponseProps: spec.ResponseProps{
Description: "",
},
}
}
props := spec.SchemaProps{
AdditionalProperties: mapFromGoType(ctx, tp),
Items: itemsFromGoType(ctx, tp),
}
if ctx.UseDefinitions {
structName, ok := containsStruct(tp)
if ok {
props.Ref = spec.MustCreateRef(getRefName(structName))
return &spec.Responses{
ResponsesProps: spec.ResponsesProps{
StatusCodeResponses: map[int]spec.Response{
http.StatusOK: {
ResponseProps: spec.ResponseProps{
Schema: &spec.Schema{
SchemaProps: wrapCodeMsgProps(ctx, props, atDoc),
},
},
},
},
},
}
} else {
props := spec.SchemaProps{
AdditionalProperties: mapFromGoType(ctx, tp),
Items: itemsFromGoType(ctx, tp),
}
}
p, _ := propertiesFromType(ctx, tp)
props.Type = typeFromGoType(ctx, tp)
props.Properties = p
return &spec.Responses{
ResponsesProps: spec.ResponsesProps{
StatusCodeResponses: map[int]spec.Response{
http.StatusOK: {
if ctx.UseDefinitions {
structName, ok := containsStruct(tp)
if ok {
props.Ref = spec.MustCreateRef(getRefName(structName))
response = spec.Response{
ResponseProps: spec.ResponseProps{
Schema: &spec.Schema{
SchemaProps: wrapCodeMsgProps(ctx, props, atDoc),
},
},
}
return responsesFromStatusCode(atDoc, statusCode, response)
}
}
p, _ := propertiesFromType(ctx, tp)
props.Type = typeFromGoType(ctx, tp)
props.Properties = p
response = spec.Response{
ResponseProps: spec.ResponseProps{
Schema: &spec.Schema{
SchemaProps: wrapCodeMsgProps(ctx, props, atDoc),
},
},
}
}
return responsesFromStatusCode(atDoc, statusCode, response)
}
func responsesFromStatusCode(atDoc apiSpec.AtDoc, statusCode int, response spec.Response) *spec.Responses {
statusCodeResponses := map[int]spec.Response{
statusCode: response,
}
for code, description := range responseDescriptions(atDoc) {
if code == statusCode {
responseWithDescription := response
responseWithDescription.Description = description
statusCodeResponses[code] = responseWithDescription
} else {
statusCodeResponses[code] = spec.Response{
ResponseProps: spec.ResponseProps{
Description: description,
},
}
}
}
return &spec.Responses{
ResponsesProps: spec.ResponsesProps{
StatusCodeResponses: statusCodeResponses,
},
}
}
func responseStatusCode(atDoc apiSpec.AtDoc) int {
return getOrDefault(atDoc.Properties, propertyKeyRespCode, http.StatusOK, func(str string, def int) int {
statusCode, err := strconv.Atoi(str)
if err != nil || statusCode < http.StatusContinue || statusCode > 599 {
return def
}
return statusCode
})
}
func responseDescriptions(atDoc apiSpec.AtDoc) map[int]string {
descriptions := make(map[int]string)
for _, item := range strings.Split(getStringFromKVOrDefault(atDoc.Properties, propertyKeyResponses, ""), "<br>") {
codeText, description, ok := strings.Cut(item, "-")
if !ok {
continue
}
code, err := strconv.Atoi(strings.TrimSpace(codeText))
if err != nil || code < http.StatusContinue || code > 599 {
continue
}
descriptions[code] = strings.TrimSpace(description)
}
return descriptions
}

View File

@@ -0,0 +1,92 @@
package swagger
import (
"net/http"
"testing"
"github.com/stretchr/testify/assert"
"github.com/zeromicro/go-zero/tools/goctl/api/spec"
)
func TestJsonResponseFromTypeStatusCode(t *testing.T) {
tests := []struct {
name string
properties map[string]string
response spec.Type
want int
}{
{
name: "defaults to ok",
response: spec.PrimitiveType{RawName: "string"},
want: http.StatusOK,
},
{
name: "uses custom status code",
properties: map[string]string{
propertyKeyRespCode: "201",
},
response: spec.PrimitiveType{RawName: "string"},
want: http.StatusCreated,
},
{
name: "supports quoted custom status code",
properties: map[string]string{
propertyKeyRespCode: `"204"`,
},
want: http.StatusNoContent,
},
{
name: "defaults for invalid status code",
properties: map[string]string{
propertyKeyRespCode: "600",
},
response: spec.PrimitiveType{RawName: "string"},
want: http.StatusOK,
},
{
name: "defaults for non-numeric status code",
properties: map[string]string{
propertyKeyRespCode: "created",
},
response: spec.PrimitiveType{RawName: "string"},
want: http.StatusOK,
},
{
name: "uses custom status code without response body",
properties: map[string]string{
propertyKeyRespCode: "204",
},
want: http.StatusNoContent,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
responses := jsonResponseFromType(testingContext(t), spec.AtDoc{
Properties: test.properties,
}, test.response)
assert.Len(t, responses.StatusCodeResponses, 1)
assert.Contains(t, responses.StatusCodeResponses, test.want)
if test.response == nil {
assert.Nil(t, responses.StatusCodeResponses[test.want].Schema)
}
})
}
}
func TestJsonResponseFromTypeMultipleStatusCodes(t *testing.T) {
responses := jsonResponseFromType(testingContext(t), spec.AtDoc{
Properties: map[string]string{
propertyKeyResponses: "200-OK<br>401-Unauthorized<br>404-User not found",
},
}, spec.PrimitiveType{RawName: "string"})
assert.Len(t, responses.StatusCodeResponses, 3)
assert.Equal(t, "OK", responses.StatusCodeResponses[http.StatusOK].Description)
assert.NotNil(t, responses.StatusCodeResponses[http.StatusOK].Schema)
assert.Equal(t, "Unauthorized", responses.StatusCodeResponses[http.StatusUnauthorized].Description)
assert.Nil(t, responses.StatusCodeResponses[http.StatusUnauthorized].Schema)
assert.Equal(t, "User not found", responses.StatusCodeResponses[http.StatusNotFound].Description)
assert.Nil(t, responses.StatusCodeResponses[http.StatusNotFound].Schema)
}

View File

@@ -202,6 +202,8 @@ func expandMembers(ctx Context, tp apiSpec.Type) []apiSpec.Member {
}
members = append(members, v)
}
case apiSpec.PointerType:
members = expandMembers(ctx, val.Type)
}
return members

View File

@@ -3,8 +3,8 @@ package swagger
import (
"testing"
"github.com/zeromicro/go-zero/tools/goctl/api/spec"
"github.com/stretchr/testify/assert"
"github.com/zeromicro/go-zero/tools/goctl/api/spec"
)
func Test_pathVariable2SwaggerVariable(t *testing.T) {
@@ -66,7 +66,7 @@ func TestArrayDefinitionsBug(t *testing.T) {
// Verify the array field has correct structure
assert.Equal(t, "array", arrayField.Type[0])
// Check that we have items
assert.NotNil(t, arrayField.Items, "Array should have items defined")
assert.NotNil(t, arrayField.Items.Schema, "Array items should have schema")
@@ -74,7 +74,7 @@ func TestArrayDefinitionsBug(t *testing.T) {
// The FIX: $ref should be inside items, not at schema level
hasRef := arrayField.Ref.String() != ""
assert.False(t, hasRef, "Schema level should NOT have $ref")
// The $ref should be in the items
hasItemsRef := arrayField.Items.Schema.Ref.String() != ""
assert.True(t, hasItemsRef, "Items should have $ref")
@@ -138,3 +138,55 @@ func TestArrayWithoutDefinitions(t *testing.T) {
assert.Contains(t, arrayField.Items.Schema.Properties, "itemName")
assert.Equal(t, []string{"itemName"}, arrayField.Items.Schema.Required)
}
func TestPropertiesFromTypeInlinePointerMembers(t *testing.T) {
ctx := testingContext(t)
baseStruct := spec.DefineStruct{
RawName: "EmbeddedUser",
Members: []spec.Member{
{
Name: "UserId",
Type: spec.PrimitiveType{RawName: "int"},
Tag: `json:"userId"`,
},
},
}
auditStruct := spec.DefineStruct{
RawName: "EmbeddedAudit",
Members: []spec.Member{
{
Name: "TraceId",
Type: spec.PrimitiveType{RawName: "string"},
Tag: `json:"traceId"`,
},
},
}
testStruct := spec.DefineStruct{
RawName: "EmbeddedProfile",
Members: []spec.Member{
{
Type: baseStruct,
IsInline: true,
},
{
Type: spec.PointerType{
Type: auditStruct,
},
IsInline: true,
},
{
Name: "Nickname",
Type: spec.PrimitiveType{RawName: "string"},
Tag: `json:"nickname,optional"`,
},
},
}
properties, required := propertiesFromType(ctx, testStruct)
assert.Contains(t, properties, "userId")
assert.Contains(t, properties, "traceId")
assert.Contains(t, properties, "nickname")
assert.ElementsMatch(t, []string{"userId", "traceId"}, required)
}

View File

@@ -1,12 +1,12 @@
module github.com/zeromicro/go-zero/tools/goctl
go 1.24.0
go 1.25.0
require (
github.com/DATA-DOG/go-sqlmock v1.5.2
github.com/emicklei/proto v1.14.3
github.com/fatih/structtag v1.2.0
github.com/go-openapi/spec v0.21.1-0.20250328170532-a3928469592e
github.com/go-openapi/spec v0.22.9
github.com/go-sql-driver/mysql v1.10.0
github.com/gookit/color v1.6.1
github.com/iancoleman/strcase v0.3.0
@@ -38,9 +38,16 @@ require (
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.21.1 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/jsonpointer v1.0.0 // indirect
github.com/go-openapi/jsonreference v1.0.0 // indirect
github.com/go-openapi/swag v0.23.1 // indirect
github.com/go-openapi/swag/conv v0.27.3 // indirect
github.com/go-openapi/swag/jsonutils v0.27.3 // indirect
github.com/go-openapi/swag/loading v0.27.3 // indirect
github.com/go-openapi/swag/pools v0.27.3 // indirect
github.com/go-openapi/swag/stringutils v0.27.3 // indirect
github.com/go-openapi/swag/typeutils v0.27.3 // indirect
github.com/go-openapi/swag/yamlutils v0.27.3 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/gnostic-models v0.7.0 // indirect

View File

@@ -41,14 +41,34 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic=
github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
github.com/go-openapi/spec v0.21.1-0.20250328170532-a3928469592e h1:auobAirzhPsLHMso0NVMqK0QunuLDYCK83KnaVUM/RU=
github.com/go-openapi/spec v0.21.1-0.20250328170532-a3928469592e/go.mod h1:NAKTe9SplQBxIUlHlsuId1jk1I7bWTVV/2q/GtdRi6g=
github.com/go-openapi/jsonpointer v1.0.0 h1:kR9tHqY0CtZaOPVFm622dPVNhrvYpwr4uCxgL3h1H8s=
github.com/go-openapi/jsonpointer v1.0.0/go.mod h1:Z3rw7dWu1p9IgitXCFamSlA5lmDiklEB6vkaxcNZW5Y=
github.com/go-openapi/jsonreference v1.0.0 h1:jlmTr6torcd1YgDQvSfNmRtKzYDO4FGBkrAdlAVWnpY=
github.com/go-openapi/jsonreference v1.0.0/go.mod h1:jtwdyGbJk0Xhe5Y+rwtglQP6Sb1WZST4rT32LWB+sv0=
github.com/go-openapi/spec v0.22.9 h1:/vKIFDcGKp0ktZWGbym/tJEWbk6/XOEmAVU0kqKMH+w=
github.com/go-openapi/spec v0.22.9/go.mod h1:b/mNUYIOQOyIiUzUzXEE8xzyZqf93KvM9hQGP91yfl0=
github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU=
github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
github.com/go-openapi/swag/conv v0.27.3 h1:iqJFmGEjmX3AY0lSszABFqRVqOSt99XS0LzNIMJYuhU=
github.com/go-openapi/swag/conv v0.27.3/go.mod h1:nPRmN6jgNme99hpf+nM0auDZGALWIqlwhisKPK/bQhQ=
github.com/go-openapi/swag/jsonutils v0.27.3 h1:1DEz+O82frtSMBcos/7XIn1GnpNTbsD4Bru4Dc/uhRc=
github.com/go-openapi/swag/jsonutils v0.27.3/go.mod h1:qiDCoQvzkMxrV3G8FLEdIU5L+EFYc0zcDOHWT3Yofvo=
github.com/go-openapi/swag/jsonutils/fixtures_test v0.27.3 h1:h/eT9kmGCDdFLJF29lOhzLtF0FmP1AX2MhLJWVebsb8=
github.com/go-openapi/swag/jsonutils/fixtures_test v0.27.3/go.mod h1:mofwUWx70wvskwESqRJ//k/9kURmCgyJl5m5Ppoh5kY=
github.com/go-openapi/swag/loading v0.27.3 h1:L9nQkEgzU7QgFQL+pLEMfGUKxeM4pWwGwbET9Z3weW0=
github.com/go-openapi/swag/loading v0.27.3/go.mod h1:rJ0NeaKsF4CVPnMGjPQl7JlSHzvD0bc2DKXLss1hiuE=
github.com/go-openapi/swag/pools v0.27.3 h1:gXjImP3F6/56wRRcFgEPld084Y6u2gs21ikPBt8NKBk=
github.com/go-openapi/swag/pools v0.27.3/go.mod h1:kVQefhSK5RWuRe7BXsL8htgBPAMpN7HDGpGEknqugeE=
github.com/go-openapi/swag/stringutils v0.27.3 h1:Ru28hnbAvN5wycALQYy8IobHvASq+FUFMlp1QzLM0JI=
github.com/go-openapi/swag/stringutils v0.27.3/go.mod h1:lzRN95CxXmA03XcDWHLOb6nOMcxCqR5rGY0lOgsfRoM=
github.com/go-openapi/swag/typeutils v0.27.3 h1:l6SSrx5eR5/WVwrGNzN6bQ9WqL04mrxNBl9YgQ3rcJ4=
github.com/go-openapi/swag/typeutils v0.27.3/go.mod h1:Srm0xFNRZ1Y+vCxJclo5qzx8aj+1pAKda/YfFPrG0dQ=
github.com/go-openapi/swag/yamlutils v0.27.3 h1:cRFCAoYtslYn9L9T0xWryHy1t7c1MACC+DMj3CLvwvs=
github.com/go-openapi/swag/yamlutils v0.27.3/go.mod h1:6JYBGj8sw/NawMllyZY+cTA8Mzk2etS3ZBASdcyPsiU=
github.com/go-openapi/testify/enable/yaml/v2 v2.6.0 h1:gGHwAJ0R/5jU8BEGDbfRNR3hL68dAVi84WuOApp29B0=
github.com/go-openapi/testify/enable/yaml/v2 v2.6.0/go.mod h1:tY+St1SGq4NFl0QIqdTY4aEdbChAHxhyB77XQi9iJCo=
github.com/go-openapi/testify/v2 v2.6.0 h1:5PKH2HE7YJ/LuRPQGvSxBRlFXNQhSetBLlGAgUEu3ug=
github.com/go-openapi/testify/v2 v2.6.0/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw=
github.com/go-sql-driver/mysql v1.10.0 h1:Q+1LV8DkHJvSYAdR83XzuhDaTykuDx0l6fkXxoWCWfw=
github.com/go-sql-driver/mysql v1.10.0/go.mod h1:M+cqaI7+xxXGG9swrdeUIoPG3Y3KCkF0pZej+SK+nWk=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=