reedline 0.48.0

A readline-like crate for CLI text input
Documentation
use crossterm::event::{KeyCode, KeyModifiers};
use keybindings::{EdgeEvent, EdgePath, EdgeRepeat, EmptyKeyClass, InputBindings};

use super::{
    key::HelixKey,
    mode::{HelixMachine, HelixMode, HelixStep},
};

#[derive(Default)]
pub(super) struct HelixBindings;

impl HelixBindings {
    fn add_single_keypress_mapping(
        machine: &mut HelixMachine,
        mode: HelixMode,
        code: KeyCode,
        step: HelixStep,
    ) {
        let path: &EdgePath<HelixKey, EmptyKeyClass> = &[(
            EdgeRepeat::Once,
            EdgeEvent::Key(HelixKey::new(code, KeyModifiers::NONE)),
        )];
        machine.add_mapping(mode, path, &step);
    }

    fn add_bindings(
        machine: &mut HelixMachine,
        mode: HelixMode,
        bindings: &[(KeyCode, HelixStep)],
    ) {
        for (code, step) in bindings {
            Self::add_single_keypress_mapping(machine, mode, *code, step.clone());
        }
    }
}

impl InputBindings<HelixKey, HelixStep> for HelixBindings {
    fn setup(&self, machine: &mut HelixMachine) {
        let insert_bindings = [(KeyCode::Esc, (None, Some(HelixMode::Normal)))];
        let normal_bindings = [
            (KeyCode::Char('i'), (None, Some(HelixMode::Insert))),
            (
                KeyCode::Char('h'),
                (Some(super::action::HelixAction::MoveCharLeft), None),
            ),
            (
                KeyCode::Left,
                (Some(super::action::HelixAction::MoveCharLeft), None),
            ),
            (
                KeyCode::Char('l'),
                (Some(super::action::HelixAction::MoveCharRight), None),
            ),
            (
                KeyCode::Right,
                (Some(super::action::HelixAction::MoveCharRight), None),
            ),
            (
                KeyCode::Char('a'),
                (
                    Some(super::action::HelixAction::MoveCharRight),
                    Some(HelixMode::Insert),
                ),
            ),
        ];

        Self::add_bindings(machine, HelixMode::Insert, &insert_bindings);
        Self::add_bindings(machine, HelixMode::Normal, &normal_bindings);
    }
}