GatoMQTT 0.2.0

no_std, no_alloc MQTT 3.1.1 broker library for embedded Rust. Bounded session registry, retained messages, QoS 1, transport-agnostic (plain TCP or TLS via TlsSession trait).
Documentation
use super::state::SessionId;
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
use embassy_sync::signal::Signal;

pub type SessionSignal = Signal<CriticalSectionRawMutex, ()>;
pub type SessionSignals<const N: usize> = [SessionSignal; N];

pub const fn new_session_signals<const N: usize>() -> SessionSignals<N> {
    [const { Signal::new() }; N]
}

pub fn signal_session<const N: usize>(signals: &SessionSignals<N>, session_id: SessionId) {
    if let Some(signal) = signals.get(session_id) {
        signal.signal(());
    }
}

pub fn reset_session_signal<const N: usize>(signals: &SessionSignals<N>, session_id: SessionId) {
    if let Some(signal) = signals.get(session_id) {
        signal.reset();
    }
}

#[cfg(test)]
mod tests {
    use super::{new_session_signals, reset_session_signal, signal_session};

    #[test]
    fn reset_session_signal_clears_queued_notification() {
        let signals = new_session_signals::<2>();

        signal_session(&signals, 1);
        assert!(signals[1].signaled());

        signal_session(&signals, 1);
        reset_session_signal(&signals, 1);

        assert!(!signals[1].signaled());
    }
}