glue/
publisher.rs

1use crate::ZMQ_CONTEXT;
2use anyhow::Result;
3
4pub trait GluePublisher: Send {
5    fn glue_new_pub(send_address: String) -> Result<impl GluePublisher>;
6    fn glue_send<T>(&self, msg: T) -> Result<()>
7    where
8        T: Into<zmq::Message> + Send + Sync + 'static;
9    fn glue_gen_send<T>(self) -> impl Send + FnMut(T) -> Result<(), Box<dyn std::error::Error>>
10    where
11        T: Into<zmq::Message> + Send + Sync + 'static;
12}
13
14impl GluePublisher for zmq::Socket {
15    fn glue_new_pub(send_address: String) -> Result<impl GluePublisher> {
16        let socket = ZMQ_CONTEXT.socket(zmq::PUB)?;
17        socket.bind(&send_address)?;
18
19        Ok(socket)
20    }
21
22    fn glue_send<T>(&self, msg: T) -> Result<()>
23    where
24        T: Into<zmq::Message> + Send + Sync + 'static,
25    {
26        let serialized_msg: zmq::Message = msg.into();
27        Ok(self.send(serialized_msg, 0)?)
28    }
29
30    fn glue_gen_send<T>(self) -> impl Send + FnMut(T) -> Result<(), Box<dyn std::error::Error>>
31    where
32        T: Into<zmq::Message> + Send + Sync + 'static,
33    {
34        move |c| Ok(self.glue_send(c)?)
35    }
36}