rumqttd 0.20.0

rumqttd is a high performance MQTT broker written in Rust which is light weight and embeddable
Documentation
use crate::router::{Event, Meter};
use crate::ConnectionId;
use flume::{Receiver, RecvError, RecvTimeoutError, SendError, Sender, TryRecvError, TrySendError};

#[derive(Debug, thiserror::Error)]
pub enum LinkError {
    #[error("Channel try send error")]
    TrySend(#[from] TrySendError<(ConnectionId, Event)>),
    #[error("Channel send error")]
    Send(#[from] SendError<(ConnectionId, Event)>),
    #[error("Channel recv error")]
    Recv(#[from] RecvError),
    #[error("Channel timeout recv error")]
    RecvTimeout(#[from] RecvTimeoutError),
    #[error("Timeout = {0}")]
    Elapsed(#[from] tokio::time::error::Elapsed),
    #[error("Channel try_recv error")]
    TryRecv(#[from] TryRecvError),
}

pub struct MetersLink {
    router_rx: Receiver<Vec<Meter>>,
}

impl MetersLink {
    pub fn new(router_tx: Sender<(ConnectionId, Event)>) -> Result<MetersLink, LinkError> {
        let (tx, rx) = flume::bounded(100);

        router_tx.send((0, Event::NewMeter(tx)))?;
        let link = MetersLink { router_rx: rx };
        Ok(link)
    }

    pub async fn init(router_tx: Sender<(ConnectionId, Event)>) -> Result<MetersLink, LinkError> {
        let (tx, rx) = flume::bounded(100);

        router_tx.send_async((0, Event::NewMeter(tx))).await?;
        let link = MetersLink { router_rx: rx };
        Ok(link)
    }

    pub fn recv(&self) -> Result<Vec<Meter>, LinkError> {
        let o = self.router_rx.try_recv()?;
        Ok(o)
    }

    pub async fn next(&self) -> Result<Vec<Meter>, LinkError> {
        let o = self.router_rx.recv_async().await?;
        Ok(o)
    }
}