bitpill 0.3.5

A personal medication management TUI application built in Rust.
Documentation
use crate::presentation::tui::app::App;
use crate::presentation::tui::handlers::port::{Handler, HandlerResult};
use crate::presentation::tui::screen::Screen;

pub struct ScheduleResultHandler;

impl Default for ScheduleResultHandler {
    fn default() -> Self {
        ScheduleResultHandler
    }
}

impl Handler for ScheduleResultHandler {
    fn handle(
        &mut self,
        app: &mut App,
        _key: crate::presentation::tui::input::Key,
    ) -> HandlerResult {
        app.current_screen = Screen::HomeScreen;
        app.load_medications();
        HandlerResult::Continue
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::presentation::tui::app::App;
    use crate::presentation::tui::app_services::AppServices;
    use crossterm::event::KeyCode;

    #[test]
    fn handle_enter_sets_screen_to_home() {
        let mut app = App::new(AppServices::fake());
        app.current_screen = Screen::HomeScreen;
        let mut handler = ScheduleResultHandler;
        let key = crate::presentation::tui::input::from_code(KeyCode::Enter);
        handler.handle(&mut app, key);
        assert!(matches!(app.current_screen, Screen::HomeScreen));
    }

    #[test]
    fn handle_esc_also_sets_screen_to_home() {
        let mut app = App::new(AppServices::fake());
        app.current_screen = Screen::HomeScreen;
        let mut handler = ScheduleResultHandler;
        let key = crate::presentation::tui::input::from_code(KeyCode::Esc);
        handler.handle(&mut app, key);
        assert!(matches!(app.current_screen, Screen::HomeScreen));
    }

    #[test]
    fn handle_via_trait_object_works() {
        let mut app = App::new(AppServices::fake());
        let mut handler: Box<dyn Handler> = Box::new(ScheduleResultHandler);
        let key = crate::presentation::tui::input::from_code(KeyCode::Enter);
        handler.handle(&mut app, key);
        assert!(matches!(app.current_screen, Screen::HomeScreen));
    }
}