use std::io::stdout;
use std::panic;
use std::sync::Once;
use crossterm::event::PopKeyboardEnhancementFlags;
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use crossterm::ExecutableCommand;
static PANIC_HOOK: Once = Once::new();
fn install_panic_hook() {
PANIC_HOOK.call_once(|| {
let default = panic::take_hook();
panic::set_hook(Box::new(move |info| {
let _ = restore_terminal();
default(info);
}));
});
}
pub fn enter() -> anyhow::Result<()> {
install_panic_hook();
enable_raw_mode()?;
let mut out = stdout();
out.execute(EnterAlternateScreen)?;
Ok(())
}
pub fn restore_terminal() -> anyhow::Result<()> {
let mut out = stdout();
let _ = out.execute(PopKeyboardEnhancementFlags);
let _ = disable_raw_mode();
let _ = out.execute(LeaveAlternateScreen);
Ok(())
}
pub struct Guard;
impl Drop for Guard {
fn drop(&mut self) {
let _ = restore_terminal();
}
}