use crossterm::event::{DisableBracketedPaste, EnableBracketedPaste};
use crossterm::execute;
use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
use crate::core::cursor;
use crate::error::Result;
pub struct TerminalGuard {
bracketed_paste: bool,
}
impl TerminalGuard {
pub fn new() -> Result<Self> {
enable_raw_mode()?;
let bracketed_paste =
execute!(std::io::stdout(), EnableBracketedPaste).is_ok();
cursor::hide();
Ok(Self { bracketed_paste })
}
}
impl Drop for TerminalGuard {
fn drop(&mut self) {
cursor::show();
if self.bracketed_paste
&& let Err(error) =
execute!(std::io::stdout(), DisableBracketedPaste)
{
log::warn!("could not disable bracketed paste: {error}");
}
if let Err(error) = disable_raw_mode() {
log::warn!("could not restore terminal from raw mode: {error}");
}
}
}