lean-tui 1.1.1

Standalone TUI infoview for Lean 4 theorem prover
use ratatui::{
    buffer::Buffer,
    layout::Rect,
    style::Style,
    text::{Line, Span},
    widgets::{Paragraph, Widget},
};

use crate::{
    keybindings::{KeyBinding, GLOBAL_KEYBINDINGS},
    message::ModeAction,
    theme::Theme,
};

fn status_entries<A>(bindings: &[KeyBinding<A>]) -> impl Iterator<Item = [Span<'static>; 2]> + '_ {
    let key_style = Style::new().fg(Theme::KEYBINDING);
    bindings.iter().filter_map(move |binding| {
        binding.status_description.map(|description| {
            [
                Span::styled(binding.label, key_style),
                Span::raw(format!(": {description}")),
            ]
        })
    })
}

pub struct StatusBar {
    pub mode_keybindings: &'static [KeyBinding<ModeAction>],
}

impl Widget for StatusBar {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let spans: Vec<Span> = status_entries(GLOBAL_KEYBINDINGS)
            .chain(status_entries(self.mode_keybindings))
            .enumerate()
            .flat_map(|(index, entry)| {
                let separator = (index > 0).then(|| Span::raw(" │ "));
                separator.into_iter().chain(entry)
            })
            .collect();
        Paragraph::new(Line::from(spans)).render(area, buf);
    }
}