diff_tool/services/
terminal.rs

1use anyhow::Result;
2use crossterm::{
3    terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
4    ExecutableCommand,
5};
6use ratatui::prelude::*;
7use std::{io::stdout, panic};
8
9pub fn init_terminal() -> Result<Terminal<impl Backend>> {
10    log::trace!("Initialising Terminal");
11    enable_raw_mode()?;
12    stdout().execute(EnterAlternateScreen)?;
13    let terminal = Terminal::new(CrosstermBackend::new(stdout()))?;
14    Ok(terminal)
15}
16
17pub fn restore_terminal() -> Result<()> {
18    log::trace!("Restoring Terminal");
19    stdout().execute(LeaveAlternateScreen)?;
20    disable_raw_mode()?;
21    Ok(())
22}
23
24pub fn install_panic_hook() {
25    let original_hook = panic::take_hook();
26    panic::set_hook(Box::new(move |panic_info| {
27        stdout().execute(LeaveAlternateScreen).unwrap();
28        disable_raw_mode().unwrap();
29        original_hook(panic_info);
30    }));
31}