use std::collections::HashMap;
use {
reovim_driver_input::{
KeyEvent, KeyLookupState, KeySequence, ModeKeyResolver, ModeState, ModeTransition,
PopResult, ResolveInput, ResolveResult,
},
reovim_kernel::api::v1::ModeId,
};
use crate::modes::VimMode;
pub struct VimWindowResolver {
mode_id: ModeId,
}
impl VimWindowResolver {
#[must_use]
pub const fn new() -> Self {
Self {
mode_id: VimMode::WINDOW_ID,
}
}
}
impl Default for VimWindowResolver {
fn default() -> Self {
Self::new()
}
}
impl ModeKeyResolver for VimWindowResolver {
#[cfg_attr(coverage_nightly, coverage(off))]
fn resolve_with_keymap(
&self,
key: &KeyEvent,
_state: &mut ModeState,
input: &ResolveInput<'_>,
) -> ResolveResult {
let keys = KeySequence::from_keys(&[*key]);
let lookup_state = input.keymap.query(input.mode, &keys);
match lookup_state {
KeyLookupState::ExactOnly(cmd) | KeyLookupState::ExactWithLonger { exact: cmd, .. } => {
if cmd == crate::ids::CANCEL_TO_NORMAL {
ResolveResult::ModeTransition(ModeTransition::Pop {
result: Some(PopResult::Cancelled),
})
} else {
ResolveResult::ModeTransition(ModeTransition::Pop {
result: Some(PopResult::ExecuteCommand {
command: cmd,
args: HashMap::new(),
}),
})
}
}
KeyLookupState::PrefixOnly => {
ResolveResult::Pending
}
KeyLookupState::NotFound => {
ResolveResult::NotHandled
}
}
}
fn mode_id(&self) -> &ModeId {
&self.mode_id
}
fn inherits_from(&self) -> Option<&ModeId> {
None
}
fn reset(&mut self) {
}
}