use std::{
io::{self, stdout, Stdout},
panic::{set_hook, take_hook},
};
use color_eyre::eyre::{Context, Result};
use crossterm::{
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{backend::CrosstermBackend, Terminal};
pub type SshyTerminal = Terminal<CrosstermBackend<Stdout>>;
pub fn setup_terminal() -> Result<SshyTerminal> {
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen)?;
let backend = CrosstermBackend::new(stdout);
Terminal::new(backend).wrap_err("Error creating the terminal instance")
}
pub fn end_terminal(mut terminal: Terminal<CrosstermBackend<Stdout>>) -> Result<()> {
disable_raw_mode()?;
execute!(terminal.backend_mut(), LeaveAlternateScreen)
.wrap_err("Error shutting down the terminal instance")
}
fn restore_tui() -> io::Result<()> {
disable_raw_mode()?;
execute!(stdout(), LeaveAlternateScreen)?;
Ok(())
}
pub fn init_panic_hook() {
let original_hook = take_hook();
set_hook(Box::new(move |panic_info| {
let _ = restore_tui();
original_hook(panic_info);
}))
}