use std::io; use crate::ratatui::buffer::Cell; use crate::ratatui::layout::Rect; #[cfg(feature = "termion")] mod termion; #[cfg(feature = "termion")] pub use self::termion::TermionBackend; mod crossterm; pub use self::crossterm::CrosstermBackend; #[derive(Debug, Clone, Copy, PartialEq)] pub enum ClearType { All, AfterCursor, BeforeCursor, CurrentLine, UntilNewLine, } pub trait Backend { fn draw<'a, I>(&mut self, content: I) -> Result<(), io::Error> where I: Iterator; /// Insert `n` line breaks to the terminal screen fn append_lines(&mut self, n: u16) -> io::Result<()> { // to get around the unused warning let _n = n; Ok(()) } fn hide_cursor(&mut self) -> Result<(), io::Error>; fn show_cursor(&mut self) -> Result<(), io::Error>; fn get_cursor(&mut self) -> Result<(u16, u16), io::Error>; fn set_cursor(&mut self, x: u16, y: u16) -> Result<(), io::Error>; /// Clears the whole terminal screen fn clear(&mut self) -> Result<(), io::Error>; /// Clears a specific region of the terminal specified by the [`ClearType`] parameter fn clear_region(&mut self, clear_type: ClearType) -> Result<(), io::Error> { match clear_type { ClearType::All => self.clear(), ClearType::AfterCursor | ClearType::BeforeCursor | ClearType::CurrentLine | ClearType::UntilNewLine => Err(io::Error::new( io::ErrorKind::Other, format!("clear_type [{clear_type:?}] not supported with this backend"), )), } } fn size(&self) -> Result; fn flush(&mut self) -> Result<(), io::Error>; }