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,
max_channels: u16,
channel_kind: &str,
rates: Option<&[String]>,
marker: Option<&str>,
) {
let ch_str = format!("{} {}", max_channels, channel_kind);
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!(" {}", 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}");
}