use anyhow::{Context, Result};
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use ratatui::DefaultTerminal;
use std::io::stdout;
use std::ops::{Deref, DerefMut};
pub struct TerminalGuard {
terminal: DefaultTerminal,
}
impl TerminalGuard {
pub fn new() -> Result<Self> {
match ratatui::try_init() {
Ok(terminal) => {
let _ = crossterm::execute!(stdout(), EnableMouseCapture);
Ok(Self { terminal })
}
Err(e) => {
ratatui::restore();
Err(e).context("chat requires an interactive terminal")
}
}
}
}
impl Deref for TerminalGuard {
type Target = DefaultTerminal;
fn deref(&self) -> &DefaultTerminal {
&self.terminal
}
}
impl DerefMut for TerminalGuard {
fn deref_mut(&mut self) -> &mut DefaultTerminal {
&mut self.terminal
}
}
impl Drop for TerminalGuard {
fn drop(&mut self) {
let _ = crossterm::execute!(stdout(), DisableMouseCapture);
ratatui::restore();
}
}