1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
use anyhow::Result;
use crossterm::event as c_event;
use crate::input::{Event, EventReaderFn};
/// Create an event reader that will map the provided events to the internal representation of the
/// events. This allows for mocking of event input when testing at the highest level of the application.
///
/// This function does not accept any `Event::MetaEvent` or `Event::StandardEvent` event types, instead
/// use other event types that will map to the expected value using the keybindings.
///
/// This function should be used sparingly, and instead `with_event_handler` should be used where possible.
///
/// # Panics
/// If provided an event generator that returns a `Event::MetaEvent` or `Event::StandardEvent` event type.
pub(crate) fn create_event_reader<EventGeneratorFunction>(
event_generator: EventGeneratorFunction,
) -> impl EventReaderFn
where EventGeneratorFunction: Fn() -> Result<Option<Event>> + Sync + Send + 'static {
move || {
match event_generator()? {
None => Ok(None),
Some(event) => {
match event {
Event::Key(key) => {
Ok(Some(c_event::Event::Key(c_event::KeyEvent::new(
key.code,
key.modifiers,
))))
},
Event::Mouse(mouse_event) => Ok(Some(c_event::Event::Mouse(mouse_event))),
Event::None => Ok(None),
Event::Resize(width, height) => Ok(Some(c_event::Event::Resize(width, height))),
Event::Standard(_) => {
panic!("MetaEvent and Standard are not supported, please use other event types")
},
}
},
}
}
}
|