use std::{
io::{Result as IoResult, Write},
net::{TcpStream, UdpSocket},
};
#[derive(Debug)]
pub(super) enum Connection {
#[cfg_attr(docsrs, doc(cfg(unix)))]
#[cfg(unix)]
Stream(std::os::unix::net::UnixStream),
#[cfg_attr(docsrs, doc(cfg(unix)))]
#[cfg(unix)]
Datagram(std::os::unix::net::UnixDatagram),
#[cfg_attr(docsrs, doc(cfg(unix)))]
#[cfg(unix)]
SyslogCall,
Udp(UdpSocket),
Tcp(TcpStream),
}
impl Write for Connection {
fn write(&mut self, buf: &[u8]) -> IoResult<usize> {
match *self {
#[cfg(unix)]
Self::Datagram(ref ud) => {
ud.send(buf)
}
#[cfg(unix)]
Self::Stream(ref mut w) => {
w.write(buf)
.and_then(|sz| w.write_all(&[0; 1]).map(|()| sz))
}
#[cfg(unix)]
Self::SyslogCall => Ok(buf.len()), Self::Tcp(ref mut w) => {
let n = w.write(buf)?;
Ok(w.write(b"\n")? + n)
}
Self::Udp(ref socket) => {
socket.send(buf)
}
}
}
fn flush(&mut self) -> IoResult<()> {
match *self {
#[cfg(unix)]
Self::Datagram(_) => Ok(()),
#[cfg(unix)]
Self::Stream(ref mut w) => w.flush(),
#[cfg(unix)]
Self::SyslogCall => Ok(()),
Self::Udp(_) => Ok(()),
Self::Tcp(ref mut w) => w.flush(),
}
}
}