quelch 0.4.0

Ingest data from Jira, Confluence, and more directly into Azure AI Search
Documentation
use ratatui::{
    buffer::Buffer,
    layout::Rect,
    style::{Color, Style},
    text::{Line, Span},
    widgets::{Block, Borders, Paragraph, Widget},
};

use crate::tui::app::LogLine;

pub struct LogView<'a> {
    pub lines: &'a [LogLine],
    pub focused: bool,
}

impl Widget for LogView<'_> {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let border = if self.focused {
            Style::default().fg(Color::Cyan)
        } else {
            Style::default().fg(Color::DarkGray)
        };
        let block = Block::default()
            .borders(Borders::ALL)
            .border_style(border)
            .title("Log");
        let inner = block.inner(area);
        block.render(area, buf);

        let height = inner.height as usize;
        let start = self.lines.len().saturating_sub(height);
        let lines: Vec<Line> = self.lines[start..]
            .iter()
            .map(|l| {
                Line::from(vec![
                    Span::styled(
                        format!("{:>5}", format!("{:?}", l.level)),
                        Style::default().fg(level_colour(&l.level)),
                    ),
                    Span::raw(" "),
                    Span::raw(l.message.clone()),
                ])
            })
            .collect();
        Paragraph::new(lines).render(inner, buf);
    }
}

fn level_colour(l: &tracing::Level) -> Color {
    match *l {
        tracing::Level::ERROR => Color::Red,
        tracing::Level::WARN => Color::Yellow,
        tracing::Level::INFO => Color::Green,
        tracing::Level::DEBUG => Color::Cyan,
        tracing::Level::TRACE => Color::Gray,
    }
}