keyfork/keyfork-prompt/src/raw_mode.rs

80 lines
1.5 KiB
Rust

use std::{
io::Write,
os::fd::AsRawFd,
};
use keyfork_crossterm::terminal::{FdTerminal, TerminalIoctl};
use crate::Result;
pub(crate) struct RawMode<'a, W>
where
W: Write + AsRawFd + Sized,
{
write: &'a mut W,
terminal: FdTerminal,
}
impl<'a, W> RawMode<'a, W>
where
W: Write + AsRawFd + Sized,
{
pub(crate) fn new(write_handle: &'a mut W) -> Result<Self> {
let mut terminal = FdTerminal::from(write_handle.as_raw_fd());
terminal.enable_raw_mode()?;
Ok(Self {
terminal,
write: write_handle,
})
}
}
impl<W> Write for RawMode<'_, W>
where
W: Write + AsRawFd + Sized,
{
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.write.write(buf)
}
fn flush(&mut self) -> std::io::Result<()> {
self.write.flush()
}
}
impl<W> AsRawFd for RawMode<'_, W>
where
W: Write + AsRawFd + Sized,
{
fn as_raw_fd(&self) -> std::os::fd::RawFd {
self.write.as_raw_fd()
}
}
/*
impl<W> ExecutableCommand for RawMode<W>
where
W: Write + AsRawFd + Sized,
{
fn execute(&mut self, command: impl crossterm::Command) -> std::io::Result<&mut Self> {
let mut write = self.write.lock().unwrap();
match write.execute(command) {
Ok(_) => {
drop(write);
Ok(self)
}
Err(e) => Err(e),
}
}
}
*/
impl<W> Drop for RawMode<'_, W>
where
W: Write + AsRawFd + Sized,
{
fn drop(&mut self) {
self.terminal.disable_raw_mode().unwrap();
}
}