tailwind_rs_postcss/purger/
mod.rs1pub mod content_scanner;
7pub mod class_extractor;
8pub mod rule_filter;
9pub mod types;
10
11use types::*;
12
13pub struct CSSPurger {
15 content_scanner: content_scanner::ContentScanner,
16 class_extractor: class_extractor::ClassExtractor,
17 rule_filter: rule_filter::RuleFilter,
18 config: PurgeConfig,
19}
20
21impl CSSPurger {
22 pub fn new() -> Self {
24 Self::with_config(PurgeConfig::default())
25 }
26
27 pub fn with_config(config: PurgeConfig) -> Self {
29 Self {
30 content_scanner: content_scanner::ContentScanner::new(),
31 class_extractor: class_extractor::ClassExtractor::new(),
32 rule_filter: rule_filter::RuleFilter::new(),
33 config,
34 }
35 }
36
37 pub fn purge(&mut self, css: &str, content_paths: &[String]) -> Result<PurgeResult, PurgeError> {
39 let start_time = std::time::Instant::now();
40
41 let used_classes = self.content_scanner.scan_content(content_paths)?;
43
44 let css_classes = self.class_extractor.extract_classes(css)?;
46
47 let filtered_css = self.rule_filter.filter_rules(css, &used_classes, &self.config)?;
49
50 let processing_time = start_time.elapsed();
51 let original_size = css.len();
52 let purged_size = filtered_css.len();
53 let size_reduction = if original_size > 0 {
54 ((original_size - purged_size) as f64 / original_size as f64) * 100.0
55 } else {
56 0.0
57 };
58
59 Ok(PurgeResult {
60 purged_css: filtered_css,
61 used_classes: used_classes.len(),
62 removed_classes: css_classes.len() - used_classes.len(),
63 original_size,
64 purged_size,
65 size_reduction_percentage: size_reduction,
66 processing_time,
67 })
68 }
69
70 pub fn purge_advanced(&mut self, css: &str, content_paths: &[String], options: &PurgeOptions) -> Result<PurgeResult, PurgeError> {
72 let start_time = std::time::Instant::now();
73
74 let used_classes = self.content_scanner.scan_content_advanced(content_paths, options)?;
76
77 let css_classes = self.class_extractor.extract_classes(css)?;
79
80 let filtered_css = self.rule_filter.filter_rules_advanced(css, &used_classes, &self.config, options)?;
82
83 let processing_time = start_time.elapsed();
84 let original_size = css.len();
85 let purged_size = filtered_css.len();
86 let size_reduction = if original_size > 0 {
87 ((original_size - purged_size) as f64 / original_size as f64) * 100.0
88 } else {
89 0.0
90 };
91
92 Ok(PurgeResult {
93 purged_css: filtered_css,
94 used_classes: used_classes.len(),
95 removed_classes: css_classes.len() - used_classes.len(),
96 original_size,
97 purged_size,
98 size_reduction_percentage: size_reduction,
99 processing_time,
100 })
101 }
102
103 pub fn get_statistics(&self) -> PurgeStatistics {
105 PurgeStatistics {
106 total_purges: 0, average_size_reduction: 0.0,
108 processing_time: std::time::Duration::from_secs(0),
109 }
110 }
111}
112
113pub use types::*;