feat(tui): add a panic hook to reset terminal upon panic (#112)

This commit is contained in:
Orhun Parmaksız 2023-09-14 18:51:34 +03:00
parent 3f862ffcdd
commit 1b1aa97be4
No known key found for this signature in database
GPG Key ID: F83424824B3E4B90

View File

@ -1,6 +1,7 @@
use ratatui::backend::TermionBackend;
use std::env;
use std::io;
use std::io::{self, Write};
use std::panic;
use std::process;
use systeroid_tui::args::Args;
use systeroid_tui::error::Result;
@ -15,6 +16,24 @@ fn main() -> Result<()> {
let output = MouseTerminal::from(output);
let output = output.into_alternate_screen()?;
let backend = TermionBackend::new(output);
let panic_hook = panic::take_hook();
panic::set_hook(Box::new(move |panic| {
let panic_cleanup = || -> Result<()> {
let mut output = io::stderr();
write!(
output,
"{}{}{}",
termion::clear::All,
termion::screen::ToMainScreen,
termion::cursor::Show
)?;
output.into_raw_mode()?.suspend_raw_mode()?;
io::stderr().flush()?;
Ok(())
};
panic_cleanup().expect("failed to clean up for panic");
panic_hook(panic);
}));
match systeroid_tui::run(args, backend) {
Ok(_) => process::exit(0),
Err(e) => {