use std::collections::HashMap; use std::sync::Arc; use tokio::sync::Mutex; use tokio_util::sync::CancellationToken; #[derive(Default)] pub struct DownloadManagerState { pub cancel_tokens: HashMap, } #[derive(serde::Deserialize, Clone, Debug)] pub struct ProxyConfig { pub url: String, pub username: Option, pub password: Option, pub no_proxy: Option>, // List of domains to bypass proxy pub ignore_ssl: Option, // Ignore SSL certificate verification } #[derive(serde::Deserialize, Clone, Debug)] pub struct DownloadItem { pub url: String, pub save_path: String, pub proxy: Option, pub sha256: Option, pub size: Option, } #[derive(serde::Serialize, Clone, Debug)] pub struct DownloadEvent { pub transferred: u64, pub total: u64, } /// Structure to track progress for each file in parallel downloads #[derive(Clone)] pub struct ProgressTracker { file_progress: Arc>>, total_size: u64, } impl ProgressTracker { pub fn new(_items: &[DownloadItem], sizes: HashMap) -> Self { let total_size = sizes.values().sum(); ProgressTracker { file_progress: Arc::new(Mutex::new(HashMap::new())), total_size, } } pub async fn update_progress(&self, file_id: &str, transferred: u64) { let mut progress = self.file_progress.lock().await; progress.insert(file_id.to_string(), transferred); } pub async fn get_total_progress(&self) -> (u64, u64) { let progress = self.file_progress.lock().await; let total_transferred: u64 = progress.values().sum(); (total_transferred, self.total_size) } }