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