use crate::{config::Cfg, List}; use crate::{ db::userlist_get_all_current_versions_with_mods, error::{ErrorType, MLError, MLE}, files::{ clean_list_dir, delete_version, disable_version, download_versions, get_downloaded_versions, }, modrinth::get_raw_versions, }; pub async fn download(config: Cfg, liststack: Vec, clean: bool, delete_old: bool) -> MLE<()> { for current_list in liststack { println!("Downloading current versions of mods in {}", current_list.id); let downloaded_versions = get_downloaded_versions(current_list.clone())?; // println!("To download: {:#?}", downloaded_versions); let current_version_ids = match userlist_get_all_current_versions_with_mods( config.clone(), String::from(¤t_list.id), ) { Ok(i) => Ok(i), Err(e) => Err(MLError::new(ErrorType::DBError, e.to_string().as_str())), }?; let mut to_download: Vec = vec![]; //(mod_id, version_id) let mut to_disable: Vec<(String, String)> = vec![]; for version in current_version_ids { let mod_id = version.0; let current_version = version.1; let current_download = downloaded_versions.get(&mod_id); if current_download.is_none() || clean { to_download.push(current_version); } else { let downloaded_version = current_download .ok_or("SOMETHING_HAS_REALLY_GONE_WRONG") .unwrap(); if ¤t_version != downloaded_version { to_disable.push((mod_id.clone(), String::from(downloaded_version))); to_download.push(current_version); } } } if clean { clean_list_dir(¤t_list)? }; if !to_download.is_empty() { download_versions( current_list.clone(), config.clone(), get_raw_versions(&config.apis.modrinth, to_download).await, ) .await?; } else { println!("There are no new versions to download"); } if !to_disable.is_empty() { for ver in to_disable { if delete_old { // println!("Deleting version {} for mod {}", ver.1, ver.0); delete_version(current_list.clone(), ver.1)?; } else { disable_version(config.clone(), current_list.clone(), ver.1, ver.0)?; }; } } } Ok(()) }