use crate::Result;
use std::os::unix::io::{AsRawFd, RawFd};
pub(crate) struct SocketWrapper {
pub(crate) socket: zmq::Socket,
fd: RawFd,
}
impl SocketWrapper {
pub fn new(socket: zmq::Socket) -> Result<Self> {
Ok(Self {
fd: socket.get_fd()?,
socket,
})
}
}
impl AsRawFd for SocketWrapper {
fn as_raw_fd(&self) -> RawFd {
self.fd
}
}
pub trait AsZmqSocket {
fn get_socket(&self) -> &zmq::Socket;
}
pub trait SocketExt {
fn get_linger(&self) -> Result<i32>;
fn set_linger(&self, value: i32) -> Result<()>;
fn get_sndhwm(&self) -> Result<i32>;
fn set_sndhwm(&self, value: i32) -> Result<()>;
fn get_rcvhwm(&self) -> Result<i32>;
fn set_rcvhwm(&self, value: i32) -> Result<()>;
fn is_probe_router(&self) -> Result<bool>;
fn set_probe_router(&self, value: bool) -> Result<()>;
fn is_ipv6(&self) -> Result<bool>;
fn is_immediate(&self) -> Result<bool>;
fn is_plain_server(&self) -> Result<bool>;
fn is_conflate(&self) -> Result<bool>;
fn is_curve_server(&self) -> Result<bool>;
fn is_gssapi_server(&self) -> Result<bool>;
fn is_gssapi_plaintext(&self) -> Result<bool>;
fn get_maxmsgsize(&self) -> Result<i64>;
fn get_affinity(&self) -> Result<u64>;
fn get_rate(&self) -> Result<i32>;
fn get_recovery_ivl(&self) -> Result<i32>;
fn get_sndbuf(&self) -> Result<i32>;
fn get_rcvbuf(&self) -> Result<i32>;
fn get_tos(&self) -> Result<i32>;
fn get_reconnect_ivl(&self) -> Result<i32>;
fn get_reconnect_ivl_max(&self) -> Result<i32>;
fn get_backlog(&self) -> Result<i32>;
fn get_identity(&self) -> Result<Vec<u8>>;
}
macro_rules! getter {
($name: ident, $retval: ty) => {
#[inline]
fn $name(&self) -> $crate::Result<$retval> {
self.get_socket().$name().map_err(|e| e.into())
}
};
}
macro_rules! setter {
($name: ident, $type: ty) => {
#[inline]
fn $name(&self, value: $type) -> $crate::Result<()> {
self.get_socket().$name(value).map_err(|e| e.into())
}
};
}
impl<T: AsZmqSocket> SocketExt for T {
getter!(is_ipv6, bool);
getter!(is_immediate, bool);
getter!(is_plain_server, bool);
getter!(is_conflate, bool);
getter!(is_probe_router, bool);
setter!(set_probe_router, bool);
getter!(is_curve_server, bool);
getter!(is_gssapi_server, bool);
getter!(is_gssapi_plaintext, bool);
getter!(get_maxmsgsize, i64);
getter!(get_sndhwm, i32);
setter!(set_sndhwm, i32);
getter!(get_rcvhwm, i32);
setter!(set_rcvhwm, i32);
getter!(get_affinity, u64);
getter!(get_rate, i32);
getter!(get_recovery_ivl, i32);
getter!(get_sndbuf, i32);
getter!(get_rcvbuf, i32);
getter!(get_tos, i32);
getter!(get_linger, i32);
setter!(set_linger, i32);
getter!(get_reconnect_ivl, i32);
getter!(get_reconnect_ivl_max, i32);
getter!(get_backlog, i32);
getter!(get_identity, Vec<u8>);
}