bevy_ratatui 0.3.0

A Bevy plugin for building terminal user interfaces with Ratatui
Documentation
use bevy::{app::AppExit, prelude::*};
use crossterm::event::{KeyCode, KeyEventKind, KeyModifiers};

use crate::error::exit_on_error;

pub struct EventPlugin;

impl Plugin for EventPlugin {
    fn build(&self, app: &mut App) {
        app.add_event::<KeyEvent>()
            .add_systems(PreUpdate, crossterm_event_system.pipe(exit_on_error));
    }
}

/// Wrapper around `crossterm::event::KeyEvent`.
#[derive(Debug, Deref, Event, PartialEq, Eq, Clone, Hash)]
pub struct KeyEvent(pub crossterm::event::KeyEvent);

pub fn crossterm_event_system(
    mut app_exit: EventWriter<AppExit>,
    mut key_events: EventWriter<KeyEvent>,
) -> color_eyre::Result<()> {
    while crossterm::event::poll(std::time::Duration::ZERO)? {
        match crossterm::event::read()? {
            crossterm::event::Event::Key(event) if event.kind == KeyEventKind::Press => {
                match (event.modifiers, event.code) {
                    (KeyModifiers::CONTROL, KeyCode::Char('c')) => {
                        app_exit.send_default();
                    }
                    _ => {}
                }
                key_events.send(KeyEvent(event));
            }
            _ => {}
        }
    }
    Ok(())
}