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::{PipelineId, ProjectId};
use crate::input::InputProcessor;
use crate::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::CloseProjectDetails),
            KeyCode::Up        => ui.handle_pipeline_selection(-1),
            KeyCode::Down      => ui.handle_pipeline_selection(1),
            KeyCode::Enter if self.selected.is_some() =>
                self.sender.dispatch(GlimEvent::OpenPipelineActions(self.project_id, self.selected.unwrap())),
            _ => ()
        }
    }
}

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

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