reedline 0.48.0

A readline-like crate for CLI text input
Documentation
use crate::PromptViMode;
use keybindings::{EmptyKeyState, InputKey, ModalMachine, Mode, ModeKeys};

use super::{action::HelixAction, key::HelixKey};

#[derive(Clone, Copy, Debug, Default, Hash, Eq, PartialEq)]
pub(super) enum HelixMode {
    #[default]
    Insert,
    Normal,
}

impl Mode<HelixAction, EmptyKeyState> for HelixMode {}

impl From<PromptViMode> for HelixMode {
    fn from(mode: PromptViMode) -> Self {
        match mode {
            PromptViMode::Insert => HelixMode::Insert,
            PromptViMode::Normal => HelixMode::Normal,
        }
    }
}

impl ModeKeys<HelixKey, HelixAction, EmptyKeyState> for HelixMode {
    fn unmapped(
        &self,
        key: &HelixKey,
        _: &mut EmptyKeyState,
    ) -> (Vec<HelixAction>, Option<HelixMode>) {
        match self {
            HelixMode::Normal => (vec![], None),
            HelixMode::Insert => {
                if let Some(c) = key.get_char() {
                    return (vec![HelixAction::Type(c)], None);
                }

                (vec![], None)
            }
        }
    }
}

pub(super) type HelixStep = (Option<HelixAction>, Option<HelixMode>);

pub(super) type HelixMachine = ModalMachine<HelixKey, HelixStep>;