use crate::Position; use std::io::{self, stdout, Write}; use termion::color; use termion::event::Key; use termion::input::TermRead; use termion::raw::{IntoRawMode, RawTerminal}; pub struct Size { pub width: u16, pub height: u16, } pub struct Terminal { size: Size, _stdout: RawTerminal, } impl Terminal { pub fn default() -> Result { let size = termion::terminal_size()?; Ok(Self { size: Size { width: size.0, height: size.1.saturating_sub(2), }, _stdout: stdout().into_raw_mode()?, }) } pub fn size(&self) -> &Size { &self.size } pub fn clear_screen() { print!("{}", termion::clear::All); } #[allow(clippy::cast_possible_truncation)] pub fn cursor_position(position: &Position) { let Position { mut x, mut y } = position; x = x.saturating_add(1); y = y.saturating_add(1); let x = x as u16; let y = y as u16; print!("{}", termion::cursor::Goto(x, y)); } pub fn flush() -> Result<(), std::io::Error> { io::stdout().flush() } pub fn read_key() -> Result { loop { if let Some(key) = io::stdin().lock().keys().next() { return key; } } } pub fn cursor_hide() { print!("{}", termion::cursor::Hide); } pub fn cursor_show() { print!("{}", termion::cursor::Show); } pub fn clear_current_line() { print!("{}", termion::clear::CurrentLine); } pub fn set_bg_color(color: color::Rgb) { print!("{}", color::Bg(color)); } pub fn reset_bg_color() { print!("{}", color::Bg(color::Reset)); } pub fn set_fg_color(color: color::Rgb) { print!("{}", color::Fg(color)); } pub fn reset_fg_color() { print!("{}", color::Fg(color::Reset)); } }