use crossterm::event::{ Event, KeyboardEnhancementFlags, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags, }; use crossterm::terminal::{ disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, }; use crossterm::{event, execute}; use ratatui::prelude::{CrosstermBackend, Terminal}; use std::io; use std::io::{stdout, Stdout}; use std::panic; pub type Tui = Terminal>; pub fn init() -> io::Result { execute!(stdout(), EnterAlternateScreen)?; execute!( stdout(), PushKeyboardEnhancementFlags( KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES, ) )?; enable_raw_mode()?; Terminal::new(CrosstermBackend::new(stdout())) } pub fn restore() -> io::Result<()> { execute!(stdout(), LeaveAlternateScreen)?; execute!(stdout(), PopKeyboardEnhancementFlags)?; disable_raw_mode()?; Ok(()) } pub fn get_event(tick: std::time::Duration) -> io::Result> { if event::poll(tick)? { return Ok(Some(event::read()?)); } Ok(None) } pub fn install_hooks() -> eyre::Result<()> { let hook_builder = color_eyre::config::HookBuilder::default(); let (panic_hook, eyre_hook) = hook_builder.into_hooks(); let panic_hook = panic_hook.into_panic_hook(); panic::set_hook(Box::new(move |panic_info| { restore().unwrap(); panic_hook(panic_info); })); let eyre_hook = eyre_hook.into_eyre_hook(); eyre::set_hook(Box::new(move |error| { restore().unwrap(); eyre_hook(error) }))?; Ok(()) }