codetether_agent/tui/app/
panic_cleanup.rs1use std::{panic, sync::Arc};
2
3use super::terminal_state::restore_terminal_state;
4
5type PanicHook = dyn Fn(&panic::PanicHookInfo<'_>) + Send + Sync + 'static;
6
7pub(super) struct PanicHookGuard {
8 previous: Arc<PanicHook>,
9}
10
11pub(super) fn install_panic_cleanup_hook() -> PanicHookGuard {
12 let previous: Arc<PanicHook> = panic::take_hook().into();
13 let hook = Arc::clone(&previous);
14 panic::set_hook(Box::new(move |info| {
15 restore_terminal_state();
16 hook(info);
17 }));
18 PanicHookGuard { previous }
19}
20
21impl Drop for PanicHookGuard {
22 fn drop(&mut self) {
23 let previous = Arc::clone(&self.previous);
24 panic::set_hook(Box::new(move |info| previous(info)));
25 }
26}