Skip to main content

morph_cli/utils/
terminal.rs

1use colored::Colorize;
2use indicatif::{ProgressBar, ProgressStyle};
3
4pub fn label(text: &str) -> String {
5    text.bold().cyan().to_string()
6}
7
8pub fn bullet() -> String {
9    "•".bold().blue().to_string()
10}
11
12pub fn success_prefix() -> String {
13    "done".bold().green().to_string()
14}
15
16pub fn warning_prefix() -> String {
17    "todo".bold().yellow().to_string()
18}
19
20pub fn muted_prefix() -> String {
21    "skip".bold().dimmed().to_string()
22}
23
24pub fn error_prefix() -> String {
25    "fail".bold().red().to_string()
26}
27
28pub fn info_prefix() -> String {
29    "info".bold().blue().to_string()
30}
31
32pub fn print_info(message: &str) {
33    println!("{}", message.bold());
34}
35
36pub fn spinner(message: &str) -> ProgressBar {
37    let spinner = ProgressBar::new_spinner();
38    spinner.set_style(
39        ProgressStyle::with_template("{spinner:.cyan} {msg}")
40            .expect("spinner template should be valid")
41            .tick_strings(&["⠋", "⠙", "⠸", "⠴", "⠦", "⠇"]),
42    );
43    spinner.set_message(message.to_owned());
44    spinner.enable_steady_tick(std::time::Duration::from_millis(80));
45    spinner
46}
47pub enum LogLevel {
48    Verbose,
49    Info,
50    Warning,
51    Error,
52}
53
54pub fn log(level: LogLevel, message: &str, is_verbose: bool) {
55    match level {
56        LogLevel::Verbose if is_verbose => {
57            println!("{} {}", "trace".bold().dimmed(), message.dimmed());
58        }
59        LogLevel::Info => {
60            println!("{} {}", "info".bold().blue(), message);
61        }
62        LogLevel::Warning => {
63            println!("{} {}", "warn".bold().yellow(), message);
64        }
65        LogLevel::Error => {
66            println!("{} {}", "error".bold().red(), message);
67        }
68        _ => {}
69    }
70}
71
72pub fn explain_skip(reason: &str) -> String {
73    format!("{} {}", "skipped:".bold().yellow(), reason.dimmed())
74}
75
76pub fn explain_error(category: &str, message: &str) -> String {
77    format!("{}: {}", category.bold().red(), message)
78}