use crate::{CompressionAlgorithm, SnapshotConfig};
use std::time::Duration;
#[derive(Debug, Clone)]
pub enum SnapshotPreset {
Development,
Production,
HighPerformance,
LowMemory,
NetworkOptimized,
Debug,
Custom(SnapshotConfig),
}
impl SnapshotPreset {
pub fn config(&self) -> SnapshotConfig {
match self {
SnapshotPreset::Development => Self::development_config(),
SnapshotPreset::Production => Self::production_config(),
SnapshotPreset::HighPerformance => Self::high_performance_config(),
SnapshotPreset::LowMemory => Self::low_memory_config(),
SnapshotPreset::NetworkOptimized => Self::network_optimized_config(),
SnapshotPreset::Debug => Self::debug_config(),
SnapshotPreset::Custom(config) => config.clone(),
}
}
fn development_config() -> SnapshotConfig {
SnapshotConfig {
compression_enabled: true,
compression_algorithm: CompressionAlgorithm::Lz4,
compression_level: 1, validation_enabled: true,
memory_mapping_enabled: true,
parallel_loading: true,
progress_reporting: true, max_optimization_level: crate::OptimizationLevel::MaxPerformance,
max_cache_size: 64 * 1024 * 1024, cache_eviction_policy: crate::CacheEvictionPolicy::LeastRecentlyUsed,
}
}
fn production_config() -> SnapshotConfig {
SnapshotConfig {
compression_enabled: true,
compression_algorithm: CompressionAlgorithm::Auto,
compression_level: 6, validation_enabled: true,
memory_mapping_enabled: true,
parallel_loading: true,
progress_reporting: false, max_optimization_level: crate::OptimizationLevel::MaxPerformance,
max_cache_size: 128 * 1024 * 1024, cache_eviction_policy: crate::CacheEvictionPolicy::Adaptive,
}
}
fn high_performance_config() -> SnapshotConfig {
SnapshotConfig {
compression_enabled: true,
compression_algorithm: CompressionAlgorithm::Lz4,
compression_level: 1, validation_enabled: false, memory_mapping_enabled: true,
parallel_loading: true,
progress_reporting: false,
max_optimization_level: crate::OptimizationLevel::MaxPerformance,
max_cache_size: 256 * 1024 * 1024, cache_eviction_policy: crate::CacheEvictionPolicy::LeastRecentlyUsed,
}
}
fn low_memory_config() -> SnapshotConfig {
SnapshotConfig {
compression_enabled: true,
compression_algorithm: CompressionAlgorithm::Zstd,
compression_level: 9, validation_enabled: true,
memory_mapping_enabled: false, parallel_loading: false, progress_reporting: false,
max_optimization_level: crate::OptimizationLevel::MaxPerformance,
max_cache_size: 16 * 1024 * 1024, cache_eviction_policy: crate::CacheEvictionPolicy::TimeToLive(Duration::from_secs(60)),
}
}
fn network_optimized_config() -> SnapshotConfig {
SnapshotConfig {
compression_enabled: true,
compression_algorithm: CompressionAlgorithm::Zstd,
compression_level: 9, validation_enabled: true,
memory_mapping_enabled: true,
parallel_loading: true,
progress_reporting: false,
max_optimization_level: crate::OptimizationLevel::MaxPerformance,
max_cache_size: 32 * 1024 * 1024, cache_eviction_policy: crate::CacheEvictionPolicy::LeastFrequentlyUsed,
}
}
fn debug_config() -> SnapshotConfig {
SnapshotConfig {
compression_enabled: false, compression_algorithm: CompressionAlgorithm::None,
compression_level: 0,
validation_enabled: true,
memory_mapping_enabled: false, parallel_loading: false, progress_reporting: true, max_optimization_level: crate::OptimizationLevel::MaxPerformance,
max_cache_size: 128 * 1024 * 1024, cache_eviction_policy: crate::CacheEvictionPolicy::LeastRecentlyUsed,
}
}
pub fn all_presets() -> Vec<SnapshotPreset> {
vec![
SnapshotPreset::Development,
SnapshotPreset::Production,
SnapshotPreset::HighPerformance,
SnapshotPreset::LowMemory,
SnapshotPreset::NetworkOptimized,
SnapshotPreset::Debug,
]
}
pub fn from_name(name: &str) -> Option<SnapshotPreset> {
match name.to_lowercase().as_str() {
"development" | "dev" => Some(SnapshotPreset::Development),
"production" | "prod" => Some(SnapshotPreset::Production),
"high-performance" | "highperf" | "performance" => {
Some(SnapshotPreset::HighPerformance)
}
"low-memory" | "lowmem" | "minimal" => Some(SnapshotPreset::LowMemory),
"network-optimized" | "network" | "small" => Some(SnapshotPreset::NetworkOptimized),
"debug" => Some(SnapshotPreset::Debug),
_ => None,
}
}
pub fn name(&self) -> &'static str {
match self {
SnapshotPreset::Development => "Development",
SnapshotPreset::Production => "Production",
SnapshotPreset::HighPerformance => "High-Performance",
SnapshotPreset::LowMemory => "Low-Memory",
SnapshotPreset::NetworkOptimized => "Network-Optimized",
SnapshotPreset::Debug => "Debug",
SnapshotPreset::Custom(_) => "Custom",
}
}
pub fn description(&self) -> &'static str {
match self {
SnapshotPreset::Development => {
"Fast build times with minimal compression, ideal for development iteration"
}
SnapshotPreset::Production => {
"Balanced performance and size, recommended for production deployments"
}
SnapshotPreset::HighPerformance => {
"Optimized for fastest loading times, minimal validation overhead"
}
SnapshotPreset::LowMemory => {
"Minimal memory usage with maximum compression for constrained environments"
}
SnapshotPreset::NetworkOptimized => {
"Smallest possible file size for network distribution"
}
SnapshotPreset::Debug => "Maximum validation and debugging information, no compression",
SnapshotPreset::Custom(_) => "Custom configuration with user-specified settings",
}
}
pub fn characteristics(&self) -> PresetCharacteristics {
match self {
SnapshotPreset::Development => PresetCharacteristics {
build_time: BuildTime::Fast,
load_time: LoadTime::Fast,
file_size: FileSize::Medium,
memory_usage: MemoryUsage::Medium,
validation_level: ValidationLevel::Standard,
debugging_friendly: true,
},
SnapshotPreset::Production => PresetCharacteristics {
build_time: BuildTime::Medium,
load_time: LoadTime::Fast,
file_size: FileSize::Small,
memory_usage: MemoryUsage::Medium,
validation_level: ValidationLevel::Standard,
debugging_friendly: false,
},
SnapshotPreset::HighPerformance => PresetCharacteristics {
build_time: BuildTime::Fast,
load_time: LoadTime::VeryFast,
file_size: FileSize::Medium,
memory_usage: MemoryUsage::High,
validation_level: ValidationLevel::Minimal,
debugging_friendly: false,
},
SnapshotPreset::LowMemory => PresetCharacteristics {
build_time: BuildTime::Slow,
load_time: LoadTime::Medium,
file_size: FileSize::VerySmall,
memory_usage: MemoryUsage::VeryLow,
validation_level: ValidationLevel::Standard,
debugging_friendly: false,
},
SnapshotPreset::NetworkOptimized => PresetCharacteristics {
build_time: BuildTime::Slow,
load_time: LoadTime::Medium,
file_size: FileSize::VerySmall,
memory_usage: MemoryUsage::Low,
validation_level: ValidationLevel::Standard,
debugging_friendly: false,
},
SnapshotPreset::Debug => PresetCharacteristics {
build_time: BuildTime::Medium,
load_time: LoadTime::Medium,
file_size: FileSize::Large,
memory_usage: MemoryUsage::Medium,
validation_level: ValidationLevel::Comprehensive,
debugging_friendly: true,
},
SnapshotPreset::Custom(_) => PresetCharacteristics {
build_time: BuildTime::Medium,
load_time: LoadTime::Medium,
file_size: FileSize::Medium,
memory_usage: MemoryUsage::Medium,
validation_level: ValidationLevel::Standard,
debugging_friendly: false,
},
}
}
}
#[derive(Debug, Clone)]
pub struct PresetCharacteristics {
pub build_time: BuildTime,
pub load_time: LoadTime,
pub file_size: FileSize,
pub memory_usage: MemoryUsage,
pub validation_level: ValidationLevel,
pub debugging_friendly: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum BuildTime {
VeryFast,
Fast,
Medium,
Slow,
VerySlow,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum LoadTime {
VeryFast,
Fast,
Medium,
Slow,
VerySlow,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum FileSize {
VerySmall,
Small,
Medium,
Large,
VeryLarge,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum MemoryUsage {
VeryLow,
Low,
Medium,
High,
VeryHigh,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum ValidationLevel {
None,
Minimal,
Standard,
Comprehensive,
Exhaustive,
}
impl std::fmt::Display for BuildTime {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
BuildTime::VeryFast => write!(f, "Very Fast"),
BuildTime::Fast => write!(f, "Fast"),
BuildTime::Medium => write!(f, "Medium"),
BuildTime::Slow => write!(f, "Slow"),
BuildTime::VerySlow => write!(f, "Very Slow"),
}
}
}
impl std::fmt::Display for LoadTime {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LoadTime::VeryFast => write!(f, "Very Fast"),
LoadTime::Fast => write!(f, "Fast"),
LoadTime::Medium => write!(f, "Medium"),
LoadTime::Slow => write!(f, "Slow"),
LoadTime::VerySlow => write!(f, "Very Slow"),
}
}
}
impl std::fmt::Display for FileSize {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
FileSize::VerySmall => write!(f, "Very Small"),
FileSize::Small => write!(f, "Small"),
FileSize::Medium => write!(f, "Medium"),
FileSize::Large => write!(f, "Large"),
FileSize::VeryLarge => write!(f, "Very Large"),
}
}
}
impl std::fmt::Display for MemoryUsage {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
MemoryUsage::VeryLow => write!(f, "Very Low"),
MemoryUsage::Low => write!(f, "Low"),
MemoryUsage::Medium => write!(f, "Medium"),
MemoryUsage::High => write!(f, "High"),
MemoryUsage::VeryHigh => write!(f, "Very High"),
}
}
}
impl std::fmt::Display for ValidationLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ValidationLevel::None => write!(f, "None"),
ValidationLevel::Minimal => write!(f, "Minimal"),
ValidationLevel::Standard => write!(f, "Standard"),
ValidationLevel::Comprehensive => write!(f, "Comprehensive"),
ValidationLevel::Exhaustive => write!(f, "Exhaustive"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_preset_from_name() {
assert!(matches!(
SnapshotPreset::from_name("development"),
Some(SnapshotPreset::Development)
));
assert!(matches!(
SnapshotPreset::from_name("prod"),
Some(SnapshotPreset::Production)
));
assert!(matches!(
SnapshotPreset::from_name("highperf"),
Some(SnapshotPreset::HighPerformance)
));
assert!(SnapshotPreset::from_name("invalid").is_none());
}
#[test]
fn test_preset_names() {
assert_eq!(SnapshotPreset::Development.name(), "Development");
assert_eq!(SnapshotPreset::Production.name(), "Production");
assert_eq!(SnapshotPreset::Debug.name(), "Debug");
}
#[test]
fn test_preset_configs() {
let dev_config = SnapshotPreset::Development.config();
assert!(dev_config.progress_reporting);
assert_eq!(dev_config.compression_level, 1);
let prod_config = SnapshotPreset::Production.config();
assert!(!prod_config.progress_reporting);
assert_eq!(prod_config.compression_level, 6);
let debug_config = SnapshotPreset::Debug.config();
assert!(!debug_config.compression_enabled);
assert!(debug_config.validation_enabled);
}
#[test]
fn test_preset_characteristics() {
let high_perf = SnapshotPreset::HighPerformance;
let chars = high_perf.characteristics();
assert_eq!(chars.load_time, LoadTime::VeryFast);
assert_eq!(chars.memory_usage, MemoryUsage::High);
assert_eq!(chars.validation_level, ValidationLevel::Minimal);
let low_mem = SnapshotPreset::LowMemory;
let chars = low_mem.characteristics();
assert_eq!(chars.memory_usage, MemoryUsage::VeryLow);
assert_eq!(chars.file_size, FileSize::VerySmall);
}
#[test]
fn test_all_presets() {
let presets = SnapshotPreset::all_presets();
assert_eq!(presets.len(), 6);
let names: std::collections::HashSet<_> = presets.iter().map(|p| p.name()).collect();
assert_eq!(names.len(), 6);
}
#[test]
fn test_characteristic_ordering() {
assert!(BuildTime::VeryFast < BuildTime::Fast);
assert!(LoadTime::Fast < LoadTime::Medium);
assert!(FileSize::Small < FileSize::Large);
assert!(MemoryUsage::Low < MemoryUsage::High);
assert!(ValidationLevel::Minimal < ValidationLevel::Standard);
}
}