use std::io::{IsTerminal, Write};
use crossterm::{cursor, terminal, QueueableCommand};
pub(crate) fn clear_line<W: Write>(w: &mut W) -> std::io::Result<()> {
w.queue(terminal::Clear(terminal::ClearType::CurrentLine))?
.queue(cursor::MoveToColumn(0))?;
Ok(())
}
pub(crate) struct CursorGuard {
pub(crate) is_tty: bool,
}
impl Drop for CursorGuard {
fn drop(&mut self) {
if self.is_tty {
let mut stdout = std::io::stdout().lock();
let _ = clear_line(&mut stdout);
let _ = stdout.queue(cursor::Show);
let _ = stdout.flush();
}
}
}
pub fn reset() -> std::io::Result<()> {
let mut stdout = std::io::stdout().lock();
if !stdout.is_terminal() {
return Ok(());
}
stdout
.queue(cursor::Show)?
.queue(cursor::MoveToColumn(0))?
.queue(terminal::Clear(terminal::ClearType::FromCursorDown))?;
stdout.flush()?;
Ok(())
}