1use std::io::{self, Stdout};
4
5use crossterm::terminal::{
6 disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
7};
8use crossterm::{cursor, execute};
9use ratatui::backend::CrosstermBackend;
10use ratatui::Terminal;
11
12pub type TuiTerminal = Terminal<CrosstermBackend<Stdout>>;
13
14pub fn setup_terminal() -> io::Result<TuiTerminal> {
15 enable_raw_mode()?;
16 let mut stdout = io::stdout();
17 if let Err(err) = execute!(stdout, EnterAlternateScreen, cursor::Hide) {
18 let _ = disable_raw_mode();
19 return Err(err);
20 }
21
22 match Terminal::new(CrosstermBackend::new(stdout)) {
23 Ok(terminal) => Ok(terminal),
24 Err(err) => {
25 let _ = execute!(io::stdout(), LeaveAlternateScreen, cursor::Show);
26 let _ = disable_raw_mode();
27 Err(err)
28 }
29 }
30}
31
32pub fn restore_terminal(terminal: &mut TuiTerminal) {
33 let _ = disable_raw_mode();
34 let _ = execute!(terminal.backend_mut(), LeaveAlternateScreen, cursor::Show);
35}
36
37pub fn cleanup_terminal() {
40 let _ = disable_raw_mode();
41 let _ = execute!(io::stdout(), LeaveAlternateScreen, cursor::Show);
42}