cli: add progress indicators to various commands

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I49d0c21e12e5f424bad105b32845798d6a6a6964
This commit is contained in:
raf 2026-05-03 03:04:04 +03:00
commit 1873bb19ae
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
4 changed files with 142 additions and 18 deletions

View file

@ -1,4 +1,7 @@
use std::{collections::HashMap, path::Path};
use std::{collections::HashMap, path::Path, time::Duration};
use indicatif::{ProgressBar, ProgressStyle};
use yansi::Paint;
use crate::{
error::{PakkerError, Result},
@ -113,6 +116,15 @@ pub async fn execute(
let platform = create_platform("curseforge", cf_api_key)?;
let spinner = ProgressBar::new_spinner();
spinner.set_style(
ProgressStyle::default_spinner()
.template("{spinner:.green} {msg}")
.expect("spinner template is valid"),
);
spinner.enable_steady_tick(Duration::from_millis(80));
spinner.set_message("Fetching from CurseForge...");
let mut project = platform
.request_project_with_files(&input, mc_versions, &loaders)
.await
@ -122,6 +134,8 @@ pub async fn execute(
))
})?;
spinner.finish_and_clear();
// If file_id specified, filter to that file
if let Some(fid) = file_id {
project.files.retain(|f| f.id == fid);
@ -133,6 +147,7 @@ pub async fn execute(
}
projects_to_merge.push(project);
spinner.finish_and_clear();
}
// Modrinth
@ -142,6 +157,15 @@ pub async fn execute(
let platform = create_platform("modrinth", None)?;
let spinner = ProgressBar::new_spinner();
spinner.set_style(
ProgressStyle::default_spinner()
.template("{spinner:.green} {msg}")
.expect("spinner template is valid"),
);
spinner.enable_steady_tick(Duration::from_millis(80));
spinner.set_message("Fetching from Modrinth...");
let mut project = platform
.request_project_with_files(&input, mc_versions, &loaders)
.await
@ -159,6 +183,7 @@ pub async fn execute(
}
}
spinner.finish_and_clear();
projects_to_merge.push(project);
}
@ -170,6 +195,15 @@ pub async fn execute(
let gh_token = std::env::var("GITHUB_TOKEN").ok();
let platform = create_platform("github", gh_token)?;
let spinner = ProgressBar::new_spinner();
spinner.set_style(
ProgressStyle::default_spinner()
.template("{spinner:.green} {msg}")
.expect("spinner template is valid"),
);
spinner.enable_steady_tick(Duration::from_millis(80));
spinner.set_message("Fetching from GitHub...");
let repo_path = format!("{owner}/{repo}");
let mut project = platform
.request_project_with_files(&repo_path, mc_versions, &loaders)
@ -190,6 +224,7 @@ pub async fn execute(
}
}
spinner.finish_and_clear();
projects_to_merge.push(project);
}
@ -259,7 +294,10 @@ pub async fn execute(
log::info!("Replacing existing project: {existing_name}");
lockfile.projects[pos] = combined_project.clone();
println!("✓ Replaced '{existing_name}' with '{project_name}'");
println!(
"{}",
format!("✓ Replaced '{existing_name}' with '{project_name}'").green()
);
} else {
if !yes {
let prompt_msg = format!("Add project '{project_name}'?");
@ -270,13 +308,22 @@ pub async fn execute(
}
lockfile.add_project(combined_project.clone());
println!("✓ Added '{project_name}'");
println!("{}", format!("✓ Added '{project_name}'").green());
}
// Resolve dependencies unless --no-deps is specified
if !no_deps {
log::info!("Resolving dependencies...");
let dep_spinner = ProgressBar::new_spinner();
dep_spinner.set_style(
ProgressStyle::default_spinner()
.template("{spinner:.green} {msg}")
.expect("spinner template is valid"),
);
dep_spinner.enable_steady_tick(Duration::from_millis(80));
dep_spinner.set_message("Resolving dependencies...");
let platforms = create_all_platforms();
let mut resolver = DependencyResolver::new();
@ -284,6 +331,8 @@ pub async fn execute(
.resolve(&mut combined_project, &mut lockfile, &platforms)
.await?;
dep_spinner.finish_and_clear();
for dep in deps {
// Skip if already in lockfile
if lockfile.projects.iter().any(|p| {
@ -310,7 +359,7 @@ pub async fn execute(
log::info!("Adding dependency: {dep_name}");
lockfile.add_project(dep);
println!(" ✓ Added dependency '{dep_name}'");
println!("{}", format!(" ✓ Added dependency '{dep_name}'").green());
}
}