1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use raw_tty::IntoRawMode;
use std::error::Error;
use std::fs::{self, File};
use std::io::Write;
use termion::input::TermRead;

pub struct Terminal {
    pub output: File,
}

impl Terminal {
    pub fn new() -> Result<Terminal, Box<dyn Error>> {
        let output = fs::OpenOptions::new()
            .read(true)
            .write(true)
            .open("/dev/tty")?;

        Ok(Terminal { output })
    }

    pub fn keys(
        &mut self,
    ) -> Result<termion::input::Keys<raw_tty::RawReader<File>>, Box<dyn Error>> {
        Ok(self.output.try_clone()?.into_raw_mode()?.keys())
    }

    pub fn print(&mut self, text: &str) {
        self.output.write_all(text.as_bytes()).unwrap();
        self.output.flush().unwrap();
    }
}