use colored::Colorize;
use indicatif::{ProgressBar, ProgressStyle};
pub fn label(text: &str) -> String {
text.bold().cyan().to_string()
}
pub fn bullet() -> String {
"•".bold().blue().to_string()
}
pub fn success_prefix() -> String {
"done".bold().green().to_string()
}
pub fn warning_prefix() -> String {
"todo".bold().yellow().to_string()
}
pub fn muted_prefix() -> String {
"skip".bold().dimmed().to_string()
}
pub fn error_prefix() -> String {
"fail".bold().red().to_string()
}
pub fn info_prefix() -> String {
"info".bold().blue().to_string()
}
pub fn print_info(message: &str) {
println!("{}", message.bold());
}
pub fn spinner(message: &str) -> ProgressBar {
let spinner = ProgressBar::new_spinner();
spinner.set_style(
ProgressStyle::with_template("{spinner:.cyan} {msg}")
.expect("spinner template should be valid")
.tick_strings(&["⠋", "⠙", "⠸", "⠴", "⠦", "⠇"]),
);
spinner.set_message(message.to_owned());
spinner.enable_steady_tick(std::time::Duration::from_millis(80));
spinner
}
pub enum LogLevel {
Verbose,
Info,
Warning,
Error,
}
pub fn log(level: LogLevel, message: &str, is_verbose: bool) {
match level {
LogLevel::Verbose if is_verbose => {
println!("{} {}", "trace".bold().dimmed(), message.dimmed());
}
LogLevel::Info => {
println!("{} {}", "info".bold().blue(), message);
}
LogLevel::Warning => {
println!("{} {}", "warn".bold().yellow(), message);
}
LogLevel::Error => {
println!("{} {}", "error".bold().red(), message);
}
_ => {}
}
}
pub fn explain_skip(reason: &str) -> String {
format!("{} {}", "skipped:".bold().yellow(), reason.dimmed())
}
pub fn explain_error(category: &str, message: &str) -> String {
format!("{}: {}", category.bold().red(), message)
}