use crate::error::ZmqError;
use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub(crate) enum Endpoint {
Tcp(String, 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" => {
if address_part.is_empty() {
Err(invalid_endpoint_err())
} else {
Ok(Endpoint::Tcp(
address_part.to_string(),
endpoint_str.to_string(),
))
}
}
#[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())
}
}