@@ -25,79 +25,144 @@ var (
2525)
2626
2727func genLogic (dir , rootPkg , projectPkg string , cfg * config.Config , api * spec.ApiSpec ) error {
28- for _ , g := range api .Service .Groups {
29- for _ , r := range g .Routes {
30- err := genLogicByRoute (dir , rootPkg , projectPkg , cfg , g , r )
28+ type fileKey struct {
29+ subdir string
30+ filename string
31+ }
32+
33+ type logicFile struct {
34+ pkgName string
35+ imports []string
36+ logics []map [string ]any
37+ sseEnable bool
38+ }
39+
40+ files := make (map [fileKey ]* logicFile )
41+
42+ for _ , group := range api .Service .Groups {
43+ sse := group .GetAnnotation ("sse" ) == "true"
44+ for _ , route := range group .Routes {
45+ logic := getLogicName (route )
46+
47+ fileBase := route .GetAnnotation (filenameProperty )
48+ if len (fileBase ) == 0 {
49+ fileBase = group .GetAnnotation (filenameProperty )
50+ }
51+ if len (fileBase ) == 0 {
52+ fileBase = logic
53+ }
54+
55+ goFile , err := format .FileNamingFormat (cfg .NamingFormat , fileBase )
3156 if err != nil {
3257 return err
3358 }
59+
60+ subDir := getLogicFolderPath (group , route )
61+ key := fileKey {
62+ subdir : subDir ,
63+ filename : goFile + ".go" ,
64+ }
65+
66+ f , ok := files [key ]
67+ if ! ok {
68+ f = & logicFile {
69+ pkgName : subDir [strings .LastIndex (subDir , "/" )+ 1 :],
70+ imports : nil ,
71+ logics : nil ,
72+ sseEnable : sse ,
73+ }
74+ files [key ] = f
75+ }
76+
77+ imports := genLogicImports (route , rootPkg )
78+ for _ , imp := range strings .Split (imports , "\n \t " ) {
79+ imp = strings .TrimSpace (imp )
80+ if len (imp ) == 0 {
81+ continue
82+ }
83+ found := false
84+ for _ , existing := range f .imports {
85+ if existing == imp {
86+ found = true
87+ break
88+ }
89+ }
90+ if ! found {
91+ f .imports = append (f .imports , imp )
92+ }
93+ }
94+
95+ var responseString string
96+ var returnString string
97+ var requestString string
98+ if len (route .ResponseTypeName ()) > 0 {
99+ resp := responseGoTypeName (route , typesPacket )
100+ responseString = "(resp " + resp + ", err error)"
101+ returnString = "return"
102+ } else {
103+ responseString = "error"
104+ returnString = "return nil"
105+ }
106+ if len (route .RequestTypeName ()) > 0 {
107+ requestString = "req *" + requestGoTypeName (route , typesPacket )
108+ }
109+
110+ if sse {
111+ responseString = "error"
112+ returnString = "return nil"
113+ resp := responseGoTypeName (route , typesPacket )
114+ if len (requestString ) == 0 {
115+ requestString = "client chan<- " + resp
116+ } else {
117+ requestString += ", client chan<- " + resp
118+ }
119+ }
120+
121+ logicData := map [string ]any {
122+ "logic" : strings .Title (logic ),
123+ "function" : strings .Title (strings .TrimSuffix (logic , "Logic" )),
124+ "responseType" : responseString ,
125+ "returnString" : returnString ,
126+ "request" : requestString ,
127+ "hasDoc" : len (route .JoinedDoc ()) > 0 ,
128+ "doc" : getDoc (route .JoinedDoc ()),
129+ }
130+
131+ f .logics = append (f .logics , logicData )
34132 }
35133 }
36- return nil
37- }
38134
39- func genLogicByRoute (dir , rootPkg , projectPkg string , cfg * config.Config , group spec.Group , route spec.Route ) error {
40- logic := getLogicName (route )
41- goFile , err := format .FileNamingFormat (cfg .NamingFormat , logic )
42- if err != nil {
43- return err
44- }
135+ for key , f := range files {
136+ importsJoined := strings .Join (f .imports , "\n \t " )
45137
46- imports := genLogicImports (route , rootPkg )
47- var responseString string
48- var returnString string
49- var requestString string
50- if len (route .ResponseTypeName ()) > 0 {
51- resp := responseGoTypeName (route , typesPacket )
52- responseString = "(resp " + resp + ", err error)"
53- returnString = "return"
54- } else {
55- responseString = "error"
56- returnString = "return nil"
57- }
58- if len (route .RequestTypeName ()) > 0 {
59- requestString = "req *" + requestGoTypeName (route , typesPacket )
60- }
138+ builtinTemplate := logicTemplate
139+ templateFile := logicTemplateFile
140+ if f .sseEnable {
141+ builtinTemplate = sseLogicTemplate
142+ templateFile = sseLogicTemplateFile
143+ }
61144
62- subDir := getLogicFolderPath (group , route )
63- builtinTemplate := logicTemplate
64- templateFile := logicTemplateFile
65- sse := group .GetAnnotation ("sse" )
66- if sse == "true" {
67- builtinTemplate = sseLogicTemplate
68- templateFile = sseLogicTemplateFile
69- responseString = "error"
70- returnString = "return nil"
71- resp := responseGoTypeName (route , typesPacket )
72- if len (requestString ) == 0 {
73- requestString = "client chan<- " + resp
74- } else {
75- requestString += ", client chan<- " + resp
145+ if err := genFile (fileGenConfig {
146+ dir : dir ,
147+ subdir : key .subdir ,
148+ filename : key .filename ,
149+ templateName : "logicTemplate" ,
150+ category : category ,
151+ templateFile : templateFile ,
152+ builtinTemplate : builtinTemplate ,
153+ data : map [string ]any {
154+ "pkgName" : f .pkgName ,
155+ "imports" : importsJoined ,
156+ "Logics" : f .logics ,
157+ "projectPkg" : projectPkg ,
158+ "version" : version .BuildVersion ,
159+ },
160+ }); err != nil {
161+ return err
76162 }
77163 }
78164
79- return genFile (fileGenConfig {
80- dir : dir ,
81- subdir : subDir ,
82- filename : goFile + ".go" ,
83- templateName : "logicTemplate" ,
84- category : category ,
85- templateFile : templateFile ,
86- builtinTemplate : builtinTemplate ,
87- data : map [string ]any {
88- "pkgName" : subDir [strings .LastIndex (subDir , "/" )+ 1 :],
89- "imports" : imports ,
90- "logic" : strings .Title (logic ),
91- "function" : strings .Title (strings .TrimSuffix (logic , "Logic" )),
92- "responseType" : responseString ,
93- "returnString" : returnString ,
94- "request" : requestString ,
95- "hasDoc" : len (route .JoinedDoc ()) > 0 ,
96- "doc" : getDoc (route .JoinedDoc ()),
97- "projectPkg" : projectPkg ,
98- "version" : version .BuildVersion ,
99- },
100- })
165+ return nil
101166}
102167
103168func getLogicFolderPath (group spec.Group , route spec.Route ) string {
0 commit comments