use crate::error::ZmqError;
use std::{
net::SocketAddr,
path::{Path, PathBuf},
};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub(crate) enum Endpoint {
Tcp(std::net::SocketAddr, String), #[cfg(feature = "ipc")]
Ipc(PathBuf, String), #[cfg(feature = "inproc")]
Inproc(String), }
pub(crate) fn parse_endpoint(endpoint_str: &str) -> Result<Endpoint, ZmqError> {
let invalid_endpoint_err = || ZmqError::InvalidEndpoint(endpoint_str.to_string());
if let Some(separator_pos) = endpoint_str.find("://") {
let scheme = &endpoint_str[..separator_pos];
let address_part = &endpoint_str[separator_pos + 3..];
match scheme {
"tcp" => {
address_part
.parse::<SocketAddr>()
.map(|addr| Endpoint::Tcp(addr, endpoint_str.to_string()))
.map_err(|_| {
tracing::debug!("Failed to parse TCP address: {}", address_part);
invalid_endpoint_err()
})
}
#[cfg(feature = "ipc")]
"ipc" => {
if address_part.is_empty() || address_part.contains('\0') {
Err(invalid_endpoint_err())
} else {
let path = PathBuf::from(address_part);
Ok(Endpoint::Ipc(path, endpoint_str.to_string()))
}
}
#[cfg(feature = "inproc")]
"inproc" => {
if address_part.is_empty() || address_part.contains('\0') {
Err(invalid_endpoint_err())
} else {
Ok(Endpoint::Inproc(address_part.to_string()))
}
}
_ => Err(ZmqError::UnsupportedTransport(endpoint_str.to_string())),
} } else {
Err(invalid_endpoint_err())
}
}