syncable_cli/analyzer/frameworks/
go.rs

1use super::{LanguageFrameworkDetector, TechnologyRule, FrameworkDetectionUtils};
2use crate::analyzer::{DetectedTechnology, DetectedLanguage, TechnologyCategory, LibraryType};
3use crate::error::Result;
4
5pub struct GoFrameworkDetector;
6
7impl LanguageFrameworkDetector for GoFrameworkDetector {
8    fn detect_frameworks(&self, language: &DetectedLanguage) -> Result<Vec<DetectedTechnology>> {
9        let rules = get_go_technology_rules();
10        
11        // Combine main and dev dependencies for comprehensive detection
12        let all_deps: Vec<String> = language.main_dependencies.iter()
13            .chain(language.dev_dependencies.iter())
14            .cloned()
15            .collect();
16        
17        let technologies = FrameworkDetectionUtils::detect_technologies_by_dependencies(
18            &rules, &all_deps, language.confidence
19        );
20        
21        Ok(technologies)
22    }
23    
24    fn supported_languages(&self) -> Vec<&'static str> {
25        vec!["Go"]
26    }
27}
28
29/// Go technology detection rules with comprehensive framework coverage
30fn get_go_technology_rules() -> Vec<TechnologyRule> {
31    vec![
32        // WEB FRAMEWORKS
33        TechnologyRule {
34            name: "Gin".to_string(),
35            category: TechnologyCategory::BackendFramework,
36            confidence: 0.95,
37            dependency_patterns: vec!["github.com/gin-gonic/gin".to_string(), "gin-gonic".to_string()],
38            requires: vec![],
39            conflicts_with: vec![],
40            is_primary_indicator: true,
41            alternative_names: vec!["gin-gonic".to_string()],
42            file_indicators: vec![],
43        },
44        TechnologyRule {
45            name: "Echo".to_string(),
46            category: TechnologyCategory::BackendFramework,
47            confidence: 0.95,
48            dependency_patterns: vec!["github.com/labstack/echo".to_string(), "labstack/echo".to_string()],
49            requires: vec![],
50            conflicts_with: vec![],
51            is_primary_indicator: true,
52            alternative_names: vec!["labstack/echo".to_string()],
53            file_indicators: vec![],
54        },
55        TechnologyRule {
56            name: "Fiber".to_string(),
57            category: TechnologyCategory::BackendFramework,
58            confidence: 0.95,
59            dependency_patterns: vec!["github.com/gofiber/fiber".to_string(), "gofiber".to_string()],
60            requires: vec![],
61            conflicts_with: vec![],
62            is_primary_indicator: true,
63            alternative_names: vec!["gofiber".to_string()],
64            file_indicators: vec![],
65        },
66        TechnologyRule {
67            name: "Chi".to_string(),
68            category: TechnologyCategory::BackendFramework,
69            confidence: 0.90,
70            dependency_patterns: vec!["github.com/go-chi/chi".to_string(), "go-chi/chi".to_string()],
71            requires: vec![],
72            conflicts_with: vec![],
73            is_primary_indicator: true,
74            alternative_names: vec!["chi".to_string()],
75            file_indicators: vec![],
76        },
77        TechnologyRule {
78            name: "Gorilla Mux".to_string(),
79            category: TechnologyCategory::BackendFramework,
80            confidence: 0.90,
81            dependency_patterns: vec!["github.com/gorilla/mux".to_string(), "gorilla/mux".to_string()],
82            requires: vec![],
83            conflicts_with: vec![],
84            is_primary_indicator: true,
85            alternative_names: vec!["mux".to_string()],
86            file_indicators: vec![],
87        },
88        TechnologyRule {
89            name: "HttpRouter".to_string(),
90            category: TechnologyCategory::BackendFramework,
91            confidence: 0.90,
92            dependency_patterns: vec!["github.com/julienschmidt/httprouter".to_string(), "julienschmidt/httprouter".to_string()],
93            requires: vec![],
94            conflicts_with: vec![],
95            is_primary_indicator: true,
96            alternative_names: vec!["httprouter".to_string()],
97            file_indicators: vec![],
98        },
99        TechnologyRule {
100            name: "Beego".to_string(),
101            category: TechnologyCategory::BackendFramework,
102            confidence: 0.90,
103            dependency_patterns: vec!["github.com/beego/beego".to_string(), "beego/beego".to_string()],
104            requires: vec![],
105            conflicts_with: vec![],
106            is_primary_indicator: true,
107            alternative_names: vec!["beego".to_string()],
108            file_indicators: vec![],
109        },
110        TechnologyRule {
111            name: "Revel".to_string(),
112            category: TechnologyCategory::BackendFramework,
113            confidence: 0.85,
114            dependency_patterns: vec!["github.com/revel/revel".to_string(), "revel/revel".to_string()],
115            requires: vec![],
116            conflicts_with: vec![],
117            is_primary_indicator: true,
118            alternative_names: vec!["revel".to_string()],
119            file_indicators: vec![],
120        },
121        TechnologyRule {
122            name: "Buffalo".to_string(),
123            category: TechnologyCategory::BackendFramework,
124            confidence: 0.85,
125            dependency_patterns: vec!["github.com/gobuffalo/buffalo".to_string(), "gobuffalo/buffalo".to_string()],
126            requires: vec![],
127            conflicts_with: vec![],
128            is_primary_indicator: true,
129            alternative_names: vec!["buffalo".to_string()],
130            file_indicators: vec![],
131        },
132        TechnologyRule {
133            name: "Gin Web Framework".to_string(),
134            category: TechnologyCategory::BackendFramework,
135            confidence: 0.95,
136            dependency_patterns: vec!["github.com/gin-gonic/gin".to_string(), "gin-gonic".to_string()],
137            requires: vec![],
138            conflicts_with: vec![],
139            is_primary_indicator: true,
140            alternative_names: vec!["gin".to_string()],
141            file_indicators: vec![],
142        },
143        TechnologyRule {
144            name: "Go Kit".to_string(),
145            category: TechnologyCategory::Library(LibraryType::Utility),
146            confidence: 0.90,
147            dependency_patterns: vec!["github.com/go-kit/kit".to_string(), "go-kit".to_string()],
148            requires: vec![],
149            conflicts_with: vec![],
150            is_primary_indicator: false,
151            alternative_names: vec!["kit".to_string()],
152            file_indicators: vec![],
153        },
154        TechnologyRule {
155            name: "Micro".to_string(),
156            category: TechnologyCategory::Library(LibraryType::Utility),
157            confidence: 0.90,
158            dependency_patterns: vec!["github.com/micro/micro".to_string(), "micro/micro".to_string()],
159            requires: vec![],
160            conflicts_with: vec![],
161            is_primary_indicator: false,
162            alternative_names: vec!["micro".to_string()],
163            file_indicators: vec![],
164        },
165        TechnologyRule {
166            name: "Go Micro".to_string(),
167            category: TechnologyCategory::Library(LibraryType::Utility),
168            confidence: 0.90,
169            dependency_patterns: vec!["github.com/micro/go-micro".to_string(), "micro/go-micro".to_string()],
170            requires: vec![],
171            conflicts_with: vec![],
172            is_primary_indicator: false,
173            alternative_names: vec!["go-micro".to_string()],
174            file_indicators: vec![],
175        },
176        TechnologyRule {
177            name: "Go Frame".to_string(),
178            category: TechnologyCategory::BackendFramework,
179            confidence: 0.90,
180            dependency_patterns: vec!["github.com/gogf/gf".to_string(), "gogf/gf".to_string()],
181            requires: vec![],
182            conflicts_with: vec![],
183            is_primary_indicator: true,
184            alternative_names: vec!["gf".to_string()],
185            file_indicators: vec![],
186        },
187        TechnologyRule {
188            name: "Iris".to_string(),
189            category: TechnologyCategory::BackendFramework,
190            confidence: 0.90,
191            dependency_patterns: vec!["github.com/kataras/iris".to_string(), "kataras/iris".to_string()],
192            requires: vec![],
193            conflicts_with: vec![],
194            is_primary_indicator: true,
195            alternative_names: vec!["iris".to_string()],
196            file_indicators: vec![],
197        },
198        TechnologyRule {
199            name: "FastHTTP".to_string(),
200            category: TechnologyCategory::BackendFramework,
201            confidence: 0.95,
202            dependency_patterns: vec!["github.com/valyala/fasthttp".to_string(), "fasthttp".to_string()],
203            requires: vec![],
204            conflicts_with: vec![],
205            is_primary_indicator: true,
206            alternative_names: vec!["valyala/fasthttp".to_string()],
207            file_indicators: vec![],
208        },
209        TechnologyRule {
210            name: "Hertz".to_string(),
211            category: TechnologyCategory::BackendFramework,
212            confidence: 0.95,
213            dependency_patterns: vec!["github.com/cloudwego/hertz".to_string(), "cloudwego/hertz".to_string()],
214            requires: vec![],
215            conflicts_with: vec![],
216            is_primary_indicator: true,
217            alternative_names: vec!["cloudwego".to_string()],
218            file_indicators: vec![],
219        },
220        
221        // DATABASE/ORM
222        TechnologyRule {
223            name: "GORM".to_string(),
224            category: TechnologyCategory::Database,
225            confidence: 0.90,
226            dependency_patterns: vec!["gorm.io/gorm".to_string(), "gorm".to_string()],
227            requires: vec![],
228            conflicts_with: vec![],
229            is_primary_indicator: false,
230            alternative_names: vec!["entgo".to_string()],
231            file_indicators: vec![],
232        },
233        TechnologyRule {
234            name: "Ent".to_string(),
235            category: TechnologyCategory::Database,
236            confidence: 0.90,
237            dependency_patterns: vec!["entgo.io/ent".to_string(), "facebook/ent".to_string()],
238            requires: vec![],
239            conflicts_with: vec![],
240            is_primary_indicator: false,
241            alternative_names: vec!["entgo".to_string()],
242            file_indicators: vec![],
243        },
244        TechnologyRule {
245            name: "Xorm".to_string(),
246            category: TechnologyCategory::Database,
247            confidence: 0.85,
248            dependency_patterns: vec!["xorm.io/xorm".to_string(), "xorm".to_string()],
249            requires: vec![],
250            conflicts_with: vec![],
251            is_primary_indicator: false,
252            alternative_names: vec![],
253            file_indicators: vec![],
254        },
255        TechnologyRule {
256            name: "Bun".to_string(),
257            category: TechnologyCategory::Database,
258            confidence: 0.85,
259            dependency_patterns: vec!["github.com/uptrace/bun".to_string(), "uptrace/bun".to_string()],
260            requires: vec![],
261            conflicts_with: vec![],
262            is_primary_indicator: false,
263            alternative_names: vec![],
264            file_indicators: vec![],
265        },
266        TechnologyRule {
267            name: "SQLBoiler".to_string(),
268            category: TechnologyCategory::Database,
269            confidence: 0.85,
270            dependency_patterns: vec!["github.com/volatiletech/sqlboiler".to_string(), "volatiletech/sqlboiler".to_string()],
271            requires: vec![],
272            conflicts_with: vec![],
273            is_primary_indicator: false,
274            alternative_names: vec![],
275            file_indicators: vec![],
276        },
277        TechnologyRule {
278            name: "Squirrel".to_string(),
279            category: TechnologyCategory::Database,
280            confidence: 0.85,
281            dependency_patterns: vec!["github.com/Masterminds/squirrel".to_string(), "Masterminds/squirrel".to_string()],
282            requires: vec![],
283            conflicts_with: vec![],
284            is_primary_indicator: false,
285            alternative_names: vec![],
286            file_indicators: vec![],
287        },
288        
289        // TESTING
290        TechnologyRule {
291            name: "Testify".to_string(),
292            category: TechnologyCategory::Testing,
293            confidence: 0.85,
294            dependency_patterns: vec!["github.com/stretchr/testify".to_string(), "stretchr/testify".to_string()],
295            requires: vec![],
296            conflicts_with: vec![],
297            is_primary_indicator: false,
298            alternative_names: vec!["stretchr/testify".to_string()],
299            file_indicators: vec![],
300        },
301        TechnologyRule {
302            name: "Ginkgo".to_string(),
303            category: TechnologyCategory::Testing,
304            confidence: 0.85,
305            dependency_patterns: vec!["github.com/onsi/ginkgo".to_string(), "ginkgo".to_string()],
306            requires: vec![],
307            conflicts_with: vec![],
308            is_primary_indicator: false,
309            alternative_names: vec!["onsi/ginkgo".to_string()],
310            file_indicators: vec![],
311        },
312        
313        // CLI FRAMEWORKS
314        TechnologyRule {
315            name: "Cobra".to_string(),
316            category: TechnologyCategory::Library(LibraryType::CLI),
317            confidence: 0.85,
318            dependency_patterns: vec!["github.com/spf13/cobra".to_string(), "cobra".to_string()],
319            requires: vec![],
320            conflicts_with: vec![],
321            is_primary_indicator: true,
322            alternative_names: vec!["spf13/cobra".to_string()],
323            file_indicators: vec![],
324        },
325        
326        // CONFIG MANAGEMENT
327        TechnologyRule {
328            name: "Viper".to_string(),
329            category: TechnologyCategory::Library(LibraryType::Utility),
330            confidence: 0.80,
331            dependency_patterns: vec!["github.com/spf13/viper".to_string(), "viper".to_string()],
332            requires: vec![],
333            conflicts_with: vec![],
334            is_primary_indicator: false,
335            alternative_names: vec!["spf13/viper".to_string()],
336            file_indicators: vec![],
337        },
338        
339        // LOGGING
340        TechnologyRule {
341            name: "Logrus".to_string(),
342            category: TechnologyCategory::Library(LibraryType::Utility),
343            confidence: 0.85,
344            dependency_patterns: vec!["github.com/sirupsen/logrus".to_string(), "sirupsen/logrus".to_string()],
345            requires: vec![],
346            conflicts_with: vec![],
347            is_primary_indicator: false,
348            alternative_names: vec!["logrus".to_string()],
349            file_indicators: vec![],
350        },
351        TechnologyRule {
352            name: "Zap".to_string(),
353            category: TechnologyCategory::Library(LibraryType::Utility),
354            confidence: 0.85,
355            dependency_patterns: vec!["go.uber.org/zap".to_string(), "zap".to_string()],
356            requires: vec![],
357            conflicts_with: vec![],
358            is_primary_indicator: false,
359            alternative_names: vec!["zap".to_string()],
360            file_indicators: vec![],
361        },
362        
363        // HTTP CLIENTS
364        TechnologyRule {
365            name: "Resty".to_string(),
366            category: TechnologyCategory::Library(LibraryType::HttpClient),
367            confidence: 0.85,
368            dependency_patterns: vec!["github.com/go-resty/resty".to_string(), "go-resty/resty".to_string()],
369            requires: vec![],
370            conflicts_with: vec![],
371            is_primary_indicator: false,
372            alternative_names: vec!["resty".to_string()],
373            file_indicators: vec![],
374        },
375        
376        // MESSAGING
377        TechnologyRule {
378            name: "NATS".to_string(),
379            category: TechnologyCategory::Library(LibraryType::Utility),
380            confidence: 0.90,
381            dependency_patterns: vec!["github.com/nats-io/nats.go".to_string(), "nats-io/nats.go".to_string()],
382            requires: vec![],
383            conflicts_with: vec![],
384            is_primary_indicator: false,
385            alternative_names: vec!["nats".to_string()],
386            file_indicators: vec![],
387        },
388        TechnologyRule {
389            name: "Kafka".to_string(),
390            category: TechnologyCategory::Library(LibraryType::Utility),
391            confidence: 0.90,
392            dependency_patterns: vec!["github.com/Shopify/sarama".to_string(), "Shopify/sarama".to_string()],
393            requires: vec![],
394            conflicts_with: vec![],
395            is_primary_indicator: false,
396            alternative_names: vec!["sarama".to_string()],
397            file_indicators: vec![],
398        },
399        TechnologyRule {
400            name: "RabbitMQ".to_string(),
401            category: TechnologyCategory::Library(LibraryType::Utility),
402            confidence: 0.90,
403            dependency_patterns: vec!["github.com/streadway/amqp".to_string(), "streadway/amqp".to_string()],
404            requires: vec![],
405            conflicts_with: vec![],
406            is_primary_indicator: false,
407            alternative_names: vec!["amqp".to_string()],
408            file_indicators: vec![],
409        },
410    ]
411}