use crossterm::{
execute,
terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode},
};
use ratatui::{Terminal, backend::CrosstermBackend};
use std::io::{self, Stdout};
pub struct TerminalHandle {
terminal: Terminal<CrosstermBackend<Stdout>>,
}
impl TerminalHandle {
pub fn new() -> io::Result<Self> {
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen)?;
let backend = CrosstermBackend::new(stdout);
let terminal = Terminal::new(backend)?;
Ok(Self { terminal })
}
pub fn draw<F>(&mut self, f: F) -> io::Result<ratatui::CompletedFrame<'_>>
where
F: FnOnce(&mut ratatui::Frame),
{
self.terminal.draw(f)
}
pub fn restore_alternate_screen(&mut self) -> io::Result<()> {
enable_raw_mode()?;
execute!(self.terminal.backend_mut(), EnterAlternateScreen)?;
self.terminal.clear()?;
Ok(())
}
}
impl Drop for TerminalHandle {
fn drop(&mut self) {
let _ = disable_raw_mode();
let _ = execute!(self.terminal.backend_mut(), LeaveAlternateScreen);
let _ = self.terminal.show_cursor();
}
}