From eafd11d949be9c8828de1ca666b4906bcc729364 Mon Sep 17 00:00:00 2001 From: kesonan Date: Sun, 27 Apr 2025 23:18:33 +0800 Subject: [PATCH] =?UTF-8?q?goctl:=20supported=20api=20types=20group=20for?= =?UTF-8?q?=20EXPERIMENTAL(=E5=AE=9E=E9=AA=8C=E6=80=A7=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=9A=E6=94=AF=E6=8C=81=20api=20type=20=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=93=E6=8C=89=E7=85=A7=E5=88=86=E7=BB=84=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86=E6=96=87=E4=BB=B6)=20(#4810)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/goctl/api/gogen/gentypes.go | 86 +++++++++++++++++++++++++++++-- tools/goctl/api/gogen/vars.go | 2 + 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/tools/goctl/api/gogen/gentypes.go b/tools/goctl/api/gogen/gentypes.go index 5ee51abe9..89f3295d0 100644 --- a/tools/goctl/api/gogen/gentypes.go +++ b/tools/goctl/api/gogen/gentypes.go @@ -6,12 +6,14 @@ import ( "io" "os" "path" + "sort" "strings" "github.com/zeromicro/go-zero/tools/goctl/api/spec" apiutil "github.com/zeromicro/go-zero/tools/goctl/api/util" "github.com/zeromicro/go-zero/tools/goctl/config" "github.com/zeromicro/go-zero/tools/goctl/internal/version" + "github.com/zeromicro/go-zero/tools/goctl/pkg/env" "github.com/zeromicro/go-zero/tools/goctl/util" "github.com/zeromicro/go-zero/tools/goctl/util/format" ) @@ -39,20 +41,89 @@ func BuildTypes(types []spec.Type) (string, error) { return builder.String(), nil } -func genTypes(dir string, cfg *config.Config, api *spec.ApiSpec) error { - val, err := BuildTypes(api.Types) +func removeTypeFromDefault(tp spec.Type, group string, groupTypes map[string]map[string]spec.Type) map[string]map[string]spec.Type { + switch val := tp.(type) { + case spec.DefineStruct: + typeName := util.Title(tp.Name()) + defaultGroups, ok := groupTypes[groupTypeDefault] + if ok { + delete(defaultGroups, typeName) + types, ok := groupTypes[group] + if !ok { + types = make(map[string]spec.Type) + } + types[typeName] = tp + groupTypes[group] = types + } + groupTypes[groupTypeDefault] = defaultGroups + case spec.PointerType: + groupTypes = removeTypeFromDefault(val.Type, group, groupTypes) + case spec.ArrayType: + groupTypes = removeTypeFromDefault(val.Value, group, groupTypes) + } + return groupTypes +} + +func genTypesWithGroup(dir string, cfg *config.Config, api *spec.ApiSpec) error { + groupTypes := make(map[string]map[string]spec.Type) + for _, v := range api.Types { + types, ok := groupTypes[groupTypeDefault] + if !ok { + types = make(map[string]spec.Type) + } + types[util.Title(v.Name())] = v + groupTypes[groupTypeDefault] = types + } + + for _, v := range api.Service.Groups { + group := v.GetAnnotation(groupProperty) + if len(group) == 0 { + continue + } + for _, v := range v.Routes { + if v.RequestType != nil { + groupTypes = removeTypeFromDefault(v.RequestType, group, groupTypes) + } + if v.ResponseType != nil { + groupTypes = removeTypeFromDefault(v.ResponseType, group, groupTypes) + } + } + } + + for group, typeGroup := range groupTypes { + var types []spec.Type + for _, v := range typeGroup { + types = append(types, v) + } + sort.Slice(types, func(i, j int) bool { + return types[i].Name() < types[j].Name() + }) + + if err := writeTypes(dir, group, cfg, types); err != nil { + return err + } + } + + return nil +} + +func writeTypes(dir, baseFilename string, cfg *config.Config, types []spec.Type) error { + if len(types) == 0 { + return nil + } + val, err := BuildTypes(types) if err != nil { return err } - typeFilename, err := format.FileNamingFormat(cfg.NamingFormat, typesFile) + typeFilename, err := format.FileNamingFormat(cfg.NamingFormat, baseFilename) if err != nil { return err } typeFilename = typeFilename + ".go" filename := path.Join(dir, typesDir, typeFilename) - os.Remove(filename) + _ = os.Remove(filename) return genFile(fileGenConfig{ dir: dir, @@ -70,6 +141,13 @@ func genTypes(dir string, cfg *config.Config, api *spec.ApiSpec) error { }) } +func genTypes(dir string, cfg *config.Config, api *spec.ApiSpec) error { + if env.UseExperimental() { + return genTypesWithGroup(dir, cfg, api) + } + return writeTypes(dir, typesFile, cfg, api.Types) +} + func writeType(writer io.Writer, tp spec.Type) error { structType, ok := tp.(spec.DefineStruct) if !ok { diff --git a/tools/goctl/api/gogen/vars.go b/tools/goctl/api/gogen/vars.go index c55142da5..88f58ec0e 100644 --- a/tools/goctl/api/gogen/vars.go +++ b/tools/goctl/api/gogen/vars.go @@ -10,4 +10,6 @@ const ( middlewareDir = internal + "middleware" typesDir = internal + typesPacket groupProperty = "group" + + groupTypeDefault="types" )