packium/src/commands/update.rs

68 lines
1.7 KiB
Rust

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<Diff> = 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();
}