syncable_cli/agent/ui/
colors.rs1use colored::Colorize;
6
7pub mod icons {
9 pub const PENDING: &str = "○";
10 pub const EXECUTING: &str = "◐";
11 pub const SUCCESS: &str = "✓";
12 pub const ERROR: &str = "✗";
13 pub const WARNING: &str = "⚠";
14 pub const CANCELED: &str = "⊘";
15 pub const CONFIRMING: &str = "⏳";
16 pub const ARROW: &str = "→";
17 pub const THINKING: &str = "💭";
18 pub const ROBOT: &str = "🤖";
19 pub const TOOL: &str = "🔧";
20 pub const SHELL: &str = "🐚";
21 pub const EDIT: &str = "✏️";
22 pub const FILE: &str = "📄";
23 pub const FOLDER: &str = "📁";
24 pub const SECURITY: &str = "🔒";
25 pub const SEARCH: &str = "🔍";
26 pub const DOCKER: &str = "🐳";
27 pub const LINT: &str = "📋";
28 pub const FIX: &str = "🔧";
29 pub const CRITICAL: &str = "🔴";
30 pub const HIGH: &str = "🟠";
31 pub const MEDIUM: &str = "🟡";
32 pub const LOW: &str = "🟢";
33 pub const KUBERNETES: &str = "☸";
34 pub const HELM: &str = "⎈";
35}
36
37pub mod ansi {
39 pub const CLEAR_LINE: &str = "\x1b[2K\r";
41 pub const CURSOR_UP: &str = "\x1b[1A";
43 pub const HIDE_CURSOR: &str = "\x1b[?25l";
45 pub const SHOW_CURSOR: &str = "\x1b[?25h";
47 pub const RESET: &str = "\x1b[0m";
49 pub const BOLD: &str = "\x1b[1m";
51 pub const DIM: &str = "\x1b[2m";
53 pub const ITALIC: &str = "\x1b[3m";
55
56 pub const BRIGHT: &str = "\x1b[1m";
60 pub const SUBDUED: &str = "\x1b[2;3m"; pub const STD_CYAN: &str = "\x1b[36m";
64 pub const STD_YELLOW: &str = "\x1b[33m";
66 pub const STD_GREEN: &str = "\x1b[32m";
68 pub const STD_RED: &str = "\x1b[31m";
70 pub const STD_BLUE: &str = "\x1b[34m";
72 pub const STD_MAGENTA: &str = "\x1b[35m";
74
75 pub const PURPLE: &str = "\x1b[38;5;141m";
77 pub const ORANGE: &str = "\x1b[38;5;216m";
78 pub const PINK: &str = "\x1b[38;5;212m";
79 pub const MAGENTA: &str = "\x1b[38;5;207m";
80 pub const CYAN: &str = "\x1b[38;5;51m";
81 pub const GRAY: &str = "\x1b[38;5;245m";
82 pub const WHITE: &str = "\x1b[38;5;255m";
83 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"; }
94
95pub fn format_tool_name(name: &str) -> String {
97 name.cyan().bold().to_string()
98}
99
100pub fn format_status(success: bool, message: &str) -> String {
102 if success {
103 format!("{} {}", icons::SUCCESS.green(), message.green())
104 } else {
105 format!("{} {}", icons::ERROR.red(), message.red())
106 }
107}
108
109pub fn format_elapsed(seconds: u64) -> String {
111 if seconds < 60 {
112 format!("{}s", seconds)
113 } else {
114 let mins = seconds / 60;
115 let secs = seconds % 60;
116 format!("{}m {}s", mins, secs)
117 }
118}
119
120pub fn format_thinking(subject: &str) -> String {
122 format!("{} {}", icons::THINKING, subject.cyan().italic())
123}
124
125pub fn format_info(message: &str) -> String {
127 format!("{} {}", icons::ARROW.cyan(), message)
128}
129
130pub fn format_warning(message: &str) -> String {
132 format!("⚠ {}", message.yellow())
133}
134
135pub fn format_error(message: &str) -> String {
137 format!("{} {}", icons::ERROR.red(), message.red())
138}
139
140#[cfg(test)]
141mod tests {
142 use super::*;
143
144 #[test]
145 fn test_format_elapsed() {
146 assert_eq!(format_elapsed(5), "5s");
147 assert_eq!(format_elapsed(30), "30s");
148 assert_eq!(format_elapsed(65), "1m 5s");
149 assert_eq!(format_elapsed(125), "2m 5s");
150 }
151}