glim-tui 0.1.0

A TUI for monitoring GitLab CI/CD pipelines and projects
use std::sync::mpsc::Sender;
use crossterm::event::{KeyCode, KeyEvent};
use crate::dispatcher::Dispatcher;
use crate::event::GlimEvent;
use crate::id::ProjectId;
use crate::input::InputProcessor;
use crate::ui::StatefulWidgets;

pub struct NormalModeProcessor {
    sender: Sender<GlimEvent>,
    selected: Option<ProjectId>
}

impl NormalModeProcessor {
    pub fn new(sender: Sender<GlimEvent>) -> Self {
        Self {
            sender,
            selected: None,
        }
    }

    fn process(
        &self,
        event: &KeyEvent,
    ) {
        if let Some(e) = match event.code {
            KeyCode::Enter if self.selected.is_some() =>
                Some(GlimEvent::OpenProjectDetails(self.selected.unwrap())),
            KeyCode::Char('a') => Some(GlimEvent::ShowLastNotification),
            KeyCode::Char('c') => Some(GlimEvent::DisplayConfig),
            KeyCode::Char('l') => Some(GlimEvent::ToggleInternalLogs),
            KeyCode::Char('p') => self.selected.map(GlimEvent::RequestPipelines),
            KeyCode::Char('q') => Some(GlimEvent::Shutdown),
            KeyCode::Char('r') => Some(GlimEvent::RequestProjects),
            KeyCode::Char('w') => self.selected.map(GlimEvent::BrowseToProject),
            KeyCode::Up        => Some(GlimEvent::SelectPreviousProject),
            KeyCode::Down      => Some(GlimEvent::SelectNextProject),
            KeyCode::F(12)     => Some(GlimEvent::ToggleColorDepth),
            _ => None
        } { self.dispatch(e) }
    }
}

impl InputProcessor for NormalModeProcessor {

    fn apply(&mut self, event: &GlimEvent, _ui: &mut StatefulWidgets) {
        match event {
            GlimEvent::SelectedProject(id)   => self.selected = Some(*id),
            GlimEvent::Key(e)                => self.process(e),
            _                                => ()
        }
    }

    fn on_pop(&self) {}
    fn on_push(&self) {}
}

impl Dispatcher for NormalModeProcessor {
    fn dispatch(&self, event: GlimEvent) {
        self.sender.dispatch(event)
    }
}