Files
Senbei/src/ui.rs
T
2026-08-09 00:08:31 +08:00

74 lines
2.1 KiB
Rust

use crate::unpacker::{IntegrityReport, Kind};
use indicatif::{ProgressBar, ProgressStyle};
use owo_colors::OwoColorize;
use std::path::Path;
/// Create a progress bar for `n` items. Hidden when `quiet` is true.
pub fn progress(n: u64, quiet: bool) -> ProgressBar {
if quiet || n == 0 {
return ProgressBar::hidden();
}
let bar = ProgressBar::new(n);
bar.set_style(
ProgressStyle::default_bar()
.template("[{elapsed_precise}] {bar:40.cyan/blue} {pos}/{len} {msg}")
.unwrap_or_else(|_| ProgressStyle::default_bar()),
);
bar
}
/// Print a green success line, suspending the progress bar.
pub fn ok(bar: &ProgressBar, quiet: bool, rel: &Path, kind: Kind, dest: &Path) {
if quiet {
return;
}
let msg = format!(
"{} {:?} {} -> {}",
"✓".green(),
kind,
rel.display(),
dest.display()
);
bar.suspend(|| println!("{msg}"));
}
/// Print a green success line for a de-obfuscated il2cpp `global-metadata.dat`,
/// reporting how many method tokens were remapped.
pub fn metadata(bar: &ProgressBar, quiet: bool, rel: &Path, remapped: usize, dest: &Path) {
if quiet {
return;
}
let msg = format!(
"{} metadata {} -> {} ({} method tokens remapped)",
"✓".green(),
rel.display(),
dest.display(),
remapped
);
bar.suspend(|| println!("{msg}"));
}
/// Print a red error line, suspending the progress bar.
pub fn err(bar: &ProgressBar, quiet: bool, rel: &Path, e: &anyhow::Error) {
if quiet {
return;
}
let msg = format!("{} {} {e:#}", "✗".red(), rel.display());
bar.suspend(|| eprintln!("{msg}"));
}
/// Print a yellow warning line for a file that unpacked but failed the static
/// integrity check (likely to crash at runtime), suspending the progress bar.
pub fn suspect(bar: &ProgressBar, quiet: bool, rel: &Path, report: &IntegrityReport) {
if quiet {
return;
}
let msg = format!(
"{} {} integrity check failed: {}",
"!".yellow(),
rel.display(),
report.issues.join("; ")
);
bar.suspend(|| eprintln!("{msg}"));
}