67 lines
2.6 KiB
Rust
67 lines
2.6 KiB
Rust
use crossterm::style::Color;
|
|
use crossterm::style::{SetForegroundColor, ResetColor};
|
|
use termimad::MadSkin;
|
|
|
|
/// Simple output handler with markdown support
|
|
pub struct SimpleOutput {
|
|
mad_skin: MadSkin,
|
|
}
|
|
|
|
impl SimpleOutput {
|
|
pub fn new() -> Self {
|
|
let mut mad_skin = MadSkin::default();
|
|
// Dracula color scheme
|
|
// Background: #282a36, Foreground: #f8f8f2
|
|
// Colors: Cyan #8be9fd, Green #50fa7b, Orange #ffb86c, Pink #ff79c6, Purple #bd93f9, Red #ff5555, Yellow #f1fa8c
|
|
|
|
mad_skin.set_headers_fg(Color::Rgb { r: 189, g: 147, b: 249 }); // Purple for headers
|
|
mad_skin.bold.set_fg(Color::Rgb { r: 255, g: 121, b: 198 }); // Pink for bold
|
|
mad_skin.italic.set_fg(Color::Rgb { r: 139, g: 233, b: 253 }); // Cyan for italic
|
|
mad_skin.code_block.set_bg(Color::Rgb { r: 68, g: 71, b: 90 }); // Dracula background variant
|
|
mad_skin.code_block.set_fg(Color::Rgb { r: 80, g: 250, b: 123 }); // Green for code text
|
|
mad_skin.inline_code.set_bg(Color::Rgb { r: 68, g: 71, b: 90 }); // Same background for inline code
|
|
mad_skin.inline_code.set_fg(Color::Rgb { r: 241, g: 250, b: 140 }); // Yellow for inline code
|
|
mad_skin.quote_mark.set_fg(Color::Rgb { r: 98, g: 114, b: 164 }); // Comment purple for quote marks
|
|
mad_skin.strikeout.set_fg(Color::Rgb { r: 255, g: 85, b: 85 }); // Red for strikethrough
|
|
|
|
Self { mad_skin }
|
|
}
|
|
|
|
pub fn print(&self, text: &str) {
|
|
println!("{}", text);
|
|
}
|
|
|
|
pub fn print_markdown(&self, markdown: &str) {
|
|
self.mad_skin.print_text(markdown);
|
|
}
|
|
|
|
pub fn _print_status(&self, status: &str) {
|
|
println!("📊 {}", status);
|
|
}
|
|
|
|
pub fn print_context(&self, used: u32, total: u32, percentage: f32) {
|
|
let bar_width = 10;
|
|
let filled_width = ((percentage / 100.0) * bar_width as f32) as usize;
|
|
let empty_width = bar_width.saturating_sub(filled_width);
|
|
|
|
let filled_chars = "●".repeat(filled_width);
|
|
let empty_chars = "○".repeat(empty_width);
|
|
|
|
// Determine color based on percentage
|
|
let color = if percentage < 60.0 {
|
|
crossterm::style::Color::Green
|
|
} else if percentage < 80.0 {
|
|
crossterm::style::Color::Yellow
|
|
} else {
|
|
crossterm::style::Color::Red
|
|
};
|
|
|
|
// Print with colored progress bar
|
|
print!("Context: ");
|
|
print!("{}", SetForegroundColor(color));
|
|
print!("{}{}", filled_chars, empty_chars);
|
|
print!("{}", ResetColor);
|
|
println!(" {:.1}% | {}/{} tokens", percentage, used, total);
|
|
}
|
|
}
|