devpane 0.3.1

A terminal-first multi-process workspace and development dashboard
use std::io::{self, Read, Write};
use std::time::Duration;

#[cfg(unix)]
mod unix;

#[cfg(unix)]
pub use unix::{Listener, connect, connect_with_retry, prepare_listener, remove_socket};

#[cfg(windows)]
mod windows;

#[cfg(windows)]
pub use windows::{Listener, connect, connect_with_retry, prepare_listener, remove_socket};

pub(super) trait ReadWrite: Read + Write + Send {
    fn set_read_timeout(&self, timeout: Option<Duration>) -> io::Result<()>;
}

pub struct Connection {
    inner: Box<dyn ReadWrite>,
}

impl Connection {
    pub(crate) fn new<T: ReadWrite + 'static>(stream: T) -> Self {
        Self {
            inner: Box::new(stream),
        }
    }

    pub fn set_read_timeout(&self, timeout: Option<Duration>) -> io::Result<()> {
        self.inner.set_read_timeout(timeout)
    }
}

impl Read for Connection {
    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
        self.inner.read(buf)
    }
}

impl Write for Connection {
    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
        self.inner.write(buf)
    }

    fn flush(&mut self) -> io::Result<()> {
        self.inner.flush()
    }
}