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