1use crossterm::{cursor, terminal as crossterm_terminal};
6use std::io::{self, Result as CrosstermResult, Write};
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub struct Size {
11 pub width: u16,
13 pub height: u16,
15}
16
17pub struct Terminal {
19 stdout: io::Stdout,
20}
21
22impl Terminal {
23 pub fn new() -> Self {
25 Self { stdout: io::stdout() }
26 }
27
28 pub fn size(&self) -> CrosstermResult<Size> {
30 let (width, height) = crossterm_terminal::size()?;
31 Ok(Size { width, height })
32 }
33
34 pub fn enter_raw_mode(&self) -> CrosstermResult<()> {
36 crossterm_terminal::enable_raw_mode()
37 }
38
39 pub fn exit_raw_mode(&self) -> CrosstermResult<()> {
41 crossterm_terminal::disable_raw_mode()
42 }
43
44 pub fn clear(&mut self) -> CrosstermResult<()> {
46 write!(self.stdout, "{}", crossterm_terminal::Clear(crossterm_terminal::ClearType::All))?;
47 self.stdout.flush()?;
48 Ok(())
49 }
50
51 pub fn move_cursor(&mut self, x: u16, y: u16) -> CrosstermResult<()> {
53 write!(self.stdout, "{}", cursor::MoveTo(x, y))?;
54 self.stdout.flush()?;
55 Ok(())
56 }
57
58 pub fn hide_cursor(&mut self) -> CrosstermResult<()> {
60 write!(self.stdout, "{}", cursor::Hide)?;
61 self.stdout.flush()?;
62 Ok(())
63 }
64
65 pub fn show_cursor(&mut self) -> CrosstermResult<()> {
67 write!(self.stdout, "{}", cursor::Show)?;
68 self.stdout.flush()?;
69 Ok(())
70 }
71}