use colored::Colorize;
pub mod icons {
pub const PENDING: &str = "○";
pub const EXECUTING: &str = "◐";
pub const SUCCESS: &str = "✓";
pub const ERROR: &str = "✗";
pub const WARNING: &str = "⚠";
pub const CANCELED: &str = "⊘";
pub const CONFIRMING: &str = "⏳";
pub const ARROW: &str = "→";
pub const THINKING: &str = "💭";
pub const ROBOT: &str = "🤖";
pub const TOOL: &str = "🔧";
pub const SHELL: &str = "🐚";
pub const EDIT: &str = "✏️";
pub const FILE: &str = "📄";
pub const FOLDER: &str = "📁";
pub const SECURITY: &str = "🔒";
pub const SEARCH: &str = "🔍";
pub const DOCKER: &str = "🐳";
pub const LINT: &str = "📋";
pub const FIX: &str = "🔧";
pub const CRITICAL: &str = "🔴";
pub const HIGH: &str = "🟠";
pub const MEDIUM: &str = "🟡";
pub const LOW: &str = "🟢";
pub const KUBERNETES: &str = "☸";
pub const HELM: &str = "⎈";
}
pub mod ansi {
pub const CLEAR_LINE: &str = "\x1b[2K\r";
pub const CURSOR_UP: &str = "\x1b[1A";
pub const HIDE_CURSOR: &str = "\x1b[?25l";
pub const SHOW_CURSOR: &str = "\x1b[?25h";
pub const RESET: &str = "\x1b[0m";
pub const BOLD: &str = "\x1b[1m";
pub const DIM: &str = "\x1b[2m";
pub const ITALIC: &str = "\x1b[3m";
pub const BRIGHT: &str = "\x1b[1m";
pub const SUBDUED: &str = "\x1b[2;3m"; pub const STD_CYAN: &str = "\x1b[36m";
pub const STD_YELLOW: &str = "\x1b[33m";
pub const STD_GREEN: &str = "\x1b[32m";
pub const STD_RED: &str = "\x1b[31m";
pub const STD_BLUE: &str = "\x1b[34m";
pub const STD_MAGENTA: &str = "\x1b[35m";
pub const PURPLE: &str = "\x1b[38;5;141m";
pub const ORANGE: &str = "\x1b[38;5;216m";
pub const PINK: &str = "\x1b[38;5;212m";
pub const MAGENTA: &str = "\x1b[38;5;207m";
pub const CYAN: &str = "\x1b[38;5;51m";
pub const GRAY: &str = "\x1b[38;5;245m";
pub const WHITE: &str = "\x1b[38;5;255m";
pub const SUCCESS: &str = "\x1b[38;5;114m";
pub const DOCKER_BLUE: &str = "\x1b[38;5;39m"; pub const TEAL: &str = "\x1b[38;5;30m"; pub const CRITICAL: &str = "\x1b[38;5;196m"; pub const HIGH: &str = "\x1b[38;5;208m"; pub const MEDIUM: &str = "\x1b[38;5;220m"; pub const LOW: &str = "\x1b[38;5;114m"; pub const INFO_BLUE: &str = "\x1b[38;5;75m"; }
pub fn format_tool_name(name: &str) -> String {
name.cyan().bold().to_string()
}
pub fn format_status(success: bool, message: &str) -> String {
if success {
format!("{} {}", icons::SUCCESS.green(), message.green())
} else {
format!("{} {}", icons::ERROR.red(), message.red())
}
}
pub fn format_elapsed(seconds: u64) -> String {
if seconds < 60 {
format!("{}s", seconds)
} else {
let mins = seconds / 60;
let secs = seconds % 60;
format!("{}m {}s", mins, secs)
}
}
pub fn format_thinking(subject: &str) -> String {
format!("{} {}", icons::THINKING, subject.cyan().italic())
}
pub fn format_info(message: &str) -> String {
format!("{} {}", icons::ARROW.cyan(), message)
}
pub fn format_warning(message: &str) -> String {
format!("⚠ {}", message.yellow())
}
pub fn format_error(message: &str) -> String {
format!("{} {}", icons::ERROR.red(), message.red())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_format_elapsed() {
assert_eq!(format_elapsed(5), "5s");
assert_eq!(format_elapsed(30), "30s");
assert_eq!(format_elapsed(65), "1m 5s");
assert_eq!(format_elapsed(125), "2m 5s");
}
}