use tokio::io::{AsyncRead, AsyncWrite};
use crate::{
client::Endpoint,
error::{Error, Result},
};
pub trait AsyncQmpStream: AsyncRead + AsyncWrite + Unpin + Send {}
impl<T> AsyncQmpStream for T where T: AsyncRead + AsyncWrite + Unpin + Send {}
pub type QmpStream = Box<dyn AsyncQmpStream>;
pub async fn connect(endpoint: Endpoint) -> Result<QmpStream> {
match endpoint {
#[cfg(unix)]
Endpoint::Unix { path } => {
let s = tokio::net::UnixStream::connect(&path)
.await
.map_err(Error::from)?;
Ok(Box::new(s))
}
#[cfg(not(unix))]
Endpoint::Unix { .. } => Err(Error::protocol(
"unix sockets are not supported on this platform",
)),
Endpoint::Tcp { host, port } => {
let addr = (host.as_str(), port);
let s = tokio::net::TcpStream::connect(addr)
.await
.map_err(Error::from)?;
let _ = s.set_nodelay(true);
Ok(Box::new(s))
}
}
}