use console::{Emoji, style};
use indicatif::{ProgressBar, ProgressStyle};
use miette::{IntoDiagnostic, Result};
use std::time::Duration;
pub type TermEmoji = Emoji<'static, 'static>;
pub enum AppEmoji {
Sparkle,
Clipboard,
Rocket,
Floppy,
}
impl AppEmoji {
pub fn as_emoji(&self) -> TermEmoji {
match self {
AppEmoji::Sparkle => Emoji("β¨ ", ":-)"),
AppEmoji::Clipboard => Emoji("π ", ""),
AppEmoji::Rocket => Emoji("π ", ""),
AppEmoji::Floppy => Emoji("πΎ ", ""),
}
}
}
pub fn print_header(title: &str) {
println!(
"\n{} {}",
AppEmoji::Sparkle.as_emoji(),
style(title).bold().green()
);
}
pub fn print_step(emoji: AppEmoji, message: &str) {
println!("\n{} {}", emoji.as_emoji(), style(message).bold());
}
pub fn print_success(message: &str) {
println!(
"\n{} {}",
AppEmoji::Clipboard.as_emoji(),
style(message).bold().green()
);
}
pub fn print_warning(message: &str) {
println!("{} {}", style("Warning:").yellow(), message);
}
pub fn start_spinner(message: &str) -> Result<ProgressBar> {
let spinner = ProgressBar::new_spinner();
spinner.set_style(
ProgressStyle::default_spinner()
.tick_chars("β β β Ήβ Έβ Όβ ΄β ¦β §β β ")
.template("{spinner:.blue} {msg}")
.into_diagnostic()?,
);
spinner.set_message(message.to_string());
spinner.enable_steady_tick(Duration::from_millis(80));
Ok(spinner)
}
pub fn finish_spinner_success(spinner: &ProgressBar, message: &str) {
spinner.finish_with_message(format!("{} {}", style("β").green(), message));
}
pub fn finish_spinner_error(spinner: &ProgressBar, message: &str) {
spinner.finish_with_message(format!("{} {}", style("β").red(), message));
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_app_emoji_variants() {
let sparkle = AppEmoji::Sparkle.as_emoji();
let clipboard = AppEmoji::Clipboard.as_emoji();
let rocket = AppEmoji::Rocket.as_emoji();
let floppy = AppEmoji::Floppy.as_emoji();
assert!(!sparkle.to_string().is_empty());
assert!(!clipboard.to_string().is_empty());
assert!(!rocket.to_string().is_empty());
assert!(!floppy.to_string().is_empty());
}
#[test]
fn test_start_spinner_template_valid() {
let spinner_result = start_spinner("Fetching token...");
assert!(spinner_result.is_ok(), "Spinner template should be valid");
}
#[test]
fn test_spinner_success_lifecycle() {
let spinner = start_spinner("Working...").unwrap();
assert!(!spinner.is_finished());
finish_spinner_success(&spinner, "Done!");
assert!(spinner.is_finished());
}
#[test]
fn test_spinner_error_lifecycle() {
let spinner = start_spinner("Working...").unwrap();
assert!(!spinner.is_finished());
finish_spinner_error(&spinner, "Failed!");
assert!(spinner.is_finished());
}
}