http-diff 0.0.3

http-diff - CLI tool to verify consistency across web server versions. Ideal for large-scale refactors, sanity tests and maintaining data integrity across versions.
use tracing::info;

use crate::{
    actions::AppAction,
    app_state::{AppState, Screen},
};

fn should_skip_action(app_has_exception: bool, action: &AppAction) -> bool {
    if !app_has_exception {
        return false;
    }

    match action {
        AppAction::Quit
        | AppAction::ConfigurationLoaded(_)
        | AppAction::GenerateDefaultConfiguration
        | AppAction::DismissNotification
        | AppAction::SetNotification(_) => false,
        _ => true,
    }
}

pub fn update_state(
    app: &mut AppState,
    action: AppAction,
) -> Option<AppAction> {
    let skip_action =
        should_skip_action(app.critical_exception.is_some(), &action);

    if skip_action {
        info!(
            "Can not handle action '{:?}' as critical exception occurred",
            action
        );
        return None;
    }
    match action {
        AppAction::Quit => {
            app.should_quit = true;
            None
        }
        AppAction::SetCriticalException(error) => {
            app.show_exception_screen(error);
            None
        }
        AppAction::ShowHelp => {
            app.show_help_screen();
            None
        }
        AppAction::CloseHelp => {
            app.close_help_screen();
            None
        }
        AppAction::SelectPreviousRow => {
            app.select_previous_row();
            None
        }
        AppAction::SelectNextRow => {
            app.select_next_row();
            None
        }
        AppAction::ScrollUp => app.scroll_up(),
        AppAction::ScrollDown => app.scroll_down(),
        AppAction::GoToNextDiff => {
            app.go_to_next_diff();
            None
        }
        AppAction::GoToPreviousDiff => {
            app.go_to_prev_diff();
            None
        }
        AppAction::SetNotification(notification) => {
            app.set_notification(notification);
            None
        }
        AppAction::DismissNotification => {
            app.clear_notification();
            None
        }
        AppAction::ChangeTheme => {
            app.change_a_theme();
            None
        }
        AppAction::JobsUpdated(updated_jobs) => {
            app.upsert_jobs(updated_jobs);
            None
        }
        AppAction::ShowJobInfo(job) => app.set_selected_job(job),
        AppAction::SelectRowByJobName(job_name) => {
            app.select_row_by_job_name(&job_name);
            None
        }
        AppAction::CloseJobInfoScreen => {
            app.selected_job = None;
            app.current_screen = Screen::Home;
            None
        }
        AppAction::StartAllJobs => {
            app.reset_jobs_state();

            match app.current_screen {
                Screen::JobInfo => Some(AppAction::CloseJobInfoScreen),
                _ => None,
            }
        }
        AppAction::StartOneJob(_) => match app.current_screen {
            Screen::JobInfo => Some(AppAction::CloseJobInfoScreen),
            _ => None,
        },
        AppAction::SwitchTab => {
            app.go_to_next_request_info_tab();

            None
        }
        AppAction::ConfigurationLoaded(configuration) => {
            app.on_configuration_load(configuration);
            None
        }
        AppAction::LoadingJobsProgress(payload) => {
            app.on_load_jobs_progress_change(payload)
        }
        AppAction::GenerateDefaultConfiguration => app.save_default_config(),
        _ => None,
    }
}