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 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
33fn get_go_technology_rules() -> Vec<TechnologyRule> {
35 vec![
36 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 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 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 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 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 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 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 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}