use std::io::{self, Write};
use super::KohBackend;
pub struct CrosstermBackend {
out: io::BufWriter<io::Stdout>,
raw: bool,
}
impl CrosstermBackend {
pub fn new() -> io::Result<Self> {
Ok(Self {
out: io::BufWriter::new(io::stdout()),
raw: false,
})
}
}
impl KohBackend for CrosstermBackend {
fn write_bytes(&mut self, bytes: &[u8]) -> io::Result<()> {
self.out.write_all(bytes)
}
fn flush(&mut self) -> io::Result<()> {
self.out.flush()
}
fn enter_raw_mode(&mut self) -> io::Result<()> {
crossterm::terminal::enable_raw_mode()?;
self.raw = true;
Ok(())
}
fn leave_raw_mode(&mut self) -> io::Result<()> {
if self.raw {
crossterm::terminal::disable_raw_mode()?;
self.raw = false;
}
Ok(())
}
fn size(&self) -> io::Result<(u16, u16)> {
let (cols, rows) = crossterm::terminal::size()?;
Ok((rows, cols))
}
}
impl Drop for CrosstermBackend {
fn drop(&mut self) {
if self.raw {
let _ = crossterm::terminal::disable_raw_mode();
}
}
}