use console::{style, Style, Term};
pub fn print_header(text: &str) {
let term = Term::stdout();
let _ = term.write_line(&format!("{}", style(text).cyan().bold()));
}
pub fn print_success(text: &str) {
let _ = Term::stdout().write_line(&format!("{}", style(text).green()));
}
pub fn print_warning(text: &str) {
let _ = Term::stderr().write_line(&format!("{}", style(text).yellow()));
}
pub fn print_error(text: &str) {
let _ = Term::stderr().write_line(&format!("{}", style(text).red()));
}
pub fn print_dim(text: &str) {
let _ = Term::stdout().write_line(&format!("{}", style(text).dim()));
}
pub fn status_style(status: &str) -> Style {
match status {
"active" => Style::new().green().bold(),
"clean" => Style::new().green(),
"modified" => Style::new().yellow(),
"merged" => Style::new().magenta(),
"pr-open" => Style::new().cyan(),
"busy" => Style::new().red().bold(),
"stale" => Style::new().red(),
_ => Style::new(),
}
}
pub fn status_icon(status: &str) -> &'static str {
match status {
"active" => "●",
"clean" => "○",
"modified" => "◉",
"merged" => "✓",
"pr-open" => "⬆",
"busy" => "🔒",
"stale" => "x",
_ => "○",
}
}
pub fn terminal_width() -> usize {
Term::stdout().size().1 as usize
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_status_icon_all_variants() {
assert_eq!(status_icon("active"), "●");
assert_eq!(status_icon("clean"), "○");
assert_eq!(status_icon("modified"), "◉");
assert_eq!(status_icon("stale"), "x");
}
#[test]
fn test_status_icon_unknown_fallback() {
assert_eq!(status_icon("unknown"), "○");
assert_eq!(status_icon(""), "○");
assert_eq!(status_icon("something_else"), "○");
}
#[test]
fn test_status_style_known() {
let _ = status_style("active");
let _ = status_style("clean");
let _ = status_style("modified");
let _ = status_style("stale");
let _ = status_style("unknown");
}
#[test]
fn test_status_icon_merged() {
assert_eq!(status_icon("merged"), "✓");
}
#[test]
fn test_status_icon_pr_open() {
assert_eq!(status_icon("pr-open"), "⬆");
}
#[test]
fn test_status_style_new_statuses() {
let _ = status_style("merged");
let _ = status_style("pr-open");
}
}