use crossterm::event::KeyCode;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Event {
Key(KeyCode),
FocusEditor,
LintRequest,
LintComplete,
LintError(String),
PurifyRequest,
PurifyComplete,
PurifyError(String),
EdgeCaseFound(String),
QuitRequest,
QuitConfirmed,
HelpToggle,
ModeChange(u8),
Tick,
}
pub trait EventHandler {
fn handle(&mut self, event: Event);
fn was_handled(&self, event: &Event) -> bool;
}
#[derive(Debug, Default)]
#[cfg(test)]
struct EventRecorder {
events: Vec<Event>,
}
#[cfg(test)]
impl EventRecorder {
fn new() -> Self {
Self::default()
}
fn events(&self) -> &[Event] {
&self.events
}
fn clear(&mut self) {
self.events.clear();
}
}
#[cfg(test)]
impl EventHandler for EventRecorder {
fn handle(&mut self, event: Event) {
self.events.push(event);
}
fn was_handled(&self, event: &Event) -> bool {
self.events.contains(event)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_event_recorder() {
let mut recorder = EventRecorder::new();
recorder.handle(Event::FocusEditor);
recorder.handle(Event::LintRequest);
assert!(recorder.was_handled(&Event::FocusEditor));
assert!(recorder.was_handled(&Event::LintRequest));
assert!(!recorder.was_handled(&Event::QuitRequest));
assert_eq!(recorder.events().len(), 2);
recorder.clear();
assert!(recorder.events().is_empty());
}
#[test]
fn test_event_equality() {
assert_eq!(Event::FocusEditor, Event::FocusEditor);
assert_ne!(Event::FocusEditor, Event::LintRequest);
}
}