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 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
29fn get_go_technology_rules() -> Vec<TechnologyRule> {
31 vec![
32 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 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 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 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 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 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 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 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}