syncable_cli/analyzer/frameworks/
rust.rs

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        // 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!["Rust"]
30    }
31}
32
33/// Rust technology detection rules with comprehensive framework coverage
34fn get_rust_technology_rules() -> Vec<TechnologyRule> {
35    vec![
36        // WEB FRAMEWORKS
37        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        // ASYNC RUNTIMES
247        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        // HTTP CLIENTS & SERVERS
281        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        // ERROR HANDLING
315        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        // SERIALIZATION
360        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        // CLI FRAMEWORKS
416        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        // LOGGING AND TRACING
461        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        // TESTING
517        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        // DATABASE
562        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        // CRYPTOGRAPHY & SECURITY
611        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        // DATE/TIME
678        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        // WASM
701        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        // GAME DEVELOPMENT
735        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        // TEMPLATING
758        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        // MATH/SCIENCE
792        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        // IMAGE PROCESSING
815        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        // PARSING
827        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        // COMPRESSION
850        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}