use colored::Colorize;
use dialoguer::Confirm;
use indicatif::{ProgressBar, ProgressStyle};
use std::time::Duration;
pub fn info(msg: &str) {
println!("{}", msg.cyan());
}
pub fn success(msg: &str) {
println!("{}", msg.green());
}
pub fn warning(msg: &str) {
println!("{}", msg.yellow());
}
pub fn error(msg: &str) {
eprintln!("{}", msg.red());
}
pub fn header(title: &str) {
let separator = "=".repeat(title.len() + 4);
println!("{}", separator.cyan());
println!(" {}", title.cyan().bold());
println!("{}", separator.cyan());
}
pub fn spinner(msg: &str) -> ProgressBar {
let pb = ProgressBar::new_spinner();
pb.set_style(
ProgressStyle::default_spinner()
.template("{spinner:.cyan} {msg}")
.unwrap()
.tick_chars("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"),
);
pb.set_message(msg.to_string());
pb.enable_steady_tick(Duration::from_millis(80));
pb
}
pub fn confirm_dangerous(msg: &str) -> bool {
println!("{} {}", "WARNING:".red().bold(), msg.red());
Confirm::new()
.with_prompt("Are you sure?")
.default(false)
.interact()
.unwrap_or(false)
}
pub fn confirm_strict(msg: &str) -> bool {
println!("{} {}", "WARNING:".red().bold(), msg.red());
println!("Type '{}' to confirm:", "yes".yellow());
let mut input = String::new();
if std::io::stdin().read_line(&mut input).is_err() {
return false;
}
input.trim().to_lowercase() == "yes"
}
pub fn step(num: usize, total: usize, msg: &str) {
println!("{} {}", format!("[{num}/{total}]").cyan().bold(), msg);
}
pub fn list_item(key: &str, value: &str) {
println!(" {} {}", format!("{key}:").green(), value);
}
pub fn show_command(cmd: &str) {
println!("{} {}", "$".dimmed(), cmd.dimmed());
}