Skip to main content

codetether_agent/tui/app/
panic_cleanup.rs

1use 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}