syncable_cli/analyzer/frameworks/
go.rs

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