llm 1.3.8

A Rust library unifying multiple LLM backends.
Documentation
use crossterm::event::{KeyCode, KeyEvent};

use super::super::{OverlayAction, OverlayResult};

pub(super) fn handle_picker(
    state: &mut crate::runtime::PickerState,
    key: KeyEvent,
) -> OverlayResult {
    if key.code == KeyCode::Esc {
        return OverlayResult::close(OverlayAction::Handled);
    }
    if handle_picker_nav(state, key.code) {
        return OverlayResult::action(OverlayAction::Handled);
    }
    if let Some(action) = handle_picker_select(state, key.code) {
        return OverlayResult::close(action);
    }
    handle_picker_query(state, key.code);
    OverlayResult::action(OverlayAction::Handled)
}

pub(super) fn handle_model_picker(
    state: &mut crate::runtime::PickerState,
    key: KeyEvent,
) -> OverlayResult {
    if key.code == KeyCode::Esc {
        return OverlayResult::close(OverlayAction::Handled);
    }
    if handle_picker_nav(state, key.code) {
        return OverlayResult::action(OverlayAction::Handled);
    }
    if let Some(action) = handle_model_select(state, key.code) {
        return OverlayResult::close(action);
    }
    handle_picker_query(state, key.code);
    OverlayResult::action(OverlayAction::Handled)
}

pub(super) fn handle_skill_picker(
    state: &mut crate::runtime::PickerState,
    key: KeyEvent,
) -> OverlayResult {
    if key.code == KeyCode::Esc {
        return OverlayResult::close(OverlayAction::Handled);
    }
    if handle_picker_nav(state, key.code) {
        return OverlayResult::action(OverlayAction::Handled);
    }
    if let Some(action) = handle_skill_select(state, key.code) {
        return OverlayResult::close(action);
    }
    handle_picker_query(state, key.code);
    OverlayResult::action(OverlayAction::Handled)
}

fn handle_picker_nav(state: &mut crate::runtime::PickerState, code: KeyCode) -> bool {
    match code {
        KeyCode::Up => {
            state.prev();
            true
        }
        KeyCode::Down => {
            state.next();
            true
        }
        _ => false,
    }
}

fn handle_picker_select(
    state: &mut crate::runtime::PickerState,
    code: KeyCode,
) -> Option<OverlayAction> {
    if code != KeyCode::Enter {
        return None;
    }
    state
        .selected_item()
        .cloned()
        .map(OverlayAction::PickerSelected)
}

fn handle_picker_query(state: &mut crate::runtime::PickerState, code: KeyCode) {
    match code {
        KeyCode::Backspace => {
            state.pop_query();
        }
        KeyCode::Char(ch) => {
            state.push_query(ch);
        }
        _ => {}
    }
}

fn handle_model_select(
    state: &mut crate::runtime::PickerState,
    code: KeyCode,
) -> Option<OverlayAction> {
    if code != KeyCode::Enter {
        return None;
    }
    if let Some(item) = state.selected_item() {
        return Some(OverlayAction::SetModel(item.id.clone()));
    }
    if !state.query.is_empty() {
        return Some(OverlayAction::SetModel(state.query.clone()));
    }
    Some(OverlayAction::Handled)
}

fn handle_skill_select(
    state: &mut crate::runtime::PickerState,
    code: KeyCode,
) -> Option<OverlayAction> {
    if code != KeyCode::Enter {
        return None;
    }
    state
        .selected_item()
        .map(|item| OverlayAction::ActivateSkill(item.id.clone()))
        .or_else(|| {
            (!state.query.is_empty()).then(|| OverlayAction::ActivateSkill(state.query.clone()))
        })
}