syncable_cli/analyzer/frameworks/
rust.rs

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        // Combine main and dev dependencies for comprehensive detection
12        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
29/// Rust technology detection rules with comprehensive framework coverage
30fn get_rust_technology_rules() -> Vec<TechnologyRule> {
31    vec![
32        // WEB FRAMEWORKS
33        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        // ASYNC RUNTIMES
244        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        // HTTP CLIENTS & SERVERS
279        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        // ERROR HANDLING
314        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        // 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        
416        // CLI FRAMEWORKS
417        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        // LOGGING AND TRACING
463        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        // TESTING
520        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        // DATABASE
566        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        // CRYPTOGRAPHY & SECURITY
612        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        // DATE/TIME
680        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        // WASM
704        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        // GAME DEVELOPMENT
739        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        // TEMPLATING
763        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        // MATH/SCIENCE
798        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        // IMAGE PROCESSING
822        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        // PARSING
835        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        // COMPRESSION
859        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}