use std::fs::File;
use std::io::{self, Read, Write};
use std::os::fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd, RawFd};
use std::path::{Path, PathBuf};
#[derive(Debug)]
pub struct Pty {
controller: File,
device: PathBuf,
}
impl Pty {
pub(crate) fn open() -> io::Result<(Pty, OwnedFd)> {
let (controller, device, path) = crate::native::open_terminal()?;
Ok((
Pty {
controller: File::from(controller),
device: path,
},
device,
))
}
pub fn device(&self) -> &Path {
&self.device
}
pub fn set_size(&self, rows: u16, cols: u16) -> io::Result<()> {
crate::native::set_window(self.controller.as_raw_fd(), rows, cols)
}
}
impl Read for Pty {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.controller.read(buf)
}
}
impl Read for &Pty {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
(&self.controller).read(buf)
}
}
impl Write for Pty {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.controller.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.controller.flush()
}
}
impl Write for &Pty {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
(&self.controller).write(buf)
}
fn flush(&mut self) -> io::Result<()> {
(&self.controller).flush()
}
}
impl AsFd for Pty {
fn as_fd(&self) -> BorrowedFd<'_> {
self.controller.as_fd()
}
}
impl AsRawFd for Pty {
fn as_raw_fd(&self) -> RawFd {
self.controller.as_raw_fd()
}
}
impl From<Pty> for OwnedFd {
fn from(pty: Pty) -> OwnedFd {
pty.controller.into()
}
}