use clap::ArgMatches;
use crossterm::event::KeyCode;
use crossterm::event::KeyModifiers;
use crate::widgets::CommanderEvent;
use crate::widgets::KeyEventHandler;
use crate::Result;
use super::AppCommanderCommand;
use super::AppCommanderState;
#[derive(Debug)]
pub enum AppCommanderEvent<'a, T>
where
T: AppCommanderCommand,
{
Handled,
Action(
&'a mut T,
ArgMatches,
),
}
impl<'a, T> KeyEventHandler<'a, AppCommanderEvent<'a, T>> for AppCommanderState<T>
where
T: AppCommanderCommand,
{
fn handle_key_event(
&'a mut self,
code: KeyCode,
modifiers: KeyModifiers,
) -> Result<AppCommanderEvent<'a, T>>
{
let response = match self
.commander
.handle_key_event(
code, modifiers,
)?
{
CommanderEvent::Handled => AppCommanderEvent::Handled,
CommanderEvent::Action((name, args)) =>
{
for command in self
.commands
.iter_mut()
{
if command
.command()
.get_name()
.eq(&name)
{
return Ok(
AppCommanderEvent::Action(
command, args,
),
);
}
}
AppCommanderEvent::Handled
}
};
Ok(response)
}
}