use crate::{ config, modrinth::{project::get_project_versions, versions::ProjectVersion}, pack::{Mod, Modpack}, }; use colored::*; use inquire::MultiSelect; use std::fmt; struct Diff { r#mod: Mod, new_version: ProjectVersion, } impl fmt::Display for Diff { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "{} {} -> {}", self.r#mod.title.bold(), self.r#mod.version.as_ref().unwrap().version_number.red(), self.new_version.version_number.green() ) } } pub async fn update() { let mut config = config::Config::get().unwrap(); let modpack = Modpack::from_config(&config).await.unwrap(); let mut diffs: Vec = vec![]; // Find the newest compatible version of the mod for (project_id, r#mod) in modpack.mods { let project_versions = get_project_versions(&project_id, &config.game_version) .await .unwrap(); let new_version = project_versions.get(0).unwrap(); if r#mod.version.as_ref().unwrap().version_number == new_version.version_number { continue; } diffs.push(Diff { r#mod, new_version: new_version.clone(), }) } if diffs.len() == 0 { return println!("There are no mods left to update :)"); } let updated_diffs = MultiSelect::new("Select mods to update", diffs) .prompt() .unwrap(); // Bumb the new versions to the config for diff in updated_diffs { config .projects .insert(diff.r#mod.project_id, diff.new_version.id.to_string()); } config.save().unwrap(); }