glim-tui 0.2.1

A TUI for monitoring GitLab CI/CD pipelines and projects
use std::sync::mpsc::Sender;

use crossterm::event::{KeyCode, KeyEvent};

use crate::{
    dispatcher::Dispatcher,
    event::GlimEvent,
    id::{PipelineId, ProjectId},
    input::InputProcessor,
    ui::StatefulWidgets,
};

pub struct ProjectDetailsProcessor {
    sender: Sender<GlimEvent>,
    project_id: ProjectId,
    selected: Option<PipelineId>,
}

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

    fn process(&self, event: &KeyEvent, ui: &mut StatefulWidgets) {
        match event.code {
            KeyCode::Esc => self
                .sender
                .dispatch(GlimEvent::ProjectDetailsClose),
            KeyCode::Char('q') => self
                .sender
                .dispatch(GlimEvent::ProjectDetailsClose),
            KeyCode::Up => ui.handle_pipeline_selection(-1),
            KeyCode::Down => ui.handle_pipeline_selection(1),
            KeyCode::Char('k') => ui.handle_pipeline_selection(-1),
            KeyCode::Char('j') => ui.handle_pipeline_selection(1),
            KeyCode::Enter if self.selected.is_some() => {
                self.sender
                    .dispatch(GlimEvent::PipelineActionsOpen(
                        self.project_id,
                        self.selected.unwrap(),
                    ))
            },
            KeyCode::Char('o') if self.selected.is_some() => {
                self.sender
                    .dispatch(GlimEvent::PipelineActionsOpen(
                        self.project_id,
                        self.selected.unwrap(),
                    ))
            },
            KeyCode::F(12) => self.sender.dispatch(GlimEvent::ScreenCapture),
            _ => (),
        }
    }
}

impl InputProcessor for ProjectDetailsProcessor {
    fn apply(&mut self, event: &GlimEvent, ui: &mut StatefulWidgets) {
        match event {
            GlimEvent::PipelineSelected(pipeline) => self.selected = Some(*pipeline),
            GlimEvent::InputKey(e) => self.process(e, ui),
            _ => (),
        }
    }

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