eazygit 0.5.1

A fast TUI for Git with staging, conflicts, rebase, and palette-first UX
Documentation
use crate::app::{AppState, Action};
use crate::input::InputEvent;
use crate::errors::ComponentError;
use crossterm::event::KeyCode::*;

pub fn handle_rebase_todo(event: InputEvent, state: &AppState) -> Result<Option<Action>, ComponentError> {
    if let InputEvent::Key(key) = &event {
        if key.kind == crossterm::event::KeyEventKind::Press {
            if state.rebase_todo_editing {
                return Ok(match key.code {
                    Esc => Some(Action::RebaseTodoRewriteLine(state.rebase_todo_selected, state.rebase_todo_edit_buffer.clone())),
                    Enter => Some(Action::RebaseTodoRewriteLine(state.rebase_todo_selected, state.rebase_todo_edit_buffer.clone())),
                    Backspace => {
                        let mut buf = state.rebase_todo_edit_buffer.clone();
                        buf.pop();
                        Some(Action::RebaseTodoEditBuffer(buf))
                    }
                    Char(c) => {
                        let mut buf = state.rebase_todo_edit_buffer.clone();
                        buf.push(c);
                        Some(Action::RebaseTodoEditBuffer(buf))
                    }
                    _ => None,
                });
            }
            return Ok(match key.code {
                Esc => Some(Action::HideRebaseTodo),
                Up | Char('k') => Some(Action::RebaseTodoUp),
                Down | Char('j') => Some(Action::RebaseTodoDown),
                Enter => Some(Action::StartRebaseTodoEdit(
                    state.rebase_todo_selected,
                    state.rebase_todo
                        .get(state.rebase_todo_selected)
                        .cloned()
                        .unwrap_or_default(),
                )),
                Char('c') => Some(Action::RebaseContinue),
                Char('a') => Some(Action::RebaseAbort),
                Char('x') => Some(Action::RebaseSkip),
                Char('o') => Some(Action::OpenRebaseTodoInEditor),
                Char('p') => Some(Action::RebaseTodoToggleKind(state.rebase_todo_selected, "pick".into())),
                Char('e') => Some(Action::RebaseTodoToggleKind(state.rebase_todo_selected, "edit".into())),
                Char('s') => Some(Action::RebaseTodoToggleKind(state.rebase_todo_selected, "squash".into())),
                Char('f') => Some(Action::RebaseTodoToggleKind(state.rebase_todo_selected, "fixup".into())),
                Char('d') => Some(Action::RebaseTodoToggleKind(state.rebase_todo_selected, "drop".into())),
                Char('w') => Some(Action::RebaseTodoToggleKind(state.rebase_todo_selected, "reword".into())),
                Char('S') => Some(Action::SaveRebaseTodo),
                _ => None,
            });
        }
    }
    Ok(None)
}

pub fn handle_rebase_builder(event: InputEvent, state: &AppState) -> Result<Option<Action>, ComponentError> {
    if let InputEvent::Key(key) = &event {
        if key.kind == crossterm::event::KeyEventKind::Press {
            return Ok(match key.code {
                Esc => Some(Action::RebaseCancel),
                Enter => Some(Action::RebaseSaveAndRun),
                Char('j') | Down => Some(Action::RebaseNext),
                Char('k') | Up => Some(Action::RebasePrev),
                Char('[') => Some(Action::RebaseMoveUp),
                Char(']') => Some(Action::RebaseMoveDown),
                Left | Right => Some(Action::RebaseCycleAction),
                Char('p') => Some(Action::RebaseSetAction(crate::app::rebase::RebaseAction::Pick)),
                Char('r') => Some(Action::RebaseSetAction(crate::app::rebase::RebaseAction::Reword)),
                Char('e') => Some(Action::RebaseSetAction(crate::app::rebase::RebaseAction::Edit)),
                Char('s') => Some(Action::RebaseSetAction(crate::app::rebase::RebaseAction::Squash)),
                Char('f') => Some(Action::RebaseSetAction(crate::app::rebase::RebaseAction::Fixup)),
                Char('d') => Some(Action::RebaseSetAction(crate::app::rebase::RebaseAction::Drop)),

                Char('A') => Some(Action::RebaseAbortFromBuilder),
                Char('R') => Some(Action::RebaseToggleUseRoot), // Toggle --root flag
                Char('b') => state
                    .rebase_session
                    .entries
                    .get(state.rebase_session.cursor)
                    .map(|entry| Action::RebaseSetBase(entry.hash.clone())),
                _ => None,
            });
        }
    }
    Ok(None)
}

pub fn handle_rebase_recovery(event: InputEvent, _state: &AppState) -> Result<Option<Action>, ComponentError> {
    if let InputEvent::Key(key) = &event {
        if key.kind == crossterm::event::KeyEventKind::Press {
            return Ok(match key.code {
                Esc => Some(Action::HideRebaseRecovery),
                Char('c') => Some(Action::RebaseContinueInterrupted),
                Char('a') => Some(Action::RebaseAbortInterrupted),
                _ => None,
            });
        }
    }
    Ok(None)
}

/// Stubbed - rebase feature removed
pub fn handle_reword_input(_event: InputEvent, _state: &AppState) -> Result<Option<Action>, ComponentError> {
    Ok(None)
}

/// Stubbed - rebase feature removed
pub fn handle_edit_input(_event: InputEvent, _state: &AppState) -> Result<Option<Action>, ComponentError> {
    Ok(None)
}