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}