use crate::caps::probed::ProbeCapabilities;
use crate::caps::Capabilities;
use crate::input::InputEvent;
use crate::surface::Change;
use crate::{format_err, Result};
use num_traits::NumCast;
use std::fmt::Display;
use std::time::Duration;
#[cfg(unix)]
pub mod unix;
#[cfg(windows)]
pub mod windows;
pub mod buffered;
#[cfg(unix)]
pub use self::unix::{UnixTerminal, UnixTerminalWaker as TerminalWaker};
#[cfg(windows)]
pub use self::windows::{WindowsTerminal, WindowsTerminalWaker as TerminalWaker};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ScreenSize {
pub rows: usize,
pub cols: usize,
pub xpixel: usize,
pub ypixel: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Blocking {
DoNotWait,
Wait,
}
pub trait Terminal {
fn set_raw_mode(&mut self) -> Result<()>;
fn set_cooked_mode(&mut self) -> Result<()>;
fn enter_alternate_screen(&mut self) -> Result<()>;
fn exit_alternate_screen(&mut self) -> Result<()>;
fn get_screen_size(&mut self) -> Result<ScreenSize>;
fn probe_capabilities(&mut self) -> Option<ProbeCapabilities> {
None
}
fn set_screen_size(&mut self, size: ScreenSize) -> Result<()>;
fn render(&mut self, changes: &[Change]) -> Result<()>;
fn flush(&mut self) -> Result<()>;
fn poll_input(&mut self, wait: Option<Duration>) -> Result<Option<InputEvent>>;
fn waker(&self) -> TerminalWaker;
}
#[cfg(unix)]
pub type SystemTerminal = UnixTerminal;
#[cfg(windows)]
pub type SystemTerminal = WindowsTerminal;
pub fn new_terminal(caps: Capabilities) -> Result<impl Terminal> {
SystemTerminal::new(caps)
}
pub(crate) fn cast<T: NumCast + Display + Copy, U: NumCast>(n: T) -> Result<U> {
num_traits::cast(n).ok_or_else(|| format_err!("{} is out of bounds for this system", n))
}