morph_cli/utils/
terminal.rs1use 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}