tailwind_rs_postcss/css_optimizer/
mod.rs1pub mod analyzer;
7pub mod minifier;
8pub mod property_optimizer;
9pub mod rule_merger;
10pub mod selector_optimizer;
11pub mod types;
12
13pub struct CSSOptimizer {
17 analyzer: analyzer::CSSAnalyzer,
18 rule_merger: rule_merger::RuleMerger,
19 property_optimizer: property_optimizer::PropertyOptimizer,
20 selector_optimizer: selector_optimizer::SelectorOptimizer,
21 minifier: minifier::CSSMinifier,
22 config: types::OptimizationConfig,
23}
24
25impl CSSOptimizer {
26 pub fn new() -> Self {
28 Self::with_config(types::OptimizationConfig::default())
29 }
30
31 pub fn with_config(config: types::OptimizationConfig) -> Self {
33 Self {
34 analyzer: analyzer::CSSAnalyzer::new(),
35 rule_merger: rule_merger::RuleMerger::new(),
36 property_optimizer: property_optimizer::PropertyOptimizer::new(),
37 selector_optimizer: selector_optimizer::SelectorOptimizer::new(),
38 minifier: minifier::CSSMinifier::new(),
39 config,
40 }
41 }
42
43 pub fn optimize(
45 &mut self,
46 css: &str,
47 ) -> Result<types::OptimizationResult, types::OptimizationError> {
48 let start_time = std::time::Instant::now();
49 let original_size = css.len();
50
51 let analysis = self.analyzer.analyze(css)?;
53
54 let mut optimized_css = css.to_string();
56 let mut metrics = types::OptimizationMetrics::new();
57
58 if self.config.merge_rules {
59 let merge_result = self.rule_merger.merge_rules(&optimized_css)?;
60 optimized_css = merge_result.optimized_css;
61 metrics.rules_merged = merge_result.rules_merged;
62 }
63
64 if self.config.optimize_properties {
65 let property_result = self
66 .property_optimizer
67 .optimize_properties(&optimized_css)?;
68 optimized_css = property_result.optimized_css;
69 metrics.properties_optimized = property_result.properties_optimized;
70 metrics.duplicates_removed = property_result.duplicates_removed;
71 }
72
73 if self.config.optimize_selectors {
74 let selector_result = self.selector_optimizer.optimize_selectors(&optimized_css)?;
75 optimized_css = selector_result.optimized_css;
76 metrics.selectors_optimized = selector_result.selectors_optimized;
77 }
78
79 if self.config.minify {
80 let minified = self.minifier.minify(&optimized_css)?;
81 optimized_css = minified;
82 }
83
84 let processing_time = start_time.elapsed();
85 let final_size = optimized_css.len();
86 let size_reduction = if original_size > 0 {
87 ((original_size - final_size) as f64 / original_size as f64) * 100.0
88 } else {
89 0.0
90 };
91
92 metrics.original_size = original_size;
93 metrics.optimized_size = final_size;
94 metrics.size_reduction_percentage = size_reduction;
95 metrics.processing_time = processing_time;
96
97 Ok(types::OptimizationResult {
98 optimized_css,
99 metrics,
100 analysis,
101 })
102 }
103
104 pub fn get_statistics(&self) -> types::OptimizationStatistics {
106 types::OptimizationStatistics {
107 total_optimizations: 0, average_size_reduction: 0.0,
109 processing_time: std::time::Duration::from_secs(0),
110 }
111 }
112}
113
114pub use types::*;