tailwind_rs_postcss/css_optimizer/
mod.rs

1//! CSS Optimization System
2//!
3//! This module provides comprehensive CSS optimization functionality including
4//! rule merging, property optimization, selector optimization, and CSS minification.
5
6pub mod analyzer;
7pub mod minifier;
8pub mod property_optimizer;
9pub mod rule_merger;
10pub mod selector_optimizer;
11pub mod types;
12
13// Re-export types for convenience
14
15/// Main CSS optimizer for comprehensive CSS optimization
16pub 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    /// Create a new CSS optimizer with default configuration
27    pub fn new() -> Self {
28        Self::with_config(types::OptimizationConfig::default())
29    }
30
31    /// Create a new CSS optimizer with custom configuration
32    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    /// Optimize CSS with comprehensive analysis and optimization
44    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        // Step 1: Analyze CSS for optimization opportunities
52        let analysis = self.analyzer.analyze(css)?;
53
54        // Step 2: Apply optimizations based on configuration
55        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    /// Get optimization statistics
105    pub fn get_statistics(&self) -> types::OptimizationStatistics {
106        types::OptimizationStatistics {
107            total_optimizations: 0, // Will be updated during optimization
108            average_size_reduction: 0.0,
109            processing_time: std::time::Duration::from_secs(0),
110        }
111    }
112}
113
114// Re-export types for convenience
115pub use types::*;