use colored::Colorize;
use std::io::{self, IsTerminal, Write};
pub fn error(msg: &str) {
eprintln!("{} {}", "error:".red().bold(), msg);
}
pub fn warning(msg: &str) {
eprintln!("{} {}", "warning:".yellow().bold(), msg);
}
pub fn success(msg: &str) {
println!("{} {}", "✓".green().bold(), msg);
}
pub fn hint(msg: &str) {
eprintln!("{} {}", "hint:".dimmed(), msg.dimmed());
}
pub fn header(msg: &str) {
println!("{}", msg.cyan().bold());
}
pub fn status(msg: &str) {
println!("{} {}", "→".blue(), msg);
}
pub fn path(p: &std::path::Path) -> String {
p.display().to_string().bright_white().to_string()
}
pub fn file_changed(path_str: &str) -> String {
format!("{} {}", "modified:".yellow(), path_str)
}
pub fn file_added(path_str: &str) -> String {
format!("{} {}", "added:".green(), path_str)
}
pub fn file_deleted(path_str: &str) -> String {
format!("{} {}", "deleted:".red(), path_str)
}
pub fn metric(label: &str, value: impl std::fmt::Display) -> String {
format!(" {}: {}", label.dimmed(), value.to_string().cyan())
}
pub fn section(title: &str) {
println!("\n{}", title.bold());
}
pub fn url(u: &str) -> String {
u.bright_blue().underline().to_string()
}
pub fn is_terminal() -> bool {
io::stdout().is_terminal()
}
pub fn render_markdown(markdown: &str, output: &mut dyn Write) -> io::Result<()> {
if io::stdout().is_terminal() {
let skin = create_skin();
let rendered = skin.term_text(markdown);
write!(output, "{}", rendered)
} else {
write!(output, "{}", markdown)
}
}
pub fn render_markdown_to_terminal(markdown: &str) {
let skin = create_skin();
let rendered = skin.term_text(markdown);
print!("{}", rendered);
}
fn create_skin() -> termimad::MadSkin {
use termimad::*;
let mut skin = MadSkin::default();
skin.set_headers_fg(crossterm::style::Color::Cyan);
skin.bold.set_fg(crossterm::style::Color::White);
skin.bullet = StyledChar::from_fg_char(crossterm::style::Color::Blue, '•');
skin.code_block.set_fg(crossterm::style::Color::Yellow);
skin.inline_code.set_fg(crossterm::style::Color::Yellow);
skin.bold.set_fg(crossterm::style::Color::White);
skin.italic.set_fg(crossterm::style::Color::Magenta);
skin.horizontal_rule = StyledChar::from_fg_char(crossterm::style::Color::DarkGrey, '─');
skin
}