package gogen import ( "fmt" "path" "strings" "github.com/tal-tech/go-zero/tools/goctl/api/spec" "github.com/tal-tech/go-zero/tools/goctl/config" ctlutil "github.com/tal-tech/go-zero/tools/goctl/util" "github.com/tal-tech/go-zero/tools/goctl/util/format" "github.com/tal-tech/go-zero/tools/goctl/vars" ) const logicTemplate = `package logic import ( {{.imports}} ) type {{.logic}} struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func New{{.logic}}(ctx context.Context, svcCtx *svc.ServiceContext) {{.logic}} { return {{.logic}}{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *{{.logic}}) {{.function}}({{.request}}) {{.responseType}} { // todo: add your logic here and delete this line {{.returnString}} } ` func genLogic(dir string, cfg *config.Config, api *spec.ApiSpec) error { for _, g := range api.Service.Groups { for _, r := range g.Routes { err := genLogicByRoute(dir, cfg, g, r) if err != nil { return err } } } return nil } func genLogicByRoute(dir string, cfg *config.Config, group spec.Group, route spec.Route) error { logic := getLogicName(route) goFile, err := format.FileNamingFormat(cfg.NamingFormat, logic) if err != nil { return err } parentPkg, err := getParentPackage(dir) if err != nil { return err } imports := genLogicImports(route, parentPkg) var responseString string var returnString string var requestString string if len(route.ResponseTypeName()) > 0 { resp := responseGoTypeName(route, typesPacket) responseString = "(" + resp + ", error)" if strings.HasPrefix(resp, "*") { returnString = fmt.Sprintf("return &%s{}, nil", strings.TrimPrefix(resp, "*")) } else { returnString = fmt.Sprintf("return %s{}, nil", resp) } } else { responseString = "error" returnString = "return nil" } if len(route.RequestTypeName()) > 0 { requestString = "req " + requestGoTypeName(route, typesPacket) } return genFile(fileGenConfig{ dir: dir, subdir: getLogicFolderPath(group, route), filename: goFile + ".go", templateName: "logicTemplate", category: category, templateFile: logicTemplateFile, builtinTemplate: logicTemplate, data: map[string]string{ "imports": imports, "logic": strings.Title(logic), "function": strings.Title(strings.TrimSuffix(logic, "Logic")), "responseType": responseString, "returnString": returnString, "request": requestString, }, }) } func getLogicFolderPath(group spec.Group, route spec.Route) string { folder := route.GetAnnotation(groupProperty) if len(folder) == 0 { folder = group.GetAnnotation(groupProperty) if len(folder) == 0 { return logicDir } } folder = strings.TrimPrefix(folder, "/") folder = strings.TrimSuffix(folder, "/") return path.Join(logicDir, folder) } func genLogicImports(route spec.Route, parentPkg string) string { var imports []string imports = append(imports, `"context"`+"\n") imports = append(imports, fmt.Sprintf("\"%s\"", ctlutil.JoinPackages(parentPkg, contextDir))) if len(route.ResponseTypeName()) > 0 || len(route.RequestTypeName()) > 0 { imports = append(imports, fmt.Sprintf("\"%s\"\n", ctlutil.JoinPackages(parentPkg, typesDir))) } imports = append(imports, fmt.Sprintf("\"%s/core/logx\"", vars.ProjectOpenSourceURL)) return strings.Join(imports, "\n\t") }