stynx-code-tui 3.12.1

Terminal user interface with ratatui for interactive sessions
Documentation
use ratatui::{
    buffer::Buffer,
    layout::Rect,
    style::Style,
    text::{Line, Span},
    widgets::{Paragraph, Widget},
};

use crate::theme;

pub struct CostDisplay {
    pub input_tokens: u64,
    pub output_tokens: u64,
    pub cost: f64,
}

impl CostDisplay {
    pub fn new(input_tokens: u64, output_tokens: u64, cost: f64) -> Self {
        Self { input_tokens, output_tokens, cost }
    }

    fn format_tokens(count: u64) -> String {
        if count >= 1_000_000 { format!("{:.1}M", count as f64 / 1_000_000.0) }
        else if count >= 1_000 { format!("{:.1}K", count as f64 / 1_000.0) }
        else { count.to_string() }
    }
}

impl Widget for CostDisplay {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let line = Line::from(vec![
            Span::styled("In: ", Style::default().fg(theme::MUTED())),
            Span::styled(Self::format_tokens(self.input_tokens), Style::default().fg(theme::FOAM())),
            Span::styled("  Out: ", Style::default().fg(theme::MUTED())),
            Span::styled(Self::format_tokens(self.output_tokens), Style::default().fg(theme::FOAM())),
            Span::styled("  Cost: ", Style::default().fg(theme::MUTED())),
            Span::styled(format!("${:.4}", self.cost), Style::default().fg(theme::GOLD())),
        ]);
        Paragraph::new(line).render(area, buf);
    }
}