mod modes;
#[cfg(unix)]
mod unix;
#[cfg(unix)]
use unix as sys;
#[cfg(windows)]
mod windows;
#[cfg(windows)]
use windows as sys;
#[cfg(not(any(unix, windows)))]
mod sys {
pub(super) struct Saved;
pub(super) fn enable() -> std::io::Result<Saved> {
Err(std::io::Error::new(
std::io::ErrorKind::Unsupported,
"raw terminal input is only supported on Unix and Windows",
))
}
pub(super) fn restore(_: &Saved) {}
}
use std::io;
pub use modes::{MOUSE_OFF, MOUSE_ON};
pub struct RawMode {
saved: sys::Saved,
}
impl RawMode {
pub fn enable() -> io::Result<RawMode> {
Ok(RawMode {
saved: sys::enable()?,
})
}
}
impl Drop for RawMode {
fn drop(&mut self) {
sys::restore(&self.saved);
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::IsTerminal;
#[test]
fn enable_without_a_terminal_explains_what_to_do() {
if io::stdin().is_terminal() {
return;
}
let error = RawMode::enable()
.err()
.expect("must fail without a terminal");
assert_eq!(error.kind(), io::ErrorKind::Unsupported);
assert!(error.to_string().contains("ssh -t"));
}
}