use std::fmt::Debug; use std::io; use console::Term; /// A trait for minimal terminal-like behavior. /// /// Anything that implements this trait can be used a draw target via [`ProgressDrawTarget::term_like`]. /// /// [`ProgressDrawTarget::term_like`]: crate::ProgressDrawTarget::term_like pub trait TermLike: Debug + Send + Sync { /// Return the terminal width fn width(&self) -> u16; /// Return the terminal height fn height(&self) -> u16 { // FIXME: remove this default impl in the next major version bump 20 // sensible default } /// Move the cursor up by `n` lines fn move_cursor_up(&self, n: usize) -> io::Result<()>; /// Move the cursor down by `n` lines fn move_cursor_down(&self, n: usize) -> io::Result<()>; /// Move the cursor right by `n` chars fn move_cursor_right(&self, n: usize) -> io::Result<()>; /// Move the cursor left by `n` chars fn move_cursor_left(&self, n: usize) -> io::Result<()>; /// Write a string and add a newline. fn write_line(&self, s: &str) -> io::Result<()>; /// Write a string fn write_str(&self, s: &str) -> io::Result<()>; /// Clear the current line and reset the cursor to beginning of the line fn clear_line(&self) -> io::Result<()>; fn flush(&self) -> io::Result<()>; } impl TermLike for Term { fn width(&self) -> u16 { self.size().1 } fn height(&self) -> u16 { self.size().0 } fn move_cursor_up(&self, n: usize) -> io::Result<()> { self.move_cursor_up(n) } fn move_cursor_down(&self, n: usize) -> io::Result<()> { self.move_cursor_down(n) } fn move_cursor_right(&self, n: usize) -> io::Result<()> { self.move_cursor_right(n) } fn move_cursor_left(&self, n: usize) -> io::Result<()> { self.move_cursor_left(n) } fn write_line(&self, s: &str) -> io::Result<()> { self.write_line(s) } fn write_str(&self, s: &str) -> io::Result<()> { self.write_str(s) } fn clear_line(&self) -> io::Result<()> { self.clear_line() } fn flush(&self) -> io::Result<()> { self.flush() } }