eazygit 0.5.1

A fast TUI for Git with staging, conflicts, rebase, and palette-first UX
Documentation
use crate::app::{actions::Action, state::AppState};

pub fn handle(state: &mut AppState, action: &Action) -> bool {
    match action {
        Action::SetOpStatus(text) => {
            state.op_status = text.clone();
        }
        Action::AppendOpLog(line) => {
            const MAX_LOG: usize = 20;
            state.op_log.push_back(line.clone());
            while state.op_log.len() > MAX_LOG {
                state.op_log.pop_front();
            }
        }
        Action::ToggleOpLog => {
            state.show_op_log = !state.show_op_log;
        }
        Action::ShowOpLog => {
            state.show_op_log = true;
        }
        Action::ToggleMergeNotifier => {
            state.merge_notifier_enabled = !state.merge_notifier_enabled;
        }
        Action::SetMergeBaseBranch(name) => {
            state.merge_base_branch = name.clone();
        }
        Action::SetMergeAhead(ahead) => {
            state.merge_notifier_ahead = *ahead;
        }
        Action::SetMergeInterval(secs) => {
            state.merge_notifier_interval_secs = *secs;
        }
        Action::AppendMergeLog(line) => {
            const MAX_LOG: usize = 20;
            state.merge_notifier_log.push_back(line.clone());
            while state.merge_notifier_log.len() > MAX_LOG {
                state.merge_notifier_log.pop_front();
            }
        }
        Action::ToggleMergeLog => {
            state.show_merge_log = !state.show_merge_log;
        }
        Action::ShowMergeBasePicker => {
            state.merge_base_picker = true;
            state.merge_base_selected = 0;
        }
        Action::HideMergeBasePicker => {
            state.merge_base_picker = false;
        }
        Action::SetMergeBaseCandidates(list) => {
            state.merge_base_candidates = list.clone();
            state.merge_base_selected = 0;
        }
        Action::MergeBaseUp => {
            if state.merge_base_selected > 0 {
                state.merge_base_selected -= 1;
            }
        }
        Action::MergeBaseDown => {
            let max_idx = state.merge_base_candidates.len().saturating_sub(1);
            if state.merge_base_selected < max_idx {
                state.merge_base_selected += 1;
            }
        }
        Action::ApplyMergeBase(name) => {
            state.merge_base_branch = name.clone();
            state.merge_base_picker = false;
        }
        _ => return false,
    }
    true
}