use colored::*;
pub fn error(msg: impl AsRef<str>) {
eprintln!("{} {}", "✗".red().bold(), msg.as_ref());
}
pub fn warning(msg: impl AsRef<str>) {
eprintln!("{} {}", "⚠".yellow().bold(), msg.as_ref());
}
pub fn success(msg: impl AsRef<str>) {
println!("{} {}", "✓".green().bold(), msg.as_ref());
}
pub fn header(text: impl AsRef<str>) {
println!("{}", text.as_ref().cyan().bold());
}
pub fn separator() {
println!();
}
pub fn item_with_detail(name: impl AsRef<str>, detail: impl AsRef<str>) {
println!(" {} {}", name.as_ref().bold(), detail.as_ref().dimmed());
}
pub fn device_entry(
name: &str,
in_channels: Option<u16>,
out_channels: Option<u16>,
rates: Option<&[String]>,
marker: Option<&str>,
) {
let ch_str = match (in_channels, out_channels) {
(Some(i), Some(o)) => format!("{}in {}out", i, o),
(Some(i), None) => format!("{}in", i),
(None, Some(o)) => format!("{}out", o),
(None, None) => String::new(),
};
let mut line = format!(" {} {}", name.bold(), ch_str.magenta());
if let Some(rates) = rates
&& !rates.is_empty()
{
line.push_str(&format!(" {}", rates.join(", ").dimmed()));
}
if let Some(m) = marker {
line.push_str(&format!(" {}", format!("({m})").green().bold()));
}
println!("{line}");
}
pub fn device_entry_unavailable(name: &str, marker: Option<&str>, err: &str) {
let mut line = format!(" {} {}", name.bold(), "(configs unavailable)".dimmed());
if let Some(m) = marker {
line.push_str(&format!(" {}", m.green().bold()));
}
line.push_str(&format!("\n {}", err.red()));
println!("{line}");
}