68 lines
1.7 KiB
Rust
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();
|
|
}
|