tabiew 0.13.1

A lightweight TUI application to view and query tabular data files, such as CSV, TSV, and parquet.
use crossterm::event::{KeyCode, KeyModifiers};

use crate::{handler::message::Message, tui::component::Component};

pub trait OverlayStep {
    fn next(self) -> Self;
    fn responder(&mut self) -> &mut dyn Component;
}

#[derive(Debug)]
pub struct MultiStepOverlay<W: OverlayStep> {
    state: Option<W>,
}

impl<W> MultiStepOverlay<W>
where
    W: OverlayStep,
{
    pub fn new(state: W) -> Self {
        Self { state: Some(state) }
    }
}

impl<W> Component for MultiStepOverlay<W>
where
    W: OverlayStep,
{
    fn render(
        &mut self,
        area: ratatui::prelude::Rect,
        buf: &mut ratatui::prelude::Buffer,
        focus_state: crate::tui::component::FocusState,
    ) {
        if let Some(responder) = self.state.as_mut().map(|s| s.responder()) {
            responder.render(area, buf, focus_state);
        }
    }

    fn handle(&mut self, event: crossterm::event::KeyEvent) -> bool {
        self.state
            .as_mut()
            .map(|s| s.responder().handle(event))
            .unwrap_or(false)
            || match (event.code, event.modifiers) {
                (KeyCode::Esc, KeyModifiers::NONE) => {
                    Message::PaneDismissModal.enqueue();
                    Message::AppDismissOverlay.enqueue();
                    true
                }
                (KeyCode::Enter, KeyModifiers::NONE) => {
                    self.state = self.state.take().map(|s| s.next());
                    true
                }
                _ => false,
            }
    }
}

impl<State> Default for MultiStepOverlay<State>
where
    State: Default + OverlayStep,
{
    fn default() -> Self {
        Self::new(Default::default())
    }
}