termitype 0.0.11

Terminal-based typing test inspired by a certain typing test you might know.
Documentation
use crate::{
    app::App,
    config::Setting,
    error::AppError,
    leaderboard::{LeaderboardMotion, SortColumn},
    menu::{MenuContext, MenuMotion},
    modal::ModalContext,
    variants::{CursorVariant, PickerVariant, ResultsVariant},
};
use anyhow::Result;

#[derive(Debug, Clone, PartialEq)]
pub enum Action {
    NoOp,
    Quit,
    Restart,
    Start,
    Redo,

    Input(char),
    Backspace,

    MenuNav(MenuMotion),
    MenuOpen(MenuContext),
    MenuShortcut(char),
    MenuClose,
    MenuToggle,
    MenuGoBack,
    MenuSelect,
    MenuInitSearch,
    MenuExitSearch,
    MenuBackspaceSearch,
    MenuUpdateSearch(String),

    CommandPaletteToggle,

    ModalOpen(ModalContext),
    ModalInput(char),
    ModalBackspace,
    ModalConfirm,
    ModalClose,

    LeaderboardOpen,
    LeaderboardClose,
    LeaderboardToggle,
    LeaderboardSort(SortColumn),
    LeaderboardNav(LeaderboardMotion),

    Toggle(Setting),
    Enable(Setting),
    Disable(Setting),

    SetLineCount(u8),
    SetTheme(String),
    SetCursorVariant(CursorVariant),
    SetPickerVariant(PickerVariant),
    SetResultVariant(ResultsVariant),

    SetTime(u16),
    SetWords(u16),
    SetAsciiArt(String),
    SetLanguage(String),

    RandomizeTheme,
    CyclePreviousArt,
    CycleNextArt,
}

pub fn handle_action(app: &mut App, action: Action) -> Result<(), AppError> {
    match action {
        Action::NoOp => Ok(()),
        Action::Quit => app.quit(),
        Action::Restart => app.restart(),
        Action::Redo => app.redo(),
        Action::Input(c) => app.handler.handle_input(&mut *app, c),
        Action::Backspace => app.handler.handle_backspace(&mut *app),
        Action::MenuNav(motion) => app.handler.handle_menu_navigate(&mut *app, motion),
        Action::MenuOpen(ctx) => app.handler.handle_menu_open(&mut *app, ctx),
        Action::MenuShortcut(shortcut) => app.handler.handle_menu_shortcut(&mut *app, shortcut),
        Action::MenuClose => app.handler.handle_menu_close(&mut *app),
        Action::MenuToggle => app.handler.handle_menu_toggle(&mut *app),
        Action::MenuGoBack => app.handler.handle_menu_backtrack(&mut *app),
        Action::MenuSelect => app.handler.handle_menu_select(&mut *app),
        Action::MenuInitSearch => app.handler.handle_menu_init_search(&mut *app),
        Action::MenuExitSearch => app.handler.handle_menu_exit_search(&mut *app),
        Action::MenuBackspaceSearch => app.handler.handle_menu_backspace_search(&mut *app),
        Action::MenuUpdateSearch(query) => app.handler.handle_menu_update_search(&mut *app, query),
        Action::CommandPaletteToggle => app.handler.handle_command_palette_toggle(&mut *app),
        Action::ModalOpen(ctx) => app.handler.handle_modal_open(&mut *app, ctx),
        Action::ModalInput(c) => app.handler.handle_modal_input(&mut *app, c),
        Action::ModalBackspace => app.handler.handle_modal_backspace(&mut *app),
        Action::ModalConfirm => app.handler.handle_modal_confirm(&mut *app),
        Action::ModalClose => app.handler.handle_modal_close(&mut *app),
        Action::LeaderboardOpen => app.handler.handle_leaderboard_open(&mut *app),
        Action::LeaderboardClose => app.handler.handle_leaderboard_close(&mut *app),
        Action::LeaderboardToggle => app.handler.handle_leaderboard_toggle(&mut *app),
        Action::LeaderboardSort(col) => app.handler.handle_leaderboard_sort(&mut *app, col),
        Action::LeaderboardNav(motion) => app.handler.handle_leaderboard_nav(&mut *app, motion),
        Action::Toggle(setting) => app.handler.handle_toggle_setting(&mut *app, setting),
        Action::Enable(setting) => app.handler.handle_enable_setting(&mut *app, setting),
        Action::Disable(setting) => app.handler.handle_disable_setting(&mut *app, setting),
        Action::SetLineCount(count) => app.handler.handle_set_line_count(&mut *app, count),
        Action::SetTheme(name) => app.handler.handle_change_theme(&mut *app, name),
        Action::SetCursorVariant(variant) => app.handler.handle_set_cursor(&mut *app, variant),
        Action::SetPickerVariant(variant) => app.handler.handle_set_picker(&mut *app, variant),
        Action::SetResultVariant(variant) => app.handler.handle_set_result(&mut *app, variant),
        Action::SetTime(secs) => app.handler.handle_set_time(&mut *app, secs as usize),
        Action::SetWords(count) => app.handler.handle_set_words(&mut *app, count as usize),
        Action::SetLanguage(lang) => app.handler.handle_set_language(&mut *app, lang),
        Action::SetAsciiArt(art) => app.handler.handle_set_ascii_art(&mut *app, art),
        Action::RandomizeTheme => app.handler.handle_randomize_theme(&mut *app),
        Action::CycleNextArt => app.handler.handle_cycle_prev_art(&mut *app),
        Action::CyclePreviousArt => app.handler.handle_cycle_next_art(&mut *app),
        _ => Ok(()),
    }
}