use std::io::{self, Stdout}; use anyhow::Result; use crossterm::cursor::{Hide, Show}; use crossterm::execute; use crossterm::terminal::{ disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, }; use ratatui::backend::CrosstermBackend; use ratatui::Terminal; pub type LimeTerminal = Terminal>; pub struct TerminalSession { terminal: LimeTerminal, } impl TerminalSession { pub fn enter() -> Result { enable_raw_mode()?; let mut stdout = io::stdout(); execute!(stdout, EnterAlternateScreen, Hide)?; let backend = CrosstermBackend::new(stdout); let mut terminal = Terminal::new(backend)?; terminal.clear()?; Ok(Self { terminal }) } pub fn terminal_mut(&mut self) -> &mut LimeTerminal { &mut self.terminal } } impl Drop for TerminalSession { fn drop(&mut self) { let _ = disable_raw_mode(); let mut stdout = io::stdout(); let _ = execute!(stdout, Show, LeaveAlternateScreen); } }