use crossterm::{cursor, terminal as crossterm_terminal};
use std::io::{self, Result as CrosstermResult, Write};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Size {
pub width: u16,
pub height: u16,
}
pub struct Terminal {
stdout: io::Stdout,
}
impl Terminal {
pub fn new() -> Self {
Self { stdout: io::stdout() }
}
pub fn size(&self) -> CrosstermResult<Size> {
let (width, height) = crossterm_terminal::size()?;
Ok(Size { width, height })
}
pub fn enter_raw_mode(&self) -> CrosstermResult<()> {
crossterm_terminal::enable_raw_mode()
}
pub fn exit_raw_mode(&self) -> CrosstermResult<()> {
crossterm_terminal::disable_raw_mode()
}
pub fn clear(&mut self) -> CrosstermResult<()> {
write!(self.stdout, "{}", crossterm_terminal::Clear(crossterm_terminal::ClearType::All))?;
self.stdout.flush()?;
Ok(())
}
pub fn move_cursor(&mut self, x: u16, y: u16) -> CrosstermResult<()> {
write!(self.stdout, "{}", cursor::MoveTo(x, y))?;
self.stdout.flush()?;
Ok(())
}
pub fn hide_cursor(&mut self) -> CrosstermResult<()> {
write!(self.stdout, "{}", cursor::Hide)?;
self.stdout.flush()?;
Ok(())
}
pub fn show_cursor(&mut self) -> CrosstermResult<()> {
write!(self.stdout, "{}", cursor::Show)?;
self.stdout.flush()?;
Ok(())
}
}