#[cfg(unix)]
use std::os::unix::net::UnixStream;
use std::{
io::{Read, Write},
net::TcpStream,
};
use anyhow::{bail, Result};
use crate::{account::Account, protocol::Protocol};
pub trait Stream: Read + Write {}
impl<T: Read + Write> Stream for T {}
pub fn connect(account: &Account, protocol: &Protocol) -> Result<Box<dyn Stream>> {
let stream: Box<dyn Stream> = match protocol {
#[cfg(unix)]
Protocol::UnixSocket => {
let Some(sock) = &account.unix_socket else {
bail!("Missing unix socket configuration");
};
let stream = UnixStream::connect(&sock.path)?;
Box::new(stream)
}
Protocol::Tcp => {
let Some(tcp) = &account.tcp else {
bail!("Missing TCP configuration");
};
let stream = TcpStream::connect((tcp.host.as_str(), tcp.port))?;
Box::new(stream)
}
};
Ok(stream)
}