From 27f2ccf2aafea1d033fb238b61db24bcd2136588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Sat, 8 Feb 2025 22:04:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=B0=E6=9F=9C=E8=A7=A3=E6=9E=90=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- generate.go | 36 +++++++++++++++++++++++++++++++++++- parser_test.go | 9 ++------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/generate.go b/generate.go index 432fbca..20ab3a4 100644 --- a/generate.go +++ b/generate.go @@ -8,6 +8,7 @@ package api_doc import ( + "fmt" "git.zhangdeman.cn/gateway/api-doc/define" "git.zhangdeman.cn/zhangdeman/consts" "reflect" @@ -169,6 +170,9 @@ func (g *Generate) AddApi(baseCfg *define.UriBaseConfig, paramList []*define.Par // // Date : 15:25 2025/2/8 func (g *Generate) AddComponentsSchema(pkgPath string, inputType reflect.Type) { + if nil == g.docData { + g.docData = &define.OpenapiDoc{} + } if nil == g.docData.Components { g.docData.Components = &define.Components{ Schemas: map[string]*define.Schema{}, @@ -198,9 +202,39 @@ func (g *Generate) AddComponentsSchema(pkgPath string, inputType reflect.Type) { } // 数组 if inputType.Kind() == reflect.Slice || inputType.Kind() == reflect.Array { - inputType.Comparable() + g.parseSliceItem(inputType) + return } // 结构体 if inputType.Kind() == reflect.Struct { + for i := 0; i < inputType.NumField(); i++ { + if inputType.Field(i).Type.Kind() == reflect.Ptr || + inputType.Field(i).Type.Kind() == reflect.Struct || + inputType.Field(i).Type.Kind() == reflect.Map || + inputType.Field(i).Type.Kind() == reflect.Array || + inputType.Field(i).Type.Kind() == reflect.Slice { + g.AddComponentsSchema(inputType.PkgPath(), inputType.Field(i).Type) + } + fmt.Println(inputType.Field(i).Name) + } } } + +// parseSliceItem 解析数组每一项 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 21:33 2025/2/8 +func (g *Generate) parseSliceItem(inputType reflect.Type) string { + if inputType.Kind() != reflect.Slice && inputType.Kind() != reflect.Array { + // 不是数组 + return "" + } + sliceValue := reflect.MakeSlice(inputType, 1, 1) + sliceItemType := sliceValue.Index(0).Type() + g.AddComponentsSchema(sliceItemType.PkgPath(), sliceItemType) + if len(sliceItemType.PkgPath()) == 0 { + return sliceItemType.String() + } + return sliceItemType.PkgPath() + "." + sliceItemType.String() +} diff --git a/parser_test.go b/parser_test.go index 71fc30c..b7122be 100644 --- a/parser_test.go +++ b/parser_test.go @@ -30,14 +30,9 @@ func Test_parser_Openapi3(t *testing.T) { type B struct { List []A `json:"list"` } - var b *B - tt := reflect.TypeOf(b) - fmt.Println(tt) var bArr []*B - v := reflect.MakeSlice(reflect.TypeOf(bArr), 1, 1) - fmt.Println(v) - index9 := v.Index(0) - fmt.Println(index9, index9.Type()) + g := Generate{} + fmt.Println(g.parseSliceItem(reflect.TypeOf(bArr))) current, _ := user.Current() byteData, _ := os.ReadFile(current.HomeDir + "/Downloads/test-openapi-doc.json") var data define.OpenapiDoc