1use super::{FrameworkDetectionUtils, LanguageFrameworkDetector, TechnologyRule};
2use crate::analyzer::{DetectedLanguage, DetectedTechnology, LibraryType, TechnologyCategory};
3use crate::error::Result;
4
5pub struct RustFrameworkDetector;
6
7impl LanguageFrameworkDetector for RustFrameworkDetector {
8 fn detect_frameworks(&self, language: &DetectedLanguage) -> Result<Vec<DetectedTechnology>> {
9 let rules = get_rust_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!["Rust"]
30 }
31}
32
33fn get_rust_technology_rules() -> Vec<TechnologyRule> {
35 vec![
36 TechnologyRule {
38 name: "Actix Web".to_string(),
39 category: TechnologyCategory::BackendFramework,
40 confidence: 0.95,
41 dependency_patterns: vec!["actix-web".to_string()],
42 requires: vec![],
43 conflicts_with: vec![],
44 is_primary_indicator: true,
45 alternative_names: vec!["actix".to_string()],
46 file_indicators: vec![],
47 },
48 TechnologyRule {
49 name: "Axum".to_string(),
50 category: TechnologyCategory::BackendFramework,
51 confidence: 0.95,
52 dependency_patterns: vec!["axum".to_string()],
53 requires: vec!["Tokio".to_string()],
54 conflicts_with: vec![],
55 is_primary_indicator: true,
56 alternative_names: vec![],
57 file_indicators: vec![],
58 },
59 TechnologyRule {
60 name: "Rocket".to_string(),
61 category: TechnologyCategory::BackendFramework,
62 confidence: 0.95,
63 dependency_patterns: vec!["rocket".to_string()],
64 requires: vec![],
65 conflicts_with: vec![],
66 is_primary_indicator: true,
67 alternative_names: vec![],
68 file_indicators: vec![],
69 },
70 TechnologyRule {
71 name: "Warp".to_string(),
72 category: TechnologyCategory::BackendFramework,
73 confidence: 0.95,
74 dependency_patterns: vec!["warp".to_string()],
75 requires: vec![],
76 conflicts_with: vec![],
77 is_primary_indicator: true,
78 alternative_names: vec![],
79 file_indicators: vec![],
80 },
81 TechnologyRule {
82 name: "Tide".to_string(),
83 category: TechnologyCategory::BackendFramework,
84 confidence: 0.90,
85 dependency_patterns: vec!["tide".to_string()],
86 requires: vec![],
87 conflicts_with: vec![],
88 is_primary_indicator: true,
89 alternative_names: vec![],
90 file_indicators: vec![],
91 },
92 TechnologyRule {
93 name: "Thruster".to_string(),
94 category: TechnologyCategory::BackendFramework,
95 confidence: 0.90,
96 dependency_patterns: vec!["thruster".to_string()],
97 requires: vec![],
98 conflicts_with: vec![],
99 is_primary_indicator: true,
100 alternative_names: vec![],
101 file_indicators: vec![],
102 },
103 TechnologyRule {
104 name: "Poem".to_string(),
105 category: TechnologyCategory::BackendFramework,
106 confidence: 0.90,
107 dependency_patterns: vec!["poem".to_string()],
108 requires: vec![],
109 conflicts_with: vec![],
110 is_primary_indicator: true,
111 alternative_names: vec![],
112 file_indicators: vec![],
113 },
114 TechnologyRule {
115 name: "Rwf".to_string(),
116 category: TechnologyCategory::BackendFramework,
117 confidence: 0.90,
118 dependency_patterns: vec!["rwf".to_string()],
119 requires: vec![],
120 conflicts_with: vec![],
121 is_primary_indicator: true,
122 alternative_names: vec![],
123 file_indicators: vec![],
124 },
125 TechnologyRule {
126 name: "Salvo".to_string(),
127 category: TechnologyCategory::BackendFramework,
128 confidence: 0.95,
129 dependency_patterns: vec!["salvo".to_string()],
130 requires: vec![],
131 conflicts_with: vec![],
132 is_primary_indicator: true,
133 alternative_names: vec![],
134 file_indicators: vec![],
135 },
136 TechnologyRule {
137 name: "Gotham".to_string(),
138 category: TechnologyCategory::BackendFramework,
139 confidence: 0.95,
140 dependency_patterns: vec!["gotham".to_string()],
141 requires: vec![],
142 conflicts_with: vec![],
143 is_primary_indicator: true,
144 alternative_names: vec![],
145 file_indicators: vec![],
146 },
147 TechnologyRule {
148 name: "Iron".to_string(),
149 category: TechnologyCategory::BackendFramework,
150 confidence: 0.95,
151 dependency_patterns: vec!["iron".to_string()],
152 requires: vec![],
153 conflicts_with: vec![],
154 is_primary_indicator: true,
155 alternative_names: vec![],
156 file_indicators: vec![],
157 },
158 TechnologyRule {
159 name: "Nickel".to_string(),
160 category: TechnologyCategory::BackendFramework,
161 confidence: 0.95,
162 dependency_patterns: vec!["nickel".to_string()],
163 requires: vec![],
164 conflicts_with: vec![],
165 is_primary_indicator: true,
166 alternative_names: vec![],
167 file_indicators: vec![],
168 },
169 TechnologyRule {
170 name: "Rouille".to_string(),
171 category: TechnologyCategory::BackendFramework,
172 confidence: 0.90,
173 dependency_patterns: vec!["rouille".to_string()],
174 requires: vec![],
175 conflicts_with: vec![],
176 is_primary_indicator: true,
177 alternative_names: vec![],
178 file_indicators: vec![],
179 },
180 TechnologyRule {
181 name: "Rustful".to_string(),
182 category: TechnologyCategory::BackendFramework,
183 confidence: 0.90,
184 dependency_patterns: vec!["rustful".to_string()],
185 requires: vec![],
186 conflicts_with: vec![],
187 is_primary_indicator: true,
188 alternative_names: vec![],
189 file_indicators: vec![],
190 },
191 TechnologyRule {
192 name: "Rustless".to_string(),
193 category: TechnologyCategory::BackendFramework,
194 confidence: 0.90,
195 dependency_patterns: vec!["rustless".to_string()],
196 requires: vec![],
197 conflicts_with: vec![],
198 is_primary_indicator: true,
199 alternative_names: vec![],
200 file_indicators: vec![],
201 },
202 TechnologyRule {
203 name: "Saphir".to_string(),
204 category: TechnologyCategory::BackendFramework,
205 confidence: 0.90,
206 dependency_patterns: vec!["saphir".to_string()],
207 requires: vec![],
208 conflicts_with: vec![],
209 is_primary_indicator: true,
210 alternative_names: vec![],
211 file_indicators: vec![],
212 },
213 TechnologyRule {
214 name: "Tardis".to_string(),
215 category: TechnologyCategory::BackendFramework,
216 confidence: 0.95,
217 dependency_patterns: vec!["tardis".to_string()],
218 requires: vec![],
219 conflicts_with: vec![],
220 is_primary_indicator: true,
221 alternative_names: vec![],
222 file_indicators: vec![],
223 },
224 TechnologyRule {
225 name: "Loco".to_string(),
226 category: TechnologyCategory::BackendFramework,
227 confidence: 0.95,
228 dependency_patterns: vec!["loco-rs".to_string()],
229 requires: vec![],
230 conflicts_with: vec![],
231 is_primary_indicator: true,
232 alternative_names: vec!["loco".to_string()],
233 file_indicators: vec![],
234 },
235 TechnologyRule {
236 name: "Trillium".to_string(),
237 category: TechnologyCategory::BackendFramework,
238 confidence: 0.95,
239 dependency_patterns: vec!["trillium".to_string()],
240 requires: vec!["Tokio".to_string()],
241 conflicts_with: vec![],
242 is_primary_indicator: true,
243 alternative_names: vec![],
244 file_indicators: vec![],
245 },
246 TechnologyRule {
248 name: "Tokio".to_string(),
249 category: TechnologyCategory::Runtime,
250 confidence: 0.90,
251 dependency_patterns: vec!["tokio".to_string()],
252 requires: vec![],
253 conflicts_with: vec!["async-std".to_string()],
254 is_primary_indicator: false,
255 alternative_names: vec![],
256 file_indicators: vec![],
257 },
258 TechnologyRule {
259 name: "async-std".to_string(),
260 category: TechnologyCategory::Runtime,
261 confidence: 0.90,
262 dependency_patterns: vec!["async-std".to_string()],
263 requires: vec![],
264 conflicts_with: vec!["Tokio".to_string()],
265 is_primary_indicator: false,
266 alternative_names: vec![],
267 file_indicators: vec![],
268 },
269 TechnologyRule {
270 name: "smol".to_string(),
271 category: TechnologyCategory::Runtime,
272 confidence: 0.90,
273 dependency_patterns: vec!["smol".to_string()],
274 requires: vec![],
275 conflicts_with: vec![],
276 is_primary_indicator: false,
277 alternative_names: vec![],
278 file_indicators: vec![],
279 },
280 TechnologyRule {
282 name: "reqwest".to_string(),
283 category: TechnologyCategory::Library(LibraryType::Utility),
284 confidence: 0.90,
285 dependency_patterns: vec!["reqwest".to_string()],
286 requires: vec![],
287 conflicts_with: vec![],
288 is_primary_indicator: false,
289 alternative_names: vec![],
290 file_indicators: vec![],
291 },
292 TechnologyRule {
293 name: "hyper".to_string(),
294 category: TechnologyCategory::Library(LibraryType::Utility),
295 confidence: 0.90,
296 dependency_patterns: vec!["hyper".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: "ureq".to_string(),
305 category: TechnologyCategory::Library(LibraryType::Utility),
306 confidence: 0.90,
307 dependency_patterns: vec!["ureq".to_string()],
308 requires: vec![],
309 conflicts_with: vec![],
310 is_primary_indicator: false,
311 alternative_names: vec![],
312 file_indicators: vec![],
313 },
314 TechnologyRule {
316 name: "anyhow".to_string(),
317 category: TechnologyCategory::Library(LibraryType::Utility),
318 confidence: 0.85,
319 dependency_patterns: vec!["anyhow".to_string()],
320 requires: vec![],
321 conflicts_with: vec![],
322 is_primary_indicator: false,
323 alternative_names: vec![],
324 file_indicators: vec![],
325 },
326 TechnologyRule {
327 name: "thiserror".to_string(),
328 category: TechnologyCategory::Library(LibraryType::Utility),
329 confidence: 0.85,
330 dependency_patterns: vec!["thiserror".to_string()],
331 requires: vec![],
332 conflicts_with: vec![],
333 is_primary_indicator: false,
334 alternative_names: vec![],
335 file_indicators: vec![],
336 },
337 TechnologyRule {
338 name: "eyre".to_string(),
339 category: TechnologyCategory::Library(LibraryType::Utility),
340 confidence: 0.85,
341 dependency_patterns: vec!["eyre".to_string()],
342 requires: vec![],
343 conflicts_with: vec![],
344 is_primary_indicator: false,
345 alternative_names: vec![],
346 file_indicators: vec![],
347 },
348 TechnologyRule {
349 name: "color-eyre".to_string(),
350 category: TechnologyCategory::Library(LibraryType::Utility),
351 confidence: 0.85,
352 dependency_patterns: vec!["color-eyre".to_string()],
353 requires: vec![],
354 conflicts_with: vec![],
355 is_primary_indicator: false,
356 alternative_names: vec![],
357 file_indicators: vec![],
358 },
359 TechnologyRule {
361 name: "Serde".to_string(),
362 category: TechnologyCategory::Library(LibraryType::Utility),
363 confidence: 0.85,
364 dependency_patterns: vec!["serde".to_string()],
365 requires: vec![],
366 conflicts_with: vec![],
367 is_primary_indicator: false,
368 alternative_names: vec![],
369 file_indicators: vec![],
370 },
371 TechnologyRule {
372 name: "serde_json".to_string(),
373 category: TechnologyCategory::Library(LibraryType::Utility),
374 confidence: 0.85,
375 dependency_patterns: vec!["serde_json".to_string()],
376 requires: vec!["Serde".to_string()],
377 conflicts_with: vec![],
378 is_primary_indicator: false,
379 alternative_names: vec![],
380 file_indicators: vec![],
381 },
382 TechnologyRule {
383 name: "bincode".to_string(),
384 category: TechnologyCategory::Library(LibraryType::Utility),
385 confidence: 0.85,
386 dependency_patterns: vec!["bincode".to_string()],
387 requires: vec![],
388 conflicts_with: vec![],
389 is_primary_indicator: false,
390 alternative_names: vec![],
391 file_indicators: vec![],
392 },
393 TechnologyRule {
394 name: "toml".to_string(),
395 category: TechnologyCategory::Library(LibraryType::Utility),
396 confidence: 0.85,
397 dependency_patterns: vec!["toml".to_string()],
398 requires: vec![],
399 conflicts_with: vec![],
400 is_primary_indicator: false,
401 alternative_names: vec![],
402 file_indicators: vec![],
403 },
404 TechnologyRule {
405 name: "ron".to_string(),
406 category: TechnologyCategory::Library(LibraryType::Utility),
407 confidence: 0.85,
408 dependency_patterns: vec!["ron".to_string()],
409 requires: vec![],
410 conflicts_with: vec![],
411 is_primary_indicator: false,
412 alternative_names: vec![],
413 file_indicators: vec![],
414 },
415 TechnologyRule {
417 name: "clap".to_string(),
418 category: TechnologyCategory::Library(LibraryType::CLI),
419 confidence: 0.85,
420 dependency_patterns: vec!["clap".to_string()],
421 requires: vec![],
422 conflicts_with: vec![],
423 is_primary_indicator: true,
424 alternative_names: vec![],
425 file_indicators: vec![],
426 },
427 TechnologyRule {
428 name: "structopt".to_string(),
429 category: TechnologyCategory::Library(LibraryType::CLI),
430 confidence: 0.85,
431 dependency_patterns: vec!["structopt".to_string()],
432 requires: vec![],
433 conflicts_with: vec![],
434 is_primary_indicator: true,
435 alternative_names: vec![],
436 file_indicators: vec![],
437 },
438 TechnologyRule {
439 name: "argh".to_string(),
440 category: TechnologyCategory::Library(LibraryType::CLI),
441 confidence: 0.85,
442 dependency_patterns: vec!["argh".to_string()],
443 requires: vec![],
444 conflicts_with: vec![],
445 is_primary_indicator: true,
446 alternative_names: vec![],
447 file_indicators: vec![],
448 },
449 TechnologyRule {
450 name: "bpaf".to_string(),
451 category: TechnologyCategory::Library(LibraryType::CLI),
452 confidence: 0.85,
453 dependency_patterns: vec!["bpaf".to_string()],
454 requires: vec![],
455 conflicts_with: vec![],
456 is_primary_indicator: true,
457 alternative_names: vec![],
458 file_indicators: vec![],
459 },
460 TechnologyRule {
462 name: "tracing".to_string(),
463 category: TechnologyCategory::Library(LibraryType::Utility),
464 confidence: 0.85,
465 dependency_patterns: vec!["tracing".to_string()],
466 requires: vec![],
467 conflicts_with: vec![],
468 is_primary_indicator: false,
469 alternative_names: vec![],
470 file_indicators: vec![],
471 },
472 TechnologyRule {
473 name: "log".to_string(),
474 category: TechnologyCategory::Library(LibraryType::Utility),
475 confidence: 0.85,
476 dependency_patterns: vec!["log".to_string()],
477 requires: vec![],
478 conflicts_with: vec![],
479 is_primary_indicator: false,
480 alternative_names: vec![],
481 file_indicators: vec![],
482 },
483 TechnologyRule {
484 name: "env_logger".to_string(),
485 category: TechnologyCategory::Library(LibraryType::Utility),
486 confidence: 0.85,
487 dependency_patterns: vec!["env_logger".to_string()],
488 requires: vec![],
489 conflicts_with: vec![],
490 is_primary_indicator: false,
491 alternative_names: vec![],
492 file_indicators: vec![],
493 },
494 TechnologyRule {
495 name: "slog".to_string(),
496 category: TechnologyCategory::Library(LibraryType::Utility),
497 confidence: 0.85,
498 dependency_patterns: vec!["slog".to_string()],
499 requires: vec![],
500 conflicts_with: vec![],
501 is_primary_indicator: false,
502 alternative_names: vec![],
503 file_indicators: vec![],
504 },
505 TechnologyRule {
506 name: "fern".to_string(),
507 category: TechnologyCategory::Library(LibraryType::Utility),
508 confidence: 0.85,
509 dependency_patterns: vec!["fern".to_string()],
510 requires: vec![],
511 conflicts_with: vec![],
512 is_primary_indicator: false,
513 alternative_names: vec![],
514 file_indicators: vec![],
515 },
516 TechnologyRule {
518 name: "rstest".to_string(),
519 category: TechnologyCategory::Testing,
520 confidence: 0.85,
521 dependency_patterns: vec!["rstest".to_string()],
522 requires: vec![],
523 conflicts_with: vec![],
524 is_primary_indicator: false,
525 alternative_names: vec![],
526 file_indicators: vec![],
527 },
528 TechnologyRule {
529 name: "proptest".to_string(),
530 category: TechnologyCategory::Testing,
531 confidence: 0.85,
532 dependency_patterns: vec!["proptest".to_string()],
533 requires: vec![],
534 conflicts_with: vec![],
535 is_primary_indicator: false,
536 alternative_names: vec![],
537 file_indicators: vec![],
538 },
539 TechnologyRule {
540 name: "quickcheck".to_string(),
541 category: TechnologyCategory::Testing,
542 confidence: 0.85,
543 dependency_patterns: vec!["quickcheck".to_string()],
544 requires: vec![],
545 conflicts_with: vec![],
546 is_primary_indicator: false,
547 alternative_names: vec![],
548 file_indicators: vec![],
549 },
550 TechnologyRule {
551 name: "Criterion".to_string(),
552 category: TechnologyCategory::Testing,
553 confidence: 0.85,
554 dependency_patterns: vec!["criterion".to_string()],
555 requires: vec![],
556 conflicts_with: vec![],
557 is_primary_indicator: false,
558 alternative_names: vec![],
559 file_indicators: vec![],
560 },
561 TechnologyRule {
563 name: "Diesel".to_string(),
564 category: TechnologyCategory::Database,
565 confidence: 0.90,
566 dependency_patterns: vec!["diesel".to_string()],
567 requires: vec![],
568 conflicts_with: vec![],
569 is_primary_indicator: false,
570 alternative_names: vec![],
571 file_indicators: vec![],
572 },
573 TechnologyRule {
574 name: "SQLx".to_string(),
575 category: TechnologyCategory::Database,
576 confidence: 0.90,
577 dependency_patterns: vec!["sqlx".to_string()],
578 requires: vec![],
579 conflicts_with: vec![],
580 is_primary_indicator: false,
581 alternative_names: vec![],
582 file_indicators: vec![],
583 },
584 TechnologyRule {
585 name: "SeaORM".to_string(),
586 category: TechnologyCategory::Database,
587 confidence: 0.90,
588 dependency_patterns: vec![
589 "sea-orm".to_string(),
590 "sea-orm-migration".to_string(),
591 "sea-orm-cli".to_string(),
592 ],
593 requires: vec![],
594 conflicts_with: vec![],
595 is_primary_indicator: false,
596 alternative_names: vec!["seaorm".to_string()],
597 file_indicators: vec![],
598 },
599 TechnologyRule {
600 name: "Rbatis".to_string(),
601 category: TechnologyCategory::Database,
602 confidence: 0.90,
603 dependency_patterns: vec!["rbatis".to_string(), "rbdc".to_string()],
604 requires: vec![],
605 conflicts_with: vec![],
606 is_primary_indicator: false,
607 alternative_names: vec![],
608 file_indicators: vec![],
609 },
610 TechnologyRule {
612 name: "ring".to_string(),
613 category: TechnologyCategory::Library(LibraryType::Utility),
614 confidence: 0.85,
615 dependency_patterns: vec!["ring".to_string()],
616 requires: vec![],
617 conflicts_with: vec![],
618 is_primary_indicator: false,
619 alternative_names: vec![],
620 file_indicators: vec![],
621 },
622 TechnologyRule {
623 name: "rustls".to_string(),
624 category: TechnologyCategory::Library(LibraryType::Utility),
625 confidence: 0.85,
626 dependency_patterns: vec!["rustls".to_string()],
627 requires: vec![],
628 conflicts_with: vec![],
629 is_primary_indicator: false,
630 alternative_names: vec![],
631 file_indicators: vec![],
632 },
633 TechnologyRule {
634 name: "sha2".to_string(),
635 category: TechnologyCategory::Library(LibraryType::Utility),
636 confidence: 0.85,
637 dependency_patterns: vec!["sha2".to_string()],
638 requires: vec![],
639 conflicts_with: vec![],
640 is_primary_indicator: false,
641 alternative_names: vec![],
642 file_indicators: vec![],
643 },
644 TechnologyRule {
645 name: "hmac".to_string(),
646 category: TechnologyCategory::Library(LibraryType::Utility),
647 confidence: 0.85,
648 dependency_patterns: vec!["hmac".to_string()],
649 requires: vec![],
650 conflicts_with: vec![],
651 is_primary_indicator: false,
652 alternative_names: vec![],
653 file_indicators: vec![],
654 },
655 TechnologyRule {
656 name: "aes".to_string(),
657 category: TechnologyCategory::Library(LibraryType::Utility),
658 confidence: 0.85,
659 dependency_patterns: vec!["aes".to_string()],
660 requires: vec![],
661 conflicts_with: vec![],
662 is_primary_indicator: false,
663 alternative_names: vec![],
664 file_indicators: vec![],
665 },
666 TechnologyRule {
667 name: "rsa".to_string(),
668 category: TechnologyCategory::Library(LibraryType::Utility),
669 confidence: 0.85,
670 dependency_patterns: vec!["rsa".to_string()],
671 requires: vec![],
672 conflicts_with: vec![],
673 is_primary_indicator: false,
674 alternative_names: vec![],
675 file_indicators: vec![],
676 },
677 TechnologyRule {
679 name: "chrono".to_string(),
680 category: TechnologyCategory::Library(LibraryType::Utility),
681 confidence: 0.85,
682 dependency_patterns: vec!["chrono".to_string()],
683 requires: vec![],
684 conflicts_with: vec![],
685 is_primary_indicator: false,
686 alternative_names: vec![],
687 file_indicators: vec![],
688 },
689 TechnologyRule {
690 name: "time".to_string(),
691 category: TechnologyCategory::Library(LibraryType::Utility),
692 confidence: 0.85,
693 dependency_patterns: vec!["time".to_string()],
694 requires: vec![],
695 conflicts_with: vec![],
696 is_primary_indicator: false,
697 alternative_names: vec![],
698 file_indicators: vec![],
699 },
700 TechnologyRule {
702 name: "wasm-bindgen".to_string(),
703 category: TechnologyCategory::Library(LibraryType::Utility),
704 confidence: 0.85,
705 dependency_patterns: vec!["wasm-bindgen".to_string()],
706 requires: vec![],
707 conflicts_with: vec![],
708 is_primary_indicator: false,
709 alternative_names: vec![],
710 file_indicators: vec![],
711 },
712 TechnologyRule {
713 name: "js-sys".to_string(),
714 category: TechnologyCategory::Library(LibraryType::Utility),
715 confidence: 0.85,
716 dependency_patterns: vec!["js-sys".to_string()],
717 requires: vec![],
718 conflicts_with: vec![],
719 is_primary_indicator: false,
720 alternative_names: vec![],
721 file_indicators: vec![],
722 },
723 TechnologyRule {
724 name: "web-sys".to_string(),
725 category: TechnologyCategory::Library(LibraryType::Utility),
726 confidence: 0.85,
727 dependency_patterns: vec!["web-sys".to_string()],
728 requires: vec![],
729 conflicts_with: vec![],
730 is_primary_indicator: false,
731 alternative_names: vec![],
732 file_indicators: vec![],
733 },
734 TechnologyRule {
736 name: "Bevy".to_string(),
737 category: TechnologyCategory::Library(LibraryType::Utility),
738 confidence: 0.95,
739 dependency_patterns: vec!["bevy".to_string()],
740 requires: vec![],
741 conflicts_with: vec![],
742 is_primary_indicator: true,
743 alternative_names: vec![],
744 file_indicators: vec![],
745 },
746 TechnologyRule {
747 name: "ggez".to_string(),
748 category: TechnologyCategory::Library(LibraryType::Utility),
749 confidence: 0.95,
750 dependency_patterns: vec!["ggez".to_string()],
751 requires: vec![],
752 conflicts_with: vec![],
753 is_primary_indicator: true,
754 alternative_names: vec![],
755 file_indicators: vec![],
756 },
757 TechnologyRule {
759 name: "handlebars".to_string(),
760 category: TechnologyCategory::Library(LibraryType::Utility),
761 confidence: 0.85,
762 dependency_patterns: vec!["handlebars".to_string()],
763 requires: vec![],
764 conflicts_with: vec![],
765 is_primary_indicator: false,
766 alternative_names: vec![],
767 file_indicators: vec![],
768 },
769 TechnologyRule {
770 name: "tera".to_string(),
771 category: TechnologyCategory::Library(LibraryType::Utility),
772 confidence: 0.85,
773 dependency_patterns: vec!["tera".to_string()],
774 requires: vec![],
775 conflicts_with: vec![],
776 is_primary_indicator: false,
777 alternative_names: vec![],
778 file_indicators: vec![],
779 },
780 TechnologyRule {
781 name: "askama".to_string(),
782 category: TechnologyCategory::Library(LibraryType::Utility),
783 confidence: 0.85,
784 dependency_patterns: vec!["askama".to_string()],
785 requires: vec![],
786 conflicts_with: vec![],
787 is_primary_indicator: false,
788 alternative_names: vec![],
789 file_indicators: vec![],
790 },
791 TechnologyRule {
793 name: "ndarray".to_string(),
794 category: TechnologyCategory::Library(LibraryType::Utility),
795 confidence: 0.85,
796 dependency_patterns: vec!["ndarray".to_string()],
797 requires: vec![],
798 conflicts_with: vec![],
799 is_primary_indicator: false,
800 alternative_names: vec![],
801 file_indicators: vec![],
802 },
803 TechnologyRule {
804 name: "nalgebra".to_string(),
805 category: TechnologyCategory::Library(LibraryType::Utility),
806 confidence: 0.85,
807 dependency_patterns: vec!["nalgebra".to_string()],
808 requires: vec![],
809 conflicts_with: vec![],
810 is_primary_indicator: false,
811 alternative_names: vec![],
812 file_indicators: vec![],
813 },
814 TechnologyRule {
816 name: "image".to_string(),
817 category: TechnologyCategory::Library(LibraryType::Utility),
818 confidence: 0.85,
819 dependency_patterns: vec!["image".to_string()],
820 requires: vec![],
821 conflicts_with: vec![],
822 is_primary_indicator: false,
823 alternative_names: vec![],
824 file_indicators: vec![],
825 },
826 TechnologyRule {
828 name: "nom".to_string(),
829 category: TechnologyCategory::Library(LibraryType::Utility),
830 confidence: 0.85,
831 dependency_patterns: vec!["nom".to_string()],
832 requires: vec![],
833 conflicts_with: vec![],
834 is_primary_indicator: false,
835 alternative_names: vec![],
836 file_indicators: vec![],
837 },
838 TechnologyRule {
839 name: "pest".to_string(),
840 category: TechnologyCategory::Library(LibraryType::Utility),
841 confidence: 0.85,
842 dependency_patterns: vec!["pest".to_string()],
843 requires: vec![],
844 conflicts_with: vec![],
845 is_primary_indicator: false,
846 alternative_names: vec![],
847 file_indicators: vec![],
848 },
849 TechnologyRule {
851 name: "flate2".to_string(),
852 category: TechnologyCategory::Library(LibraryType::Utility),
853 confidence: 0.85,
854 dependency_patterns: vec!["flate2".to_string()],
855 requires: vec![],
856 conflicts_with: vec![],
857 is_primary_indicator: false,
858 alternative_names: vec![],
859 file_indicators: vec![],
860 },
861 TechnologyRule {
862 name: "zstd".to_string(),
863 category: TechnologyCategory::Library(LibraryType::Utility),
864 confidence: 0.85,
865 dependency_patterns: vec!["zstd".to_string()],
866 requires: vec![],
867 conflicts_with: vec![],
868 is_primary_indicator: false,
869 alternative_names: vec![],
870 file_indicators: vec![],
871 },
872 ]
873}