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(()),
}
}